[edk2-devel] [PATCH v1 1/1] ArmPlatformPkg/Scripts: Create add-symbol-file commands from UEFI console

Artem Kopotev Artem.Kopotev at arm.com
Wed Jul 14 09:53:18 UTC 2021


Hello,

This is the second email, which originally didn't have CC to maintainers.

Best regards, Artem.

-----Original Message-----
From: devel at edk2.groups.io <devel at edk2.groups.io> On Behalf Of Artem Kopotev via groups.io
Sent: 15 June 2021 16:11
To: devel at edk2.groups.io
Subject: [edk2-devel] [PATCH v1 1/1] ArmPlatformPkg/Scripts: Create add-symbol-file commands from UEFI console

cmd_load_symbols.py can only load symbols from FV. Add the possibility to use UEFI console output to calculate dll load address and send add-symbol-file commands directly to ArmDS debugger

dll load address can't be used directly from UEFI output, see comment in
DebugPeCoffExtraActionLib: "This may not work correctly if you generate PE/COFF directly as then the Offset would not be required".

1) Use objdump -S module.dll | grep <_ModuleEntryPoint> to get offset in dll (offset)
2) Use Entrypoint=<address> from UEFI console output (entrypoint)
3) dll load address is (entrypoint)-(offset)

Signed-off-by: Artem Kopotev <artem.kopotev at arm.com>
Change-Id: I3ac5ea761254a346bbb5806fb089b0979419bc01
---
 ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py | 17 ++++-
 ArmPlatformPkg/Scripts/Ds5/console_loader.py   | 68 ++++++++++++++++++++
 2 files changed, 83 insertions(+), 2 deletions(-)

diff --git a/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py b/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py
index de4332edc7d4..89d2f28ba27d 100644
--- a/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py
+++ b/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py
@@ -1,5 +1,5 @@
 #
-#  Copyright (c) 2011-2013, ARM Limited. All rights reserved.
+#  Copyright (c) 2011-2021, Arm Limited. All rights reserved.
 #
 #  SPDX-License-Identifier: BSD-2-Clause-Patent  # @@ -7,6 +7,8 @@  from arm_ds.debugger_v1 import Debugger  from arm_ds.debugger_v1 import DebugException

+from console_loader import load_symbol_from_console
+
 import re, sys, getopt

 import edk2_debugger
@@ -21,12 +23,16 @@ def usage():
     print "-m,--sysmem=(base,size): System Memory region"
     print "-f,--fv=(base,size): Firmware region"
     print "-r,--rom=(base,size): ROM region"
+    print "-i,--input=: Filename for the EDK2 console output"
+    print "-o,--objdump=: Path to the objdump tool"

 verbose = False
 load_all = False
 report_file = None
+input_file = None
+objdump = None
 regions = []
-opts,args = getopt.getopt(sys.argv[1:], "hvar:vm:vr:vf:v", ["help","verbose","all","report=","sysmem=","rom=","fv="])
+opts,args = getopt.getopt(sys.argv[1:], "hvar:i:o:vm:vr:vf:v",
+["help","verbose","all","report=","sysmem=","rom=","fv=","input=","objd
+ump="])
 if (opts is None) or (not opts):
     report_file = '../../../report.log'
 else:
@@ -55,6 +61,10 @@ else:
         elif o in ("-r","--rom"):
             region_type = edk2_debugger.ArmPlatformDebugger.REGION_TYPE_ROM
             regex = region_reg
+        elif o in ("-i","--input"):
+            input_file = a
+        elif o in ("-o", "--objdump"):
+            objdump = a
         else:
             assert False, "Unhandled option (%s)" % o

@@ -94,3 +104,6 @@ except Exception, (ErrorClass, ErrorMessage):
     print "Error(%s): %s" % (ErrorClass, ErrorMessage)  except DebugException, de:
     print "DebugError: %s" % (de.getMessage())
+
+if input_file:
+    load_symbol_from_console(ec, input_file, objdump, verbose)
diff --git a/ArmPlatformPkg/Scripts/Ds5/console_loader.py b/ArmPlatformPkg/Scripts/Ds5/console_loader.py
new file mode 100644
index 000000000000..0ce217876d95
--- /dev/null
+++ b/ArmPlatformPkg/Scripts/Ds5/console_loader.py
@@ -0,0 +1,68 @@
+#
+#  Copyright (c) 2021, Arm Limited. All rights reserved.
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent #
+
+from arm_ds.debugger_v1 import DebugException
+
+import subprocess, os, edk2_debugger, re
+
+def get_module_name(line):
+    path = line.rsplit(' ')[1]
+    return os.path.splitext(os.path.basename(path))[0]
+
+def get_module_path(line):
+    return line.rsplit(' ')[1]
+
+def get_module_entrypoint(list, module_name):
+    line = [i for i in list if module_name in i and re.search(r'\b'+module_name+r'\b', i)]
+    if len(line) == 0:
+        # Module was not loaded using DxeDispatcher or PeiDispatcher. It is a SEC module
+        # Symbols for these modules are loaded from FV, not from console log
+        return None
+
+    entrypoint_str =  line[0].rsplit(' ')[4]
+    return entrypoint_str.rsplit('=')[1]
+
+def load_symbol_from_console(ec, console_file, objdump, verbose):
+    if objdump is None:
+        print "Error: A path to objdump tool is not specified, but -i parameter is provided"
+    elif not os.path.exists(objdump):
+        print "Error: Provided path to objdump is invalid: %s" % objdump
+    elif not os.path.exists(console_file):
+        print "Error: UEFI console file is not found: %s" % console_file
+    else:
+
+        full_list = open(console_file).read().splitlines()
+
+        efi_list = [i for i in full_list if "EntryPoint=" in i]
+
+        full_list = dict.fromkeys(full_list)
+        full_list = [i for i in full_list if "add-symbol-file" in i]
+
+        module_dict = {}
+
+        for line in full_list:
+            name = get_module_name(line)
+            module_dict[name] = (get_module_path(line),
+ get_module_entrypoint(efi_list, name))
+
+        for module in module_dict:
+            entrypoint_addr = module_dict[module][1]
+
+            if entrypoint_addr is not None:
+                path = module_dict[module][0]
+                if not os.path.exists(path):
+                    print "Module not found: " + path + ". Skipping..."
+                    continue
+
+                sp = subprocess.Popen([objdump,'-S', path], stdout =
+ subprocess.PIPE)
+
+                objdump_out = sp.stdout.readlines()
+                entrypoint_record = [i for i in objdump_out if
+ "<_ModuleEntryPoint>" in i]
+
+                entrypoint_offset = entrypoint_record[0].split(' ')[0]
+
+                load_addr = int(entrypoint_addr, 16) -
+ int(entrypoint_offset, 16)
+
+                edk2_debugger.load_symbol_from_file(ec, path,
+ load_addr, verbose)
--
2.17.1






IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#77767): https://edk2.groups.io/g/devel/message/77767
Mute This Topic: https://groups.io/mt/84198031/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list