-#
-# Copyright (c) 2011-2012, ARM Limited. All rights reserved.
-#
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-
-from arm_ds.debugger_v1 import DebugException
-
-import firmware_volume
-import struct
-
-class DebugInfoTable:
- CONST_DEBUG_INFO_TABLE_GUID = ( 0x49152E77L, 0x47641ADAL, 0xFE7AA2B7L, 0x8B5ED9FEL)
-
- DebugInfos = []
-
- def __init__(self, ec, debug_info_table_header_offset):
- self.ec = ec
- self.base = debug_info_table_header_offset
-
- def get_debug_info(self):
- count = self.ec.getMemoryService().readMemory32(self.base + 0x4)
- debug_info_table_base = self.ec.getMemoryService().readMemory32(self.base + 0x8)
-
- self.DebugInfos = []
-
- for i in range(0, count):
- # Get the address of the structure EFI_DEBUG_IMAGE_INFO
- debug_info = self.ec.getMemoryService().readMemory32(debug_info_table_base + (i * 4))
- if debug_info:
- debug_info_type = self.ec.getMemoryService().readMemory32(debug_info)
- # Normal Debug Info Type
- if debug_info_type == 1:
- # Get the base address of the structure EFI_LOADED_IMAGE_PROTOCOL
- loaded_image_protocol = self.ec.getMemoryService().readMemory32(debug_info + 0x4)
-
- image_base = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x20)
- image_size = self.ec.getMemoryService().readMemory32(loaded_image_protocol + 0x28)
-
- self.DebugInfos.append((image_base,image_size))
-
- # Return (base, size)
- def load_symbols_at(self, addr):
- if self.DebugInfos == []:
- self.get_debug_info()
-
- found = False
- for debug_info in self.DebugInfos:
- if (addr >= debug_info[0]) and (addr < debug_info[0] + debug_info[1]):
- section = firmware_volume.EfiSectionPE32(self.ec, debug_info[0])
-
- edk2_debugger.load_symbol_from_file(self.ec, section.get_debug_filepath(), section.get_debug_elfbase())
-
- found = True
- return debug_info
-
- if found == False:
- raise Exception('DebugInfoTable','No symbol found at 0x%x' % addr)
-
- def load_all_symbols(self):
- if self.DebugInfos == []:
- self.get_debug_info()
-
- for debug_info in self.DebugInfos:
- section = firmware_volume.EfiSectionPE32(self.ec, debug_info[0])
-
- edk2_debugger.load_symbol_from_file(self.ec, section.get_debug_filepath(), section.get_debug_elfbase())
-
- def dump(self):
- self.get_debug_info()
- for debug_info in self.DebugInfos:
- base_pe32 = debug_info[0]
- section = firmware_volume.EfiSectionPE32(self.ec, base_pe32)
- print section.get_debug_filepath()
-
-class SystemTable:
- CONST_ST_SIGNATURE = ('I','B','I',' ','S','Y','S','T')
-
- def __init__(self, ec, membase, memsize):
- self.membase = membase
- self.memsize = memsize
- self.ec = ec
-
- found = False
-
- # Start from the top of the memory
- offset = self.membase + self.memsize
- # Align to highest 4MB boundary
- offset = offset & ~0x3FFFFF
- # We should not have a System Table at the top of the System Memory
- offset = offset - 0x400000
-
- # Start at top and look on 4MB boundaries for system table ptr structure
- while offset > self.membase:
- try:
- signature = struct.unpack("cccccccc", self.ec.getMemoryService().read(str(offset), 8, 32))
- except DebugException:
- raise Exception('SystemTable','Fail to access System Memory. Ensure all the memory in the region [0x%x;0x%X] is accessible.' % (membase,membase+memsize))
- if signature == SystemTable.CONST_ST_SIGNATURE:
- found = True
- self.system_table_base = self.ec.getMemoryService().readMemory32(offset + 0x8)
- break
- offset = offset - 0x400000
-
- if not found:
- raise Exception('SystemTable','System Table not found in System Memory [0x%x;0x%X]' % (membase,membase+memsize))
-
- def get_configuration_table(self, conf_table_guid):
- # Number of configuration Table entry
- conf_table_entry_count = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x40)
-
- # Get location of the Configuration Table entries
- conf_table_offset = self.ec.getMemoryService().readMemory32(self.system_table_base + 0x44)
-
- for i in range(0, conf_table_entry_count):
- offset = conf_table_offset + (i * 0x14)
- guid = struct.unpack("<IIII", self.ec.getMemoryService().read(str(offset), 16, 32))
- if guid == conf_table_guid:
- return self.ec.getMemoryService().readMemory32(offset + 0x10)
-
- raise Exception('SystemTable','Configuration Table not found')
+#\r
+# Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
+# \r
+# This program and the accompanying materials \r
+# are licensed and made available under the terms and conditions of the BSD License \r
+# which accompanies this distribution. The full text of the license may be found at \r
+# http://opensource.org/licenses/bsd-license.php \r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+#\r
+\r
+from arm_ds.debugger_v1 import DebugException\r
+\r
+import struct\r
+\r
+import edk2_debugger\r
+import firmware_volume\r
+\r
+class DebugInfoTable:\r
+ CONST_DEBUG_INFO_TABLE_GUID = ( 0x49152E77L, 0x47641ADAL, 0xFE7AA2B7L, 0x8B5ED9FEL)\r
+ \r
+ DebugInfos = []\r
+ \r
+ def __init__(self, ec, debug_info_table_header_offset):\r
+ self.ec = ec\r
+ self.base = debug_info_table_header_offset\r
+ \r
+ def get_debug_info(self):\r
+ count = self.ec.getMemoryService().readMemory32(self.base + 0x4)\r
+ debug_info_table_base = self.ec.getMemoryService().readMemory32(self.base + 0x8)\r
+ \r
+ self.DebugInfos = []\r
+ \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 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
+ \r
+ self.DebugInfos.append((image_base,image_size))\r
+ \r
+ # Return (base, size)\r
+ def load_symbols_at(self, addr):\r
+ if self.DebugInfos == []:\r
+ self.get_debug_info()\r
+ \r
+ 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
+ \r
+ edk2_debugger.load_symbol_from_file(self.ec, section.get_debug_filepath(), section.get_debug_elfbase())\r
+\r
+ found = True\r
+ return debug_info\r
+\r
+ if found == False:\r
+ raise Exception('DebugInfoTable','No symbol found at 0x%x' % addr)\r
+\r
+ def load_all_symbols(self):\r
+ if self.DebugInfos == []:\r
+ self.get_debug_info()\r
+ \r
+ for debug_info in self.DebugInfos:\r
+ section = firmware_volume.EfiSectionPE32(self.ec, debug_info[0])\r
+ \r
+ edk2_debugger.load_symbol_from_file(self.ec, section.get_debug_filepath(), section.get_debug_elfbase())\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
+ print section.get_debug_filepath()\r
+ \r
+class SystemTable:\r
+ CONST_ST_SIGNATURE = ('I','B','I',' ','S','Y','S','T')\r
+ \r
+ def __init__(self, ec, membase, memsize):\r
+ self.membase = membase\r
+ self.memsize = memsize\r
+ self.ec = ec\r
+ \r
+ found = False\r
+ \r
+ # Start from the top of the memory\r
+ offset = self.membase + self.memsize\r
+ # Align to highest 4MB boundary\r
+ offset = offset & ~0x3FFFFF\r
+ # We should not have a System Table at the top of the System Memory\r
+ offset = offset - 0x400000\r
+ \r
+ # Start at top and look on 4MB boundaries for system table ptr structure\r
+ while offset > self.membase:\r
+ try:\r
+ signature = struct.unpack("cccccccc", self.ec.getMemoryService().read(str(offset), 8, 32))\r
+ except DebugException:\r
+ raise Exception('SystemTable','Fail to access System Memory. Ensure all the memory in the region [0x%x;0x%X] is accessible.' % (membase,membase+memsize))\r
+ if signature == SystemTable.CONST_ST_SIGNATURE:\r
+ found = True\r
+ self.system_table_base = self.ec.getMemoryService().readMemory32(offset + 0x8)\r
+ break\r
+ offset = offset - 0x400000\r
+ \r
+ if not found:\r
+ 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
+ \r
+ for i in range(0, conf_table_entry_count):\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
+ \r
+ raise Exception('SystemTable','Configuration Table not found')\r