On Aug 27, 2014, at 7:42 PM, Jordan Justen <[email protected]> wrote:
> It appeared to build fine with gcc 4.9 and gcc 4.4. > Thanks for testing. Andrew Fish > -Jordan > > On Wed, Aug 27, 2014 at 5:53 PM, Andrew Fish <[email protected]> wrote: >> Jordan, >> >> Could you make this change and make sure the BaseTools still compile with >> GCC49? I want to figure out if we can share the flags, or if I need to add >> and if? >> >> cd BaseTools >> make clean >> make >> >> Index: Source/C/Makefiles/header.makefile >> =================================================================== >> --- Source/C/Makefiles/header.makefile (revision 15924) >> +++ Source/C/Makefiles/header.makefile (working copy) >> @@ -41,7 +41,7 @@ >> >> >> >> INCLUDE = $(TOOL_INCLUDE) -I $(MAKEROOT) -I $(MAKEROOT)/Include/Common -I >> $(MAKEROOT)/Include/ -I $(MAKEROOT)/Include/IndustryStandard -I >> $(MAKEROOT)/Common/ -I .. -I . $(ARCH_INCLUDE) >> CPPFLAGS = $(INCLUDE) >> -CFLAGS = -MD -fshort-wchar -fno-strict-aliasing -fno-merge-constants >> -nostdlib -Wall -Werror -c -g >> +CFLAGS = -MD -fshort-wchar -fno-strict-aliasing -Wall -Werror >> -Wno-deprecated-declarations -Wno-self-assign -nostdlib -c -g >> LFLAGS = >> >> >> >> ifeq ($(ARCH), IA32) >> >> Thanks, >> >> Andrew Fish >> >> On Aug 27, 2014, at 4:39 PM, Jordan Justen <[email protected]> wrote: >> >> 0001-EmulatorPkg-Unix-Add-support-for-X11-on-Mac-OS-X-via.patch >> commit message: >> * Line lengths are a bit long >> >> 0002-EmulatorPkg-Unix-Host-Add-LLDB-support-for-Xcode-5.patch >> commit message: >> * Missing Contributed-under/Signed-off-by >> * Line lengths are a bit long >> * hte => the >> * Do you expect the lldb support would work with other toolchains? >> >> 0004-BaseTools-Add-support-for-Xcode5.patch >> commit message: >> * Name misspelled in Signed-off-by. (Maybe look at git commit -s parameter?) >> >> GCC49 >> Tested-by: Jordan Justen <[email protected]> >> >> Reviewed-by: Jordan Justen <[email protected]> >> >> On Wed, Aug 27, 2014 at 3:30 PM, Andrew Fish <[email protected]> wrote: >> >> Jordan, >> >> Here is the updated patch set for the emulator. Please review. >> >> Thanks, >> >> Andrew Fish >> >> >> >> >> >> On Aug 27, 2014, at 10:22 AM, Jordan Justen <[email protected]> wrote: >> >> On Wed, Aug 27, 2014 at 9:50 AM, Andrew Fish <[email protected]> wrote: >> >> >> On Aug 26, 2014, at 11:17 PM, Jordan Justen <[email protected]> wrote: >> >> On Tue, Aug 26, 2014 at 9:34 PM, Andrew Fish <[email protected]> wrote: >> >> EmulatorPkg:Host: Port emulator to Xcode5 >> >> Xcode5 retired gdb, so this patch adds support for using, and loading >> symbols in, lldb. >> >> >> Cool, but I don't think the subject is right: >> -EmulatorPkg:Host: Port emulator to Xcode5 >> +EmulatorPkg Unix Host: Add LLDB support >> >> Well Xcode 5 does not support gdb, and only supports lldb. >> >> >> Right. I just think the lldb support should be the focus, and Xcode 5 >> could be mentioned in the main commit message body as one motivation. >> >> -Jordan >> >> I don't see XCODE5 in the patch. Seems fine to mention in the commit >> message that Xcode5 is the motivation for adding the LLDB support. >> >> Is the new SecGdbScriptBreak call going to cause EmulatorPkg to break >> on each run? Why is that needed? >> >> >> It pushes control to the lldb Python script. Loading symbols dynamically >> allows the setting of breakpoints prior to loading the module. Loading the >> symbols will resolve the breakpoint and activate it. >> The files written by the emulator are not used by lldb. I should probably >> just move the call to SecGdbScriptBreak() out of the if PCD construct that >> defines how the files get written. >> >> Since the breakpoint script is just doing a few reads from the stack it is >> very fast. The emulator runs about the same speed if you load symbols or >> not. >> >> What's the "+ 1" change in the call to SecGdbScriptBreak? >> >> >> StrSize vs. StrLen. So it was a bug. Lldb was only getting Module.dl and not >> Module.dll. >> >> I think the X stuff could be a separate commit from the LLDB part. >> >> >> OK >> >> -Jordan >> >> The lldb script also supports dumping out the build generated guid database >> and it prints guids out with thier Cname if available. lldbefi.py also >> contains some EFI specific type formatters. >> >> Unix/Host/X11IncludeHack is a symbolic link that is need to add the path for >> X11, since it is now an external package. >> X11IncludeHack is a symbolic link to /opt/X11/include >> >> To get X11 to work on a Mac you now have to install XQuartz: >> http://xquartz.macosforge.org >> >> To fully work the -combine needs to be removed from the >> *_XCODE32_X64_CC_FLAGS in BaseTools/Conf/tools_def.template, this will be a >> separate commit. >> >> --- >> EmulatorPkg/Unix/Host/Host.c | 5 +- >> EmulatorPkg/Unix/Host/Host.inf | 2 +- >> EmulatorPkg/Unix/Host/X11IncludeHack | 1 + >> EmulatorPkg/Unix/lldbefi.py | 540 >> +++++++++++++++++++++++++++++++++++ >> EmulatorPkg/Unix/lldbinit | 3 + >> 5 files changed, 549 insertions(+), 2 deletions(-) >> create mode 120000 EmulatorPkg/Unix/Host/X11IncludeHack >> create mode 100755 EmulatorPkg/Unix/lldbefi.py >> create mode 100644 EmulatorPkg/Unix/lldbinit >> >> diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c >> index 7eecbce..480bc54 100644 >> --- a/EmulatorPkg/Unix/Host/Host.c >> +++ b/EmulatorPkg/Unix/Host/Host.c >> @@ -1161,6 +1161,9 @@ GdbScriptAddImage ( >> SymbolsAddr >> ); >> fclose (GdbTempFile); >> + >> + // for lldb call the stub function too >> + SecGdbScriptBreak (ImageContext->PdbPointer, strlen >> (ImageContext->PdbPointer) + 1, (long unsigned >> int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders), 1); >> } else { >> ASSERT (FALSE); >> } >> @@ -1179,7 +1182,7 @@ GdbScriptAddImage ( >> // Target for gdb breakpoint in a script that uses >> gGdbWorkingFileName to set a breakpoint. >> // Hey what can you say scripting in gdb is not that great.... >> // >> - SecGdbScriptBreak (ImageContext->PdbPointer, strlen >> (ImageContext->PdbPointer), (long unsigned int)(ImageContext->ImageAddress + >> ImageContext->SizeOfHeaders), 1); >> + SecGdbScriptBreak (ImageContext->PdbPointer, strlen >> (ImageContext->PdbPointer) + 1, (long unsigned >> int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders), 1); >> } else { >> ASSERT (FALSE); >> } >> diff --git a/EmulatorPkg/Unix/Host/Host.inf b/EmulatorPkg/Unix/Host/Host.inf >> index dee2e0d..f8a4e99 100644 >> --- a/EmulatorPkg/Unix/Host/Host.inf >> +++ b/EmulatorPkg/Unix/Host/Host.inf >> @@ -145,4 +145,4 @@ >> XCODE:*_*_X64_DLINK_PATH == gcc >> XCODE:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext >> -lX11 -framework Carbon >> XCODE:*_*_X64_ASM_FLAGS == -g >> - >> + XCODE:*_*_X64_CC_FLAGS = -include $(DEST_DIR_DEBUG)/AutoGen.h >> -I$(WORKSPACE)/EmulatorPkg/Unix/Host/X11IncludeHack >> diff --git a/EmulatorPkg/Unix/Host/X11IncludeHack >> b/EmulatorPkg/Unix/Host/X11IncludeHack >> new file mode 120000 >> index 0000000..f7ab103 >> --- /dev/null >> +++ b/EmulatorPkg/Unix/Host/X11IncludeHack >> @@ -0,0 +1 @@ >> +/opt/X11/include >> \ No newline at end of file >> diff --git a/EmulatorPkg/Unix/lldbefi.py b/EmulatorPkg/Unix/lldbefi.py >> new file mode 100755 >> index 0000000..64549ce >> --- /dev/null >> +++ b/EmulatorPkg/Unix/lldbefi.py >> @@ -0,0 +1,540 @@ >> +#!/usr/bin/python >> + >> +# >> +# Copyright 2014 Apple Inc. All righes reserved. >> +# >> +# This program and the accompanying materials >> +# are licensed and made available under the terms and conditions of the >> BSD License >> +# which accompanies this distribution. The full text of the license may be >> found at >> +# http://opensource.org/licenses/bsd-license.php. >> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, >> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR >> IMPLIED. >> +# >> + >> +import lldb >> +import os >> +import uuid >> +import string >> +import commands >> +import optparse >> +import shlex >> + >> +guid_dict = {} >> + >> + >> +def EFI_GUID_TypeSummary (valobj,internal_dict): >> + """ Type summary for EFI GUID, print C Name if known >> + """ >> + # typedef struct { >> + # UINT32 Data1; >> + # UINT16 Data2; >> + # UINT16 Data3; >> + # UINT8 Data4[8]; >> + # } EFI_GUID; >> + SBError = lldb.SBError() >> + >> + data1_val = valobj.GetChildMemberWithName('Data1') >> + data1 = data1_val.GetValueAsUnsigned(0) >> + data2_val = valobj.GetChildMemberWithName('Data2') >> + data2 = data2_val.GetValueAsUnsigned(0) >> + data3_val = valobj.GetChildMemberWithName('Data3') >> + data3 = data3_val.GetValueAsUnsigned(0) >> + str = "%x-%x-%x-" % (data1, data2, data3) >> + >> + data4_val = valobj.GetChildMemberWithName('Data4') >> + for i in range (data4_val.num_children): >> + if i == 2: >> + str +='-' >> + str += "%02x" % >> data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0) >> + >> + return guid_dict.get (str.upper(), '') >> + >> + >> + >> +EFI_STATUS_Dict = { >> + (0x8000000000000000 | 1): "Load Error", >> + (0x8000000000000000 | 2): "Invalid Parameter", >> + (0x8000000000000000 | 3): "Unsupported", >> + (0x8000000000000000 | 4): "Bad Buffer Size", >> + (0x8000000000000000 | 5): "Buffer Too Small", >> + (0x8000000000000000 | 6): "Not Ready", >> + (0x8000000000000000 | 7): "Device Error", >> + (0x8000000000000000 | 8): "Write Protected", >> + (0x8000000000000000 | 9): "Out of Resources", >> + (0x8000000000000000 | 10): "Volume Corrupt", >> + (0x8000000000000000 | 11): "Volume Full", >> + (0x8000000000000000 | 12): "No Media", >> + (0x8000000000000000 | 13): "Media changed", >> + (0x8000000000000000 | 14): "Not Found", >> + (0x8000000000000000 | 15): "Access Denied", >> + (0x8000000000000000 | 16): "No Response", >> + (0x8000000000000000 | 17): "No mapping", >> + (0x8000000000000000 | 18): "Time out", >> + (0x8000000000000000 | 19): "Not started", >> + (0x8000000000000000 | 20): "Already started", >> + (0x8000000000000000 | 21): "Aborted", >> + (0x8000000000000000 | 22): "ICMP Error", >> + (0x8000000000000000 | 23): "TFTP Error", >> + (0x8000000000000000 | 24): "Protocol Error", >> + >> + 0 : "Success", >> + 1 : "Warning Unknown Glyph", >> + 2 : "Warning Delete Failure", >> + 3 : "Warning Write Failure", >> + 4 : "Warning Buffer Too Small", >> + >> + (0x80000000 | 1): "Load Error", >> + (0x80000000 | 2): "Invalid Parameter", >> + (0x80000000 | 3): "Unsupported", >> + (0x80000000 | 4): "Bad Buffer Size", >> + (0x80000000 | 5): "Buffer Too Small", >> + (0x80000000 | 6): "Not Ready", >> + (0x80000000 | 7): "Device Error", >> + (0x80000000 | 8): "Write Protected", >> + (0x80000000 | 9): "Out of Resources", >> + (0x80000000 | 10): "Volume Corrupt", >> + (0x80000000 | 11): "Volume Full", >> + (0x80000000 | 12): "No Media", >> + (0x80000000 | 13): "Media changed", >> + (0x80000000 | 14): "Not Found", >> + (0x80000000 | 15): "Access Denied", >> + (0x80000000 | 16): "No Response", >> + (0x80000000 | 17): "No mapping", >> + (0x80000000 | 18): "Time out", >> + (0x80000000 | 19): "Not started", >> + (0x80000000 | 20): "Already started", >> + (0x80000000 | 21): "Aborted", >> + (0x80000000 | 22): "ICMP Error", >> + (0x80000000 | 23): "TFTP Error", >> + (0x80000000 | 24): "Protocol Error", >> +} >> + >> +def EFI_STATUS_TypeSummary (valobj,internal_dict): >> + # >> + # Return summary string for EFI_STATUS from dictionary >> + # >> + Status = valobj.GetValueAsUnsigned(0) >> + return EFI_STATUS_Dict.get (Status, '') >> + >> + >> +def EFI_TPL_TypeSummary (valobj,internal_dict): >> + # >> + # Return TPL values >> + # >> + >> + if valobj.TypeIsPointerType(): >> + return "" >> + >> + Tpl = valobj.GetValueAsUnsigned(0) >> + if Tpl < 4: >> + Str = "%d" % Tpl >> + elif Tpl == 6: >> + Str = "TPL_DRIVER (Obsolete Concept in edk2)" >> + elif Tpl < 8: >> + Str = "TPL_APPLICATION" >> + if Tpl - 4 > 0: >> + Str += " + " + "%d" % (Tpl - 4) >> + elif Tpl < 16: >> + Str = "TPL_CALLBACK" >> + if Tpl - 8 > 0: >> + Str += " + " + "%d" % (Tpl - 4) >> + elif Tpl < 31: >> + Str = "TPL_NOTIFY" >> + if Tpl - 16 > 0: >> + Str += " + " + "%d" % (Tpl - 4) >> + elif Tpl == 31: >> + Str = "TPL_HIGH_LEVEL" >> + else: >> + Str = "Invalid TPL" >> + >> + return Str >> + >> + >> +def CHAR16_TypeSummary (valobj,internal_dict): >> + # >> + # Display EFI CHAR16 'unsigned short' as string >> + # >> + SBError = lldb.SBError() >> + Str = '' >> + if valobj.TypeIsPointerType(): >> + if valobj.GetValueAsUnsigned () == 0: >> + return "NULL" >> + >> + # CHAR16 * max string size 1024 >> + for i in range (1024): >> + Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0) >> + if SBError.fail or Char == 0: >> + break >> + Str += unichr (Char) >> + Str = 'L"' + Str + '"' >> + return Str.encode ('utf-8', 'replace') >> + >> + if valobj.num_children == 0: >> + # CHAR16 >> + if chr (valobj.unsigned) in string.printable: >> + Str = "L'" + unichr (valobj.unsigned) + "'" >> + return Str.encode ('utf-8', 'replace') >> + else: >> + # CHAR16 [] >> + for i in range (valobj.num_children): >> + Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0) >> + if Char == 0: >> + break >> + Str += unichr (Char) >> + Str = 'L"' + Str + '"' >> + return Str.encode ('utf-8', 'replace') >> + >> + return Str >> + >> +def CHAR8_TypeSummary (valobj,internal_dict): >> + # >> + # Display EFI CHAR8 'signed char' as string >> + # unichr() is used as a junk string can produce an error message like >> this: >> + # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in >> position 1: ordinal not in range(128) >> + # >> + SBError = lldb.SBError() >> + Str = '' >> + if valobj.TypeIsPointerType(): >> + if valobj.GetValueAsUnsigned () == 0: >> + return "NULL" >> + >> + # CHAR8 * max string size 1024 >> + for i in range (1024): >> + Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0) >> + if SBError.fail or Char == 0: >> + break >> + Str += unichr (Char) >> + Str = '"' + Str + '"' >> + return Str.encode ('utf-8', 'replace') >> + >> + if valobj.num_children == 0: >> + # CHAR8 >> + if chr (valobj.unsigned) in string.printable: >> + Str = '"' + unichr (valobj.unsigned) + '"' >> + return Str.encode ('utf-8', 'replace') >> + else: >> + # CHAR8 [] >> + for i in range (valobj.num_children): >> + Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0) >> + if Char == 0: >> + break >> + Str += unichr (Char) >> + Str = '"' + Str + '"' >> + return Str.encode ('utf-8', 'replace') >> + >> + return Str >> + >> +device_path_dict = { >> + (0x01, 0x01): "PCI_DEVICE_PATH", >> + (0x01, 0x02): "PCCARD_DEVICE_PATH", >> + (0x01, 0x03): "MEMMAP_DEVICE_PATH", >> + (0x01, 0x04): "VENDOR_DEVICE_PATH", >> + (0x01, 0x05): "CONTROLLER_DEVICE_PATH", >> + (0x02, 0x01): "ACPI_HID_DEVICE_PATH", >> + (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH", >> + (0x02, 0x03): "ACPI_ADR_DEVICE_PATH", >> + (0x03, 0x01): "ATAPI_DEVICE_PATH", >> + (0x03, 0x12): "SATA_DEVICE_PATH", >> + (0x03, 0x02): "SCSI_DEVICE_PATH", >> + (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH", >> + (0x03, 0x04): "F1394_DEVICE_PATH", >> + (0x03, 0x05): "USB_DEVICE_PATH", >> + (0x03, 0x0f): "USB_CLASS_DEVICE_PATH", >> + (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH", >> + (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH", >> + (0x03, 0x06): "I2O_DEVICE_PATH", >> + (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH", >> + (0x03, 0x0c): "IPv4_DEVICE_PATH", >> + (0x03, 0x09): "INFINIBAND_DEVICE_PATH", >> + (0x03, 0x0e): "UART_DEVICE_PATH", >> + (0x03, 0x0a): "VENDOR_DEVICE_PATH", >> + (0x03, 0x13): "ISCSI_DEVICE_PATH", >> + (0x04, 0x01): "HARDDRIVE_DEVICE_PATH", >> + (0x04, 0x02): "CDROM_DEVICE_PATH", >> + (0x04, 0x03): "VENDOR_DEVICE_PATH", >> + (0x04, 0x04): "FILEPATH_DEVICE_PATH", >> + (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH", >> + (0x05, 0x01): "BBS_BBS_DEVICE_PATH", >> + (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL", >> + (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL", >> +} >> + >> +def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict): >> + # >> + # >> + # >> + if valobj.TypeIsPointerType(): >> + # EFI_DEVICE_PATH_PROTOCOL * >> + return "" >> + >> + Str = "" >> + if valobj.num_children == 3: >> + # EFI_DEVICE_PATH_PROTOCOL >> + Type = valobj.GetChildMemberWithName('Type').unsigned >> + SubType = valobj.GetChildMemberWithName('SubType').unsigned >> + if (Type, SubType) in device_path_dict: >> + TypeStr = device_path_dict[Type, SubType] >> + else: >> + TypeStr = "" >> + >> + LenLow = >> valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned >> + LenHigh = >> valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned >> + Len = LenLow + (LenHigh >> 8) >> + >> + Address = long ("%d" % valobj.addr) >> + if (Address == lldb.LLDB_INVALID_ADDRESS): >> + # Need to reserach this, it seems to be the nested struct case >> + ExprStr = "" >> + elif (Type & 0x7f == 0x7f): >> + ExprStr = "End Device Path" if SubType == 0xff else "End This >> Instance" >> + else: >> + ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address) >> + >> + Str = " {\n" >> + Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & >> 0x7f == 0x7f) else "") >> + Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr) >> + Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len) >> + Str += " (UINT8) [0] = 0x%02x\n" % LenLow >> + Str += " (UINT8) [1] = 0x%02x\n" % LenHigh >> + Str += " }\n" >> + if (Type & 0x7f == 0x7f) and (SubType == 0xff): >> + pass >> + elif ExprStr != "": >> + NextNode = Address + Len >> + Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % >> NextNode >> + >> + return Str >> + >> + >> + >> +def TypePrintFormating(debugger): >> + # >> + # Set the default print formating for EFI types in lldb. >> + # seems lldb defaults to decimal. >> + # >> + category = debugger.GetDefaultCategory() >> + FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool) >> + >> + FormatHex = lldb.SBTypeFormat(lldb.eFormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex) >> + >> + >> category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), >> FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), >> FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), >> FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), >> FormatHex) >> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), >> FormatHex) >> + >> + # >> + # Smart type printing for EFI >> + # >> + debugger.HandleCommand("type summary add EFI_GUID --python-function >> lldbefi.EFI_GUID_TypeSummary") >> + debugger.HandleCommand("type summary add EFI_STATUS --python-function >> lldbefi.EFI_STATUS_TypeSummary") >> + debugger.HandleCommand("type summary add EFI_TPL --python-function >> lldbefi.EFI_TPL_TypeSummary") >> + debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL >> --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary") >> + >> + debugger.HandleCommand("type summary add CHAR16 --python-function >> lldbefi.CHAR16_TypeSummary") >> + debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" >> --python-function lldbefi.CHAR16_TypeSummary') >> + debugger.HandleCommand("type summary add CHAR8 --python-function >> lldbefi.CHAR8_TypeSummary") >> + debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" >> --python-function lldbefi.CHAR8_TypeSummary') >> + >> + >> +gEmulatorBreakWorkaroundNeeded = True >> + >> +def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict): >> + # >> + # This is an lldb breakpoint script, and assumes the breakpoint is on a >> + # function with the same prototype as SecGdbScriptBreak(). The >> + # argument names are important as lldb looks them up. >> + # >> + # VOID >> + # SecGdbScriptBreak ( >> + # char *FileName, >> + # int FileNameLength, >> + # long unsigned int LoadAddress, >> + # int AddSymbolFlag >> + # ) >> + # { >> + # return; >> + # } >> + # >> + # When the emulator loads a PE/COFF image, it calls the stub function >> with >> + # the filename of the symbol file, the length of the FileName, the >> + # load address and a flag to indicate if this is a load or unload >> operation >> + # >> + global gEmulatorBreakWorkaroundNeeded >> + >> + if gEmulatorBreakWorkaroundNeeded: >> + # turn off lldb debug prints on SIGALRM (EFI timer tick) >> + frame.thread.process.target.debugger.HandleCommand("process handle >> SIGALRM -n false") >> + gEmulatorBreakWorkaroundNeeded = False >> + >> + # Convert C string to Python string >> + Error = lldb.SBError() >> + FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned() >> + FileNameLen = frame.FindVariable >> ("FileNameLength").GetValueAsUnsigned() >> + FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, >> FileNameLen, Error) >> + if not Error.Success(): >> + print "!ReadCStringFromMemory() did not find a %d byte C string at >> %x" % (FileNameLen, FileNamePtr) >> + # make breakpoint command contiue >> + frame.GetThread().GetProcess().Continue() >> + >> + debugger = frame.thread.process.target.debugger >> + if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1: >> + LoadAddress = frame.FindVariable >> ("LoadAddress").GetValueAsUnsigned() >> + >> + debugger.HandleCommand ("target modules add %s" % FileName) >> + print "target modules load --slid 0x%x %s" % (LoadAddress, >> FileName) >> + debugger.HandleCommand ("target modules load --slide 0x%x --file >> %s" % (LoadAddress, FileName)) >> + else: >> + target = debugger.GetSelectedTarget() >> + for SBModule in target.module_iter(): >> + ModuleName = SBModule.GetFileSpec().GetDirectory() + '/' >> + ModuleName += SBModule.GetFileSpec().GetFilename() >> + if FileName == ModuleName or FileName == >> SBModule.GetFileSpec().GetFilename(): >> + target.ClearModuleLoadAddress (SBModule) >> + if not target.RemoveModule (SBModule): >> + print "!lldb.target.RemoveModule (%s) FAILED" % >> SBModule >> + >> + # make breakpoint command contiue >> + frame.thread.process.Continue() >> + >> +def GuidToCStructStr (guid, Name=False): >> + # >> + # Convert a 16-byte bytesarry (or bytearray compat object) to C guid >> string >> + # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, >> 0x34, 0x7C } } >> + # >> + # Name=True means lookup name in GuidNameDict and us it if you find it >> + # >> + >> + if not isinstance (guid, bytearray): >> + # convert guid object to UUID, and UUID to bytearray >> + Uuid = uuid.UUID(guid) >> + guid = bytearray (Uuid.bytes_le) >> + >> + return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X, { >> 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, >> 0x%02.2X } }" % \ >> + (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], >> guid[6], guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], >> guid[15]) >> + >> +def ParseGuidString(GuidStr): >> + # >> + # Error check and convert C Guid init to string >> + # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B") >> + # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, >> 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }") >> + # >> + >> + if "{" in GuidStr >> : >> + # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, >> 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }" >> + # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1 >> + # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', >> '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1'] >> + Hex = ''.join(x for x in GuidStr if x not in '{,}').split() >> + Str = >> "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \ >> + (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), >> int(Hex[4], 0), \ >> + int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), >> int(Hex[9], 0), int(Hex[10], 0)) >> + elif GuidStr.count('-') == 4: >> + # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form >> + Check = "%s" % str(uuid.UUID(GuidStr)).upper() >> + if GuidStr.upper() == Check: >> + Str = GuidStr.upper() >> + else: >> + Ste = "" >> + else: >> + Str = "" >> + >> + return Str >> + >> + >> +def create_guid_options(): >> + usage = "usage: %prog [data]" >> + description='''lookup EFI_GUID by CName, C struct, or GUID string and >> print out all three. >> + ''' >> + parser = optparse.OptionParser(description=description, >> prog='guid',usage=usage) >> + return parser >> + >> +def efi_guid_command(debugger, command, result, dict): >> + # Use the Shell Lexer to properly parse up command options just like a >> + # shell would >> + command_args = shlex.split(command) >> + parser = create_guid_options() >> + try: >> + (options, args) = parser.parse_args(command_args) >> + if len(args) >= 1: >> + if args[0] == "{": >> + # caller forgot to quote the string" >> + # mark arg[0] a string containing all args[n] >> + args[0] = ' '.join(args) >> + GuidStr = ParseGuidString (args[0]) >> + if GuidStr == "": >> + # return Key of GuidNameDict for value args[0] >> + GuidStr = [Key for Key, Value in guid_dict.iteritems() if >> Value == args[0]][0] >> + GuidStr = GuidStr.upper() >> + except: >> + # if you don't handle exceptions, passing an incorrect argument to >> the OptionParser will cause LLDB to exit >> + # (courtesy of OptParse dealing with argument errors by throwing >> SystemExit) >> + result.SetError ("option parsing failed") >> + return >> + >> + >> + if len(args) >= 1: >> + if GuidStr in guid_dict: >> + print "%s = %s" % (guid_dict[GuidStr], GuidStr) >> + print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr >> (GuidStr)) >> + else: >> + print GuidStr >> + else: >> + # dump entire dictionary >> + width = max(len(v) for k,v in guid_dict.iteritems()) >> + for value in sorted(guid_dict, key=guid_dict.get): >> + print '%-*s %s %s' % (width, guid_dict[value], value, >> GuidToCStructStr(value)) >> + >> + return >> + >> + >> +# >> +########## Code that runs when this script is imported into LLDB >> ########### >> +# >> +def __lldb_init_module (debugger, internal_dict): >> + # This initializer is being run from LLDB in the embedded command >> interpreter >> + # Make the options so we can generate the help text for the new LLDB >> + # command line command prior to registering it with LLDB below >> + >> + global guid_dict >> + >> + # Source Guid.xref file if we can find it >> + inputfile = os.getcwd() >> + inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref' >> + with open(inputfile) as f: >> + for line in f: >> + data = line.split(' ') >> + if len(data) >= 2: >> + guid_dict[data[0].upper()] = data[1].strip('\n') >> + >> + # init EFI specific type formaters >> + TypePrintFormating (debugger) >> + >> + >> + # add guid command >> + parser = create_guid_options() >> + efi_guid_command.__doc__ = parser.format_help() >> + debugger.HandleCommand('command script add -f lldbefi.efi_guid_command >> guid') >> + >> + >> + Target = debugger.GetTargetAtIndex(0) >> + if Target: >> + Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak') >> + if Breakpoint.GetNumLocations() == 1: >> + # Set the emulator breakpoints, if we are in the emulator >> + debugger.HandleCommand("breakpoint command add -s python -F >> lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID())) >> + print 'Type r to run emulator. SecLldbScriptBreak armed. EFI >> modules should now get source level debugging in the emulator.' >> diff --git a/EmulatorPkg/Unix/lldbinit b/EmulatorPkg/Unix/lldbinit >> new file mode 100644 >> index 0000000..16b34e3 >> --- /dev/null >> +++ b/EmulatorPkg/Unix/lldbinit >> @@ -0,0 +1,3 @@ >> +setting set frame-format "frame #${frame.index}: ${frame.pc}{ >> ${module.file.basename}{:${function.name}()${function.pc-offset}}}{ at >> ${line.file.fullpath}:${line.number}}\n" >> +command script import lldbefi.py >> +run >> -- >> 1.8.5.2 (Apple Git-48) >> >> >> ------------------------------------------------------------------------------ >> Slashdot TV. >> Video for Nerds. Stuff that matters. >> http://tv.slashdot.org/ >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> >> ------------------------------------------------------------------------------ >> Slashdot TV. >> Video for Nerds. Stuff that matters. >> http://tv.slashdot.org/ >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> >> >> ------------------------------------------------------------------------------ >> Slashdot TV. >> Video for Nerds. Stuff that matters. >> http://tv.slashdot.org/ >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> >> ------------------------------------------------------------------------------ >> Slashdot TV. >> Video for Nerds. Stuff that matters. >> http://tv.slashdot.org/ >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> >> >> ------------------------------------------------------------------------------ >> Slashdot TV. >> Video for Nerds. Stuff that matters. >> http://tv.slashdot.org/ >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> >> ------------------------------------------------------------------------------ >> Slashdot TV. >> Video for Nerds. Stuff that matters. >> http://tv.slashdot.org/ >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> >> >> ------------------------------------------------------------------------------ >> Slashdot TV. >> Video for Nerds. Stuff that matters. >> http://tv.slashdot.org/ >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> > > ------------------------------------------------------------------------------ > Slashdot TV. > Video for Nerds. Stuff that matters. > http://tv.slashdot.org/ > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
