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

Reply via email to