mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-29 12:35:53 +01:00
69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
|
#
|
||
|
# 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)
|