public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Artem Kopotev" <Artem.Kopotev@arm.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	Artem Kopotev <Artem.Kopotev@arm.com>
Cc: Leif Lindholm <leif@nuviainc.com>,
	Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Sami Mujawar <Sami.Mujawar@arm.com>
Subject: Re: [edk2-devel] [PATCH v1 1/1] ArmPlatformPkg/Scripts: Create add-symbol-file commands from UEFI console
Date: Wed, 14 Jul 2021 09:53:18 +0000	[thread overview]
Message-ID: <DBAPR08MB5557F4EFFF971126E4DF431DF6139@DBAPR08MB5557.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <1688D28138E4C4FE.1864@groups.io>

Hello,

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

Best regards, Artem.

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Artem Kopotev via groups.io
Sent: 15 June 2021 16:11
To: devel@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@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.

      parent reply	other threads:[~2021-07-14  9:53 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-15 15:11 [PATCH v1 0/1] ArmPlatformPkg/Scripts: Create add-symbol-file commands from UEFI console Artem Kopotev
2021-06-15 15:11 ` [PATCH v1 1/1] " Artem Kopotev
2021-06-22 14:49   ` [edk2-devel] " PierreGondois
2021-07-09  9:02     ` PierreGondois
2021-07-19  7:39       ` Ard Biesheuvel
     [not found] ` <1688D28138E4C4FE.1864@groups.io>
2021-07-14  9:53   ` Artem Kopotev [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DBAPR08MB5557F4EFFF971126E4DF431DF6139@DBAPR08MB5557.eurprd08.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox