#\r
-# Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
+# Copyright (c) 2011-2021, Arm Limited. All rights reserved.\r
#\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
from arm_ds.debugger_v1 import Debugger\r
from arm_ds.debugger_v1 import DebugException\r
\r
+from console_loader import load_symbol_from_console\r
+\r
import re, sys, getopt\r
\r
import edk2_debugger\r
print "-m,--sysmem=(base,size): System Memory region"\r
print "-f,--fv=(base,size): Firmware region"\r
print "-r,--rom=(base,size): ROM region"\r
+ print "-i,--input=: Filename for the EDK2 console output"\r
+ print "-o,--objdump=: Path to the objdump tool"\r
\r
verbose = False\r
load_all = False\r
report_file = None\r
+input_file = None\r
+objdump = None\r
regions = []\r
-opts,args = getopt.getopt(sys.argv[1:], "hvar:vm:vr:vf:v", ["help","verbose","all","report=","sysmem=","rom=","fv="])\r
+opts,args = getopt.getopt(sys.argv[1:], "hvar:i:o:vm:vr:vf:v", ["help","verbose","all","report=","sysmem=","rom=","fv=","input=","objdump="])\r
if (opts is None) or (not opts):\r
report_file = '../../../report.log'\r
else:\r
elif o in ("-r","--rom"):\r
region_type = edk2_debugger.ArmPlatformDebugger.REGION_TYPE_ROM\r
regex = region_reg\r
+ elif o in ("-i","--input"):\r
+ input_file = a\r
+ elif o in ("-o", "--objdump"):\r
+ objdump = a\r
else:\r
assert False, "Unhandled option (%s)" % o\r
\r
print "Error(%s): %s" % (ErrorClass, ErrorMessage)\r
except DebugException, de:\r
print "DebugError: %s" % (de.getMessage())\r
+\r
+if input_file:\r
+ load_symbol_from_console(ec, input_file, objdump, verbose)\r
--- /dev/null
+#\r
+# Copyright (c) 2021, Arm Limited. All rights reserved.\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+\r
+from arm_ds.debugger_v1 import DebugException\r
+\r
+import subprocess, os, edk2_debugger, re\r
+\r
+def get_module_name(line):\r
+ path = line.rsplit(' ')[1]\r
+ return os.path.splitext(os.path.basename(path))[0]\r
+\r
+def get_module_path(line):\r
+ return line.rsplit(' ')[1]\r
+\r
+def get_module_entrypoint(list, module_name):\r
+ line = [i for i in list if module_name in i and re.search(r'\b'+module_name+r'\b', i)]\r
+ if len(line) == 0:\r
+ # Module was not loaded using DxeDispatcher or PeiDispatcher. It is a SEC module\r
+ # Symbols for these modules are loaded from FV, not from console log\r
+ return None\r
+\r
+ entrypoint_str = line[0].rsplit(' ')[4]\r
+ return entrypoint_str.rsplit('=')[1]\r
+\r
+def load_symbol_from_console(ec, console_file, objdump, verbose):\r
+ if objdump is None:\r
+ print "Error: A path to objdump tool is not specified, but -i parameter is provided"\r
+ elif not os.path.exists(objdump):\r
+ print "Error: Provided path to objdump is invalid: %s" % objdump\r
+ elif not os.path.exists(console_file):\r
+ print "Error: UEFI console file is not found: %s" % console_file\r
+ else:\r
+\r
+ full_list = open(console_file).read().splitlines()\r
+\r
+ efi_list = [i for i in full_list if "EntryPoint=" in i]\r
+\r
+ full_list = dict.fromkeys(full_list)\r
+ full_list = [i for i in full_list if "add-symbol-file" in i]\r
+\r
+ module_dict = {}\r
+\r
+ for line in full_list:\r
+ name = get_module_name(line)\r
+ module_dict[name] = (get_module_path(line), get_module_entrypoint(efi_list, name))\r
+\r
+ for module in module_dict:\r
+ entrypoint_addr = module_dict[module][1]\r
+\r
+ if entrypoint_addr is not None:\r
+ path = module_dict[module][0]\r
+ if not os.path.exists(path):\r
+ print "Module not found: " + path + ". Skipping..."\r
+ continue\r
+\r
+ sp = subprocess.Popen([objdump,'-S', path], stdout = subprocess.PIPE)\r
+\r
+ objdump_out = sp.stdout.readlines()\r
+ entrypoint_record = [i for i in objdump_out if "<_ModuleEntryPoint>" in i]\r
+\r
+ entrypoint_offset = entrypoint_record[0].split(' ')[0]\r
+\r
+ load_addr = int(entrypoint_addr, 16) - int(entrypoint_offset, 16)\r
+\r
+ edk2_debugger.load_symbol_from_file(ec, path, load_addr, verbose)\r