]> git.proxmox.com Git - mirror_edk2.git/blame - EmulatorPkg/Unix/lldbefi.py
OvmfPkg/IntelTdx: Add SecTdxHelperLib
[mirror_edk2.git] / EmulatorPkg / Unix / lldbefi.py
CommitLineData
79e4f2a5
RN
1#!/usr/bin/python\r
2\r
3#\r
26cfe2c6 4# Copyright 2014 Apple Inc. All rights reserved.\r
79e4f2a5 5#\r
e3ba31da 6# SPDX-License-Identifier: BSD-2-Clause-Patent\r
79e4f2a5
RN
7#\r
8\r
9import lldb\r
10import os\r
11import uuid\r
12import string\r
79e4f2a5
RN
13import optparse\r
14import shlex\r
15\r
16guid_dict = {}\r
17\r
18\r
19def EFI_GUID_TypeSummary (valobj,internal_dict):\r
20 """ Type summary for EFI GUID, print C Name if known\r
21 """\r
22 # typedef struct {\r
23 # UINT32 Data1;\r
24 # UINT16 Data2;\r
25 # UINT16 Data3;\r
26 # UINT8 Data4[8];\r
27 # } EFI_GUID;\r
28 SBError = lldb.SBError()\r
29\r
30 data1_val = valobj.GetChildMemberWithName('Data1')\r
31 data1 = data1_val.GetValueAsUnsigned(0)\r
32 data2_val = valobj.GetChildMemberWithName('Data2')\r
33 data2 = data2_val.GetValueAsUnsigned(0)\r
34 data3_val = valobj.GetChildMemberWithName('Data3')\r
35 data3 = data3_val.GetValueAsUnsigned(0)\r
36 str = "%x-%x-%x-" % (data1, data2, data3)\r
37\r
38 data4_val = valobj.GetChildMemberWithName('Data4')\r
39 for i in range (data4_val.num_children):\r
40 if i == 2:\r
41 str +='-'\r
42 str += "%02x" % data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)\r
43\r
44 return guid_dict.get (str.upper(), '')\r
45\r
46\r
47\r
48EFI_STATUS_Dict = {\r
49 (0x8000000000000000 | 1): "Load Error",\r
50 (0x8000000000000000 | 2): "Invalid Parameter",\r
51 (0x8000000000000000 | 3): "Unsupported",\r
52 (0x8000000000000000 | 4): "Bad Buffer Size",\r
53 (0x8000000000000000 | 5): "Buffer Too Small",\r
54 (0x8000000000000000 | 6): "Not Ready",\r
55 (0x8000000000000000 | 7): "Device Error",\r
56 (0x8000000000000000 | 8): "Write Protected",\r
57 (0x8000000000000000 | 9): "Out of Resources",\r
58 (0x8000000000000000 | 10): "Volume Corrupt",\r
59 (0x8000000000000000 | 11): "Volume Full",\r
60 (0x8000000000000000 | 12): "No Media",\r
61 (0x8000000000000000 | 13): "Media changed",\r
62 (0x8000000000000000 | 14): "Not Found",\r
63 (0x8000000000000000 | 15): "Access Denied",\r
64 (0x8000000000000000 | 16): "No Response",\r
65 (0x8000000000000000 | 17): "No mapping",\r
66 (0x8000000000000000 | 18): "Time out",\r
67 (0x8000000000000000 | 19): "Not started",\r
68 (0x8000000000000000 | 20): "Already started",\r
69 (0x8000000000000000 | 21): "Aborted",\r
70 (0x8000000000000000 | 22): "ICMP Error",\r
71 (0x8000000000000000 | 23): "TFTP Error",\r
72 (0x8000000000000000 | 24): "Protocol Error",\r
73\r
74 0 : "Success",\r
75 1 : "Warning Unknown Glyph",\r
76 2 : "Warning Delete Failure",\r
77 3 : "Warning Write Failure",\r
78 4 : "Warning Buffer Too Small",\r
79\r
80 (0x80000000 | 1): "Load Error",\r
81 (0x80000000 | 2): "Invalid Parameter",\r
82 (0x80000000 | 3): "Unsupported",\r
83 (0x80000000 | 4): "Bad Buffer Size",\r
84 (0x80000000 | 5): "Buffer Too Small",\r
85 (0x80000000 | 6): "Not Ready",\r
86 (0x80000000 | 7): "Device Error",\r
87 (0x80000000 | 8): "Write Protected",\r
88 (0x80000000 | 9): "Out of Resources",\r
89 (0x80000000 | 10): "Volume Corrupt",\r
90 (0x80000000 | 11): "Volume Full",\r
91 (0x80000000 | 12): "No Media",\r
92 (0x80000000 | 13): "Media changed",\r
93 (0x80000000 | 14): "Not Found",\r
94 (0x80000000 | 15): "Access Denied",\r
95 (0x80000000 | 16): "No Response",\r
96 (0x80000000 | 17): "No mapping",\r
97 (0x80000000 | 18): "Time out",\r
98 (0x80000000 | 19): "Not started",\r
99 (0x80000000 | 20): "Already started",\r
100 (0x80000000 | 21): "Aborted",\r
101 (0x80000000 | 22): "ICMP Error",\r
102 (0x80000000 | 23): "TFTP Error",\r
103 (0x80000000 | 24): "Protocol Error",\r
104}\r
105\r
106def EFI_STATUS_TypeSummary (valobj,internal_dict):\r
107 #\r
108 # Return summary string for EFI_STATUS from dictionary\r
109 #\r
110 Status = valobj.GetValueAsUnsigned(0)\r
111 return EFI_STATUS_Dict.get (Status, '')\r
112\r
113\r
114def EFI_TPL_TypeSummary (valobj,internal_dict):\r
115 #\r
116 # Return TPL values\r
117 #\r
118\r
119 if valobj.TypeIsPointerType():\r
120 return ""\r
121\r
122 Tpl = valobj.GetValueAsUnsigned(0)\r
123 if Tpl < 4:\r
124 Str = "%d" % Tpl\r
125 elif Tpl == 6:\r
126 Str = "TPL_DRIVER (Obsolete Concept in edk2)"\r
127 elif Tpl < 8:\r
128 Str = "TPL_APPLICATION"\r
129 if Tpl - 4 > 0:\r
130 Str += " + " + "%d" % (Tpl - 4)\r
131 elif Tpl < 16:\r
132 Str = "TPL_CALLBACK"\r
133 if Tpl - 8 > 0:\r
134 Str += " + " + "%d" % (Tpl - 4)\r
135 elif Tpl < 31:\r
136 Str = "TPL_NOTIFY"\r
137 if Tpl - 16 > 0:\r
138 Str += " + " + "%d" % (Tpl - 4)\r
139 elif Tpl == 31:\r
140 Str = "TPL_HIGH_LEVEL"\r
141 else:\r
142 Str = "Invalid TPL"\r
143\r
144 return Str\r
145\r
146\r
147def CHAR16_TypeSummary (valobj,internal_dict):\r
148 #\r
149 # Display EFI CHAR16 'unsigned short' as string\r
150 #\r
151 SBError = lldb.SBError()\r
152 Str = ''\r
153 if valobj.TypeIsPointerType():\r
154 if valobj.GetValueAsUnsigned () == 0:\r
155 return "NULL"\r
156\r
157 # CHAR16 * max string size 1024\r
158 for i in range (1024):\r
159 Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)\r
160 if SBError.fail or Char == 0:\r
161 break\r
162 Str += unichr (Char)\r
163 Str = 'L"' + Str + '"'\r
164 return Str.encode ('utf-8', 'replace')\r
165\r
166 if valobj.num_children == 0:\r
167 # CHAR16\r
168 if chr (valobj.unsigned) in string.printable:\r
169 Str = "L'" + unichr (valobj.unsigned) + "'"\r
170 return Str.encode ('utf-8', 'replace')\r
171 else:\r
172 # CHAR16 []\r
173 for i in range (valobj.num_children):\r
174 Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)\r
175 if Char == 0:\r
176 break\r
177 Str += unichr (Char)\r
178 Str = 'L"' + Str + '"'\r
179 return Str.encode ('utf-8', 'replace')\r
180\r
181 return Str\r
182\r
183def CHAR8_TypeSummary (valobj,internal_dict):\r
184 #\r
185 # Display EFI CHAR8 'signed char' as string\r
186 # unichr() is used as a junk string can produce an error message like this:\r
187 # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128)\r
188 #\r
189 SBError = lldb.SBError()\r
190 Str = ''\r
191 if valobj.TypeIsPointerType():\r
192 if valobj.GetValueAsUnsigned () == 0:\r
193 return "NULL"\r
194\r
195 # CHAR8 * max string size 1024\r
196 for i in range (1024):\r
197 Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)\r
198 if SBError.fail or Char == 0:\r
199 break\r
200 Str += unichr (Char)\r
201 Str = '"' + Str + '"'\r
202 return Str.encode ('utf-8', 'replace')\r
203\r
204 if valobj.num_children == 0:\r
205 # CHAR8\r
206 if chr (valobj.unsigned) in string.printable:\r
207 Str = '"' + unichr (valobj.unsigned) + '"'\r
208 return Str.encode ('utf-8', 'replace')\r
209 else:\r
210 # CHAR8 []\r
211 for i in range (valobj.num_children):\r
212 Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)\r
213 if Char == 0:\r
214 break\r
215 Str += unichr (Char)\r
216 Str = '"' + Str + '"'\r
217 return Str.encode ('utf-8', 'replace')\r
218\r
219 return Str\r
220\r
221device_path_dict = {\r
222 (0x01, 0x01): "PCI_DEVICE_PATH",\r
223 (0x01, 0x02): "PCCARD_DEVICE_PATH",\r
224 (0x01, 0x03): "MEMMAP_DEVICE_PATH",\r
225 (0x01, 0x04): "VENDOR_DEVICE_PATH",\r
226 (0x01, 0x05): "CONTROLLER_DEVICE_PATH",\r
227 (0x02, 0x01): "ACPI_HID_DEVICE_PATH",\r
228 (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",\r
229 (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",\r
230 (0x03, 0x01): "ATAPI_DEVICE_PATH",\r
231 (0x03, 0x12): "SATA_DEVICE_PATH",\r
232 (0x03, 0x02): "SCSI_DEVICE_PATH",\r
233 (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",\r
234 (0x03, 0x04): "F1394_DEVICE_PATH",\r
235 (0x03, 0x05): "USB_DEVICE_PATH",\r
236 (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",\r
237 (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",\r
238 (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",\r
239 (0x03, 0x06): "I2O_DEVICE_PATH",\r
240 (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",\r
241 (0x03, 0x0c): "IPv4_DEVICE_PATH",\r
242 (0x03, 0x09): "INFINIBAND_DEVICE_PATH",\r
243 (0x03, 0x0e): "UART_DEVICE_PATH",\r
244 (0x03, 0x0a): "VENDOR_DEVICE_PATH",\r
245 (0x03, 0x13): "ISCSI_DEVICE_PATH",\r
246 (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",\r
247 (0x04, 0x02): "CDROM_DEVICE_PATH",\r
248 (0x04, 0x03): "VENDOR_DEVICE_PATH",\r
249 (0x04, 0x04): "FILEPATH_DEVICE_PATH",\r
250 (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",\r
251 (0x05, 0x01): "BBS_BBS_DEVICE_PATH",\r
252 (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",\r
253 (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",\r
254}\r
255\r
256def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):\r
257 #\r
258 #\r
259 #\r
260 if valobj.TypeIsPointerType():\r
261 # EFI_DEVICE_PATH_PROTOCOL *\r
262 return ""\r
263\r
264 Str = ""\r
265 if valobj.num_children == 3:\r
266 # EFI_DEVICE_PATH_PROTOCOL\r
267 Type = valobj.GetChildMemberWithName('Type').unsigned\r
268 SubType = valobj.GetChildMemberWithName('SubType').unsigned\r
269 if (Type, SubType) in device_path_dict:\r
270 TypeStr = device_path_dict[Type, SubType]\r
271 else:\r
272 TypeStr = ""\r
273\r
274 LenLow = valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned\r
275 LenHigh = valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned\r
276 Len = LenLow + (LenHigh >> 8)\r
277\r
278 Address = long ("%d" % valobj.addr)\r
279 if (Address == lldb.LLDB_INVALID_ADDRESS):\r
26cfe2c6 280 # Need to research this, it seems to be the nested struct case\r
79e4f2a5
RN
281 ExprStr = ""\r
282 elif (Type & 0x7f == 0x7f):\r
283 ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"\r
284 else:\r
285 ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)\r
286\r
287 Str = " {\n"\r
288 Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f == 0x7f) else "")\r
289 Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)\r
290 Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)\r
291 Str += " (UINT8) [0] = 0x%02x\n" % LenLow\r
292 Str += " (UINT8) [1] = 0x%02x\n" % LenHigh\r
293 Str += " }\n"\r
294 if (Type & 0x7f == 0x7f) and (SubType == 0xff):\r
295 pass\r
296 elif ExprStr != "":\r
297 NextNode = Address + Len\r
298 Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % NextNode\r
299\r
300 return Str\r
301\r
302\r
303\r
304def TypePrintFormating(debugger):\r
305 #\r
26cfe2c6 306 # Set the default print formatting for EFI types in lldb.\r
79e4f2a5
RN
307 # seems lldb defaults to decimal.\r
308 #\r
309 category = debugger.GetDefaultCategory()\r
310 FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)\r
311 category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool)\r
312\r
313 FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)\r
314 category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)\r
315 category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)\r
316 category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)\r
317 category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)\r
318 category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)\r
319 category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)\r
320 category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)\r
321 category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)\r
322 category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)\r
323 category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)\r
324 category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)\r
325 category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)\r
326\r
327 category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), FormatHex)\r
328 category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), FormatHex)\r
329 category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), FormatHex)\r
330 category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)\r
331 category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)\r
332 category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), FormatHex)\r
333 category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), FormatHex)\r
334\r
335 #\r
336 # Smart type printing for EFI\r
337 #\r
338 debugger.HandleCommand("type summary add EFI_GUID --python-function lldbefi.EFI_GUID_TypeSummary")\r
339 debugger.HandleCommand("type summary add EFI_STATUS --python-function lldbefi.EFI_STATUS_TypeSummary")\r
340 debugger.HandleCommand("type summary add EFI_TPL --python-function lldbefi.EFI_TPL_TypeSummary")\r
341 debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")\r
342\r
343 debugger.HandleCommand("type summary add CHAR16 --python-function lldbefi.CHAR16_TypeSummary")\r
344 debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" --python-function lldbefi.CHAR16_TypeSummary')\r
345 debugger.HandleCommand("type summary add CHAR8 --python-function lldbefi.CHAR8_TypeSummary")\r
346 debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" --python-function lldbefi.CHAR8_TypeSummary')\r
347\r
32e55c9f
AF
348 debugger.HandleCommand(\r
349 'setting set frame-format "frame #${frame.index}: ${frame.pc}'\r
350 '{ ${module.file.basename}{:${function.name}()${function.pc-offset}}}'\r
351 '{ at ${line.file.fullpath}:${line.number}}\n"'\r
352 )\r
79e4f2a5
RN
353\r
354gEmulatorBreakWorkaroundNeeded = True\r
355\r
356def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):\r
357 #\r
358 # This is an lldb breakpoint script, and assumes the breakpoint is on a\r
359 # function with the same prototype as SecGdbScriptBreak(). The\r
360 # argument names are important as lldb looks them up.\r
361 #\r
362 # VOID\r
363 # SecGdbScriptBreak (\r
364 # char *FileName,\r
365 # int FileNameLength,\r
366 # long unsigned int LoadAddress,\r
367 # int AddSymbolFlag\r
368 # )\r
369 # {\r
370 # return;\r
371 # }\r
372 #\r
373 # When the emulator loads a PE/COFF image, it calls the stub function with\r
374 # the filename of the symbol file, the length of the FileName, the\r
375 # load address and a flag to indicate if this is a load or unload operation\r
376 #\r
377 global gEmulatorBreakWorkaroundNeeded\r
378\r
379 if gEmulatorBreakWorkaroundNeeded:\r
380 # turn off lldb debug prints on SIGALRM (EFI timer tick)\r
381 frame.thread.process.target.debugger.HandleCommand("process handle SIGALRM -n false")\r
382 gEmulatorBreakWorkaroundNeeded = False\r
383\r
384 # Convert C string to Python string\r
385 Error = lldb.SBError()\r
386 FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()\r
387 FileNameLen = frame.FindVariable ("FileNameLength").GetValueAsUnsigned()\r
32e55c9f 388\r
79e4f2a5
RN
389 FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, FileNameLen, Error)\r
390 if not Error.Success():\r
7a6e6ae9 391 print("!ReadCStringFromMemory() did not find a %d byte C string at %x" % (FileNameLen, FileNamePtr))\r
26cfe2c6 392 # make breakpoint command continue\r
32e55c9f 393 return False\r
79e4f2a5
RN
394\r
395 debugger = frame.thread.process.target.debugger\r
396 if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:\r
32e55c9f 397 LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned() - 0x240\r
79e4f2a5
RN
398\r
399 debugger.HandleCommand ("target modules add %s" % FileName)\r
7a6e6ae9 400 print("target modules load --slid 0x%x %s" % (LoadAddress, FileName))\r
79e4f2a5
RN
401 debugger.HandleCommand ("target modules load --slide 0x%x --file %s" % (LoadAddress, FileName))\r
402 else:\r
403 target = debugger.GetSelectedTarget()\r
404 for SBModule in target.module_iter():\r
405 ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'\r
406 ModuleName += SBModule.GetFileSpec().GetFilename()\r
407 if FileName == ModuleName or FileName == SBModule.GetFileSpec().GetFilename():\r
408 target.ClearModuleLoadAddress (SBModule)\r
409 if not target.RemoveModule (SBModule):\r
7a6e6ae9 410 print("!lldb.target.RemoveModule (%s) FAILED" % SBModule)\r
79e4f2a5 411\r
26cfe2c6 412 # make breakpoint command continue\r
32e55c9f 413 return False\r
79e4f2a5
RN
414\r
415def GuidToCStructStr (guid, Name=False):\r
416 #\r
26cfe2c6 417 # Convert a 16-byte bytesarray (or bytearray compat object) to C guid string\r
79e4f2a5
RN
418 # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34, 0x7C } }\r
419 #\r
420 # Name=True means lookup name in GuidNameDict and us it if you find it\r
421 #\r
422\r
423 if not isinstance (guid, bytearray):\r
424 # convert guid object to UUID, and UUID to bytearray\r
425 Uuid = uuid.UUID(guid)\r
426 guid = bytearray (Uuid.bytes_le)\r
427\r
428 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 } }" % \\r
429 (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])\r
430\r
431def ParseGuidString(GuidStr):\r
432 #\r
433 # Error check and convert C Guid init to string\r
434 # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")\r
435 # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }")\r
436 #\r
437\r
438 if "{" in GuidStr :\r
439 # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }"\r
440 # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1\r
441 # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']\r
442 Hex = ''.join(x for x in GuidStr if x not in '{,}').split()\r
443 Str = "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \\r
444 (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0), \\r
445 int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0), int(Hex[10], 0))\r
446 elif GuidStr.count('-') == 4:\r
447 # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form\r
448 Check = "%s" % str(uuid.UUID(GuidStr)).upper()\r
449 if GuidStr.upper() == Check:\r
450 Str = GuidStr.upper()\r
451 else:\r
452 Ste = ""\r
453 else:\r
454 Str = ""\r
455\r
456 return Str\r
457\r
458\r
459def create_guid_options():\r
460 usage = "usage: %prog [data]"\r
461 description='''lookup EFI_GUID by CName, C struct, or GUID string and print out all three.\r
462 '''\r
463 parser = optparse.OptionParser(description=description, prog='guid',usage=usage)\r
464 return parser\r
465\r
466def efi_guid_command(debugger, command, result, dict):\r
467 # Use the Shell Lexer to properly parse up command options just like a\r
468 # shell would\r
469 command_args = shlex.split(command)\r
470 parser = create_guid_options()\r
471 try:\r
472 (options, args) = parser.parse_args(command_args)\r
473 if len(args) >= 1:\r
474 if args[0] == "{":\r
475 # caller forgot to quote the string"\r
476 # mark arg[0] a string containing all args[n]\r
477 args[0] = ' '.join(args)\r
478 GuidStr = ParseGuidString (args[0])\r
479 if GuidStr == "":\r
480 # return Key of GuidNameDict for value args[0]\r
481 GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value == args[0]][0]\r
482 GuidStr = GuidStr.upper()\r
483 except:\r
484 # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit\r
485 # (courtesy of OptParse dealing with argument errors by throwing SystemExit)\r
486 result.SetError ("option parsing failed")\r
487 return\r
488\r
489\r
490 if len(args) >= 1:\r
491 if GuidStr in guid_dict:\r
7a6e6ae9
RC
492 print("%s = %s" % (guid_dict[GuidStr], GuidStr))\r
493 print("%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr)))\r
79e4f2a5 494 else:\r
7a6e6ae9 495 print(GuidStr)\r
79e4f2a5
RN
496 else:\r
497 # dump entire dictionary\r
498 width = max(len(v) for k,v in guid_dict.iteritems())\r
499 for value in sorted(guid_dict, key=guid_dict.get):\r
7a6e6ae9 500 print('%-*s %s %s' % (width, guid_dict[value], value, GuidToCStructStr(value)))\r
79e4f2a5
RN
501\r
502 return\r
503\r
504\r
505#\r
506########## Code that runs when this script is imported into LLDB ###########\r
507#\r
508def __lldb_init_module (debugger, internal_dict):\r
509 # This initializer is being run from LLDB in the embedded command interpreter\r
510 # Make the options so we can generate the help text for the new LLDB\r
511 # command line command prior to registering it with LLDB below\r
512\r
513 global guid_dict\r
514\r
515 # Source Guid.xref file if we can find it\r
516 inputfile = os.getcwd()\r
517 inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'\r
518 with open(inputfile) as f:\r
519 for line in f:\r
520 data = line.split(' ')\r
521 if len(data) >= 2:\r
522 guid_dict[data[0].upper()] = data[1].strip('\n')\r
523\r
26cfe2c6 524 # init EFI specific type formatters\r
79e4f2a5
RN
525 TypePrintFormating (debugger)\r
526\r
527\r
528 # add guid command\r
529 parser = create_guid_options()\r
530 efi_guid_command.__doc__ = parser.format_help()\r
531 debugger.HandleCommand('command script add -f lldbefi.efi_guid_command guid')\r
532\r
533\r
534 Target = debugger.GetTargetAtIndex(0)\r
535 if Target:\r
536 Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')\r
537 if Breakpoint.GetNumLocations() == 1:\r
538 # Set the emulator breakpoints, if we are in the emulator\r
539 debugger.HandleCommand("breakpoint command add -s python -F lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))\r
7a6e6ae9 540 print('Type r to run emulator. SecLldbScriptBreak armed. EFI modules should now get source level debugging in the emulator.')\r