]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Scripts/Ds5/firmware_volume.py
ArmPlatformPkg/Ds5: Added Aarch64 support
[mirror_edk2.git] / ArmPlatformPkg / Scripts / Ds5 / firmware_volume.py
index 651c748a10a18b9df8935f6adfa0dead38702dd2..cd6f34acaf80bfdbe2deb76db33764a43e20821e 100644 (file)
@@ -140,8 +140,53 @@ class EfiSectionPE32:
         if (base_of_code < base_of_data) and (base_of_code != 0):\r
             return base_of_code\r
         else:\r
-            return base_of_data       \r
+            return base_of_data\r
+\r
+class EfiSectionPE64:\r
+    def __init__(self, ec, base_pe64):\r
+        self.ec = ec\r
+        self.base_pe64 = base_pe64\r
+\r
+    def get_debug_filepath(self):\r
+        # Offset from dos hdr to PE file hdr (EFI_IMAGE_NT_HEADERS64)\r
+        #file_header_offset = self.ec.getMemoryService().readMemory32(self.base_pe64 + 0x3C)\r
+        file_header_offset = 0x0\r
+\r
+        # Offset to debug dir in PE hdrs\r
+        debug_dir_entry_rva = self.ec.getMemoryService().readMemory32(self.base_pe64 + file_header_offset + 0x138)\r
+        if debug_dir_entry_rva == 0:\r
+            raise Exception("EfiFileSectionPE64","No Debug Directory")\r
+\r
+        debug_type = self.ec.getMemoryService().readMemory32(self.base_pe64 + debug_dir_entry_rva + 0xC)\r
+        if (debug_type != 0xdf) and (debug_type != EfiFileSection.EFI_IMAGE_DEBUG_TYPE_CODEVIEW):\r
+            raise Exception("EfiFileSectionPE64","Debug type is not dwarf")\r
+        \r
+        \r
+        debug_rva = self.ec.getMemoryService().readMemory32(self.base_pe64 + debug_dir_entry_rva + 0x14)\r
+        \r
+        dwarf_sig = struct.unpack("cccc", self.ec.getMemoryService().read(str(self.base_pe64 + debug_rva), 4, 32))\r
+        if (dwarf_sig != 0x66727764) and (dwarf_sig != FirmwareFile.CONST_NB10_SIGNATURE):\r
+            raise Exception("EfiFileSectionPE64","Dwarf debug signature not found")\r
     \r
+        if dwarf_sig == 0x66727764:\r
+            filename = self.base_pe64 + debug_rva + 0xc\r
+        else:\r
+            filename = self.base_pe64 + debug_rva + 0x10\r
+        filename = struct.unpack("200s", self.ec.getMemoryService().read(str(filename), 200, 32))[0]\r
+        return filename[0:string.find(filename,'\0')]\r
+    \r
+    def get_debug_elfbase(self):\r
+        # Offset from dos hdr to PE file hdr\r
+        pe_file_header = self.base_pe64 + self.ec.getMemoryService().readMemory32(self.base_pe64 + 0x3C)\r
+        \r
+        base_of_code = self.base_pe64 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x28)\r
+        base_of_data = self.base_pe64 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x2C)\r
+        \r
+        if (base_of_code < base_of_data) and (base_of_code != 0):\r
+            return base_of_code\r
+        else:\r
+            return base_of_data\r
+        \r
 class FirmwareFile:\r
     EFI_FV_FILETYPE_RAW                   = 0x01\r
     EFI_FV_FILETYPE_FREEFORM              = 0x02\r
@@ -287,7 +332,6 @@ class FirmwareVolume:
                 except Exception, (ErrorClass, ErrorMessage):\r
                     if verbose:\r
                         print "Error while loading a symbol file (%s: %s)" % (ErrorClass, ErrorMessage)\r
-                    pass\r
 \r
                 return debug_info\r
 \r
@@ -308,5 +352,4 @@ class FirmwareVolume:
             except Exception, (ErrorClass, ErrorMessage):\r
                 if verbose:\r
                     print "Error while loading a symbol file (%s: %s)" % (ErrorClass, ErrorMessage)\r
-                pass\r
 \r