]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg/Ds5: Added Aarch64 support
authorHarry Liebel <Harry.Liebel@arm.com>
Thu, 18 Jul 2013 21:32:43 +0000 (21:32 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 18 Jul 2013 21:32:43 +0000 (21:32 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Harry Liebel <Harry.Liebel@arm.com>
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14491 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Scripts/Ds5/edk2_debugger.py
ArmPlatformPkg/Scripts/Ds5/firmware_volume.py
ArmPlatformPkg/Scripts/Ds5/system_table.py

index 4867af1938d703a1dfc5ff1c2931b0be07642cd5..b6108d6a19454ecd71458a4d164461864fdb5fa1 100644 (file)
@@ -66,7 +66,15 @@ def load_symbol_from_file(ec, filename, address, verbose = False):
             ec.getImageService().addSymbols(filename, address)\r
         except:\r
             print "Warning: not possible to load symbols from %s at 0x%x" % (filename, address)\r
-            pass\r
+\r
+def is_aarch64(ec):\r
+    success = True\r
+    try:\r
+        # Try to access a Aarch64 specific register\r
+        ec.getRegisterService().getValue('X0')\r
+    except:\r
+        success = False\r
+    return success\r
 \r
 class ArmPlatform:\r
     def __init__(self, sysmembase=None, sysmemsize=None, fvs={}):\r
@@ -189,8 +197,11 @@ class ArmPlatformDebugger:
                     if (pc >= debug_info[0]) and (pc < debug_info[0] + debug_info[1]):\r
                         found = True\r
                 if found == False:\r
-                    info = self.debug_info_table.load_symbols_at(pc)\r
-                    debug_infos.append(info)\r
+                    try:\r
+                        info = self.debug_info_table.load_symbols_at(pc)\r
+                        debug_infos.append(info)\r
+                    except:\r
+                        pass\r
                 \r
             #self.debug_info_table.load_symbols_at(pc)\r
         else:\r
@@ -218,4 +229,3 @@ class ArmPlatformDebugger:
         except:\r
             # Debugger exception could be excepted if DRAM has not been initialized or if we have not started to run from DRAM yet\r
             print "Note: no symbols have been found in System Memory (possible cause: the UEFI permanent memory has been installed yet)"\r
-            pass\r
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
index 3e7f6ab01584cfb9cded6cf2a77c796d21bce108..2128e25f23bf61ce667a76b9bc05220c0ab29975 100644 (file)
@@ -27,6 +27,7 @@ class DebugInfoTable:
         self.base = debug_info_table_header_offset\r
         \r
     def get_debug_info(self):\r
+        # Get the information from EFI_DEBUG_IMAGE_INFO_TABLE_HEADER\r
         count = self.ec.getMemoryService().readMemory32(self.base + 0x4)\r
         debug_info_table_base = self.ec.getMemoryService().readMemory32(self.base + 0x8)\r
         \r
@@ -34,16 +35,27 @@ class DebugInfoTable:
         \r
         for i in range(0, count):\r
             # Get the address of the structure EFI_DEBUG_IMAGE_INFO\r
-            debug_info = self.ec.getMemoryService().readMemory32(debug_info_table_base + (i * 4))\r
+            if edk2_debugger.is_aarch64(self.ec):\r
+                debug_info = self.ec.getMemoryService().readMemory32(debug_info_table_base + (i * 8))\r
+            else:\r
+                debug_info = self.ec.getMemoryService().readMemory32(debug_info_table_base + (i * 4))\r
+\r
             if debug_info:\r
                 debug_info_type = self.ec.getMemoryService().readMemory32(debug_info)\r
                 # Normal Debug Info Type\r
                 if debug_info_type == 1:\r
-                    # Get the base address of the structure EFI_LOADED_IMAGE_PROTOCOL\r
-                    loaded_image_protocol = self.ec.getMemoryService().readMemory32(debug_info + 0x4)\r
-                    \r
-                    image_base = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x20)\r
-                    image_size = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x28)\r
+                    if edk2_debugger.is_aarch64(self.ec):\r
+                        # Get the base address of the structure EFI_LOADED_IMAGE_PROTOCOL\r
+                        loaded_image_protocol = self.ec.getMemoryService().readMemory32(debug_info + 0x8)\r
+\r
+                        image_base = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x40)\r
+                        image_size = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x48)\r
+                    else:\r
+                        # Get the base address of the structure EFI_LOADED_IMAGE_PROTOCOL\r
+                        loaded_image_protocol = self.ec.getMemoryService().readMemory32(debug_info + 0x4)\r
+\r
+                        image_base = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x20)\r
+                        image_size = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x28)\r
                     \r
                     self.DebugInfos.append((image_base,image_size))\r
     \r
@@ -55,14 +67,16 @@ class DebugInfoTable:
         found = False\r
         for debug_info in self.DebugInfos:\r
             if (addr >= debug_info[0]) and (addr < debug_info[0] + debug_info[1]):\r
-                section = firmware_volume.EfiSectionPE32(self.ec, debug_info[0])\r
+                if edk2_debugger.is_aarch64(self.ec):\r
+                    section = firmware_volume.EfiSectionPE64(self.ec, debug_info[0])\r
+                else:\r
+                    section = firmware_volume.EfiSectionPE32(self.ec, debug_info[0])\r
                 \r
                 try:\r
                     edk2_debugger.load_symbol_from_file(self.ec, section.get_debug_filepath(), section.get_debug_elfbase(), verbose)\r
                 except Exception, (ErrorClass, ErrorMessage):\r
                     if verbose:\r
                         print "Error while loading a symbol file (%s: %s)" % (ErrorClass, ErrorMessage)\r
-                    pass\r
 \r
                 found = True\r
                 return debug_info\r
@@ -75,20 +89,25 @@ class DebugInfoTable:
             self.get_debug_info()\r
         \r
         for debug_info in self.DebugInfos:\r
-            section = firmware_volume.EfiSectionPE32(self.ec, debug_info[0])\r
-           \r
+            if edk2_debugger.is_aarch64(self.ec):\r
+                section = firmware_volume.EfiSectionPE64(self.ec, debug_info[0])\r
+            else:\r
+                section = firmware_volume.EfiSectionPE32(self.ec, debug_info[0])
+       \r
             try:\r
                 edk2_debugger.load_symbol_from_file(self.ec, section.get_debug_filepath(), section.get_debug_elfbase(), verbose)\r
             except Exception, (ErrorClass, ErrorMessage):\r
                 if verbose:\r
                     print "Error while loading a symbol file (%s: %s)" % (ErrorClass, ErrorMessage)\r
-                pass\r
 \r
     def dump(self):\r
         self.get_debug_info()\r
         for debug_info in self.DebugInfos:\r
             base_pe32 = debug_info[0]\r
-            section = firmware_volume.EfiSectionPE32(self.ec, base_pe32)\r
+            if edk2_debugger.is_aarch64(self.ec):\r
+                section = firmware_volume.EfiSectionPE64(self.ec, base_pe32)\r
+            else:\r
+                section = firmware_volume.EfiSectionPE32(self.ec, base_pe32)\r
             print section.get_debug_filepath()\r
         \r
 class SystemTable:\r
@@ -124,14 +143,24 @@ class SystemTable:
             raise Exception('SystemTable','System Table not found in System Memory [0x%x;0x%X]' % (membase,membase+memsize))\r
         \r
     def get_configuration_table(self, conf_table_guid):\r
-        # Number of configuration Table entry\r
-        conf_table_entry_count = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x40)\r
-        \r
-        # Get location of the Configuration Table entries\r
-        conf_table_offset = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x44)\r
+        if edk2_debugger.is_aarch64(self.ec):\r
+            # Number of configuration Table entry\r
+            conf_table_entry_count = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x68)
+\r
+            # Get location of the Configuration Table entries\r
+            conf_table_offset = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x70)\r
+        else:\r
+            # Number of configuration Table entry\r
+            conf_table_entry_count = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x40)
+\r
+            # Get location of the Configuration Table entries\r
+            conf_table_offset = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x44)\r
         \r
         for i in range(0, conf_table_entry_count):\r
-            offset = conf_table_offset + (i * 0x14)\r
+            if edk2_debugger.is_aarch64(self.ec):\r
+                offset = conf_table_offset + (i * 0x18)\r
+            else:\r
+                offset = conf_table_offset + (i * 0x14)\r
             guid = struct.unpack("<IIII", self.ec.getMemoryService().read(str(offset), 16, 32))\r
             if guid == conf_table_guid:\r
                 return self.ec.getMemoryService().readMemory32(offset + 0x10)\r