]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Scripts/Ds5/console_loader.py
ArmPlatformPkg/Scripts: Infer dll load address from console output
[mirror_edk2.git] / ArmPlatformPkg / Scripts / Ds5 / console_loader.py
diff --git a/ArmPlatformPkg/Scripts/Ds5/console_loader.py b/ArmPlatformPkg/Scripts/Ds5/console_loader.py
new file mode 100644 (file)
index 0000000..e9c52d5
--- /dev/null
@@ -0,0 +1,68 @@
+#\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