]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
UefiCpuPkg/MpInitLib: Enhance waiting for AP initialization logic.
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
CommitLineData
a405b86d 1/** @file\r
2 Provides interface to advanced shell functionality for parsing both handle and protocol database.\r
3\r
d4ec9a57 4 Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
256aa6d0 5 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
8985d612 6 (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>\r
a405b86d 7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include "UefiHandleParsingLib.h"\r
f4f3c6bf 18#include "IndustryStandard/Acpi10.h"\r
66e427fe 19#include "IndustryStandard/Pci.h"\r
f4ac4354
JW
20#include <PiDxe.h>\r
21#include <Protocol/FirmwareVolume2.h>\r
a405b86d 22\r
e7e0e42b 23EFI_HANDLE mHandleParsingHiiHandle = NULL;\r
a405b86d 24HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
d4ec9a57
RN
25GUID_INFO_BLOCK *mGuidList;\r
26UINTN mGuidListCount;\r
f4ac4354
JW
27\r
28/**\r
29 Function to find the file name associated with a LoadedImageProtocol.\r
30\r
31 @param[in] LoadedImage An instance of LoadedImageProtocol.\r
32\r
33 @retval A string representation of the file name associated\r
34 with LoadedImage, or NULL if no name can be found.\r
35**/\r
36CHAR16*\r
37FindLoadedImageFileName (\r
38 IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage\r
39 )\r
40{\r
41 EFI_GUID *NameGuid;\r
42 EFI_STATUS Status;\r
43 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
44 VOID *Buffer;\r
45 UINTN BufferSize;\r
46 UINT32 AuthenticationStatus;\r
47\r
48 if ((LoadedImage == NULL) || (LoadedImage->FilePath == NULL)) {\r
49 return NULL;\r
50 }\r
51\r
52 NameGuid = EfiGetNameGuidFromFwVolDevicePathNode((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath);\r
53\r
54 if (NameGuid == NULL) {\r
55 return NULL;\r
56 }\r
57\r
58 //\r
59 // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.\r
60 //\r
61 Status = gBS->HandleProtocol (LoadedImage->DeviceHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID**) &Fv);\r
62\r
63 //\r
64 // FirmwareVolume2Protocol is PI, and is not required to be available.\r
65 //\r
66 if (EFI_ERROR (Status)) {\r
67 return NULL;\r
68 }\r
69\r
70 //\r
71 // Read the user interface section of the image.\r
72 //\r
73 Buffer = NULL;\r
74 Status = Fv->ReadSection(Fv, NameGuid, EFI_SECTION_USER_INTERFACE, 0, &Buffer, &BufferSize, &AuthenticationStatus);\r
75\r
76 if (EFI_ERROR (Status)) {\r
77 return NULL;\r
78 }\r
79\r
80 //\r
81 // ReadSection returns just the section data, without any section header. For\r
82 // a user interface section, the only data is the file name.\r
83 //\r
84 return Buffer;\r
85}\r
86\r
efb76d1a
JC
87/**\r
88 Function to translate the EFI_MEMORY_TYPE into a string.\r
89\r
90 @param[in] Memory The memory type.\r
91\r
92 @retval A string representation of the type allocated from BS Pool.\r
93**/\r
94CHAR16*\r
efb76d1a
JC
95ConvertMemoryType (\r
96 IN CONST EFI_MEMORY_TYPE Memory\r
97 )\r
98{\r
99 CHAR16 *RetVal;\r
100 RetVal = NULL;\r
101\r
102 switch (Memory) {\r
103 case EfiReservedMemoryType: StrnCatGrow(&RetVal, NULL, L"EfiReservedMemoryType", 0); break;\r
104 case EfiLoaderCode: StrnCatGrow(&RetVal, NULL, L"EfiLoaderCode", 0); break;\r
105 case EfiLoaderData: StrnCatGrow(&RetVal, NULL, L"EfiLoaderData", 0); break;\r
106 case EfiBootServicesCode: StrnCatGrow(&RetVal, NULL, L"EfiBootServicesCode", 0); break;\r
107 case EfiBootServicesData: StrnCatGrow(&RetVal, NULL, L"EfiBootServicesData", 0); break;\r
108 case EfiRuntimeServicesCode: StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesCode", 0); break;\r
109 case EfiRuntimeServicesData: StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesData", 0); break;\r
110 case EfiConventionalMemory: StrnCatGrow(&RetVal, NULL, L"EfiConventionalMemory", 0); break;\r
111 case EfiUnusableMemory: StrnCatGrow(&RetVal, NULL, L"EfiUnusableMemory", 0); break;\r
112 case EfiACPIReclaimMemory: StrnCatGrow(&RetVal, NULL, L"EfiACPIReclaimMemory", 0); break;\r
113 case EfiACPIMemoryNVS: StrnCatGrow(&RetVal, NULL, L"EfiACPIMemoryNVS", 0); break;\r
114 case EfiMemoryMappedIO: StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIO", 0); break;\r
115 case EfiMemoryMappedIOPortSpace: StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIOPortSpace", 0); break;\r
116 case EfiPalCode: StrnCatGrow(&RetVal, NULL, L"EfiPalCode", 0); break;\r
117 case EfiMaxMemoryType: StrnCatGrow(&RetVal, NULL, L"EfiMaxMemoryType", 0); break;\r
118 default: ASSERT(FALSE);\r
119 }\r
120 return (RetVal);\r
121}\r
122\r
609e0c58
JC
123/**\r
124 Function to translate the EFI_GRAPHICS_PIXEL_FORMAT into a string.\r
125\r
9145d314 126 @param[in] Fmt The format type.\r
609e0c58
JC
127\r
128 @retval A string representation of the type allocated from BS Pool.\r
129**/\r
130CHAR16*\r
609e0c58
JC
131ConvertPixelFormat (\r
132 IN CONST EFI_GRAPHICS_PIXEL_FORMAT Fmt\r
133 )\r
134{\r
135 CHAR16 *RetVal;\r
136 RetVal = NULL;\r
137\r
138 switch (Fmt) {\r
139 case PixelRedGreenBlueReserved8BitPerColor: StrnCatGrow(&RetVal, NULL, L"PixelRedGreenBlueReserved8BitPerColor", 0); break;\r
140 case PixelBlueGreenRedReserved8BitPerColor: StrnCatGrow(&RetVal, NULL, L"PixelBlueGreenRedReserved8BitPerColor", 0); break;\r
141 case PixelBitMask: StrnCatGrow(&RetVal, NULL, L"PixelBitMask", 0); break;\r
142 case PixelBltOnly: StrnCatGrow(&RetVal, NULL, L"PixelBltOnly", 0); break;\r
143 case PixelFormatMax: StrnCatGrow(&RetVal, NULL, L"PixelFormatMax", 0); break;\r
144 default: ASSERT(FALSE);\r
145 }\r
146 return (RetVal);\r
147}\r
148\r
a405b86d 149/**\r
150 Constructor for the library.\r
151\r
152 @param[in] ImageHandle Ignored.\r
153 @param[in] SystemTable Ignored.\r
154\r
155 @retval EFI_SUCCESS The operation was successful.\r
156**/\r
157EFI_STATUS\r
158EFIAPI\r
159HandleParsingLibConstructor (\r
160 IN EFI_HANDLE ImageHandle,\r
161 IN EFI_SYSTEM_TABLE *SystemTable\r
162 )\r
163{\r
d4ec9a57
RN
164 mGuidListCount = 0;\r
165 mGuidList = NULL;\r
6306fd90 166\r
e7e0e42b
CP
167 //\r
168 // Do nothing with mHandleParsingHiiHandle. Initialize HII as needed.\r
169 //\r
170 return (EFI_SUCCESS);\r
171}\r
172\r
1a6f74d9 173/**\r
e7e0e42b 174 Initialization function for HII packages.\r
1a6f74d9 175\r
e7e0e42b
CP
176**/\r
177VOID\r
178HandleParsingHiiInit (VOID)\r
179{\r
a405b86d 180 if (mHandleParsingHiiHandle == NULL) {\r
e7e0e42b
CP
181 mHandleParsingHiiHandle = HiiAddPackages (&gHandleParsingHiiGuid, gImageHandle, UefiHandleParsingLibStrings, NULL);\r
182 ASSERT (mHandleParsingHiiHandle != NULL);\r
a405b86d 183 }\r
a405b86d 184}\r
185\r
186/**\r
187 Destructor for the library. free any resources.\r
188\r
189 @param[in] ImageHandle Ignored.\r
190 @param[in] SystemTable Ignored.\r
191\r
192 @retval EFI_SUCCESS The operation was successful.\r
193**/\r
194EFI_STATUS\r
195EFIAPI\r
196HandleParsingLibDestructor (\r
197 IN EFI_HANDLE ImageHandle,\r
198 IN EFI_SYSTEM_TABLE *SystemTable\r
199 )\r
200{\r
6306fd90
JC
201 UINTN LoopCount;\r
202\r
d4ec9a57
RN
203 for (LoopCount = 0; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++) {\r
204 SHELL_FREE_NON_NULL(mGuidList[LoopCount].GuidId);\r
6306fd90
JC
205 }\r
206\r
d4ec9a57 207 SHELL_FREE_NON_NULL(mGuidList);\r
a405b86d 208 if (mHandleParsingHiiHandle != NULL) {\r
209 HiiRemovePackages(mHandleParsingHiiHandle);\r
210 }\r
211 return (EFI_SUCCESS);\r
212}\r
213\r
efb76d1a
JC
214/**\r
215 Function to dump information about LoadedImage.\r
216\r
217 This will allocate the return buffer from boot services pool.\r
218\r
219 @param[in] TheHandle The handle that has LoadedImage installed.\r
220 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
221\r
222 @retval A poitner to a string containing the information.\r
223**/\r
a405b86d 224CHAR16*\r
225EFIAPI\r
226LoadedImageProtocolDumpInformation(\r
227 IN CONST EFI_HANDLE TheHandle,\r
228 IN CONST BOOLEAN Verbose\r
229 )\r
230{\r
efb76d1a 231 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
a405b86d 232 EFI_STATUS Status;\r
efb76d1a
JC
233 CHAR16 *RetVal;\r
234 CHAR16 *Temp;\r
f4ac4354 235 CHAR16 *FileName;\r
4f67a614 236 CHAR8 *PdbFileName;\r
c15323ae 237 CHAR16 *FilePath;\r
efb76d1a
JC
238 CHAR16 *CodeType;\r
239 CHAR16 *DataType;\r
a405b86d 240\r
efb76d1a
JC
241 Status = gBS->OpenProtocol (\r
242 TheHandle,\r
243 &gEfiLoadedImageProtocolGuid,\r
244 (VOID**)&LoadedImage,\r
245 gImageHandle,\r
246 NULL,\r
247 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
248 );\r
249\r
5f119dfc 250 if (EFI_ERROR (Status)) {\r
bbb212af
JW
251 return NULL;\r
252 }\r
253\r
f4ac4354 254 FileName = FindLoadedImageFileName(LoadedImage);\r
4f67a614
HL
255 FilePath = ConvertDevicePathToText(LoadedImage->FilePath, TRUE, TRUE);\r
256 if (!Verbose) {\r
257 if (FileName == NULL) {\r
258 FileName = FilePath;\r
259 } else {\r
260 SHELL_FREE_NON_NULL(FilePath);\r
261 }\r
262 RetVal = CatSPrint(NULL, FileName);\r
263 SHELL_FREE_NON_NULL(FileName);\r
264 return RetVal;\r
265 }\r
f4ac4354 266\r
4f67a614 267 HandleParsingHiiInit();\r
f4ac4354
JW
268 RetVal = NULL;\r
269 if (FileName != NULL) {\r
270 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_NAME), NULL);\r
271\r
272 if (Temp != NULL) {\r
273 RetVal = CatSPrint(NULL, Temp, FileName);\r
274 }\r
275\r
276 SHELL_FREE_NON_NULL(Temp);\r
277 SHELL_FREE_NON_NULL(FileName);\r
278 }\r
279\r
bbb212af
JW
280 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
281 if (Temp == NULL) {\r
5f119dfc
HL
282 return NULL;\r
283 }\r
4f67a614 284 PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);\r
efb76d1a
JC
285 DataType = ConvertMemoryType(LoadedImage->ImageDataType);\r
286 CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);\r
287\r
1a6f74d9 288 RetVal = CatSPrint(\r
f4ac4354 289 RetVal,\r
1a6f74d9
CS
290 Temp,\r
291 LoadedImage->Revision,\r
292 LoadedImage->ParentHandle,\r
293 LoadedImage->SystemTable,\r
294 LoadedImage->DeviceHandle,\r
c15323ae 295 FilePath,\r
4f67a614 296 PdbFileName,\r
1a6f74d9
CS
297 LoadedImage->LoadOptionsSize,\r
298 LoadedImage->LoadOptions,\r
299 LoadedImage->ImageBase,\r
300 LoadedImage->ImageSize,\r
301 CodeType,\r
302 DataType,\r
303 LoadedImage->Unload\r
304 );\r
305\r
306\r
efb76d1a 307 SHELL_FREE_NON_NULL(Temp);\r
c15323ae 308 SHELL_FREE_NON_NULL(FilePath);\r
efb76d1a
JC
309 SHELL_FREE_NON_NULL(CodeType);\r
310 SHELL_FREE_NON_NULL(DataType);\r
311\r
312 return RetVal;\r
a405b86d 313}\r
a405b86d 314\r
609e0c58
JC
315/**\r
316 Function to dump information about GOP.\r
317\r
318 This will allocate the return buffer from boot services pool.\r
319\r
320 @param[in] TheHandle The handle that has LoadedImage installed.\r
321 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
322\r
323 @retval A poitner to a string containing the information.\r
324**/\r
325CHAR16*\r
326EFIAPI\r
327GraphicsOutputProtocolDumpInformation(\r
328 IN CONST EFI_HANDLE TheHandle,\r
329 IN CONST BOOLEAN Verbose\r
330 )\r
331{\r
e918029f
RN
332 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
333 EFI_STATUS Status;\r
334 CHAR16 *RetVal;\r
335 CHAR16 *Temp;\r
336 CHAR16 *Fmt;\r
337 CHAR16 *TempRetVal;\r
338 UINTN GopInfoSize;\r
339 UINT32 Mode;\r
340 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *GopInfo;\r
609e0c58
JC
341\r
342 if (!Verbose) {\r
343 return (CatSPrint(NULL, L"GraphicsOutput"));\r
344 }\r
345\r
e7e0e42b
CP
346 HandleParsingHiiInit();\r
347\r
609e0c58 348 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_GOP_DUMP_MAIN), NULL);\r
1a6f74d9 349 if (Temp == NULL) {\r
609e0c58
JC
350 return NULL;\r
351 }\r
352\r
353 Status = gBS->OpenProtocol (\r
354 TheHandle,\r
355 &gEfiGraphicsOutputProtocolGuid,\r
356 (VOID**)&GraphicsOutput,\r
357 gImageHandle,\r
358 NULL,\r
359 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
360 );\r
361\r
362 if (EFI_ERROR (Status)) {\r
363 SHELL_FREE_NON_NULL (Temp);\r
609e0c58
JC
364 return NULL;\r
365 }\r
366\r
367 Fmt = ConvertPixelFormat(GraphicsOutput->Mode->Info->PixelFormat);\r
368\r
1a6f74d9
CS
369 RetVal = CatSPrint(\r
370 NULL,\r
371 Temp,\r
372 GraphicsOutput->Mode->MaxMode,\r
373 GraphicsOutput->Mode->Mode,\r
374 GraphicsOutput->Mode->FrameBufferBase,\r
375 (UINT64)GraphicsOutput->Mode->FrameBufferSize,\r
376 (UINT64)GraphicsOutput->Mode->SizeOfInfo,\r
377 GraphicsOutput->Mode->Info->Version,\r
378 GraphicsOutput->Mode->Info->HorizontalResolution,\r
379 GraphicsOutput->Mode->Info->VerticalResolution,\r
380 Fmt,\r
381 GraphicsOutput->Mode->Info->PixelsPerScanLine,\r
382 GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.RedMask,\r
383 GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.GreenMask,\r
384 GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.BlueMask\r
385 );\r
386\r
e918029f
RN
387 SHELL_FREE_NON_NULL (Temp);\r
388\r
6d3911d4
QS
389 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_MAIN), NULL);\r
390 if (Temp == NULL) {\r
391 SHELL_FREE_NON_NULL (RetVal);\r
392 goto EXIT;\r
393 }\r
e918029f
RN
394\r
395 TempRetVal = CatSPrint (RetVal, Temp);\r
6d3911d4
QS
396 SHELL_FREE_NON_NULL (RetVal);\r
397 if (TempRetVal == NULL) {\r
398 goto EXIT;\r
399 }\r
e918029f
RN
400 RetVal = TempRetVal;\r
401 SHELL_FREE_NON_NULL (Temp);\r
402\r
6d3911d4
QS
403 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY), NULL);\r
404 if (Temp == NULL) {\r
405 SHELL_FREE_NON_NULL (RetVal);\r
406 goto EXIT;\r
407 }\r
408\r
e918029f
RN
409\r
410 for (Mode = 0; Mode < GraphicsOutput->Mode->MaxMode; Mode++) {\r
411 Status = GraphicsOutput->QueryMode (\r
412 GraphicsOutput,\r
413 Mode,\r
414 &GopInfoSize,\r
415 &GopInfo\r
416 );\r
417 if (EFI_ERROR (Status)) {\r
418 continue;\r
419 }\r
420\r
421 TempRetVal = CatSPrint (\r
422 RetVal,\r
423 Temp,\r
424 Mode,\r
425 GopInfo->HorizontalResolution,\r
426 GopInfo->VerticalResolution\r
427 );\r
428\r
429 SHELL_FREE_NON_NULL (GopInfo);\r
430 SHELL_FREE_NON_NULL (RetVal);\r
431 RetVal = TempRetVal;\r
432 }\r
433\r
6d3911d4
QS
434\r
435EXIT:\r
609e0c58
JC
436 SHELL_FREE_NON_NULL(Temp);\r
437 SHELL_FREE_NON_NULL(Fmt);\r
438\r
439 return RetVal;\r
440}\r
441\r
f4f3c6bf 442/**\r
e918029f
RN
443 Function to dump information about EDID Discovered Protocol.\r
444\r
445 This will allocate the return buffer from boot services pool.\r
446\r
447 @param[in] TheHandle The handle that has LoadedImage installed.\r
448 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
449\r
450 @retval A pointer to a string containing the information.\r
451**/\r
452CHAR16*\r
453EFIAPI\r
454EdidDiscoveredProtocolDumpInformation (\r
455 IN CONST EFI_HANDLE TheHandle,\r
456 IN CONST BOOLEAN Verbose\r
457 )\r
458{\r
459 EFI_EDID_DISCOVERED_PROTOCOL *EdidDiscovered;\r
460 EFI_STATUS Status;\r
461 CHAR16 *RetVal;\r
462 CHAR16 *Temp;\r
463 CHAR16 *TempRetVal;\r
464\r
465 if (!Verbose) {\r
466 return (CatSPrint (NULL, L"EDIDDiscovered"));\r
467 }\r
468\r
469 Status = gBS->OpenProtocol (\r
470 TheHandle,\r
471 &gEfiEdidDiscoveredProtocolGuid,\r
472 (VOID**)&EdidDiscovered,\r
473 NULL,\r
474 NULL,\r
475 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
476 );\r
477\r
478 if (EFI_ERROR (Status)) {\r
479 return NULL;\r
480 }\r
481\r
482 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_MAIN), NULL);\r
483 if (Temp == NULL) {\r
484 return NULL;\r
485 }\r
486\r
487 RetVal = CatSPrint (NULL, Temp, EdidDiscovered->SizeOfEdid);\r
488 SHELL_FREE_NON_NULL (Temp);\r
489\r
490 if (EdidDiscovered->SizeOfEdid != 0) {\r
491 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_DATA), NULL);\r
492 if (Temp == NULL) {\r
493 SHELL_FREE_NON_NULL (RetVal);\r
494 return NULL;\r
495 }\r
496 TempRetVal = CatSPrint (RetVal, Temp);\r
497 SHELL_FREE_NON_NULL (RetVal);\r
498 RetVal = TempRetVal;\r
499\r
79777358 500 TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidDiscovered->SizeOfEdid, EdidDiscovered->Edid);\r
e918029f
RN
501 RetVal = TempRetVal;\r
502 }\r
503 return RetVal;\r
504}\r
505\r
506/**\r
507 Function to dump information about EDID Active Protocol.\r
508\r
509 This will allocate the return buffer from boot services pool.\r
510\r
511 @param[in] TheHandle The handle that has LoadedImage installed.\r
512 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
513\r
514 @retval A pointer to a string containing the information.\r
515**/\r
516CHAR16*\r
517EFIAPI\r
518EdidActiveProtocolDumpInformation (\r
519 IN CONST EFI_HANDLE TheHandle,\r
520 IN CONST BOOLEAN Verbose\r
521 )\r
522{\r
523 EFI_EDID_ACTIVE_PROTOCOL *EdidActive;\r
524 EFI_STATUS Status;\r
525 CHAR16 *RetVal;\r
526 CHAR16 *Temp;\r
527 CHAR16 *TempRetVal;\r
528\r
529 if (!Verbose) {\r
530 return (CatSPrint (NULL, L"EDIDActive"));\r
531 }\r
532\r
533 Status = gBS->OpenProtocol (\r
534 TheHandle,\r
535 &gEfiEdidActiveProtocolGuid,\r
536 (VOID**)&EdidActive,\r
537 NULL,\r
538 NULL,\r
539 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
540 );\r
541\r
542 if (EFI_ERROR (Status)) {\r
543 return NULL;\r
544 }\r
545\r
546 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_MAIN), NULL);\r
547 if (Temp == NULL) {\r
548 return NULL;\r
549 }\r
550\r
551 RetVal = CatSPrint (NULL, Temp, EdidActive->SizeOfEdid);\r
552 SHELL_FREE_NON_NULL (Temp);\r
553\r
554 if (EdidActive->SizeOfEdid != 0) {\r
555 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_DATA), NULL);\r
556 if (Temp == NULL) {\r
557 SHELL_FREE_NON_NULL (RetVal);\r
558 return NULL;\r
559 }\r
560 TempRetVal = CatSPrint (RetVal, Temp);\r
561 SHELL_FREE_NON_NULL (RetVal);\r
562 RetVal = TempRetVal;\r
563\r
79777358 564 TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidActive->SizeOfEdid, EdidActive->Edid);\r
e918029f
RN
565 RetVal = TempRetVal;\r
566 }\r
567 return RetVal;\r
568}\r
569\r
570/**\r
f4f3c6bf 571 Function to dump information about PciRootBridgeIo.\r
572\r
573 This will allocate the return buffer from boot services pool.\r
574\r
575 @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
576 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
577\r
578 @retval A poitner to a string containing the information.\r
579**/\r
580CHAR16*\r
581EFIAPI\r
582PciRootBridgeIoDumpInformation(\r
583 IN CONST EFI_HANDLE TheHandle,\r
584 IN CONST BOOLEAN Verbose\r
585 )\r
586{\r
587 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
588 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration;\r
589 UINT64 Supports;\r
590 UINT64 Attributes;\r
591 CHAR16 *Temp;\r
592 CHAR16 *Temp2;\r
593 CHAR16 *RetVal;\r
594 EFI_STATUS Status;\r
595\r
596 RetVal = NULL;\r
597\r
598 if (!Verbose) {\r
599 return (CatSPrint(NULL, L"PciRootBridgeIo"));\r
600 }\r
601\r
e7e0e42b
CP
602 HandleParsingHiiInit();\r
603\r
f4f3c6bf 604 Status = gBS->HandleProtocol(\r
605 TheHandle,\r
606 &gEfiPciRootBridgeIoProtocolGuid,\r
607 (VOID**)&PciRootBridgeIo);\r
608\r
609 if (EFI_ERROR(Status)) {\r
610 return NULL;\r
611 }\r
612\r
613 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_PH), NULL);\r
1d6ccad2
QS
614 if (Temp == NULL) {\r
615 return NULL;\r
616 }\r
79777358 617 Temp2 = CatSPrint(NULL, Temp, PciRootBridgeIo->ParentHandle);\r
f4f3c6bf 618 FreePool(Temp);\r
619 RetVal = Temp2;\r
620 Temp2 = NULL;\r
1a6f74d9 621\r
f4f3c6bf 622 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL);\r
1d6ccad2
QS
623 if (Temp == NULL) {\r
624 SHELL_FREE_NON_NULL(RetVal);\r
625 return NULL;\r
626 }\r
f4f3c6bf 627 Temp2 = CatSPrint(RetVal, Temp, PciRootBridgeIo->SegmentNumber);\r
628 FreePool(Temp);\r
629 FreePool(RetVal);\r
630 RetVal = Temp2;\r
631 Temp2 = NULL;\r
632\r
633 Supports = 0;\r
634 Attributes = 0;\r
635 Status = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes);\r
636 if (!EFI_ERROR(Status)) {\r
637 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_ATT), NULL);\r
1d6ccad2
QS
638 if (Temp == NULL) {\r
639 SHELL_FREE_NON_NULL(RetVal);\r
640 return NULL;\r
1a6f74d9 641 }\r
f4f3c6bf 642 Temp2 = CatSPrint(RetVal, Temp, Attributes);\r
643 FreePool(Temp);\r
644 FreePool(RetVal);\r
645 RetVal = Temp2;\r
646 Temp2 = NULL;\r
1a6f74d9 647\r
f4f3c6bf 648 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL);\r
1d6ccad2
QS
649 if (Temp == NULL) {\r
650 SHELL_FREE_NON_NULL(RetVal);\r
651 return NULL;\r
652 }\r
f4f3c6bf 653 Temp2 = CatSPrint(RetVal, Temp, Supports);\r
654 FreePool(Temp);\r
655 FreePool(RetVal);\r
656 RetVal = Temp2;\r
657 Temp2 = NULL;\r
658 }\r
659\r
660 Configuration = NULL;\r
661 Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Configuration);\r
662 if (!EFI_ERROR(Status) && Configuration != NULL) {\r
663 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_TITLE), NULL);\r
1d6ccad2
QS
664 if (Temp == NULL) {\r
665 SHELL_FREE_NON_NULL(RetVal);\r
666 return NULL;\r
667 }\r
f4f3c6bf 668 Temp2 = CatSPrint(RetVal, Temp, Supports);\r
669 FreePool(Temp);\r
670 FreePool(RetVal);\r
671 RetVal = Temp2;\r
672 Temp2 = NULL;\r
673 while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {\r
674 Temp = NULL;\r
675 switch (Configuration->ResType) {\r
676 case ACPI_ADDRESS_SPACE_TYPE_MEM:\r
677 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_MEM), NULL);\r
678 break;\r
679 case ACPI_ADDRESS_SPACE_TYPE_IO:\r
680 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_IO), NULL);\r
681 break;\r
682 case ACPI_ADDRESS_SPACE_TYPE_BUS:\r
683 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_BUS), NULL);\r
684 break;\r
685 }\r
686 if (Temp != NULL) {\r
687 Temp2 = CatSPrint(RetVal, L"%s", Temp);\r
688 FreePool(Temp);\r
689 FreePool(RetVal);\r
690 RetVal = Temp2;\r
691 Temp2 = NULL;\r
692 }\r
693\r
1a6f74d9 694 Temp2 = CatSPrint(RetVal,\r
79777358 695 L"\r\n%%H%02x %016lx %016lx %02x%%N",\r
f4f3c6bf 696 Configuration->SpecificFlag,\r
697 Configuration->AddrRangeMin,\r
698 Configuration->AddrRangeMax,\r
699 Configuration->AddrSpaceGranularity\r
700 );\r
701 FreePool(RetVal);\r
702 RetVal = Temp2;\r
703 Temp2 = NULL;\r
704 Configuration++;\r
705 }\r
706 }\r
707 return (RetVal);\r
708}\r
709\r
a405b86d 710/**\r
711 Function to dump information about SimpleTextOut.\r
712\r
713 This will allocate the return buffer from boot services pool.\r
714\r
715 @param[in] TheHandle The handle that has SimpleTextOut installed.\r
716 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
717\r
718 @retval A poitner to a string containing the information.\r
719**/\r
720CHAR16*\r
721EFIAPI\r
722TxtOutProtocolDumpInformation(\r
723 IN CONST EFI_HANDLE TheHandle,\r
724 IN CONST BOOLEAN Verbose\r
725 )\r
726{\r
727 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Dev;\r
728 INTN Index;\r
729 UINTN Col;\r
730 UINTN Row;\r
731 EFI_STATUS Status;\r
732 CHAR16 *RetVal;\r
733 UINTN Size;\r
734 CHAR16 *Temp;\r
735 UINTN NewSize;\r
736\r
737 if (!Verbose) {\r
738 return (NULL);\r
739 }\r
740\r
e7e0e42b
CP
741 HandleParsingHiiInit();\r
742\r
a405b86d 743 RetVal = NULL;\r
744 Size = 0;\r
745\r
746 Status = gBS->HandleProtocol(\r
747 TheHandle,\r
748 &gEfiSimpleTextOutProtocolGuid,\r
749 (VOID**)&Dev);\r
750\r
751 ASSERT_EFI_ERROR(Status);\r
752 ASSERT (Dev != NULL && Dev->Mode != NULL);\r
753\r
754 Size = (Dev->Mode->MaxMode + 1) * 80;\r
755 RetVal = AllocateZeroPool(Size);\r
756\r
757 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_TXT_OUT_DUMP_HEADER), NULL);\r
ecae5117 758 if (Temp != NULL) {\r
759 UnicodeSPrint(RetVal, Size, Temp, Dev, Dev->Mode->Attribute);\r
760 FreePool(Temp);\r
761 }\r
a405b86d 762\r
763 //\r
764 // Dump TextOut Info\r
765 //\r
766 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_TXT_OUT_DUMP_LINE), NULL);\r
767 for (Index = 0; Index < Dev->Mode->MaxMode; Index++) {\r
768 Status = Dev->QueryMode (Dev, Index, &Col, &Row);\r
769 NewSize = Size - StrSize(RetVal);\r
770 UnicodeSPrint(\r
771 RetVal + StrLen(RetVal),\r
772 NewSize,\r
ecae5117 773 Temp == NULL?L"":Temp,\r
a405b86d 774 Index == Dev->Mode->Mode ? L'*' : L' ',\r
775 Index,\r
28981267 776 !EFI_ERROR(Status)?(INTN)Col:-1,\r
777 !EFI_ERROR(Status)?(INTN)Row:-1\r
a405b86d 778 );\r
779 }\r
780 FreePool(Temp);\r
781 return (RetVal);\r
782}\r
783\r
784STATIC CONST UINTN VersionStringSize = 60;\r
785\r
786/**\r
787 Function to dump information about EfiDriverSupportedEfiVersion protocol.\r
788\r
789 This will allocate the return buffer from boot services pool.\r
790\r
791 @param[in] TheHandle The handle that has the protocol installed.\r
792 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
793\r
794 @retval A poitner to a string containing the information.\r
795**/\r
796CHAR16*\r
797EFIAPI\r
798DriverEfiVersionProtocolDumpInformation(\r
799 IN CONST EFI_HANDLE TheHandle,\r
800 IN CONST BOOLEAN Verbose\r
801 )\r
802{\r
803 EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL *DriverEfiVersion;\r
804 EFI_STATUS Status;\r
805 CHAR16 *RetVal;\r
806\r
807 Status = gBS->HandleProtocol(\r
808 TheHandle,\r
809 &gEfiDriverSupportedEfiVersionProtocolGuid,\r
810 (VOID**)&DriverEfiVersion);\r
811\r
812 ASSERT_EFI_ERROR(Status);\r
813\r
78ed876b 814 RetVal = AllocateZeroPool(VersionStringSize);\r
aa3276c1
RN
815 if (RetVal != NULL) {\r
816 UnicodeSPrint (RetVal, VersionStringSize, L"0x%08x", DriverEfiVersion->FirmwareVersion);\r
817 }\r
a405b86d 818 return (RetVal);\r
819}\r
5e32460d
RN
820/**\r
821 Function to convert device path to string.\r
822\r
823 This will allocate the return buffer from boot services pool.\r
824\r
825 @param[in] DevPath Pointer to device path instance.\r
826 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
827 @param[in] Length Maximum allowed text length of the device path.\r
828\r
829 @retval A pointer to a string containing the information.\r
830**/\r
831CHAR16*\r
832ConvertDevicePathToShortText(\r
833 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath,\r
834 IN CONST BOOLEAN Verbose,\r
835 IN CONST UINTN Length\r
836 )\r
837{\r
838 CHAR16 *Temp;\r
839 CHAR16 *Temp2;\r
840 UINTN Size;\r
841\r
842 //\r
843 // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)\r
844 //\r
845 Temp = ConvertDevicePathToText(DevPath, TRUE, TRUE);\r
846 if (!Verbose && Temp != NULL && StrLen(Temp) > Length) {\r
847 Temp2 = NULL;\r
848 Size = 0;\r
849 Temp2 = StrnCatGrow(&Temp2, &Size, L"..", 0);\r
850 Temp2 = StrnCatGrow(&Temp2, &Size, Temp+(StrLen(Temp) - (Length - 2)), 0);\r
851 FreePool(Temp);\r
852 Temp = Temp2;\r
853 }\r
854 return (Temp);\r
855}\r
a405b86d 856\r
f6e0c4b4
HL
857/**\r
858 Function to dump protocol information.\r
859\r
860 This will allocate the return buffer from boot services pool.\r
861\r
862 @param[in] TheHandle The handle that has the protocol installed.\r
863 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
864 @param[in] Protocol The protocol is needed to dump.\r
865\r
866 @retval A pointer to a string containing the information.\r
867**/\r
868STATIC CHAR16*\r
869EFIAPI\r
870DevicePathProtocolDumpInformationEx (\r
871 IN CONST EFI_HANDLE TheHandle,\r
872 IN CONST BOOLEAN Verbose,\r
873 IN EFI_GUID *Protocol\r
874)\r
875{\r
876 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
877 CHAR16 *DevPathStr;\r
878 CHAR16 *DevPathStrTemp;\r
879 UINTN Size;\r
880 EFI_STATUS Status;\r
881 DevPathStr = NULL;\r
882 DevPathStrTemp = NULL;\r
883 Status = gBS->OpenProtocol(TheHandle, Protocol, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
884 if (!EFI_ERROR(Status)) {\r
885 DevPathStr = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
886 if (Verbose) {\r
887 Size = StrSize(DevPathStr) + sizeof(CHAR16) * 2;\r
888 DevPathStrTemp = AllocateZeroPool (Size);\r
889 if (DevPathStrTemp != NULL) {\r
890 StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), L" ", 2);\r
891 StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), DevPathStr, StrLen (DevPathStr));\r
892 }\r
893 FreePool (DevPathStr);\r
894 DevPathStr = DevPathStrTemp;\r
895 }\r
896 gBS->CloseProtocol(TheHandle, Protocol, gImageHandle, NULL);\r
897 }\r
898 return DevPathStr;\r
899}\r
900\r
a405b86d 901/**\r
902 Function to dump information about DevicePath protocol.\r
903\r
904 This will allocate the return buffer from boot services pool.\r
905\r
906 @param[in] TheHandle The handle that has the protocol installed.\r
907 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
908\r
5e32460d 909 @retval A pointer to a string containing the information.\r
a405b86d 910**/\r
911CHAR16*\r
912EFIAPI\r
913DevicePathProtocolDumpInformation(\r
914 IN CONST EFI_HANDLE TheHandle,\r
915 IN CONST BOOLEAN Verbose\r
916 )\r
917{\r
f6e0c4b4 918 return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiDevicePathProtocolGuid);\r
5e32460d
RN
919}\r
920\r
921/**\r
922 Function to dump information about LoadedImageDevicePath protocol.\r
923\r
924 This will allocate the return buffer from boot services pool.\r
925\r
926 @param[in] TheHandle The handle that has the protocol installed.\r
927 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
928\r
929 @retval A pointer to a string containing the information.\r
930**/\r
931CHAR16*\r
932EFIAPI\r
933LoadedImageDevicePathProtocolDumpInformation(\r
934 IN CONST EFI_HANDLE TheHandle,\r
935 IN CONST BOOLEAN Verbose\r
936 )\r
937{\r
f6e0c4b4 938 return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiLoadedImageDevicePathProtocolGuid);\r
a405b86d 939}\r
940\r
d772f5f3
HL
941/**\r
942 Function to dump information about BusSpecificDriverOverride protocol.\r
943\r
944 This will allocate the return buffer from boot services pool.\r
945\r
946 @param[in] TheHandle The handle that has the protocol installed.\r
947 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
948\r
949 @retval A pointer to a string containing the information.\r
950**/\r
951CHAR16*\r
952EFIAPI\r
953BusSpecificDriverOverrideProtocolDumpInformation (\r
954 IN CONST EFI_HANDLE TheHandle,\r
955 IN CONST BOOLEAN Verbose\r
956 )\r
957{\r
958 EFI_STATUS Status;\r
959 CHAR16 *GetString;\r
960 CHAR16 *RetVal;\r
961 CHAR16 *TempRetVal;\r
962 EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
963 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
964 EFI_HANDLE ImageHandle;\r
965 UINTN Size;\r
966\r
967 if (!Verbose) {\r
968 return NULL;\r
969 }\r
970 Size = 0;\r
971 GetString = NULL;\r
972 RetVal = NULL;\r
973 TempRetVal = NULL;\r
974 ImageHandle = 0;\r
975\r
976 Status = gBS->OpenProtocol (\r
977 TheHandle,\r
978 &gEfiBusSpecificDriverOverrideProtocolGuid,\r
979 (VOID**)&BusSpecificDriverOverride,\r
980 gImageHandle,\r
981 NULL,\r
982 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
983 );\r
984 if (EFI_ERROR (Status)) {\r
985 return NULL;\r
986 }\r
987 HandleParsingHiiInit ();\r
988 GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_BSDO_DUMP_MAIN), NULL);\r
989 if (GetString == NULL) {\r
990 return NULL;\r
991 }\r
992 do {\r
993 Status = BusSpecificDriverOverride->GetDriver (\r
994 BusSpecificDriverOverride,\r
995 &ImageHandle\r
996 );\r
997 if (!EFI_ERROR (Status)) {\r
998 Status = gBS->HandleProtocol (\r
999 ImageHandle,\r
1000 &gEfiLoadedImageProtocolGuid,\r
1001 (VOID **) &LoadedImage\r
1002 );\r
1003 if(!EFI_ERROR (Status)) {\r
1004 TempRetVal = CatSPrint (\r
1005 TempRetVal,\r
1006 GetString,\r
1007 ConvertHandleToHandleIndex (ImageHandle),\r
1008 ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE)\r
1009 );\r
1010 StrnCatGrow (&RetVal, &Size, TempRetVal, 0);\r
1011 SHELL_FREE_NON_NULL (TempRetVal);\r
1012 }\r
1013 }\r
1014 } while (!EFI_ERROR (Status));\r
1015\r
1016 SHELL_FREE_NON_NULL (GetString);\r
1017 return RetVal;\r
1018}\r
1019\r
24ac68ef
HL
1020/**\r
1021 Function to dump information about BlockIo protocol.\r
1022\r
1023 This will allocate the return buffer from boot services pool.\r
1024\r
1025 @param[in] TheHandle The handle that has the protocol installed.\r
1026 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1027\r
1028 @retval A pointer to a string containing the information.\r
1029**/\r
1030CHAR16*\r
1031EFIAPI\r
1032BlockIoProtocolDumpInformation (\r
1033 IN CONST EFI_HANDLE TheHandle,\r
1034 IN CONST BOOLEAN Verbose\r
1035 )\r
1036{\r
1037 EFI_STATUS Status;\r
1038 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
1039 EFI_BLOCK_IO_MEDIA *BlockMedia;\r
1040 CHAR16 *GetString;\r
1041 CHAR16 *RetVal;\r
1042\r
1043 if (!Verbose) {\r
1044 return NULL;\r
1045 }\r
1046 GetString = NULL;\r
1047 RetVal = NULL;\r
1048\r
1049 Status = gBS->OpenProtocol (\r
1050 TheHandle,\r
1051 &gEfiBlockIoProtocolGuid,\r
1052 (VOID**)&BlockIo,\r
1053 gImageHandle,\r
1054 NULL,\r
1055 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1056 );\r
1057 if (EFI_ERROR (Status)) {\r
1058 return NULL;\r
1059 }\r
1060 BlockMedia = BlockIo->Media;\r
1061 //\r
1062 // Per spec:\r
1063 // The function (ReadBlocks) must return EFI_NO_MEDIA or\r
1064 // EFI_MEDIA_CHANGED even if LBA, BufferSize, or Buffer are invalid so the caller can probe\r
1065 // for changes in media state.\r
1066 //\r
1067 BlockIo->ReadBlocks (\r
1068 BlockIo,\r
1069 BlockIo->Media->MediaId,\r
1070 0,\r
1071 0,\r
1072 NULL\r
1073 );\r
1074\r
1075 HandleParsingHiiInit ();\r
1076 GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_BLOCKIO_INFO), NULL);\r
1077 if (GetString == NULL) {\r
1078 return NULL;\r
1079 }\r
1080 RetVal = CatSPrint (\r
1081 RetVal,\r
1082 GetString,\r
1083 BlockMedia->RemovableMedia ? L"Removable " : L"Fixed ",\r
1084 BlockMedia->MediaPresent ? L"" : L"not-present ",\r
1085 BlockMedia->MediaId,\r
1086 BlockMedia->BlockSize,\r
1087 BlockMedia->LastBlock,\r
1088 MultU64x32 (BlockMedia->LastBlock + 1, BlockMedia->BlockSize),\r
1089 BlockMedia->LogicalPartition ? L"partition" : L"raw",\r
1090 BlockMedia->ReadOnly ? L"ro" : L"rw",\r
1091 BlockMedia->WriteCaching ? L"cached" : L"!cached"\r
1092 );\r
1093\r
1094 SHELL_FREE_NON_NULL (GetString);\r
1095 return RetVal;\r
1096}\r
1097\r
6fcf7288
HL
1098/**\r
1099 Function to dump information about DebugSupport Protocol.\r
1100\r
1101 @param[in] TheHandle The handle that has the protocol installed.\r
1102 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1103\r
1104 @retval A pointer to a string containing the information.\r
1105**/\r
1106CHAR16*\r
1107EFIAPI\r
1108DebugSupportProtocolDumpInformation (\r
1109 IN CONST EFI_HANDLE TheHandle,\r
1110 IN CONST BOOLEAN Verbose\r
1111 )\r
1112{\r
1113 EFI_STATUS Status;\r
1114 EFI_DEBUG_SUPPORT_PROTOCOL *DebugSupport;\r
1115 CHAR16 *GetString;\r
1116 CHAR16 *RetVal;\r
1117\r
1118 if (!Verbose) {\r
1119 return NULL;\r
1120 }\r
1121 GetString = NULL;\r
1122 RetVal = NULL;\r
1123 Status = gBS->OpenProtocol (\r
1124 TheHandle,\r
1125 &gEfiDebugSupportProtocolGuid,\r
1126 (VOID**)&DebugSupport,\r
1127 gImageHandle,\r
1128 NULL,\r
1129 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1130 );\r
1131 if (EFI_ERROR (Status)) {\r
1132 return NULL;\r
1133 }\r
1134 HandleParsingHiiInit ();\r
1135 GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_DEBUGSUPPORT_INFO), NULL);\r
1136 if (GetString == NULL) {\r
1137 return NULL;\r
1138 }\r
1139 //\r
1140 // Dump Debug support info\r
1141 //\r
1142 switch (DebugSupport->Isa) {\r
1143 case (IsaIa32):\r
1144 RetVal = CatSPrint (RetVal, GetString, L"IA-32");\r
1145 break;\r
1146 case (IsaIpf):\r
1147 RetVal = CatSPrint (RetVal, GetString, L"IPF");\r
1148 break;\r
1149 case (IsaEbc):\r
1150 RetVal = CatSPrint (RetVal, GetString, L"EBC");\r
1151 break;\r
1152 default:\r
1153 SHELL_FREE_NON_NULL (GetString);\r
1154 GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_DEBUGSUPPORT_UNKNOWN), NULL);\r
1155 RetVal = GetString != NULL ? CatSPrint (RetVal, GetString, DebugSupport->Isa) : NULL;\r
1156 break;\r
1157 }\r
1158\r
1159 SHELL_FREE_NON_NULL (GetString);\r
1160 return RetVal;\r
1161}\r
1162\r
66e427fe
HL
1163/**\r
1164 Function to dump information about PciIoProtocol.\r
1165\r
1166 This will allocate the return buffer from boot services pool.\r
1167\r
1168 @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
1169 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1170\r
1171 @retval A poitner to a string containing the information.\r
1172**/\r
1173CHAR16*\r
1174EFIAPI\r
1175PciIoProtocolDumpInformation (\r
1176 IN CONST EFI_HANDLE TheHandle,\r
1177 IN CONST BOOLEAN Verbose\r
1178 )\r
1179{\r
1180 EFI_STATUS Status;\r
1181 EFI_PCI_IO_PROTOCOL *PciIo;\r
1182 PCI_TYPE00 Pci;\r
1183 UINTN Segment;\r
1184 UINTN Bus;\r
1185 UINTN Device;\r
1186 UINTN Function;\r
1187 UINTN Index;\r
1188 CHAR16 *GetString;\r
1189 CHAR16 *TempRetVal;\r
1190 CHAR16 *RetVal;\r
1191\r
1192 if (!Verbose) {\r
1193 return (NULL);\r
1194 }\r
1195 RetVal = NULL;\r
1196 GetString = NULL;\r
1197 TempRetVal = NULL;\r
1198 Status = gBS->OpenProtocol (\r
1199 TheHandle,\r
1200 &gEfiPciIoProtocolGuid,\r
1201 (VOID**)&PciIo,\r
1202 gImageHandle,\r
1203 NULL,\r
1204 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1205 );\r
1206\r
1207 if (EFI_ERROR(Status)) {\r
1208 return NULL;\r
1209 }\r
1210 PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0, sizeof (Pci), &Pci);\r
1211 PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);\r
1212 HandleParsingHiiInit ();\r
1213 GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIIO_DUMP_MAIN), NULL);\r
1214 if (GetString == NULL) {\r
1215 return NULL;\r
1216 }\r
1217 RetVal = CatSPrint (\r
1218 NULL,\r
1219 GetString,\r
1220 Segment,\r
1221 Bus,\r
1222 Device,\r
1223 Function,\r
1224 PciIo->RomSize,\r
1225 PciIo->RomImage,\r
1226 Pci.Hdr.VendorId,\r
1227 Pci.Hdr.DeviceId,\r
1228 Pci.Hdr.ClassCode[0],\r
1229 Pci.Hdr.ClassCode[1],\r
1230 Pci.Hdr.ClassCode[2]\r
1231 );\r
1232 for (Index = 0; Index < sizeof (Pci); Index ++) {\r
1233 if ((Index % 0x10) == 0) {\r
1234 TempRetVal = CatSPrint (RetVal, L"\r\n %02x", *((UINT8 *) (&Pci) + Index));\r
1235 } else {\r
1236 TempRetVal = CatSPrint (RetVal, L"%02x", *((UINT8 *) (&Pci) + Index));\r
1237 }\r
1238 FreePool (RetVal);\r
1239 RetVal = TempRetVal;\r
1240 TempRetVal = NULL;\r
1241 }\r
1242\r
1243 FreePool(GetString);\r
1244 return RetVal;\r
1245}\r
1246\r
719c2348
HL
1247/**\r
1248 Function to dump information about UsbIoProtocol.\r
1249\r
1250 This will allocate the return buffer from boot services pool.\r
1251\r
1252 @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
1253 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1254\r
1255 @retval A poitner to a string containing the information.\r
1256**/\r
1257CHAR16*\r
1258EFIAPI\r
1259UsbIoProtocolDumpInformation (\r
1260 IN CONST EFI_HANDLE TheHandle,\r
1261 IN CONST BOOLEAN Verbose\r
1262 )\r
1263{\r
1264 EFI_STATUS Status;\r
1265 EFI_USB_IO_PROTOCOL *UsbIo;\r
1266 EFI_USB_INTERFACE_DESCRIPTOR InterfaceDesc;\r
1267 CHAR16 *GetString;\r
1268 CHAR16 *RetVal;\r
1269\r
1270 if (!Verbose) {\r
1271 return (NULL);\r
1272 }\r
1273 RetVal = NULL;\r
1274 GetString = NULL;\r
1275 Status = gBS->OpenProtocol (\r
1276 TheHandle,\r
1277 &gEfiUsbIoProtocolGuid,\r
1278 (VOID**)&UsbIo,\r
1279 gImageHandle,\r
1280 NULL,\r
1281 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1282 );\r
1283\r
1284 if (EFI_ERROR(Status)) {\r
1285 return NULL;\r
1286 }\r
1287 UsbIo->UsbGetInterfaceDescriptor (UsbIo, &InterfaceDesc);\r
1288 HandleParsingHiiInit ();\r
1289 GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_USBIO_DUMP_MAIN), NULL);\r
1290 if (GetString == NULL) {\r
1291 return NULL;\r
1292 }\r
1293 RetVal = CatSPrint (\r
1294 NULL,\r
1295 GetString,\r
1296 InterfaceDesc.InterfaceNumber,\r
1297 InterfaceDesc.InterfaceClass,\r
1298 InterfaceDesc.InterfaceSubClass,\r
1299 InterfaceDesc.InterfaceProtocol\r
1300 );\r
1301\r
1302 FreePool (GetString);\r
1303 return RetVal;\r
1304}\r
1305\r
59febea1
SEHM
1306/**\r
1307 Function to dump information about EfiAdapterInformation Protocol.\r
1308\r
1309 @param[in] TheHandle The handle that has the protocol installed.\r
1310 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1311\r
1312 @retval A pointer to a string containing the information.\r
1313**/\r
1314CHAR16*\r
1315EFIAPI\r
1316AdapterInformationDumpInformation (\r
1317 IN CONST EFI_HANDLE TheHandle,\r
1318 IN CONST BOOLEAN Verbose\r
1319 )\r
1320{\r
1321 EFI_STATUS Status;\r
1322 EFI_ADAPTER_INFORMATION_PROTOCOL *EfiAdptrInfoProtocol;\r
1323 UINTN InfoTypesBufferCount;\r
1324 UINTN GuidIndex;\r
1325 EFI_GUID *InfoTypesBuffer;\r
1326 CHAR16 *GuidStr;\r
1327 CHAR16 *TempStr;\r
1328 CHAR16 *RetVal;\r
1a6f74d9 1329 CHAR16 *TempRetVal;\r
59febea1
SEHM
1330 VOID *InformationBlock;\r
1331 UINTN InformationBlockSize;\r
1a6f74d9 1332\r
59febea1
SEHM
1333 if (!Verbose) {\r
1334 return (CatSPrint(NULL, L"AdapterInfo"));\r
1335 }\r
1336\r
1d6ccad2
QS
1337 InfoTypesBuffer = NULL;\r
1338 InformationBlock = NULL;\r
1a6f74d9 1339\r
59febea1
SEHM
1340\r
1341 Status = gBS->OpenProtocol (\r
1342 (EFI_HANDLE) (TheHandle),\r
1343 &gEfiAdapterInformationProtocolGuid,\r
1344 (VOID **) &EfiAdptrInfoProtocol,\r
1345 NULL,\r
1346 NULL,\r
1347 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1348 );\r
1349\r
1350 if (EFI_ERROR (Status)) {\r
59febea1
SEHM
1351 return NULL;\r
1352 }\r
1353\r
1354 //\r
1355 // Get a list of supported information types for this instance of the protocol.\r
1356 //\r
1357 Status = EfiAdptrInfoProtocol->GetSupportedTypes (\r
1358 EfiAdptrInfoProtocol,\r
1a6f74d9 1359 &InfoTypesBuffer,\r
59febea1
SEHM
1360 &InfoTypesBufferCount\r
1361 );\r
1a6f74d9 1362 RetVal = NULL;\r
59febea1
SEHM
1363 if (EFI_ERROR (Status)) {\r
1364 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GET_SUPP_TYPES_FAILED), NULL);\r
1d6ccad2 1365 if (TempStr != NULL) {\r
1a6f74d9 1366 RetVal = CatSPrint (NULL, TempStr, Status);\r
1d6ccad2
QS
1367 } else {\r
1368 goto ERROR_EXIT;\r
1a6f74d9 1369 }\r
59febea1
SEHM
1370 } else {\r
1371 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_SUPP_TYPE_HEADER), NULL);\r
1d6ccad2
QS
1372 if (TempStr == NULL) {\r
1373 goto ERROR_EXIT;\r
1374 }\r
1a6f74d9 1375 RetVal = CatSPrint (NULL, TempStr);\r
59febea1
SEHM
1376 SHELL_FREE_NON_NULL (TempStr);\r
1377\r
1378 for (GuidIndex = 0; GuidIndex < InfoTypesBufferCount; GuidIndex++) {\r
1379 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GUID_NUMBER), NULL);\r
1d6ccad2
QS
1380 if (TempStr == NULL) {\r
1381 goto ERROR_EXIT;\r
1382 }\r
5d54bbec 1383 TempRetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), &InfoTypesBuffer[GuidIndex]);\r
1a6f74d9
CS
1384 SHELL_FREE_NON_NULL (RetVal);\r
1385 RetVal = TempRetVal;\r
59febea1
SEHM
1386 SHELL_FREE_NON_NULL (TempStr);\r
1387\r
1388 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GUID_STRING), NULL);\r
1d6ccad2
QS
1389 if (TempStr == NULL) {\r
1390 goto ERROR_EXIT;\r
1391 }\r
59febea1
SEHM
1392\r
1393 if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
1a6f74d9
CS
1394 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoMediaStateGuid");\r
1395 SHELL_FREE_NON_NULL (RetVal);\r
1396 RetVal = TempRetVal;\r
59febea1 1397 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
1a6f74d9
CS
1398 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoNetworkBootGuid");\r
1399 SHELL_FREE_NON_NULL (RetVal);\r
1400 RetVal = TempRetVal;\r
59febea1 1401 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid)) {\r
1a6f74d9
CS
1402 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoSanMacAddressGuid");\r
1403 SHELL_FREE_NON_NULL (RetVal);\r
1404 RetVal = TempRetVal;\r
256aa6d0
SEHM
1405 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid)) {\r
1406 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoUndiIpv6SupportGuid");\r
1407 SHELL_FREE_NON_NULL (RetVal);\r
1408 RetVal = TempRetVal;\r
59febea1
SEHM
1409 } else {\r
1410\r
1411 GuidStr = GetStringNameFromGuid (&InfoTypesBuffer[GuidIndex], NULL);\r
0e88348e
RN
1412 if (GuidStr == NULL) {\r
1413 TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");\r
1414 SHELL_FREE_NON_NULL (RetVal);\r
1415 RetVal = TempRetVal;\r
1a6f74d9 1416\r
0e88348e
RN
1417 SHELL_FREE_NON_NULL (TempStr);\r
1418 SHELL_FREE_NON_NULL(GuidStr);\r
1419 //\r
1420 // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP\r
1421 //\r
1422 continue;\r
1423 } else {\r
1424 TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);\r
1425 SHELL_FREE_NON_NULL (RetVal);\r
1426 RetVal = TempRetVal;\r
1427 SHELL_FREE_NON_NULL(GuidStr);\r
59febea1
SEHM
1428 }\r
1429 }\r
1a6f74d9 1430\r
59febea1
SEHM
1431 SHELL_FREE_NON_NULL (TempStr);\r
1432\r
1433 Status = EfiAdptrInfoProtocol->GetInformation (\r
1434 EfiAdptrInfoProtocol,\r
1435 &InfoTypesBuffer[GuidIndex],\r
1436 &InformationBlock,\r
1437 &InformationBlockSize\r
1438 );\r
1439\r
1440 if (EFI_ERROR (Status)) {\r
1441 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GETINFO_FAILED), NULL);\r
1d6ccad2
QS
1442 if (TempStr == NULL) {\r
1443 goto ERROR_EXIT;\r
1444 }\r
1a6f74d9
CS
1445 TempRetVal = CatSPrint (RetVal, TempStr, Status);\r
1446 SHELL_FREE_NON_NULL (RetVal);\r
1447 RetVal = TempRetVal;\r
59febea1
SEHM
1448 } else {\r
1449 if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
1450 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_MEDIA_STATE), NULL);\r
1d6ccad2
QS
1451 if (TempStr == NULL) {\r
1452 goto ERROR_EXIT;\r
1453 }\r
1a6f74d9
CS
1454 TempRetVal = CatSPrint (\r
1455 RetVal,\r
1456 TempStr,\r
1457 ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState,\r
1458 ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState\r
1459 );\r
1460 SHELL_FREE_NON_NULL (RetVal);\r
1461 RetVal = TempRetVal;\r
59febea1
SEHM
1462 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
1463 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_NETWORK_BOOT_INFO), NULL);\r
1d6ccad2
QS
1464 if (TempStr == NULL) {\r
1465 goto ERROR_EXIT;\r
1466 }\r
1a6f74d9
CS
1467 TempRetVal = CatSPrint (\r
1468 RetVal,\r
1469 TempStr,\r
1470 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4BootCapablity,\r
1471 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6BootCapablity,\r
1472 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBootCapablity,\r
1473 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->OffloadCapability,\r
1474 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiMpioCapability,\r
1475 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4Boot,\r
1476 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6Boot,\r
1477 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBoot\r
1478 );\r
1479 SHELL_FREE_NON_NULL (RetVal);\r
1480 RetVal = TempRetVal;\r
1481 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid) == TRUE) {\r
59febea1 1482 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_SAN_MAC_ADDRESS_INFO), NULL);\r
1d6ccad2
QS
1483 if (TempStr == NULL) {\r
1484 goto ERROR_EXIT;\r
1485 }\r
1a6f74d9
CS
1486 TempRetVal = CatSPrint (\r
1487 RetVal,\r
1488 TempStr,\r
1489 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[0],\r
1490 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[1],\r
1491 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[2],\r
1492 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[3],\r
1493 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[4],\r
1494 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[5]\r
1495 );\r
1496 SHELL_FREE_NON_NULL (RetVal);\r
1497 RetVal = TempRetVal;\r
256aa6d0
SEHM
1498 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid) == TRUE) {\r
1499 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_UNDI_IPV6_INFO), NULL);\r
1500 if (TempStr == NULL) {\r
1501 goto ERROR_EXIT;\r
1502 }\r
1503\r
1504 TempRetVal = CatSPrint (\r
1505 RetVal,\r
1506 TempStr,\r
1507 ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InformationBlock)->Ipv6Support\r
e918029f 1508 );\r
256aa6d0
SEHM
1509 SHELL_FREE_NON_NULL (RetVal);\r
1510 RetVal = TempRetVal;\r
59febea1
SEHM
1511 } else {\r
1512 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_UNKNOWN_INFO_TYPE), NULL);\r
1d6ccad2
QS
1513 if (TempStr == NULL) {\r
1514 goto ERROR_EXIT;\r
1515 }\r
1a6f74d9
CS
1516 TempRetVal = CatSPrint (RetVal, TempStr, &InfoTypesBuffer[GuidIndex]);\r
1517 SHELL_FREE_NON_NULL (RetVal);\r
1518 RetVal = TempRetVal;\r
59febea1
SEHM
1519 }\r
1520 }\r
1521 SHELL_FREE_NON_NULL (TempStr);\r
1522 SHELL_FREE_NON_NULL (InformationBlock);\r
1523 }\r
1524 }\r
1525\r
1d6ccad2 1526 SHELL_FREE_NON_NULL (InfoTypesBuffer);\r
59febea1 1527 return RetVal;\r
1d6ccad2
QS
1528\r
1529ERROR_EXIT:\r
1530 SHELL_FREE_NON_NULL (RetVal);\r
1531 SHELL_FREE_NON_NULL (InfoTypesBuffer);\r
1532 SHELL_FREE_NON_NULL (InformationBlock);\r
1533 return NULL;\r
59febea1 1534}\r
8985d612
TS
1535\r
1536/**\r
1537 Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL Protocol.\r
1538\r
1539 @param[in] TheHandle The handle that has the protocol installed.\r
1540 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1541\r
1542 @retval A pointer to a string containing the information.\r
1543**/\r
1544CHAR16*\r
1545EFIAPI\r
1546FirmwareManagementDumpInformation (\r
1547 IN CONST EFI_HANDLE TheHandle,\r
1548 IN CONST BOOLEAN Verbose\r
1549 )\r
1550{\r
1551 EFI_STATUS Status;\r
1552 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *EfiFwMgmtProtocol;\r
1553 EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo;\r
1554 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1 *ImageInfoV1;\r
1555 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2 *ImageInfoV2;\r
1556 UINT64 AttributeSetting;\r
1557 UINTN ImageInfoSize;\r
1558 UINTN DescriptorSize;\r
1559 UINT32 DescriptorVersion;\r
1560 UINT32 PackageVersion;\r
1561 UINT8 DescriptorCount;\r
1562 UINT8 Index;\r
1563 UINT8 Index1;\r
1564 UINT8 ImageCount;\r
1565 CHAR16 *PackageVersionName;\r
1566 CHAR16 *TempStr;\r
1567 CHAR16 *RetVal;\r
1568 CHAR16 *TempRetVal;\r
1569 CHAR16 *AttributeSettingStr;\r
1570 BOOLEAN Found;\r
1571 BOOLEAN AttributeSupported;\r
1572\r
1573 //\r
1574 // Initialize local variables\r
1575 //\r
1576 ImageCount = 0;\r
1577 ImageInfoSize = 1;\r
1578 AttributeSetting = 0;\r
1579 Found = FALSE;\r
1580 AttributeSupported = FALSE;\r
1581 ImageInfo = NULL;\r
1582 ImageInfoV1 = NULL;\r
1583 ImageInfoV2 = NULL;\r
1584 PackageVersionName = NULL;\r
1585 RetVal = NULL;\r
1586 TempRetVal = NULL;\r
1587 TempStr = NULL;\r
1588 AttributeSettingStr = NULL;\r
1589\r
1590 if (!Verbose) {\r
1591 return (CatSPrint(NULL, L"FirmwareManagement"));\r
1592 }\r
1593\r
1594 Status = gBS->OpenProtocol (\r
1595 (EFI_HANDLE) (TheHandle),\r
1596 &gEfiFirmwareManagementProtocolGuid,\r
1597 (VOID **) &EfiFwMgmtProtocol,\r
1598 NULL,\r
1599 NULL,\r
1600 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1601 );\r
1602\r
1603 if (EFI_ERROR (Status)) {\r
1604 return NULL;\r
1605 }\r
1606\r
1607 Status = EfiFwMgmtProtocol->GetImageInfo (\r
1608 EfiFwMgmtProtocol,\r
1609 &ImageInfoSize,\r
1610 ImageInfo,\r
1611 &DescriptorVersion,\r
1612 &DescriptorCount,\r
1613 &DescriptorSize,\r
1614 &PackageVersion,\r
1615 &PackageVersionName\r
1616 );\r
1617\r
1618 if (Status == EFI_BUFFER_TOO_SMALL) {\r
1619 ImageInfo = AllocateZeroPool (ImageInfoSize);\r
1620\r
1621 if (ImageInfo == NULL) {\r
1622 Status = EFI_OUT_OF_RESOURCES;\r
1623 } else {\r
1624 Status = EfiFwMgmtProtocol->GetImageInfo (\r
1625 EfiFwMgmtProtocol,\r
1626 &ImageInfoSize,\r
1627 ImageInfo,\r
1628 &DescriptorVersion,\r
1629 &DescriptorCount,\r
1630 &DescriptorSize,\r
1631 &PackageVersion,\r
1632 &PackageVersionName\r
1633 );\r
1634 }\r
1635 }\r
1636\r
1637 if (EFI_ERROR (Status)) {\r
1638 goto ERROR_EXIT;\r
1639 }\r
1640\r
1641 //\r
1642 // Decode Image Descriptor data only if its version is supported\r
1643 //\r
1644 if (DescriptorVersion <= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) {\r
1645\r
1646 if (ImageInfo == NULL) {\r
1647 goto ERROR_EXIT;\r
1648 }\r
1649\r
1650 ImageInfoV1 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1 *)ImageInfo;\r
1651 ImageInfoV2 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2 *)ImageInfo;\r
1652\r
1653 //\r
1654 // Set ImageInfoSize in return buffer\r
1655 //\r
1656 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_INFO_SIZE), NULL);\r
1657 if (TempStr == NULL) {\r
1658 goto ERROR_EXIT;\r
1659 }\r
1660 RetVal = CatSPrint (NULL, TempStr, ImageInfoSize);\r
1661 SHELL_FREE_NON_NULL (TempStr);\r
1662\r
1663 //\r
1664 // Set DescriptorVersion in return buffer\r
1665 //\r
1666 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_VERSION), NULL);\r
1667 if (TempStr == NULL) {\r
1668 goto ERROR_EXIT;\r
1669 }\r
1670 TempRetVal = CatSPrint (RetVal, TempStr, DescriptorVersion);\r
1671 SHELL_FREE_NON_NULL (RetVal);\r
1672 RetVal = TempRetVal;\r
1673 SHELL_FREE_NON_NULL (TempStr);\r
1674\r
1675 //\r
1676 // Set DescriptorCount in return buffer\r
1677 //\r
1678 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_COUNT), NULL);\r
1679 if (TempStr == NULL) {\r
1680 goto ERROR_EXIT;\r
1681 }\r
1682 TempRetVal = CatSPrint (RetVal, TempStr, DescriptorCount);\r
1683 SHELL_FREE_NON_NULL (RetVal);\r
1684 RetVal = TempRetVal;\r
1685 SHELL_FREE_NON_NULL (TempStr);\r
1686\r
1687\r
1688 //\r
1689 // Set DescriptorSize in return buffer\r
1690 //\r
1691 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_SIZE), NULL);\r
1692 if (TempStr == NULL) {\r
1693 goto ERROR_EXIT;\r
1694 }\r
1695 TempRetVal = CatSPrint (RetVal, TempStr, DescriptorSize);\r
1696 SHELL_FREE_NON_NULL (RetVal);\r
1697 RetVal = TempRetVal;\r
1698 SHELL_FREE_NON_NULL (TempStr);\r
1699\r
1700 //\r
1701 // Set PackageVersion in return buffer\r
1702 //\r
1703 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_PACKAGE_VERSION), NULL);\r
1704 if (TempStr == NULL) {\r
1705 goto ERROR_EXIT;\r
1706 }\r
1707 TempRetVal = CatSPrint (RetVal, TempStr, PackageVersion);\r
1708 SHELL_FREE_NON_NULL (RetVal);\r
1709 RetVal = TempRetVal;\r
1710 SHELL_FREE_NON_NULL (TempStr);\r
1711\r
1712 //\r
1713 // Set PackageVersionName in return buffer\r
1714 //\r
1715 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_PACKAGE_VERSION_NAME), NULL);\r
1716 if (TempStr == NULL) {\r
1717 goto ERROR_EXIT;\r
1718 }\r
1719 TempRetVal = CatSPrint (RetVal, TempStr, PackageVersionName);\r
1720 SHELL_FREE_NON_NULL (RetVal);\r
1721 RetVal = TempRetVal;\r
1722 SHELL_FREE_NON_NULL (TempStr);\r
1723\r
1724 for (Index = 0; Index < DescriptorCount; Index++) {\r
1725 //\r
1726 // First check if Attribute is supported\r
1727 // and generate a string for AttributeSetting field\r
1728 //\r
1729 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1730 AttributeSupported = FALSE;\r
1731 AttributeSetting = 0;\r
1732 if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
1733 if (ImageInfoV1[Index].AttributesSupported != 0x0) {\r
1734 AttributeSupported = TRUE;\r
1735 AttributeSetting = ImageInfoV1[Index].AttributesSetting;\r
1736 }\r
1737 } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
1738 if (ImageInfoV2[Index].AttributesSupported != 0x0) {\r
1739 AttributeSupported = TRUE;\r
1740 AttributeSetting = ImageInfoV2[Index].AttributesSetting;\r
1741 }\r
1742 } else {\r
1743 if (ImageInfo[Index].AttributesSupported != 0x0) {\r
1744 AttributeSupported = TRUE;\r
1745 AttributeSetting = ImageInfo[Index].AttributesSetting;\r
1746 }\r
1747 }\r
1748\r
1749 if (!AttributeSupported) {\r
1750 AttributeSettingStr = CatSPrint (NULL, L"None");\r
1751 } else {\r
1752 AttributeSettingStr = CatSPrint (NULL, L"(");\r
1753\r
ac14846a 1754 if ((AttributeSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE) != 0x0) {\r
8985d612
TS
1755 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");\r
1756 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1757 AttributeSettingStr = TempRetVal;\r
1758 }\r
ac14846a 1759 if ((AttributeSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0x0) {\r
8985d612
TS
1760 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_RESET_REQUIRED");\r
1761 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1762 AttributeSettingStr = TempRetVal;\r
1763 }\r
ac14846a 1764 if ((AttributeSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED) != 0x0) {\r
8985d612
TS
1765 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");\r
1766 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1767 AttributeSettingStr = TempRetVal;\r
1768 }\r
ac14846a 1769 if ((AttributeSetting & IMAGE_ATTRIBUTE_IN_USE) != 0x0) {\r
8985d612
TS
1770 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IN_USE");\r
1771 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1772 AttributeSettingStr = TempRetVal;\r
1773 }\r
ac14846a 1774 if ((AttributeSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE) != 0x0) {\r
8985d612
TS
1775 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_UEFI_IMAGE");\r
1776 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1777 AttributeSettingStr = TempRetVal;\r
1778 }\r
1779 TempRetVal = CatSPrint (AttributeSettingStr, L" )");\r
1780 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1781 AttributeSettingStr = TempRetVal;\r
1782 }\r
1783\r
1784 if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
1785 if (ImageInfoV1[Index].ImageIndex != 0x0) {\r
1786 ImageCount++;\r
1787 }\r
1788\r
1789 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V1), NULL);\r
1790 if (TempStr == NULL) {\r
1791 goto ERROR_EXIT;\r
1792 }\r
1793 TempRetVal = CatSPrint (\r
1794 RetVal,\r
1795 TempStr,\r
1796 Index,\r
1797 ImageInfoV1[Index].ImageIndex,\r
e06a4c08 1798 &ImageInfoV1[Index].ImageTypeId,\r
8985d612
TS
1799 ImageInfoV1[Index].ImageId,\r
1800 ImageInfoV1[Index].ImageIdName,\r
1801 ImageInfoV1[Index].Version,\r
1802 ImageInfoV1[Index].VersionName,\r
1803 ImageInfoV1[Index].Size,\r
1804 ImageInfoV1[Index].AttributesSupported,\r
1805 AttributeSettingStr,\r
1806 ImageInfoV1[Index].Compatibilities\r
1807 );\r
1808 SHELL_FREE_NON_NULL (RetVal);\r
1809 RetVal = TempRetVal;\r
1810 SHELL_FREE_NON_NULL (TempStr);\r
1811 } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
1812 if (ImageInfoV2[Index].ImageIndex != 0x0) {\r
1813 ImageCount++;\r
1814 }\r
1815\r
1816 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V2), NULL);\r
1817 if (TempStr == NULL) {\r
1818 goto ERROR_EXIT;\r
1819 }\r
1820 TempRetVal = CatSPrint (\r
1821 RetVal,\r
1822 TempStr,\r
1823 Index,\r
1824 ImageInfoV2[Index].ImageIndex,\r
e06a4c08 1825 &ImageInfoV2[Index].ImageTypeId,\r
8985d612
TS
1826 ImageInfoV2[Index].ImageId,\r
1827 ImageInfoV2[Index].ImageIdName,\r
1828 ImageInfoV2[Index].Version,\r
1829 ImageInfoV2[Index].VersionName,\r
1830 ImageInfoV2[Index].Size,\r
1831 ImageInfoV2[Index].AttributesSupported,\r
1832 AttributeSettingStr,\r
1833 ImageInfoV2[Index].Compatibilities,\r
1834 ImageInfoV2[Index].LowestSupportedImageVersion\r
1835 );\r
1836 SHELL_FREE_NON_NULL (RetVal);\r
1837 RetVal = TempRetVal;\r
1838 SHELL_FREE_NON_NULL (TempStr);\r
1839 } else {\r
1840 if (ImageInfo[Index].ImageIndex != 0x0) {\r
1841 ImageCount++;\r
1842 }\r
1843\r
1844 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO), NULL);\r
1845 if (TempStr == NULL) {\r
1846 goto ERROR_EXIT;\r
1847 }\r
1848 TempRetVal = CatSPrint (\r
1849 RetVal,\r
1850 TempStr,\r
1851 Index,\r
1852 ImageInfo[Index].ImageIndex,\r
e06a4c08 1853 &ImageInfo[Index].ImageTypeId,\r
8985d612
TS
1854 ImageInfo[Index].ImageId,\r
1855 ImageInfo[Index].ImageIdName,\r
1856 ImageInfo[Index].Version,\r
1857 ImageInfo[Index].VersionName,\r
1858 ImageInfo[Index].Size,\r
1859 ImageInfo[Index].AttributesSupported,\r
1860 AttributeSettingStr,\r
1861 ImageInfo[Index].Compatibilities,\r
1862 ImageInfo[Index].LowestSupportedImageVersion,\r
1863 ImageInfo[Index].LastAttemptVersion,\r
1864 ImageInfo[Index].LastAttemptStatus,\r
1865 ImageInfo[Index].HardwareInstance\r
1866 );\r
1867 SHELL_FREE_NON_NULL (RetVal);\r
1868 RetVal = TempRetVal;\r
1869 SHELL_FREE_NON_NULL (TempStr);\r
1870 }\r
1871 }\r
1872 }\r
1873\r
1874 if (ImageCount > 0) {\r
1875 for (Index=0; Index<DescriptorCount; Index++) {\r
1876 for (Index1=Index+1; Index1<DescriptorCount; Index1++) {\r
1877 if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
1878 if (ImageInfoV1[Index].ImageId == ImageInfoV1[Index1].ImageId) {\r
1879 Found = TRUE;\r
1880 //\r
1881 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
1882 //\r
1883 goto ENDLOOP;\r
1884 }\r
1885 } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
1886 if (ImageInfoV2[Index].ImageId == ImageInfoV2[Index1].ImageId) {\r
1887 Found = TRUE;\r
1888 //\r
1889 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
1890 //\r
1891 goto ENDLOOP;\r
1892 }\r
1893 } else {\r
1894 if (ImageInfo[Index].ImageId == ImageInfo[Index1].ImageId) {\r
1895 Found = TRUE;\r
1896 //\r
1897 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
1898 //\r
1899 goto ENDLOOP;\r
1900 }\r
1901 }\r
1902 }\r
1903 }\r
1904 }\r
1905\r
1906ENDLOOP:\r
1907 //\r
1908 // Check if ImageId with duplicate value was found\r
1909 //\r
ac14846a 1910 if (Found) {\r
8985d612
TS
1911 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGEID_NON_UNIQUE), NULL);\r
1912 if (TempStr == NULL) {\r
1913 goto ERROR_EXIT;\r
1914 }\r
1915 TempRetVal = CatSPrint (RetVal, TempStr);\r
1916 SHELL_FREE_NON_NULL (RetVal);\r
1917 RetVal = TempRetVal;\r
1918 SHELL_FREE_NON_NULL (TempStr);\r
1919 }\r
1920\r
1921 SHELL_FREE_NON_NULL (ImageInfo);\r
1922 SHELL_FREE_NON_NULL (PackageVersionName);\r
1923 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1924\r
1925 return RetVal;\r
1926\r
1927ERROR_EXIT:\r
1928 SHELL_FREE_NON_NULL (RetVal);\r
1929 SHELL_FREE_NON_NULL (ImageInfo);\r
1930 SHELL_FREE_NON_NULL (PackageVersionName);\r
1931 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1932\r
1933 return NULL;\r
1934}\r
1935\r
770f3f61
HW
1936/**\r
1937 Function to dump information about Partition Information protocol.\r
1938\r
1939 This will allocate the return buffer from boot services pool.\r
1940\r
1941 @param[in] TheHandle The handle that has the protocol installed.\r
1942 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1943\r
1944 @retval A pointer to a string containing the information.\r
1945**/\r
1946CHAR16*\r
1947EFIAPI\r
1948PartitionInfoProtocolDumpInformation (\r
1949 IN CONST EFI_HANDLE TheHandle,\r
1950 IN CONST BOOLEAN Verbose\r
1951 )\r
1952{\r
1953 EFI_STATUS Status;\r
1954 EFI_PARTITION_INFO_PROTOCOL *PartitionInfo;\r
1955 CHAR16 *PartitionType;\r
1956 CHAR16 *EfiSystemPartition;\r
1957 CHAR16 *RetVal;\r
1958\r
1959 if (!Verbose) {\r
1960 return NULL;\r
1961 }\r
1962\r
1963 Status = gBS->OpenProtocol (\r
1964 TheHandle,\r
1965 &gEfiPartitionInfoProtocolGuid,\r
1966 (VOID**)&PartitionInfo,\r
1967 gImageHandle,\r
1968 NULL,\r
1969 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1970 );\r
1971 if (EFI_ERROR (Status)) {\r
1972 return NULL;\r
1973 }\r
1974\r
1975 HandleParsingHiiInit ();\r
1976\r
1977 switch (PartitionInfo->Type) {\r
1978 case PARTITION_TYPE_OTHER:\r
1979 PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_TYPE_OTHER), NULL);\r
1980 break;\r
1981 case PARTITION_TYPE_MBR:\r
1982 PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_TYPE_MBR), NULL);\r
1983 break;\r
1984 case PARTITION_TYPE_GPT:\r
1985 PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_TYPE_GPT), NULL);\r
1986 break;\r
1987 default:\r
1988 PartitionType = NULL;\r
1989 break;\r
1990 }\r
1991 if (PartitionType == NULL) {\r
1992 return NULL;\r
1993 }\r
1994\r
1995 if (PartitionInfo->System == 1) {\r
1996 EfiSystemPartition = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_EFI_SYS_PART), NULL);\r
1997 } else {\r
1998 EfiSystemPartition = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_NOT_EFI_SYS_PART), NULL);\r
1999 }\r
2000 if (EfiSystemPartition == NULL) {\r
2001 SHELL_FREE_NON_NULL (PartitionType);\r
2002 return NULL;\r
2003 }\r
2004\r
2005 RetVal = CatSPrint (\r
2006 NULL,\r
2007 L"%s\r\n%s",\r
2008 PartitionType,\r
2009 EfiSystemPartition\r
2010 );\r
2011\r
2012 SHELL_FREE_NON_NULL (EfiSystemPartition);\r
2013 SHELL_FREE_NON_NULL (PartitionType);\r
2014 return RetVal;\r
2015}\r
2016\r
a405b86d 2017//\r
2018// Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg\r
2019//\r
2020#define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \\r
2021 { \\r
ce68d3bc 2022 0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
a405b86d 2023 }\r
2024\r
2025#define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \\r
2026 { \\r
ce68d3bc 2027 0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
a405b86d 2028 }\r
2029\r
2030#define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \\r
2031 { \\r
ce68d3bc 2032 0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
a405b86d 2033 }\r
2034STATIC CONST EFI_GUID WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID;\r
2035STATIC CONST EFI_GUID WinNtIoProtocolGuid = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;\r
2036STATIC CONST EFI_GUID WinNtSerialPortGuid = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID;\r
2037\r
2c23ddaa 2038//\r
2039// Deprecated protocols we dont want to link from IntelFrameworkModulePkg\r
2040//\r
2041#define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \\r
2042 { \\r
2043 0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \\r
1a6f74d9 2044 }\r
2c23ddaa 2045#define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \\r
2046 { \\r
2047 0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \\r
2048 }\r
2049STATIC CONST EFI_GUID EfiIsaIoProtocolGuid = LOCAL_EFI_ISA_IO_PROTOCOL_GUID;\r
2050STATIC CONST EFI_GUID EfiIsaAcpiProtocolGuid = LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID;\r
2051\r
2052\r
dee34318 2053STATIC CONST GUID_INFO_BLOCK mGuidStringListNT[] = {\r
a405b86d 2054 {STRING_TOKEN(STR_WINNT_THUNK), (EFI_GUID*)&WinNtThunkProtocolGuid, NULL},\r
2055 {STRING_TOKEN(STR_WINNT_DRIVER_IO), (EFI_GUID*)&WinNtIoProtocolGuid, NULL},\r
2056 {STRING_TOKEN(STR_WINNT_SERIAL_PORT), (EFI_GUID*)&WinNtSerialPortGuid, NULL},\r
0e88348e 2057 {0, NULL, NULL},\r
a405b86d 2058};\r
2059\r
dee34318 2060STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {\r
efb76d1a 2061 {STRING_TOKEN(STR_LOADED_IMAGE), &gEfiLoadedImageProtocolGuid, LoadedImageProtocolDumpInformation},\r
a405b86d 2062 {STRING_TOKEN(STR_DEVICE_PATH), &gEfiDevicePathProtocolGuid, DevicePathProtocolDumpInformation},\r
5e32460d 2063 {STRING_TOKEN(STR_IMAGE_PATH), &gEfiLoadedImageDevicePathProtocolGuid, LoadedImageDevicePathProtocolDumpInformation},\r
a405b86d 2064 {STRING_TOKEN(STR_DEVICE_PATH_UTIL), &gEfiDevicePathUtilitiesProtocolGuid, NULL},\r
2065 {STRING_TOKEN(STR_DEVICE_PATH_TXT), &gEfiDevicePathToTextProtocolGuid, NULL},\r
2066 {STRING_TOKEN(STR_DEVICE_PATH_FTXT), &gEfiDevicePathFromTextProtocolGuid, NULL},\r
2067 {STRING_TOKEN(STR_DEVICE_PATH_PC), &gEfiPcAnsiGuid, NULL},\r
2068 {STRING_TOKEN(STR_DEVICE_PATH_VT100), &gEfiVT100Guid, NULL},\r
2069 {STRING_TOKEN(STR_DEVICE_PATH_VT100P), &gEfiVT100PlusGuid, NULL},\r
2070 {STRING_TOKEN(STR_DEVICE_PATH_VTUTF8), &gEfiVTUTF8Guid, NULL},\r
2071 {STRING_TOKEN(STR_DRIVER_BINDING), &gEfiDriverBindingProtocolGuid, NULL},\r
2072 {STRING_TOKEN(STR_PLATFORM_OVERRIDE), &gEfiPlatformDriverOverrideProtocolGuid, NULL},\r
d772f5f3 2073 {STRING_TOKEN(STR_BUS_OVERRIDE), &gEfiBusSpecificDriverOverrideProtocolGuid, BusSpecificDriverOverrideProtocolDumpInformation},\r
a405b86d 2074 {STRING_TOKEN(STR_DRIVER_DIAG), &gEfiDriverDiagnosticsProtocolGuid, NULL},\r
2075 {STRING_TOKEN(STR_DRIVER_DIAG2), &gEfiDriverDiagnostics2ProtocolGuid, NULL},\r
2076 {STRING_TOKEN(STR_DRIVER_CN), &gEfiComponentNameProtocolGuid, NULL},\r
2077 {STRING_TOKEN(STR_DRIVER_CN2), &gEfiComponentName2ProtocolGuid, NULL},\r
2078 {STRING_TOKEN(STR_PLAT_DRV_CFG), &gEfiPlatformToDriverConfigurationProtocolGuid, NULL},\r
2079 {STRING_TOKEN(STR_DRIVER_VERSION), &gEfiDriverSupportedEfiVersionProtocolGuid, DriverEfiVersionProtocolDumpInformation},\r
2080 {STRING_TOKEN(STR_TXT_IN), &gEfiSimpleTextInProtocolGuid, NULL},\r
2081 {STRING_TOKEN(STR_TXT_IN_EX), &gEfiSimpleTextInputExProtocolGuid, NULL},\r
2082 {STRING_TOKEN(STR_TXT_OUT), &gEfiSimpleTextOutProtocolGuid, TxtOutProtocolDumpInformation},\r
2083 {STRING_TOKEN(STR_SIM_POINTER), &gEfiSimplePointerProtocolGuid, NULL},\r
2084 {STRING_TOKEN(STR_ABS_POINTER), &gEfiAbsolutePointerProtocolGuid, NULL},\r
2085 {STRING_TOKEN(STR_SERIAL_IO), &gEfiSerialIoProtocolGuid, NULL},\r
609e0c58 2086 {STRING_TOKEN(STR_GRAPHICS_OUTPUT), &gEfiGraphicsOutputProtocolGuid, GraphicsOutputProtocolDumpInformation},\r
e918029f
RN
2087 {STRING_TOKEN(STR_EDID_DISCOVERED), &gEfiEdidDiscoveredProtocolGuid, EdidDiscoveredProtocolDumpInformation},\r
2088 {STRING_TOKEN(STR_EDID_ACTIVE), &gEfiEdidActiveProtocolGuid, EdidActiveProtocolDumpInformation},\r
a405b86d 2089 {STRING_TOKEN(STR_EDID_OVERRIDE), &gEfiEdidOverrideProtocolGuid, NULL},\r
2090 {STRING_TOKEN(STR_CON_IN), &gEfiConsoleInDeviceGuid, NULL},\r
2091 {STRING_TOKEN(STR_CON_OUT), &gEfiConsoleOutDeviceGuid, NULL},\r
2092 {STRING_TOKEN(STR_STD_ERR), &gEfiStandardErrorDeviceGuid, NULL},\r
2093 {STRING_TOKEN(STR_LOAD_FILE), &gEfiLoadFileProtocolGuid, NULL},\r
2094 {STRING_TOKEN(STR_LOAD_FILE2), &gEfiLoadFile2ProtocolGuid, NULL},\r
2095 {STRING_TOKEN(STR_SIMPLE_FILE_SYS), &gEfiSimpleFileSystemProtocolGuid, NULL},\r
a405b86d 2096 {STRING_TOKEN(STR_TAPE_IO), &gEfiTapeIoProtocolGuid, NULL},\r
2097 {STRING_TOKEN(STR_DISK_IO), &gEfiDiskIoProtocolGuid, NULL},\r
24ac68ef 2098 {STRING_TOKEN(STR_BLK_IO), &gEfiBlockIoProtocolGuid, BlockIoProtocolDumpInformation},\r
a405b86d 2099 {STRING_TOKEN(STR_UC), &gEfiUnicodeCollationProtocolGuid, NULL},\r
2100 {STRING_TOKEN(STR_UC2), &gEfiUnicodeCollation2ProtocolGuid, NULL},\r
f4f3c6bf 2101 {STRING_TOKEN(STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, PciRootBridgeIoDumpInformation},\r
66e427fe 2102 {STRING_TOKEN(STR_PCI_IO), &gEfiPciIoProtocolGuid, PciIoProtocolDumpInformation},\r
a405b86d 2103 {STRING_TOKEN(STR_SCSI_PT), &gEfiScsiPassThruProtocolGuid, NULL},\r
2104 {STRING_TOKEN(STR_SCSI_IO), &gEfiScsiIoProtocolGuid, NULL},\r
2105 {STRING_TOKEN(STR_SCSI_PT_EXT), &gEfiExtScsiPassThruProtocolGuid, NULL},\r
2106 {STRING_TOKEN(STR_ISCSI), &gEfiIScsiInitiatorNameProtocolGuid, NULL},\r
719c2348 2107 {STRING_TOKEN(STR_USB_IO), &gEfiUsbIoProtocolGuid, UsbIoProtocolDumpInformation},\r
a405b86d 2108 {STRING_TOKEN(STR_USB_HC), &gEfiUsbHcProtocolGuid, NULL},\r
2109 {STRING_TOKEN(STR_USB_HC2), &gEfiUsb2HcProtocolGuid, NULL},\r
6fcf7288 2110 {STRING_TOKEN(STR_DEBUG_SUPPORT), &gEfiDebugSupportProtocolGuid, DebugSupportProtocolDumpInformation},\r
a405b86d 2111 {STRING_TOKEN(STR_DEBUG_PORT), &gEfiDebugPortProtocolGuid, NULL},\r
2112 {STRING_TOKEN(STR_DECOMPRESS), &gEfiDecompressProtocolGuid, NULL},\r
2113 {STRING_TOKEN(STR_ACPI_TABLE), &gEfiAcpiTableProtocolGuid, NULL},\r
2114 {STRING_TOKEN(STR_EBC_INTERPRETER), &gEfiEbcProtocolGuid, NULL},\r
2115 {STRING_TOKEN(STR_SNP), &gEfiSimpleNetworkProtocolGuid, NULL},\r
2116 {STRING_TOKEN(STR_NII), &gEfiNetworkInterfaceIdentifierProtocolGuid, NULL},\r
2117 {STRING_TOKEN(STR_NII_31), &gEfiNetworkInterfaceIdentifierProtocolGuid_31, NULL},\r
2118 {STRING_TOKEN(STR_PXE_BC), &gEfiPxeBaseCodeProtocolGuid, NULL},\r
2119 {STRING_TOKEN(STR_PXE_CB), &gEfiPxeBaseCodeCallbackProtocolGuid, NULL},\r
2120 {STRING_TOKEN(STR_BIS), &gEfiBisProtocolGuid, NULL},\r
2121 {STRING_TOKEN(STR_MNP_SB), &gEfiManagedNetworkServiceBindingProtocolGuid, NULL},\r
2122 {STRING_TOKEN(STR_MNP), &gEfiManagedNetworkProtocolGuid, NULL},\r
2123 {STRING_TOKEN(STR_ARP_SB), &gEfiArpServiceBindingProtocolGuid, NULL},\r
2124 {STRING_TOKEN(STR_ARP), &gEfiArpProtocolGuid, NULL},\r
2125 {STRING_TOKEN(STR_DHCPV4_SB), &gEfiDhcp4ServiceBindingProtocolGuid, NULL},\r
2126 {STRING_TOKEN(STR_DHCPV4), &gEfiDhcp4ProtocolGuid, NULL},\r
2127 {STRING_TOKEN(STR_TCPV4_SB), &gEfiTcp4ServiceBindingProtocolGuid, NULL},\r
2128 {STRING_TOKEN(STR_TCPV4), &gEfiTcp4ProtocolGuid, NULL},\r
2129 {STRING_TOKEN(STR_IPV4_SB), &gEfiIp4ServiceBindingProtocolGuid, NULL},\r
2130 {STRING_TOKEN(STR_IPV4), &gEfiIp4ProtocolGuid, NULL},\r
2131 {STRING_TOKEN(STR_IPV4_CFG), &gEfiIp4ConfigProtocolGuid, NULL},\r
00a6ad1b 2132 {STRING_TOKEN(STR_IPV4_CFG2), &gEfiIp4Config2ProtocolGuid, NULL},\r
a405b86d 2133 {STRING_TOKEN(STR_UDPV4_SB), &gEfiUdp4ServiceBindingProtocolGuid, NULL},\r
2134 {STRING_TOKEN(STR_UDPV4), &gEfiUdp4ProtocolGuid, NULL},\r
2135 {STRING_TOKEN(STR_MTFTPV4_SB), &gEfiMtftp4ServiceBindingProtocolGuid, NULL},\r
2136 {STRING_TOKEN(STR_MTFTPV4), &gEfiMtftp4ProtocolGuid, NULL},\r
2137 {STRING_TOKEN(STR_AUTH_INFO), &gEfiAuthenticationInfoProtocolGuid, NULL},\r
2138 {STRING_TOKEN(STR_HASH_SB), &gEfiHashServiceBindingProtocolGuid, NULL},\r
2139 {STRING_TOKEN(STR_HASH), &gEfiHashProtocolGuid, NULL},\r
2140 {STRING_TOKEN(STR_HII_FONT), &gEfiHiiFontProtocolGuid, NULL},\r
2141 {STRING_TOKEN(STR_HII_STRING), &gEfiHiiStringProtocolGuid, NULL},\r
2142 {STRING_TOKEN(STR_HII_IMAGE), &gEfiHiiImageProtocolGuid, NULL},\r
2143 {STRING_TOKEN(STR_HII_DATABASE), &gEfiHiiDatabaseProtocolGuid, NULL},\r
2144 {STRING_TOKEN(STR_HII_CONFIG_ROUT), &gEfiHiiConfigRoutingProtocolGuid, NULL},\r
2145 {STRING_TOKEN(STR_HII_CONFIG_ACC), &gEfiHiiConfigAccessProtocolGuid, NULL},\r
2146 {STRING_TOKEN(STR_HII_FORM_BROWSER2), &gEfiFormBrowser2ProtocolGuid, NULL},\r
dee34318 2147 {STRING_TOKEN(STR_DRIVER_FAM_OVERRIDE), &gEfiDriverFamilyOverrideProtocolGuid, NULL},\r
2148 {STRING_TOKEN(STR_PCD), &gPcdProtocolGuid, NULL},\r
2149 {STRING_TOKEN(STR_TCG), &gEfiTcgProtocolGuid, NULL},\r
2150 {STRING_TOKEN(STR_HII_PACKAGE_LIST), &gEfiHiiPackageListProtocolGuid, NULL},\r
2151\r
2152//\r
2153// the ones under this are deprecated by the current UEFI Spec, but may be found anyways...\r
2154//\r
a405b86d 2155 {STRING_TOKEN(STR_SHELL_INTERFACE), &gEfiShellInterfaceGuid, NULL},\r
2156 {STRING_TOKEN(STR_SHELL_ENV2), &gEfiShellEnvironment2Guid, NULL},\r
2157 {STRING_TOKEN(STR_SHELL_ENV), &gEfiShellEnvironment2Guid, NULL},\r
2158 {STRING_TOKEN(STR_DEVICE_IO), &gEfiDeviceIoProtocolGuid, NULL},\r
2159 {STRING_TOKEN(STR_UGA_DRAW), &gEfiUgaDrawProtocolGuid, NULL},\r
2160 {STRING_TOKEN(STR_UGA_IO), &gEfiUgaIoProtocolGuid, NULL},\r
2161 {STRING_TOKEN(STR_ESP), &gEfiPartTypeSystemPartGuid, NULL},\r
2162 {STRING_TOKEN(STR_GPT_NBR), &gEfiPartTypeLegacyMbrGuid, NULL},\r
2163 {STRING_TOKEN(STR_DRIVER_CONFIG), &gEfiDriverConfigurationProtocolGuid, NULL},\r
2164 {STRING_TOKEN(STR_DRIVER_CONFIG2), &gEfiDriverConfiguration2ProtocolGuid, NULL},\r
2c23ddaa 2165\r
2166//\r
2167// these are using local (non-global) definitions to reduce package dependancy.\r
2168//\r
2169 {STRING_TOKEN(STR_ISA_IO), (EFI_GUID*)&EfiIsaIoProtocolGuid, NULL},\r
2170 {STRING_TOKEN(STR_ISA_ACPI), (EFI_GUID*)&EfiIsaAcpiProtocolGuid, NULL},\r
dee34318 2171\r
2172//\r
2173// the ones under this are GUID identified structs, not protocols\r
2174//\r
2175 {STRING_TOKEN(STR_FILE_INFO), &gEfiFileInfoGuid, NULL},\r
2176 {STRING_TOKEN(STR_FILE_SYS_INFO), &gEfiFileSystemInfoGuid, NULL},\r
2177\r
2178//\r
2179// the ones under this are misc GUIDS.\r
2180//\r
2181 {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE), &gEfiGlobalVariableGuid, NULL},\r
2182\r
2183//\r
2184// UEFI 2.2\r
2185//\r
2186 {STRING_TOKEN(STR_IP6_SB), &gEfiIp6ServiceBindingProtocolGuid, NULL},\r
2187 {STRING_TOKEN(STR_IP6), &gEfiIp6ProtocolGuid, NULL},\r
2188 {STRING_TOKEN(STR_IP6_CONFIG), &gEfiIp6ConfigProtocolGuid, NULL},\r
2189 {STRING_TOKEN(STR_MTFTP6_SB), &gEfiMtftp6ServiceBindingProtocolGuid, NULL},\r
2190 {STRING_TOKEN(STR_MTFTP6), &gEfiMtftp6ProtocolGuid, NULL},\r
2191 {STRING_TOKEN(STR_DHCP6_SB), &gEfiDhcp6ServiceBindingProtocolGuid, NULL},\r
2192 {STRING_TOKEN(STR_DHCP6), &gEfiDhcp6ProtocolGuid, NULL},\r
2193 {STRING_TOKEN(STR_UDP6_SB), &gEfiUdp6ServiceBindingProtocolGuid, NULL},\r
2194 {STRING_TOKEN(STR_UDP6), &gEfiUdp6ProtocolGuid, NULL},\r
2195 {STRING_TOKEN(STR_TCP6_SB), &gEfiTcp6ServiceBindingProtocolGuid, NULL},\r
2196 {STRING_TOKEN(STR_TCP6), &gEfiTcp6ProtocolGuid, NULL},\r
2197 {STRING_TOKEN(STR_VLAN_CONFIG), &gEfiVlanConfigProtocolGuid, NULL},\r
2198 {STRING_TOKEN(STR_EAP), &gEfiEapProtocolGuid, NULL},\r
2199 {STRING_TOKEN(STR_EAP_MGMT), &gEfiEapManagementProtocolGuid, NULL},\r
2200 {STRING_TOKEN(STR_FTP4_SB), &gEfiFtp4ServiceBindingProtocolGuid, NULL},\r
2201 {STRING_TOKEN(STR_FTP4), &gEfiFtp4ProtocolGuid, NULL},\r
2202 {STRING_TOKEN(STR_IP_SEC_CONFIG), &gEfiIpSecConfigProtocolGuid, NULL},\r
2203 {STRING_TOKEN(STR_DH), &gEfiDriverHealthProtocolGuid, NULL},\r
2204 {STRING_TOKEN(STR_DEF_IMG_LOAD), &gEfiDeferredImageLoadProtocolGuid, NULL},\r
2205 {STRING_TOKEN(STR_USER_CRED), &gEfiUserCredentialProtocolGuid, NULL},\r
2206 {STRING_TOKEN(STR_USER_MNGR), &gEfiUserManagerProtocolGuid, NULL},\r
2207 {STRING_TOKEN(STR_ATA_PASS_THRU), &gEfiAtaPassThruProtocolGuid, NULL},\r
2208\r
2209//\r
2210// UEFI 2.3\r
2211//\r
8985d612 2212 {STRING_TOKEN(STR_FW_MGMT), &gEfiFirmwareManagementProtocolGuid, FirmwareManagementDumpInformation},\r
dee34318 2213 {STRING_TOKEN(STR_IP_SEC), &gEfiIpSecProtocolGuid, NULL},\r
2214 {STRING_TOKEN(STR_IP_SEC2), &gEfiIpSec2ProtocolGuid, NULL},\r
2215\r
2216//\r
2217// UEFI 2.3.1\r
2218//\r
2219 {STRING_TOKEN(STR_KMS), &gEfiKmsProtocolGuid, NULL},\r
2220 {STRING_TOKEN(STR_BLK_IO2), &gEfiBlockIo2ProtocolGuid, NULL},\r
2221 {STRING_TOKEN(STR_SSC), &gEfiStorageSecurityCommandProtocolGuid, NULL},\r
12f1a36c 2222 {STRING_TOKEN(STR_UCRED2), &gEfiUserCredential2ProtocolGuid, NULL},\r
dee34318 2223\r
28cdb62b
CP
2224//\r
2225// UEFI 2.4\r
2226//\r
2227 {STRING_TOKEN(STR_DISK_IO2), &gEfiDiskIo2ProtocolGuid, NULL},\r
59febea1 2228 {STRING_TOKEN(STR_ADAPTER_INFO), &gEfiAdapterInformationProtocolGuid, AdapterInformationDumpInformation},\r
28cdb62b 2229\r
59edea51
HL
2230//\r
2231// UEFI2.5\r
2232//\r
2233 {STRING_TOKEN(STR_TLS_SB), &gEfiTlsServiceBindingProtocolGuid, NULL},\r
2234 {STRING_TOKEN(STR_TLS), &gEfiTlsProtocolGuid, NULL},\r
2235 {STRING_TOKEN(STR_TLS_CONFIG), &gEfiTlsConfigurationProtocolGuid, NULL},\r
2236 {STRING_TOKEN(STR_SUPPLICANT_SB), &gEfiSupplicantServiceBindingProtocolGuid, NULL},\r
2237 {STRING_TOKEN(STR_SUPPLICANT), &gEfiSupplicantProtocolGuid, NULL},\r
2238\r
2239//\r
2240// UEFI2.6\r
2241//\r
2242 {STRING_TOKEN(STR_WIFI2), &gEfiWiFi2ProtocolGuid, NULL},\r
2243 {STRING_TOKEN(STR_RAMDISK), &gEfiRamDiskProtocolGuid, NULL},\r
2244 {STRING_TOKEN(STR_HII_ID), &gEfiHiiImageDecoderProtocolGuid, NULL},\r
2245 {STRING_TOKEN(STR_HII_IE), &gEfiHiiImageExProtocolGuid, NULL},\r
2246 {STRING_TOKEN(STR_SD_MPT), &gEfiSdMmcPassThruProtocolGuid, NULL},\r
2247 {STRING_TOKEN(STR_ERASE_BLOCK), &gEfiEraseBlockProtocolGuid, NULL},\r
2248\r
2249//\r
2250// UEFI2.7\r
2251//\r
2252 {STRING_TOKEN(STR_BLUETOOTH_ATTR), &gEfiBluetoothAttributeProtocolGuid, NULL},\r
2253 {STRING_TOKEN(STR_BLUETOOTH_ATTR_SB), &gEfiBluetoothAttributeServiceBindingProtocolGuid, NULL},\r
2254 {STRING_TOKEN(STR_BLUETOOTH_LE_CONFIG), &gEfiBluetoothLeConfigProtocolGuid, NULL},\r
2255 {STRING_TOKEN(STR_UFS_DEV_CONFIG), &gEfiUfsDeviceConfigProtocolGuid, NULL},\r
2256 {STRING_TOKEN(STR_HTTP_BOOT_CALL), &gEfiHttpBootCallbackProtocolGuid, NULL},\r
2257 {STRING_TOKEN(STR_RESET_NOTI), &gEfiResetNotificationProtocolGuid, NULL},\r
770f3f61 2258 {STRING_TOKEN(STR_PARTITION_INFO), &gEfiPartitionInfoProtocolGuid, PartitionInfoProtocolDumpInformation},\r
59edea51
HL
2259 {STRING_TOKEN(STR_HII_POPUP), &gEfiHiiPopupProtocolGuid, NULL},\r
2260\r
6b640b4a
JC
2261//\r
2262// PI Spec ones\r
2263//\r
2264 {STRING_TOKEN(STR_IDE_CONT_INIT), &gEfiIdeControllerInitProtocolGuid, NULL},\r
4024c116 2265 {STRING_TOKEN(STR_DISK_INFO), &gEfiDiskInfoProtocolGuid, NULL},\r
6b640b4a 2266\r
c2788f1c
JC
2267//\r
2268// PI Spec 1.0\r
2269//\r
2270 {STRING_TOKEN(STR_BDS_ARCH), &gEfiBdsArchProtocolGuid, NULL},\r
2271 {STRING_TOKEN(STR_CPU_ARCH), &gEfiCpuArchProtocolGuid, NULL},\r
2272 {STRING_TOKEN(STR_MET_ARCH), &gEfiMetronomeArchProtocolGuid, NULL},\r
2273 {STRING_TOKEN(STR_MON_ARCH), &gEfiMonotonicCounterArchProtocolGuid, NULL},\r
2274 {STRING_TOKEN(STR_RTC_ARCH), &gEfiRealTimeClockArchProtocolGuid, NULL},\r
2275 {STRING_TOKEN(STR_RESET_ARCH), &gEfiResetArchProtocolGuid, NULL},\r
2276 {STRING_TOKEN(STR_RT_ARCH), &gEfiRuntimeArchProtocolGuid, NULL},\r
2277 {STRING_TOKEN(STR_SEC_ARCH), &gEfiSecurityArchProtocolGuid, NULL},\r
2278 {STRING_TOKEN(STR_TIMER_ARCH), &gEfiTimerArchProtocolGuid, NULL},\r
2279 {STRING_TOKEN(STR_VAR_ARCH), &gEfiVariableWriteArchProtocolGuid, NULL},\r
2280 {STRING_TOKEN(STR_V_ARCH), &gEfiVariableArchProtocolGuid, NULL},\r
2281 {STRING_TOKEN(STR_SECP), &gEfiSecurityPolicyProtocolGuid, NULL},\r
2282 {STRING_TOKEN(STR_WDT_ARCH), &gEfiWatchdogTimerArchProtocolGuid, NULL},\r
2283 {STRING_TOKEN(STR_SCR), &gEfiStatusCodeRuntimeProtocolGuid, NULL},\r
2284 {STRING_TOKEN(STR_SMB_HC), &gEfiSmbusHcProtocolGuid, NULL},\r
2285 {STRING_TOKEN(STR_FV_2), &gEfiFirmwareVolume2ProtocolGuid, NULL},\r
2286 {STRING_TOKEN(STR_FV_BLOCK), &gEfiFirmwareVolumeBlockProtocolGuid, NULL},\r
2287 {STRING_TOKEN(STR_CAP_ARCH), &gEfiCapsuleArchProtocolGuid, NULL},\r
2288 {STRING_TOKEN(STR_MP_SERVICE), &gEfiMpServiceProtocolGuid, NULL},\r
2289 {STRING_TOKEN(STR_HBRAP), &gEfiPciHostBridgeResourceAllocationProtocolGuid, NULL},\r
2290 {STRING_TOKEN(STR_PCIP), &gEfiPciPlatformProtocolGuid, NULL},\r
2291 {STRING_TOKEN(STR_PCIO), &gEfiPciOverrideProtocolGuid, NULL},\r
2292 {STRING_TOKEN(STR_PCIE), &gEfiPciEnumerationCompleteProtocolGuid, NULL},\r
2293 {STRING_TOKEN(STR_IPCID), &gEfiIncompatiblePciDeviceSupportProtocolGuid, NULL},\r
2294 {STRING_TOKEN(STR_PCIHPI), &gEfiPciHotPlugInitProtocolGuid, NULL},\r
2295 {STRING_TOKEN(STR_PCIHPR), &gEfiPciHotPlugRequestProtocolGuid, NULL},\r
2296 {STRING_TOKEN(STR_SMBIOS), &gEfiSmbiosProtocolGuid, NULL},\r
2297 {STRING_TOKEN(STR_S3_SAVE), &gEfiS3SaveStateProtocolGuid, NULL},\r
2298 {STRING_TOKEN(STR_S3_S_SMM), &gEfiS3SmmSaveStateProtocolGuid, NULL},\r
2299 {STRING_TOKEN(STR_RSC), &gEfiRscHandlerProtocolGuid, NULL},\r
2300 {STRING_TOKEN(STR_S_RSC), &gEfiSmmRscHandlerProtocolGuid, NULL},\r
2301 {STRING_TOKEN(STR_ACPI_SDT), &gEfiAcpiSdtProtocolGuid, NULL},\r
2302 {STRING_TOKEN(STR_SIO), &gEfiSioProtocolGuid, NULL},\r
2303 {STRING_TOKEN(STR_S_CPU2), &gEfiSmmCpuIo2ProtocolGuid, NULL},\r
2304 {STRING_TOKEN(STR_S_BASE2), &gEfiSmmBase2ProtocolGuid, NULL},\r
2305 {STRING_TOKEN(STR_S_ACC_2), &gEfiSmmAccess2ProtocolGuid, NULL},\r
2306 {STRING_TOKEN(STR_S_CON_2), &gEfiSmmControl2ProtocolGuid, NULL},\r
2307 {STRING_TOKEN(STR_S_CONFIG), &gEfiSmmConfigurationProtocolGuid, NULL},\r
2308 {STRING_TOKEN(STR_S_RTL), &gEfiSmmReadyToLockProtocolGuid, NULL},\r
2309 {STRING_TOKEN(STR_DS_RTL), &gEfiDxeSmmReadyToLockProtocolGuid, NULL},\r
2310 {STRING_TOKEN(STR_S_COMM), &gEfiSmmCommunicationProtocolGuid, NULL},\r
2311 {STRING_TOKEN(STR_S_STAT), &gEfiSmmStatusCodeProtocolGuid, NULL},\r
2312 {STRING_TOKEN(STR_S_CPU), &gEfiSmmCpuProtocolGuid, NULL},\r
62634215 2313 {STRING_TOKEN(STR_S_PCIRBIO), &gEfiSmmPciRootBridgeIoProtocolGuid, NULL},\r
c2788f1c
JC
2314 {STRING_TOKEN(STR_S_SWD), &gEfiSmmSwDispatch2ProtocolGuid, NULL},\r
2315 {STRING_TOKEN(STR_S_SXD), &gEfiSmmSxDispatch2ProtocolGuid, NULL},\r
2316 {STRING_TOKEN(STR_S_PTD2), &gEfiSmmPeriodicTimerDispatch2ProtocolGuid, NULL},\r
2317 {STRING_TOKEN(STR_S_UD2), &gEfiSmmUsbDispatch2ProtocolGuid, NULL},\r
2318 {STRING_TOKEN(STR_S_GD2), &gEfiSmmGpiDispatch2ProtocolGuid, NULL},\r
2319 {STRING_TOKEN(STR_S_SBD2), &gEfiSmmStandbyButtonDispatch2ProtocolGuid, NULL},\r
2320 {STRING_TOKEN(STR_S_PBD2), &gEfiSmmPowerButtonDispatch2ProtocolGuid, NULL},\r
2321 {STRING_TOKEN(STR_S_ITD2), &gEfiSmmIoTrapDispatch2ProtocolGuid, NULL},\r
2322 {STRING_TOKEN(STR_PCD), &gEfiPcdProtocolGuid, NULL},\r
2323 {STRING_TOKEN(STR_FVB2), &gEfiFirmwareVolumeBlock2ProtocolGuid, NULL},\r
2324 {STRING_TOKEN(STR_CPUIO2), &gEfiCpuIo2ProtocolGuid, NULL},\r
2325 {STRING_TOKEN(STR_LEGACY_R2), &gEfiLegacyRegion2ProtocolGuid, NULL},\r
2326 {STRING_TOKEN(STR_SAL_MIP), &gEfiSalMcaInitPmiProtocolGuid, NULL},\r
2327 {STRING_TOKEN(STR_ES_BS), &gEfiExtendedSalBootServiceProtocolGuid, NULL},\r
2328 {STRING_TOKEN(STR_ES_BIO), &gEfiExtendedSalBaseIoServicesProtocolGuid, NULL},\r
2329 {STRING_TOKEN(STR_ES_STALL), &gEfiExtendedSalStallServicesProtocolGuid, NULL},\r
2330 {STRING_TOKEN(STR_ES_RTC), &gEfiExtendedSalRtcServicesProtocolGuid, NULL},\r
2331 {STRING_TOKEN(STR_ES_VS), &gEfiExtendedSalVariableServicesProtocolGuid, NULL},\r
2332 {STRING_TOKEN(STR_ES_MTC), &gEfiExtendedSalMtcServicesProtocolGuid, NULL},\r
2333 {STRING_TOKEN(STR_ES_RESET), &gEfiExtendedSalResetServicesProtocolGuid, NULL},\r
2334 {STRING_TOKEN(STR_ES_SC), &gEfiExtendedSalStatusCodeServicesProtocolGuid, NULL},\r
2335 {STRING_TOKEN(STR_ES_FBS), &gEfiExtendedSalFvBlockServicesProtocolGuid, NULL},\r
2336 {STRING_TOKEN(STR_ES_MP), &gEfiExtendedSalMpServicesProtocolGuid, NULL},\r
2337 {STRING_TOKEN(STR_ES_PAL), &gEfiExtendedSalPalServicesProtocolGuid, NULL},\r
2338 {STRING_TOKEN(STR_ES_BASE), &gEfiExtendedSalBaseServicesProtocolGuid, NULL},\r
2339 {STRING_TOKEN(STR_ES_MCA), &gEfiExtendedSalMcaServicesProtocolGuid, NULL},\r
2340 {STRING_TOKEN(STR_ES_PCI), &gEfiExtendedSalPciServicesProtocolGuid, NULL},\r
2341 {STRING_TOKEN(STR_ES_CACHE), &gEfiExtendedSalCacheServicesProtocolGuid, NULL},\r
2342 {STRING_TOKEN(STR_ES_MCA_LOG), &gEfiExtendedSalMcaLogServicesProtocolGuid, NULL},\r
2343 {STRING_TOKEN(STR_S2ARCH), &gEfiSecurity2ArchProtocolGuid, NULL},\r
2344 {STRING_TOKEN(STR_EODXE), &gEfiSmmEndOfDxeProtocolGuid, NULL},\r
2345 {STRING_TOKEN(STR_ISAHC), &gEfiIsaHcProtocolGuid, NULL},\r
2346 {STRING_TOKEN(STR_ISAHC_B), &gEfiIsaHcServiceBindingProtocolGuid, NULL},\r
2347 {STRING_TOKEN(STR_SIO_C), &gEfiSioControlProtocolGuid, NULL},\r
2348 {STRING_TOKEN(STR_GET_PCD), &gEfiGetPcdInfoProtocolGuid, NULL},\r
2349 {STRING_TOKEN(STR_I2C_M), &gEfiI2cMasterProtocolGuid, NULL},\r
2350 {STRING_TOKEN(STR_I2CIO), &gEfiI2cIoProtocolGuid, NULL},\r
2351 {STRING_TOKEN(STR_I2CEN), &gEfiI2cEnumerateProtocolGuid, NULL},\r
2352 {STRING_TOKEN(STR_I2C_H), &gEfiI2cHostProtocolGuid, NULL},\r
2353 {STRING_TOKEN(STR_I2C_BCM), &gEfiI2cBusConfigurationManagementProtocolGuid, NULL},\r
2354 {STRING_TOKEN(STR_TREE), &gEfiTrEEProtocolGuid, NULL},\r
2355 {STRING_TOKEN(STR_TCG2), &gEfiTcg2ProtocolGuid, NULL},\r
2356 {STRING_TOKEN(STR_TIMESTAMP), &gEfiTimestampProtocolGuid, NULL},\r
2357 {STRING_TOKEN(STR_RNG), &gEfiRngProtocolGuid, NULL},\r
2358 {STRING_TOKEN(STR_NVMEPT), &gEfiNvmExpressPassThruProtocolGuid, NULL},\r
2359 {STRING_TOKEN(STR_H2_SB), &gEfiHash2ServiceBindingProtocolGuid, NULL},\r
2360 {STRING_TOKEN(STR_HASH2), &gEfiHash2ProtocolGuid, NULL},\r
2361 {STRING_TOKEN(STR_BIO_C), &gEfiBlockIoCryptoProtocolGuid, NULL},\r
2362 {STRING_TOKEN(STR_SCR), &gEfiSmartCardReaderProtocolGuid, NULL},\r
2363 {STRING_TOKEN(STR_SCE), &gEfiSmartCardEdgeProtocolGuid, NULL},\r
2364 {STRING_TOKEN(STR_USB_FIO), &gEfiUsbFunctionIoProtocolGuid, NULL},\r
2365 {STRING_TOKEN(STR_BC_HC), &gEfiBluetoothHcProtocolGuid, NULL},\r
2366 {STRING_TOKEN(STR_BC_IO_SB), &gEfiBluetoothIoServiceBindingProtocolGuid, NULL},\r
2367 {STRING_TOKEN(STR_BC_IO), &gEfiBluetoothIoProtocolGuid, NULL},\r
2368 {STRING_TOKEN(STR_BC_C), &gEfiBluetoothConfigProtocolGuid, NULL},\r
2369 {STRING_TOKEN(STR_REG_EXP), &gEfiRegularExpressionProtocolGuid, NULL},\r
2370 {STRING_TOKEN(STR_B_MGR_P), &gEfiBootManagerPolicyProtocolGuid, NULL},\r
2371 {STRING_TOKEN(STR_CKH), &gEfiConfigKeywordHandlerProtocolGuid, NULL},\r
2372 {STRING_TOKEN(STR_WIFI), &gEfiWiFiProtocolGuid, NULL},\r
2373 {STRING_TOKEN(STR_EAP_M), &gEfiEapManagement2ProtocolGuid, NULL},\r
2374 {STRING_TOKEN(STR_EAP_C), &gEfiEapConfigurationProtocolGuid, NULL},\r
2375 {STRING_TOKEN(STR_PKCS7), &gEfiPkcs7VerifyProtocolGuid, NULL},\r
2376 {STRING_TOKEN(STR_NET_DNS4_SB), &gEfiDns4ServiceBindingProtocolGuid, NULL},\r
2377 {STRING_TOKEN(STR_NET_DNS4), &gEfiDns4ProtocolGuid, NULL},\r
2378 {STRING_TOKEN(STR_NET_DNS6_SB), &gEfiDns6ServiceBindingProtocolGuid, NULL},\r
2379 {STRING_TOKEN(STR_NET_DNS6), &gEfiDns6ProtocolGuid, NULL},\r
2380 {STRING_TOKEN(STR_NET_HTTP_SB), &gEfiHttpServiceBindingProtocolGuid, NULL},\r
2381 {STRING_TOKEN(STR_NET_HTTP), &gEfiHttpProtocolGuid, NULL},\r
2382 {STRING_TOKEN(STR_NET_HTTP_U), &gEfiHttpUtilitiesProtocolGuid, NULL},\r
2383 {STRING_TOKEN(STR_REST), &gEfiRestProtocolGuid, NULL},\r
2384\r
59edea51
HL
2385//\r
2386// PI 1.5\r
2387//\r
2388 {STRING_TOKEN(STR_MM_EOD), &gEfiMmEndOfDxeProtocolGuid, NULL},\r
2389 {STRING_TOKEN(STR_MM_ITD), &gEfiMmIoTrapDispatchProtocolGuid, NULL},\r
2390 {STRING_TOKEN(STR_MM_PBD), &gEfiMmPowerButtonDispatchProtocolGuid, NULL},\r
2391 {STRING_TOKEN(STR_MM_SBD), &gEfiMmStandbyButtonDispatchProtocolGuid, NULL},\r
2392 {STRING_TOKEN(STR_MM_GD), &gEfiMmGpiDispatchProtocolGuid, NULL},\r
2393 {STRING_TOKEN(STR_MM_UD), &gEfiMmUsbDispatchProtocolGuid, NULL},\r
2394 {STRING_TOKEN(STR_MM_PTD), &gEfiMmPeriodicTimerDispatchProtocolGuid, NULL},\r
2395 {STRING_TOKEN(STR_MM_SXD), &gEfiMmSxDispatchProtocolGuid, NULL},\r
2396 {STRING_TOKEN(STR_MM_SWD), &gEfiMmSwDispatchProtocolGuid, NULL},\r
2397 {STRING_TOKEN(STR_MM_PRBI), &gEfiMmPciRootBridgeIoProtocolGuid, NULL},\r
2398 {STRING_TOKEN(STR_MM_CPU), &gEfiMmCpuProtocolGuid, NULL},\r
2399 {STRING_TOKEN(STR_MM_STACODE), &gEfiMmStatusCodeProtocolGuid, NULL},\r
2400 {STRING_TOKEN(STR_DXEMM_RTL), &gEfiDxeMmReadyToLockProtocolGuid, NULL},\r
2401 {STRING_TOKEN(STR_MM_CONFIG), &gEfiMmConfigurationProtocolGuid, NULL},\r
2402 {STRING_TOKEN(STR_MM_RTL), &gEfiMmReadyToLockProtocolGuid, NULL},\r
2403 {STRING_TOKEN(STR_MM_CONTROL), &gEfiMmControlProtocolGuid, NULL},\r
2404 {STRING_TOKEN(STR_MM_ACCESS), &gEfiMmAccessProtocolGuid, NULL},\r
2405 {STRING_TOKEN(STR_MM_BASE), &gEfiMmBaseProtocolGuid, NULL},\r
2406 {STRING_TOKEN(STR_MM_CPUIO), &gEfiMmCpuIoProtocolGuid, NULL},\r
2407 {STRING_TOKEN(STR_MM_RH), &gEfiMmRscHandlerProtocolGuid, NULL},\r
2408 {STRING_TOKEN(STR_MM_COM), &gEfiMmCommunicationProtocolGuid, NULL},\r
2409\r
0a1eb97d
JC
2410//\r
2411// UEFI Shell Spec 2.0\r
2412//\r
2413 {STRING_TOKEN(STR_SHELL_PARAMETERS), &gEfiShellParametersProtocolGuid, NULL},\r
2414 {STRING_TOKEN(STR_SHELL), &gEfiShellProtocolGuid, NULL},\r
2415\r
2416//\r
2417// UEFI Shell Spec 2.1\r
2418//\r
2419 {STRING_TOKEN(STR_SHELL_DYNAMIC), &gEfiShellDynamicCommandProtocolGuid, NULL},\r
2420\r
c2788f1c
JC
2421//\r
2422// Misc\r
2423//\r
2424 {STRING_TOKEN(STR_PCDINFOPROT), &gGetPcdInfoProtocolGuid, NULL},\r
2425\r
dee34318 2426//\r
2427// terminator\r
2428//\r
0e88348e 2429 {0, NULL, NULL},\r
a405b86d 2430};\r
2431\r
2432/**\r
2433 Function to get the node for a protocol or struct from it's GUID.\r
2434\r
2435 if Guid is NULL, then ASSERT.\r
2436\r
2437 @param[in] Guid The GUID to look for the name of.\r
2438\r
2439 @return The node.\r
2440**/\r
dee34318 2441CONST GUID_INFO_BLOCK *\r
a405b86d 2442InternalShellGetNodeFromGuid(\r
2443 IN CONST EFI_GUID* Guid\r
2444 )\r
2445{\r
dee34318 2446 CONST GUID_INFO_BLOCK *ListWalker;\r
6306fd90 2447 UINTN LoopCount;\r
a405b86d 2448\r
2449 ASSERT(Guid != NULL);\r
2450\r
d4ec9a57 2451 for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {\r
6306fd90
JC
2452 if (CompareGuid(ListWalker->GuidId, Guid)) {\r
2453 return (ListWalker);\r
2454 }\r
2455 }\r
2456\r
a405b86d 2457 if (PcdGetBool(PcdShellIncludeNtGuids)) {\r
2458 for (ListWalker = mGuidStringListNT ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2459 if (CompareGuid(ListWalker->GuidId, Guid)) {\r
2460 return (ListWalker);\r
2461 }\r
2462 }\r
2463 }\r
2464 for (ListWalker = mGuidStringList ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2465 if (CompareGuid(ListWalker->GuidId, Guid)) {\r
2466 return (ListWalker);\r
2467 }\r
2468 }\r
6306fd90
JC
2469 return (NULL);\r
2470}\r
2471\r
2472/**\r
2473Function to add a new GUID/Name mapping.\r
2474\r
2475@param[in] Guid The Guid\r
f5ba4007
QS
2476@param[in] NameID The STRING id of the HII string to use\r
2477@param[in] DumpFunc The pointer to the dump function\r
6306fd90
JC
2478\r
2479\r
2480@retval EFI_SUCCESS The operation was sucessful\r
2481@retval EFI_OUT_OF_RESOURCES A memory allocation failed\r
2482@retval EFI_INVALID_PARAMETER Guid NameId was invalid\r
2483**/\r
6306fd90 2484EFI_STATUS\r
6306fd90
JC
2485InsertNewGuidNameMapping(\r
2486 IN CONST EFI_GUID *Guid,\r
2487 IN CONST EFI_STRING_ID NameID,\r
2488 IN CONST DUMP_PROTOCOL_INFO DumpFunc OPTIONAL\r
2489 )\r
2490{\r
2491 ASSERT(Guid != NULL);\r
2492 ASSERT(NameID != 0);\r
2493\r
d4ec9a57
RN
2494 mGuidList = ReallocatePool(mGuidListCount * sizeof(GUID_INFO_BLOCK), mGuidListCount+1 * sizeof(GUID_INFO_BLOCK), mGuidList);\r
2495 if (mGuidList == NULL) {\r
2496 mGuidListCount = 0;\r
6306fd90
JC
2497 return (EFI_OUT_OF_RESOURCES);\r
2498 }\r
d4ec9a57 2499 mGuidListCount++;\r
6306fd90 2500\r
d4ec9a57
RN
2501 mGuidList[mGuidListCount - 1].GuidId = AllocateCopyPool(sizeof(EFI_GUID), Guid);\r
2502 mGuidList[mGuidListCount - 1].StringId = NameID;\r
2503 mGuidList[mGuidListCount - 1].DumpInfo = DumpFunc;\r
6306fd90 2504\r
d4ec9a57 2505 if (mGuidList[mGuidListCount - 1].GuidId == NULL) {\r
6306fd90
JC
2506 return (EFI_OUT_OF_RESOURCES);\r
2507 }\r
2508\r
2509 return (EFI_SUCCESS);\r
2510}\r
2511\r
2512/**\r
2513 Function to add a new GUID/Name mapping.\r
2514\r
2515 This cannot overwrite an existing mapping.\r
2516\r
2517 @param[in] Guid The Guid\r
2518 @param[in] TheName The Guid's name\r
2519 @param[in] Lang RFC4646 language code list or NULL\r
2520\r
2521 @retval EFI_SUCCESS The operation was sucessful\r
2522 @retval EFI_ACCESS_DENIED There was a duplicate\r
2523 @retval EFI_OUT_OF_RESOURCES A memory allocation failed\r
2524 @retval EFI_INVALID_PARAMETER Guid or TheName was NULL\r
2525**/\r
2526EFI_STATUS\r
2527EFIAPI\r
2528AddNewGuidNameMapping(\r
2529 IN CONST EFI_GUID *Guid,\r
2530 IN CONST CHAR16 *TheName,\r
2531 IN CONST CHAR8 *Lang OPTIONAL\r
2532 )\r
2533{\r
6306fd90
JC
2534 EFI_STRING_ID NameID;\r
2535\r
e7e0e42b
CP
2536 HandleParsingHiiInit();\r
2537\r
6306fd90
JC
2538 if (Guid == NULL || TheName == NULL){\r
2539 return (EFI_INVALID_PARAMETER);\r
2540 }\r
2541\r
931b2cff 2542 if ((InternalShellGetNodeFromGuid(Guid)) != NULL) {\r
6306fd90
JC
2543 return (EFI_ACCESS_DENIED);\r
2544 }\r
2545\r
2546 NameID = HiiSetString(mHandleParsingHiiHandle, 0, (CHAR16*)TheName, Lang);\r
2547 if (NameID == 0) {\r
2548 return (EFI_OUT_OF_RESOURCES);\r
2549 }\r
2550\r
2551 return (InsertNewGuidNameMapping(Guid, NameID, NULL));\r
a405b86d 2552}\r
2553\r
2554/**\r
2555 Function to get the name of a protocol or struct from it's GUID.\r
2556\r
2557 if Guid is NULL, then ASSERT.\r
2558\r
2559 @param[in] Guid The GUID to look for the name of.\r
2560 @param[in] Lang The language to use.\r
2561\r
2562 @return pointer to string of the name. The caller\r
2563 is responsible to free this memory.\r
2564**/\r
2565CHAR16*\r
2566EFIAPI\r
2567GetStringNameFromGuid(\r
2568 IN CONST EFI_GUID *Guid,\r
2569 IN CONST CHAR8 *Lang OPTIONAL\r
2570 )\r
2571{\r
dee34318 2572 CONST GUID_INFO_BLOCK *Id;\r
a405b86d 2573\r
e7e0e42b
CP
2574 HandleParsingHiiInit();\r
2575\r
a405b86d 2576 Id = InternalShellGetNodeFromGuid(Guid);\r
0e88348e
RN
2577 if (Id == NULL) {\r
2578 return NULL;\r
2579 }\r
2580 return HiiGetString (mHandleParsingHiiHandle, Id->StringId, Lang);\r
a405b86d 2581}\r
2582\r
2583/**\r
2584 Function to dump protocol information from a handle.\r
2585\r
2586 This function will return a allocated string buffer containing the\r
2587 information. The caller is responsible for freeing the memory.\r
2588\r
2589 If Guid is NULL, ASSERT().\r
2590 If TheHandle is NULL, ASSERT().\r
2591\r
2592 @param[in] TheHandle The handle to dump information from.\r
2593 @param[in] Guid The GUID of the protocol to dump.\r
2594 @param[in] Verbose TRUE for extra info. FALSE otherwise.\r
2595\r
2596 @return The pointer to string.\r
2597 @retval NULL An error was encountered.\r
2598**/\r
2599CHAR16*\r
2600EFIAPI\r
2601GetProtocolInformationDump(\r
2602 IN CONST EFI_HANDLE TheHandle,\r
2603 IN CONST EFI_GUID *Guid,\r
2604 IN CONST BOOLEAN Verbose\r
2605 )\r
2606{\r
dee34318 2607 CONST GUID_INFO_BLOCK *Id;\r
a405b86d 2608\r
2609 ASSERT(TheHandle != NULL);\r
2610 ASSERT(Guid != NULL);\r
2611\r
2612 if (TheHandle == NULL || Guid == NULL) {\r
2613 return (NULL);\r
2614 }\r
2615\r
2616 Id = InternalShellGetNodeFromGuid(Guid);\r
2617 if (Id != NULL && Id->DumpInfo != NULL) {\r
2618 return (Id->DumpInfo(TheHandle, Verbose));\r
2619 }\r
2620 return (NULL);\r
2621}\r
2622\r
2623/**\r
2624 Function to get the Guid for a protocol or struct based on it's string name.\r
2625\r
0a1eb97d
JC
2626 do not modify the returned Guid.\r
2627\r
a405b86d 2628 @param[in] Name The pointer to the string name.\r
2629 @param[in] Lang The pointer to the language code.\r
0a1eb97d 2630 @param[out] Guid The pointer to the Guid.\r
a405b86d 2631\r
2632 @retval EFI_SUCCESS The operation was sucessful.\r
2633**/\r
2634EFI_STATUS\r
2635EFIAPI\r
2636GetGuidFromStringName(\r
2637 IN CONST CHAR16 *Name,\r
2638 IN CONST CHAR8 *Lang OPTIONAL,\r
0a1eb97d 2639 OUT EFI_GUID **Guid\r
a405b86d 2640 )\r
2641{\r
dee34318 2642 CONST GUID_INFO_BLOCK *ListWalker;\r
a405b86d 2643 CHAR16 *String;\r
6306fd90 2644 UINTN LoopCount;\r
a405b86d 2645\r
e7e0e42b
CP
2646 HandleParsingHiiInit();\r
2647\r
a405b86d 2648 ASSERT(Guid != NULL);\r
2649 if (Guid == NULL) {\r
2650 return (EFI_INVALID_PARAMETER);\r
2651 }\r
2652 *Guid = NULL;\r
2653\r
2654 if (PcdGetBool(PcdShellIncludeNtGuids)) {\r
2655 for (ListWalker = mGuidStringListNT ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2656 String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
28cdb62b 2657 if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
a405b86d 2658 *Guid = ListWalker->GuidId;\r
2659 }\r
2660 SHELL_FREE_NON_NULL(String);\r
2661 if (*Guid != NULL) {\r
2662 return (EFI_SUCCESS);\r
2663 }\r
2664 }\r
2665 }\r
2666 for (ListWalker = mGuidStringList ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2667 String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
28cdb62b 2668 if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
a405b86d 2669 *Guid = ListWalker->GuidId;\r
2670 }\r
2671 SHELL_FREE_NON_NULL(String);\r
2672 if (*Guid != NULL) {\r
2673 return (EFI_SUCCESS);\r
2674 }\r
2675 }\r
6306fd90 2676\r
d4ec9a57 2677 for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {\r
6306fd90
JC
2678 String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
2679 if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
2680 *Guid = ListWalker->GuidId;\r
2681 }\r
2682 SHELL_FREE_NON_NULL(String);\r
2683 if (*Guid != NULL) {\r
2684 return (EFI_SUCCESS);\r
2685 }\r
2686 }\r
2687\r
a405b86d 2688 return (EFI_NOT_FOUND);\r
2689}\r
2690\r
36384ceb
ED
2691/**\r
2692 Get best support language for this driver.\r
1a6f74d9
CS
2693\r
2694 First base on the user input language to search, second base on the current\r
2695 platform used language to search, third get the first language from the\r
a71003f2 2696 support language list. The caller need to free the buffer of the best language.\r
36384ceb
ED
2697\r
2698 @param[in] SupportedLanguages The support languages for this driver.\r
a71003f2 2699 @param[in] InputLanguage The user input language.\r
36384ceb
ED
2700 @param[in] Iso639Language Whether get language for ISO639.\r
2701\r
2702 @return The best support language for this driver.\r
2703**/\r
2704CHAR8 *\r
a71003f2 2705EFIAPI\r
36384ceb 2706GetBestLanguageForDriver (\r
a71003f2
ED
2707 IN CONST CHAR8 *SupportedLanguages,\r
2708 IN CONST CHAR8 *InputLanguage,\r
36384ceb
ED
2709 IN BOOLEAN Iso639Language\r
2710 )\r
2711{\r
2712 CHAR8 *LanguageVariable;\r
2713 CHAR8 *BestLanguage;\r
2714\r
3cdd434e 2715 GetVariable2 (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid, (VOID**)&LanguageVariable, NULL);\r
36384ceb
ED
2716\r
2717 BestLanguage = GetBestLanguage(\r
2718 SupportedLanguages,\r
2719 Iso639Language,\r
a71003f2 2720 (InputLanguage != NULL) ? InputLanguage : "",\r
36384ceb 2721 (LanguageVariable != NULL) ? LanguageVariable : "",\r
a71003f2 2722 SupportedLanguages,\r
36384ceb
ED
2723 NULL\r
2724 );\r
2725\r
2726 if (LanguageVariable != NULL) {\r
2727 FreePool (LanguageVariable);\r
2728 }\r
2729\r
2730 return BestLanguage;\r
2731}\r
2732\r
a405b86d 2733/**\r
2734 Function to retrieve the driver name (if possible) from the ComponentName or\r
2735 ComponentName2 protocol\r
2736\r
2737 @param[in] TheHandle The driver handle to get the name of.\r
2738 @param[in] Language The language to use.\r
2739\r
2740 @retval NULL The name could not be found.\r
2741 @return A pointer to the string name. Do not de-allocate the memory.\r
2742**/\r
2743CONST CHAR16*\r
2744EFIAPI\r
2745GetStringNameFromHandle(\r
2746 IN CONST EFI_HANDLE TheHandle,\r
2747 IN CONST CHAR8 *Language\r
2748 )\r
2749{\r
2750 EFI_COMPONENT_NAME2_PROTOCOL *CompNameStruct;\r
2751 EFI_STATUS Status;\r
2752 CHAR16 *RetVal;\r
36384ceb
ED
2753 CHAR8 *BestLang;\r
2754\r
2755 BestLang = NULL;\r
a405b86d 2756\r
2757 Status = gBS->OpenProtocol(\r
2758 TheHandle,\r
2759 &gEfiComponentName2ProtocolGuid,\r
2760 (VOID**)&CompNameStruct,\r
2761 gImageHandle,\r
2762 NULL,\r
2763 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
2764 if (!EFI_ERROR(Status)) {\r
a71003f2
ED
2765 BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);\r
2766 Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);\r
36384ceb
ED
2767 if (BestLang != NULL) {\r
2768 FreePool (BestLang);\r
2769 BestLang = NULL;\r
2770 }\r
a405b86d 2771 if (!EFI_ERROR(Status)) {\r
2772 return (RetVal);\r
2773 }\r
2774 }\r
2775 Status = gBS->OpenProtocol(\r
2776 TheHandle,\r
2777 &gEfiComponentNameProtocolGuid,\r
2778 (VOID**)&CompNameStruct,\r
2779 gImageHandle,\r
2780 NULL,\r
2781 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
2782 if (!EFI_ERROR(Status)) {\r
a71003f2
ED
2783 BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);\r
2784 Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);\r
36384ceb
ED
2785 if (BestLang != NULL) {\r
2786 FreePool (BestLang);\r
2787 }\r
a405b86d 2788 if (!EFI_ERROR(Status)) {\r
2789 return (RetVal);\r
2790 }\r
2791 }\r
2792 return (NULL);\r
2793}\r
2794\r
2795/**\r
2796 Function to initialize the file global mHandleList object for use in\r
2797 vonverting handles to index and index to handle.\r
2798\r
2799 @retval EFI_SUCCESS The operation was successful.\r
2800**/\r
2801EFI_STATUS\r
a405b86d 2802InternalShellInitHandleList(\r
2803 VOID\r
2804 )\r
2805{\r
2806 EFI_STATUS Status;\r
2807 EFI_HANDLE *HandleBuffer;\r
2808 UINTN HandleCount;\r
2809 HANDLE_LIST *ListWalker;\r
2810\r
2811 if (mHandleList.NextIndex != 0) {\r
2812 return EFI_SUCCESS;\r
2813 }\r
2814 InitializeListHead(&mHandleList.List.Link);\r
2815 mHandleList.NextIndex = 1;\r
2816 Status = gBS->LocateHandleBuffer (\r
2817 AllHandles,\r
2818 NULL,\r
2819 NULL,\r
2820 &HandleCount,\r
2821 &HandleBuffer\r
2822 );\r
2823 ASSERT_EFI_ERROR(Status);\r
2824 if (EFI_ERROR(Status)) {\r
2825 return (Status);\r
2826 }\r
2827 for (mHandleList.NextIndex = 1 ; mHandleList.NextIndex <= HandleCount ; mHandleList.NextIndex++){\r
78ed876b 2828 ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
aa3276c1
RN
2829 if (ListWalker != NULL) {\r
2830 ListWalker->TheHandle = HandleBuffer[mHandleList.NextIndex - 1];\r
2831 ListWalker->TheIndex = mHandleList.NextIndex;\r
2832 InsertTailList (&mHandleList.List.Link, &ListWalker->Link);\r
2833 }\r
a405b86d 2834 }\r
2835 FreePool(HandleBuffer);\r
2836 return (EFI_SUCCESS);\r
2837}\r
2838\r
2839/**\r
2840 Function to retrieve the human-friendly index of a given handle. If the handle\r
2841 does not have a index one will be automatically assigned. The index value is valid\r
2842 until the termination of the shell application.\r
2843\r
2844 @param[in] TheHandle The handle to retrieve an index for.\r
2845\r
2846 @retval 0 A memory allocation failed.\r
2847 @return The index of the handle.\r
2848\r
2849**/\r
2850UINTN\r
2851EFIAPI\r
2852ConvertHandleToHandleIndex(\r
2853 IN CONST EFI_HANDLE TheHandle\r
2854 )\r
2855{\r
f330ff35 2856 EFI_STATUS Status;\r
2857 EFI_GUID **ProtocolBuffer;\r
2858 UINTN ProtocolCount;\r
2859 HANDLE_LIST *ListWalker;\r
2860\r
78ed876b 2861 if (TheHandle == NULL) {\r
2862 return 0;\r
2863 }\r
a405b86d 2864\r
2865 InternalShellInitHandleList();\r
2866\r
2867 for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)\r
2868 ; !IsNull(&mHandleList.List.Link,&ListWalker->Link)\r
2869 ; ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
2870 ){\r
2871 if (ListWalker->TheHandle == TheHandle) {\r
f330ff35 2872 //\r
2873 // Verify that TheHandle is still present in the Handle Database\r
2874 //\r
2875 Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
2876 if (EFI_ERROR (Status)) {\r
2877 //\r
2878 // TheHandle is not present in the Handle Database, so delete from the handle list\r
2879 //\r
2880 RemoveEntryList (&ListWalker->Link);\r
2881 return 0;\r
2882 }\r
2883 FreePool (ProtocolBuffer);\r
a405b86d 2884 return (ListWalker->TheIndex);\r
2885 }\r
2886 }\r
f330ff35 2887\r
2888 //\r
2889 // Verify that TheHandle is valid handle\r
2890 //\r
2891 Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
2892 if (EFI_ERROR (Status)) {\r
2893 //\r
2894 // TheHandle is not valid, so do not add to handle list\r
2895 //\r
2896 return 0;\r
2897 }\r
2898 FreePool (ProtocolBuffer);\r
2899\r
78ed876b 2900 ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
aa3276c1
RN
2901 if (ListWalker == NULL) {\r
2902 return 0;\r
2903 }\r
a405b86d 2904 ListWalker->TheHandle = TheHandle;\r
2905 ListWalker->TheIndex = mHandleList.NextIndex++;\r
2906 InsertTailList(&mHandleList.List.Link,&ListWalker->Link);\r
2907 return (ListWalker->TheIndex);\r
2908}\r
2909\r
2910\r
2911\r
2912/**\r
2913 Function to retrieve the EFI_HANDLE from the human-friendly index.\r
2914\r
2915 @param[in] TheIndex The index to retrieve the EFI_HANDLE for.\r
2916\r
2917 @retval NULL The index was invalid.\r
2918 @return The EFI_HANDLE that index represents.\r
2919\r
2920**/\r
2921EFI_HANDLE\r
2922EFIAPI\r
2923ConvertHandleIndexToHandle(\r
2924 IN CONST UINTN TheIndex\r
2925 )\r
2926{\r
f330ff35 2927 EFI_STATUS Status;\r
2928 EFI_GUID **ProtocolBuffer;\r
2929 UINTN ProtocolCount;\r
a405b86d 2930 HANDLE_LIST *ListWalker;\r
2931\r
2932 InternalShellInitHandleList();\r
2933\r
2934 if (TheIndex >= mHandleList.NextIndex) {\r
f330ff35 2935 return NULL;\r
a405b86d 2936 }\r
2937\r
2938 for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)\r
2939 ; !IsNull(&mHandleList.List.Link,&ListWalker->Link)\r
2940 ; ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
2941 ){\r
f330ff35 2942 if (ListWalker->TheIndex == TheIndex && ListWalker->TheHandle != NULL) {\r
2943 //\r
2944 // Verify that LinkWalker->TheHandle is valid handle\r
2945 //\r
2946 Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);\r
00324f3f
RN
2947 if (!EFI_ERROR (Status)) {\r
2948 FreePool (ProtocolBuffer);\r
2949 } else {\r
f330ff35 2950 //\r
2951 // TheHandle is not valid, so do not add to handle list\r
2952 //\r
2953 ListWalker->TheHandle = NULL;\r
2954 }\r
a405b86d 2955 return (ListWalker->TheHandle);\r
2956 }\r
2957 }\r
f330ff35 2958 return NULL;\r
a405b86d 2959}\r
2960\r
2961/**\r
2962 Gets all the related EFI_HANDLEs based on the mask supplied.\r
2963\r
2964 This function scans all EFI_HANDLES in the UEFI environment's handle database\r
2965 and returns the ones with the specified relationship (Mask) to the specified\r
2966 controller handle.\r
2967\r
2968 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.\r
2969 If MatchingHandleCount is NULL, then ASSERT.\r
2970\r
2971 If MatchingHandleBuffer is not NULL upon a successful return the memory must be\r
2972 caller freed.\r
2973\r
2974 @param[in] DriverBindingHandle The handle with Driver Binding protocol on it.\r
2975 @param[in] ControllerHandle The handle with Device Path protocol on it.\r
2976 @param[in] MatchingHandleCount The pointer to UINTN that specifies the number of HANDLES in\r
2977 MatchingHandleBuffer.\r
2978 @param[out] MatchingHandleBuffer On a successful return, a buffer of MatchingHandleCount\r
2979 EFI_HANDLEs with a terminating NULL EFI_HANDLE.\r
2980 @param[out] HandleType An array of type information.\r
2981\r
2982 @retval EFI_SUCCESS The operation was successful, and any related handles\r
2983 are in MatchingHandleBuffer.\r
2984 @retval EFI_NOT_FOUND No matching handles were found.\r
2985 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.\r
2986**/\r
2987EFI_STATUS\r
2988EFIAPI\r
2989ParseHandleDatabaseByRelationshipWithType (\r
2990 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,\r
2991 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
2992 IN UINTN *HandleCount,\r
2993 OUT EFI_HANDLE **HandleBuffer,\r
2994 OUT UINTN **HandleType\r
2995 )\r
2996{\r
2997 EFI_STATUS Status;\r
2998 UINTN HandleIndex;\r
2999 EFI_GUID **ProtocolGuidArray;\r
3000 UINTN ArrayCount;\r
3001 UINTN ProtocolIndex;\r
3002 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;\r
3003 UINTN OpenInfoCount;\r
3004 UINTN OpenInfoIndex;\r
3005 UINTN ChildIndex;\r
f330ff35 3006 INTN DriverBindingHandleIndex;\r
a405b86d 3007\r
3008 ASSERT(HandleCount != NULL);\r
3009 ASSERT(HandleBuffer != NULL);\r
3010 ASSERT(HandleType != NULL);\r
3011 ASSERT(DriverBindingHandle != NULL || ControllerHandle != NULL);\r
3012\r
3013 *HandleCount = 0;\r
3014 *HandleBuffer = NULL;\r
3015 *HandleType = NULL;\r
3016\r
3017 //\r
3018 // Retrieve the list of all handles from the handle database\r
3019 //\r
3020 Status = gBS->LocateHandleBuffer (\r
3021 AllHandles,\r
3022 NULL,\r
3023 NULL,\r
3024 HandleCount,\r
3025 HandleBuffer\r
3026 );\r
3027 if (EFI_ERROR (Status)) {\r
3028 return (Status);\r
3029 }\r
3030\r
3031 *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));\r
aa3276c1
RN
3032 if (*HandleType == NULL) {\r
3033 SHELL_FREE_NON_NULL (*HandleBuffer);\r
94fcb76b 3034 *HandleCount = 0;\r
aa3276c1
RN
3035 return EFI_OUT_OF_RESOURCES;\r
3036 }\r
a405b86d 3037\r
f330ff35 3038 DriverBindingHandleIndex = -1;\r
3039 for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
3040 if (DriverBindingHandle != NULL && (*HandleBuffer)[HandleIndex] == DriverBindingHandle) {\r
3041 DriverBindingHandleIndex = (INTN)HandleIndex;\r
3042 }\r
3043 }\r
3044\r
a405b86d 3045 for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
3046 //\r
3047 // Retrieve the list of all the protocols on each handle\r
3048 //\r
3049 Status = gBS->ProtocolsPerHandle (\r
3050 (*HandleBuffer)[HandleIndex],\r
3051 &ProtocolGuidArray,\r
3052 &ArrayCount\r
3053 );\r
f330ff35 3054 if (EFI_ERROR (Status)) {\r
3055 continue;\r
3056 }\r
a405b86d 3057\r
f330ff35 3058 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
a405b86d 3059\r
f330ff35 3060 //\r
3061 // Set the bit describing what this handle has\r
3062 //\r
3063 if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid) ) {\r
7aae3c35 3064 (*HandleType)[HandleIndex] |= (UINTN)HR_IMAGE_HANDLE;\r
f330ff35 3065 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid) ) {\r
7aae3c35 3066 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_BINDING_HANDLE;\r
f330ff35 3067 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {\r
7aae3c35 3068 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;\r
f330ff35 3069 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) {\r
7aae3c35 3070 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;\r
f330ff35 3071 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid) ) {\r
7aae3c35 3072 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;\r
f330ff35 3073 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid) ) {\r
7aae3c35 3074 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;\r
f330ff35 3075 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid) ) {\r
7aae3c35 3076 (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;\r
f330ff35 3077 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid) ) {\r
7aae3c35 3078 (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;\r
f330ff35 3079 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid) ) {\r
7aae3c35 3080 (*HandleType)[HandleIndex] |= (UINTN)HR_DEVICE_HANDLE;\r
f330ff35 3081 }\r
3082 //\r
3083 // Retrieve the list of agents that have opened each protocol\r
3084 //\r
3085 Status = gBS->OpenProtocolInformation (\r
a405b86d 3086 (*HandleBuffer)[HandleIndex],\r
3087 ProtocolGuidArray[ProtocolIndex],\r
3088 &OpenInfo,\r
3089 &OpenInfoCount\r
3090 );\r
f330ff35 3091 if (EFI_ERROR (Status)) {\r
3092 continue;\r
3093 }\r
3094\r
3095 if (ControllerHandle == NULL) {\r
3096 //\r
1a6f74d9 3097 // ControllerHandle == NULL and DriverBindingHandle != NULL.\r
f330ff35 3098 // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing\r
3099 //\r
3100 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
3101 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
7aae3c35 3102 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
f330ff35 3103 if (DriverBindingHandleIndex != -1) {\r
7aae3c35 3104 (*HandleType)[DriverBindingHandleIndex] |= (UINTN)HR_DEVICE_DRIVER;\r
f330ff35 3105 }\r
3106 }\r
3107 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
7aae3c35 3108 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
f330ff35 3109 if (DriverBindingHandleIndex != -1) {\r
7aae3c35 3110 (*HandleType)[DriverBindingHandleIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
f330ff35 3111 }\r
3112 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
3113 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 3114 (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
f330ff35 3115 }\r
3116 }\r
3117 }\r
3118 }\r
3119 }\r
3120 if (DriverBindingHandle == NULL && ControllerHandle != NULL) {\r
3121 if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
7aae3c35 3122 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
a405b86d 3123 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
f330ff35 3124 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
3125 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
3126 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 3127 (*HandleType)[ChildIndex] |= (UINTN)HR_DEVICE_DRIVER;\r
f330ff35 3128 }\r
a405b86d 3129 }\r
f330ff35 3130 }\r
3131 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
3132 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
3133 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 3134 (*HandleType)[ChildIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
f330ff35 3135 }\r
3136 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 3137 (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
a405b86d 3138 }\r
3139 }\r
3140 }\r
f330ff35 3141 }\r
3142 } else {\r
3143 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
3144 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
3145 if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
7aae3c35 3146 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_PARENT_HANDLE);\r
f330ff35 3147 }\r
3148 }\r
3149 }\r
3150 }\r
3151 }\r
3152 if (DriverBindingHandle != NULL && ControllerHandle != NULL) {\r
3153 if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
7aae3c35 3154 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
f330ff35 3155 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
3156 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
3157 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
3158 if (DriverBindingHandleIndex != -1) {\r
7aae3c35 3159 (*HandleType)[DriverBindingHandleIndex] |= (UINTN)HR_DEVICE_DRIVER;\r
a405b86d 3160 }\r
3161 }\r
f330ff35 3162 }\r
3163 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
3164 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
a405b86d 3165 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
f330ff35 3166 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 3167 (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
a405b86d 3168 }\r
3169 }\r
3170 }\r
f330ff35 3171\r
3172 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
3173 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 3174 (*HandleType)[ChildIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
f330ff35 3175 }\r
3176 }\r
3177 }\r
3178 }\r
3179 } else {\r
3180 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
3181 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
3182 if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
7aae3c35 3183 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_PARENT_HANDLE);\r
f330ff35 3184 }\r
a405b86d 3185 }\r
3186 }\r
a405b86d 3187 }\r
3188 }\r
f330ff35 3189 FreePool (OpenInfo);\r
a405b86d 3190 }\r
f330ff35 3191 FreePool (ProtocolGuidArray);\r
a405b86d 3192 }\r
f330ff35 3193 return EFI_SUCCESS;\r
a405b86d 3194}\r
3195\r
3196/**\r
3197 Gets all the related EFI_HANDLEs based on the single EFI_HANDLE and the mask\r
3198 supplied.\r
3199\r
3200 This function will scan all EFI_HANDLES in the UEFI environment's handle database\r
3201 and return all the ones with the specified relationship (Mask) to the specified\r
3202 controller handle.\r
3203\r
3204 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.\r
3205 If MatchingHandleCount is NULL, then ASSERT.\r
3206\r
3207 If MatchingHandleBuffer is not NULL upon a sucessful return the memory must be\r
3208 caller freed.\r
3209\r
3210 @param[in] DriverBindingHandle Handle to a object with Driver Binding protocol\r
3211 on it.\r
3212 @param[in] ControllerHandle Handle to a device with Device Path protocol on it.\r
3213 @param[in] Mask Mask of what relationship(s) is desired.\r
3214 @param[in] MatchingHandleCount Poitner to UINTN specifying number of HANDLES in\r
3215 MatchingHandleBuffer.\r
3216 @param[out] MatchingHandleBuffer On a sucessful return a buffer of MatchingHandleCount\r
3217 EFI_HANDLEs and a terminating NULL EFI_HANDLE.\r
3218\r
3219 @retval EFI_SUCCESS The operation was sucessful and any related handles\r
3220 are in MatchingHandleBuffer;\r
3221 @retval EFI_NOT_FOUND No matching handles were found.\r
3222 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.\r
3223**/\r
3224EFI_STATUS\r
3225EFIAPI\r
3226ParseHandleDatabaseByRelationship (\r
3227 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,\r
3228 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
3229 IN CONST UINTN Mask,\r
3230 IN UINTN *MatchingHandleCount,\r
3231 OUT EFI_HANDLE **MatchingHandleBuffer OPTIONAL\r
3232 )\r
3233{\r
3234 EFI_STATUS Status;\r
3235 UINTN HandleCount;\r
3236 EFI_HANDLE *HandleBuffer;\r
3237 UINTN *HandleType;\r
3238 UINTN HandleIndex;\r
3239\r
3240 ASSERT(MatchingHandleCount != NULL);\r
3241 ASSERT(DriverBindingHandle != NULL || ControllerHandle != NULL);\r
3242\r
3243 if ((Mask & HR_VALID_MASK) != Mask) {\r
3244 return (EFI_INVALID_PARAMETER);\r
3245 }\r
3246\r
3247 if ((Mask & HR_CHILD_HANDLE) != 0 && DriverBindingHandle == NULL) {\r
3248 return (EFI_INVALID_PARAMETER);\r
3249 }\r
3250\r
3251 *MatchingHandleCount = 0;\r
3252 if (MatchingHandleBuffer != NULL) {\r
3253 *MatchingHandleBuffer = NULL;\r
3254 }\r
3255\r
3256 HandleBuffer = NULL;\r
3257 HandleType = NULL;\r
3258\r
3259 Status = ParseHandleDatabaseByRelationshipWithType (\r
3260 DriverBindingHandle,\r
3261 ControllerHandle,\r
3262 &HandleCount,\r
3263 &HandleBuffer,\r
3264 &HandleType\r
3265 );\r
3266 if (!EFI_ERROR (Status)) {\r
3267 //\r
3268 // Count the number of handles that match the attributes in Mask\r
3269 //\r
3270 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
3271 if ((HandleType[HandleIndex] & Mask) == Mask) {\r
3272 (*MatchingHandleCount)++;\r
3273 }\r
3274 }\r
3275 //\r
3276 // If no handles match the attributes in Mask then return EFI_NOT_FOUND\r
3277 //\r
3278 if (*MatchingHandleCount == 0) {\r
3279 Status = EFI_NOT_FOUND;\r
3280 } else {\r
3281\r
3282 if (MatchingHandleBuffer == NULL) {\r
3283 //\r
3284 // Someone just wanted the count...\r
3285 //\r
3286 Status = EFI_SUCCESS;\r
3287 } else {\r
3288 //\r
3289 // Allocate a handle buffer for the number of handles that matched the attributes in Mask\r
3290 //\r
78ed876b 3291 *MatchingHandleBuffer = AllocateZeroPool ((*MatchingHandleCount +1)* sizeof (EFI_HANDLE));\r
94fcb76b
RN
3292 if (*MatchingHandleBuffer == NULL) {\r
3293 Status = EFI_OUT_OF_RESOURCES;\r
3294 } else {\r
aa3276c1
RN
3295 for (HandleIndex = 0, *MatchingHandleCount = 0\r
3296 ; HandleIndex < HandleCount\r
3297 ; HandleIndex++\r
3298 ) {\r
3299 //\r
3300 // Fill the allocated buffer with the handles that matched the attributes in Mask\r
3301 //\r
3302 if ((HandleType[HandleIndex] & Mask) == Mask) {\r
3303 (*MatchingHandleBuffer)[(*MatchingHandleCount)++] = HandleBuffer[HandleIndex];\r
3304 }\r
3305 }\r
a405b86d 3306\r
a405b86d 3307 //\r
aa3276c1 3308 // Make the last one NULL\r
a405b86d 3309 //\r
aa3276c1 3310 (*MatchingHandleBuffer)[*MatchingHandleCount] = NULL;\r
a405b86d 3311\r
aa3276c1 3312 Status = EFI_SUCCESS;\r
94fcb76b 3313 } // *MatchingHandleBuffer == NULL (ELSE)\r
a405b86d 3314 } // MacthingHandleBuffer == NULL (ELSE)\r
3315 } // *MatchingHandleCount == 0 (ELSE)\r
3316 } // no error on ParseHandleDatabaseByRelationshipWithType\r
3317\r
3318 if (HandleBuffer != NULL) {\r
3319 FreePool (HandleBuffer);\r
3320 }\r
3321\r
3322 if (HandleType != NULL) {\r
3323 FreePool (HandleType);\r
3324 }\r
3325\r
94fcb76b
RN
3326 ASSERT ((MatchingHandleBuffer == NULL) ||\r
3327 (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||\r
3328 (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL));\r
a405b86d 3329 return Status;\r
3330}\r
3331\r
3332/**\r
3333 Gets handles for any child controllers of the passed in controller.\r
3334\r
3335 @param[in] ControllerHandle The handle of the "parent controller"\r
b6c54204 3336 @param[out] MatchingHandleCount Pointer to the number of handles in\r
a405b86d 3337 MatchingHandleBuffer on return.\r
3338 @param[out] MatchingHandleBuffer Buffer containing handles on a successful\r
3339 return.\r
3340\r
3341\r
3342 @retval EFI_SUCCESS The operation was sucessful.\r
3343**/\r
3344EFI_STATUS\r
3345EFIAPI\r
3346ParseHandleDatabaseForChildControllers(\r
3347 IN CONST EFI_HANDLE ControllerHandle,\r
b6c54204 3348 OUT UINTN *MatchingHandleCount,\r
a405b86d 3349 OUT EFI_HANDLE **MatchingHandleBuffer OPTIONAL\r
3350 )\r
3351{\r
3352 EFI_STATUS Status;\r
f330ff35 3353 UINTN HandleIndex;\r
a405b86d 3354 UINTN DriverBindingHandleCount;\r
3355 EFI_HANDLE *DriverBindingHandleBuffer;\r
3356 UINTN DriverBindingHandleIndex;\r
3357 UINTN ChildControllerHandleCount;\r
3358 EFI_HANDLE *ChildControllerHandleBuffer;\r
3359 UINTN ChildControllerHandleIndex;\r
a405b86d 3360 EFI_HANDLE *HandleBufferForReturn;\r
3361\r
ff51746b 3362 if (MatchingHandleCount == NULL) {\r
3363 return (EFI_INVALID_PARAMETER);\r
3364 }\r
64d753f1 3365 *MatchingHandleCount = 0;\r
a405b86d 3366\r
3367 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
3368 ControllerHandle,\r
3369 &DriverBindingHandleCount,\r
3370 &DriverBindingHandleBuffer\r
3371 );\r
3372 if (EFI_ERROR (Status)) {\r
3373 return Status;\r
3374 }\r
3375\r
ff51746b 3376 //\r
3377 // Get a buffer big enough for all the controllers.\r
3378 //\r
f330ff35 3379 HandleBufferForReturn = GetHandleListByProtocol(NULL);\r
a405b86d 3380 if (HandleBufferForReturn == NULL) {\r
3381 FreePool (DriverBindingHandleBuffer);\r
ff51746b 3382 return (EFI_NOT_FOUND);\r
a405b86d 3383 }\r
3384\r
a405b86d 3385 for (DriverBindingHandleIndex = 0; DriverBindingHandleIndex < DriverBindingHandleCount; DriverBindingHandleIndex++) {\r
3386 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
3387 DriverBindingHandleBuffer[DriverBindingHandleIndex],\r
3388 ControllerHandle,\r
3389 &ChildControllerHandleCount,\r
3390 &ChildControllerHandleBuffer\r
3391 );\r
3392 if (EFI_ERROR (Status)) {\r
3393 continue;\r
3394 }\r
3395\r
3396 for (ChildControllerHandleIndex = 0;\r
3397 ChildControllerHandleIndex < ChildControllerHandleCount;\r
3398 ChildControllerHandleIndex++\r
3399 ) {\r
f330ff35 3400 for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) {\r
3401 if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {\r
3402 break;\r
3403 }\r
3404 }\r
3405 if (HandleIndex >= *MatchingHandleCount) {\r
3406 HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
3407 }\r
a405b86d 3408 }\r
3409\r
3410 FreePool (ChildControllerHandleBuffer);\r
3411 }\r
3412\r
3413 FreePool (DriverBindingHandleBuffer);\r
3414\r
7eb3bb6c
LE
3415 if (MatchingHandleBuffer == NULL || *MatchingHandleCount == 0) {\r
3416 //\r
3417 // The caller is not interested in the actual handles, or we've found none.\r
3418 //\r
3419 FreePool (HandleBufferForReturn);\r
3420 HandleBufferForReturn = NULL;\r
3421 }\r
3422\r
a405b86d 3423 if (MatchingHandleBuffer != NULL) {\r
3424 *MatchingHandleBuffer = HandleBufferForReturn;\r
a405b86d 3425 }\r
7eb3bb6c 3426\r
94fcb76b
RN
3427 ASSERT ((MatchingHandleBuffer == NULL) ||\r
3428 (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||\r
3429 (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL));\r
a405b86d 3430\r
3431 return (EFI_SUCCESS);\r
3432}\r
3433\r
3434/**\r
3435 Appends 1 buffer to another buffer. This will re-allocate the destination buffer\r
3436 if necessary to fit all of the data.\r
3437\r
3438 If DestinationBuffer is NULL, then ASSERT().\r
3439\r
4ff7e37b
ED
3440 @param[in, out] DestinationBuffer The pointer to the pointer to the buffer to append onto.\r
3441 @param[in, out] DestinationSize The pointer to the size of DestinationBuffer.\r
3442 @param[in] SourceBuffer The pointer to the buffer to append onto DestinationBuffer.\r
3443 @param[in] SourceSize The number of bytes of SourceBuffer to append.\r
a405b86d 3444\r
3445 @retval NULL A memory allocation failed.\r
3446 @retval NULL A parameter was invalid.\r
3447 @return A pointer to (*DestinationBuffer).\r
3448**/\r
3449VOID*\r
a405b86d 3450BuffernCatGrow (\r
3451 IN OUT VOID **DestinationBuffer,\r
3452 IN OUT UINTN *DestinationSize,\r
3453 IN VOID *SourceBuffer,\r
3454 IN UINTN SourceSize\r
3455 )\r
3456{\r
3457 UINTN LocalDestinationSize;\r
3458 UINTN LocalDestinationFinalSize;\r
3459\r
3460 ASSERT(DestinationBuffer != NULL);\r
3461\r
3462 if (SourceSize == 0 || SourceBuffer == NULL) {\r
3463 return (*DestinationBuffer);\r
3464 }\r
3465\r
3466 if (DestinationSize == NULL) {\r
3467 LocalDestinationSize = 0;\r
3468 } else {\r
3469 LocalDestinationSize = *DestinationSize;\r
3470 }\r
3471\r
3472 LocalDestinationFinalSize = LocalDestinationSize + SourceSize;\r
3473\r
3474 if (DestinationSize != NULL) {\r
3475 *DestinationSize = LocalDestinationSize;\r
3476 }\r
3477\r
3478 if (LocalDestinationSize == 0) {\r
3479 // allcoate\r
78ed876b 3480 *DestinationBuffer = AllocateZeroPool(LocalDestinationFinalSize);\r
a405b86d 3481 } else {\r
3482 // reallocate\r
3483 *DestinationBuffer = ReallocatePool(LocalDestinationSize, LocalDestinationFinalSize, *DestinationBuffer);\r
3484 }\r
3485\r
3486 ASSERT(*DestinationBuffer != NULL);\r
3487\r
3488 // copy\r
3489 return (CopyMem(((UINT8*)(*DestinationBuffer)) + LocalDestinationSize, SourceBuffer, SourceSize));\r
3490}\r
3491\r
3492/**\r
3493 Gets handles for any child devices produced by the passed in driver.\r
3494\r
3495 @param[in] DriverHandle The handle of the driver.\r
3496 @param[in] MatchingHandleCount Pointer to the number of handles in\r
3497 MatchingHandleBuffer on return.\r
3498 @param[out] MatchingHandleBuffer Buffer containing handles on a successful\r
3499 return.\r
3500 @retval EFI_SUCCESS The operation was sucessful.\r
3501 @sa ParseHandleDatabaseByRelationship\r
3502**/\r
3503EFI_STATUS\r
3504EFIAPI\r
3505ParseHandleDatabaseForChildDevices(\r
3506 IN CONST EFI_HANDLE DriverHandle,\r
3507 IN UINTN *MatchingHandleCount,\r
3508 OUT EFI_HANDLE **MatchingHandleBuffer OPTIONAL\r
3509 )\r
3510{\r
3511 EFI_HANDLE *Buffer;\r
3512 EFI_HANDLE *Buffer2;\r
3513 UINTN Count1;\r
3514 UINTN Count2;\r
3515 UINTN HandleIndex;\r
3516 EFI_STATUS Status;\r
3517 UINTN HandleBufferSize;\r
3518\r
3519 ASSERT(MatchingHandleCount != NULL);\r
3520\r
3521 HandleBufferSize = 0;\r
3522 Buffer = NULL;\r
3523 Buffer2 = NULL;\r
3524 *MatchingHandleCount = 0;\r
3525\r
3526 Status = PARSE_HANDLE_DATABASE_DEVICES (\r
3527 DriverHandle,\r
3528 &Count1,\r
3529 &Buffer\r
3530 );\r
3531 if (!EFI_ERROR (Status)) {\r
3532 for (HandleIndex = 0; HandleIndex < Count1; HandleIndex++) {\r
3533 //\r
3534 // now find the children\r
3535 //\r
3536 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
3537 DriverHandle,\r
3538 Buffer[HandleIndex],\r
3539 &Count2,\r
3540 &Buffer2\r
3541 );\r
3542 if (EFI_ERROR(Status)) {\r
3543 break;\r
3544 }\r
3545 //\r
3546 // save out required and optional data elements\r
3547 //\r
3548 *MatchingHandleCount += Count2;\r
3549 if (MatchingHandleBuffer != NULL) {\r
3550 *MatchingHandleBuffer = BuffernCatGrow((VOID**)MatchingHandleBuffer, &HandleBufferSize, Buffer2, Count2 * sizeof(Buffer2[0]));\r
3551 }\r
3552\r
3553 //\r
3554 // free the memory\r
3555 //\r
3556 if (Buffer2 != NULL) {\r
3557 FreePool(Buffer2);\r
3558 }\r
3559 }\r
3560 }\r
3561\r
3562 if (Buffer != NULL) {\r
3563 FreePool(Buffer);\r
3564 }\r
3565 return (Status);\r
3566}\r
3567\r
3568/**\r
3569 Function to get all handles that support a given protocol or all handles.\r
3570\r
3571 @param[in] ProtocolGuid The guid of the protocol to get handles for. If NULL\r
3572 then the function will return all handles.\r
3573\r
3574 @retval NULL A memory allocation failed.\r
3575 @return A NULL terminated list of handles.\r
3576**/\r
3577EFI_HANDLE*\r
3578EFIAPI\r
40d7a9cf 3579GetHandleListByProtocol (\r
a405b86d 3580 IN CONST EFI_GUID *ProtocolGuid OPTIONAL\r
3581 )\r
3582{\r
3583 EFI_HANDLE *HandleList;\r
3584 UINTN Size;\r
3585 EFI_STATUS Status;\r
3586\r
3587 Size = 0;\r
3588 HandleList = NULL;\r
3589\r
3590 //\r
3591 // We cannot use LocateHandleBuffer since we need that NULL item on the ends of the list!\r
3592 //\r
3593 if (ProtocolGuid == NULL) {\r
3594 Status = gBS->LocateHandle(AllHandles, NULL, NULL, &Size, HandleList);\r
3595 if (Status == EFI_BUFFER_TOO_SMALL) {\r
78ed876b 3596 HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
40d7a9cf 3597 if (HandleList == NULL) {\r
3598 return (NULL);\r
3599 }\r
a405b86d 3600 Status = gBS->LocateHandle(AllHandles, NULL, NULL, &Size, HandleList);\r
3601 HandleList[Size/sizeof(EFI_HANDLE)] = NULL;\r
3602 }\r
3603 } else {\r
3604 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)ProtocolGuid, NULL, &Size, HandleList);\r
3605 if (Status == EFI_BUFFER_TOO_SMALL) {\r
78ed876b 3606 HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
40d7a9cf 3607 if (HandleList == NULL) {\r
3608 return (NULL);\r
3609 }\r
a405b86d 3610 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)ProtocolGuid, NULL, &Size, HandleList);\r
3611 HandleList[Size/sizeof(EFI_HANDLE)] = NULL;\r
3612 }\r
3613 }\r
3614 if (EFI_ERROR(Status)) {\r
3615 if (HandleList != NULL) {\r
3616 FreePool(HandleList);\r
3617 }\r
3618 return (NULL);\r
3619 }\r
3620 return (HandleList);\r
3621}\r
3622\r
3623/**\r
3624 Function to get all handles that support some protocols.\r
3625\r
3626 @param[in] ProtocolGuids A NULL terminated list of protocol GUIDs.\r
3627\r
3628 @retval NULL A memory allocation failed.\r
ff51746b 3629 @retval NULL ProtocolGuids was NULL.\r
3630 @return A NULL terminated list of EFI_HANDLEs.\r
a405b86d 3631**/\r
3632EFI_HANDLE*\r
3633EFIAPI\r
40d7a9cf 3634GetHandleListByProtocolList (\r
a405b86d 3635 IN CONST EFI_GUID **ProtocolGuids\r
3636 )\r
3637{\r
3638 EFI_HANDLE *HandleList;\r
3639 UINTN Size;\r
3640 UINTN TotalSize;\r
40d7a9cf 3641 UINTN TempSize;\r
a405b86d 3642 EFI_STATUS Status;\r
3643 CONST EFI_GUID **GuidWalker;\r
3644 EFI_HANDLE *HandleWalker1;\r
3645 EFI_HANDLE *HandleWalker2;\r
3646\r
3647 Size = 0;\r
3648 HandleList = NULL;\r
3649 TotalSize = sizeof(EFI_HANDLE);\r
3650\r
3651 for (GuidWalker = ProtocolGuids ; GuidWalker != NULL && *GuidWalker != NULL ; GuidWalker++,Size = 0){\r
3652 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &Size, NULL);\r
3653 if (Status == EFI_BUFFER_TOO_SMALL) {\r
3654 TotalSize += Size;\r
3655 }\r
3656 }\r
40d7a9cf 3657\r
3658 //\r
e918029f 3659 // No handles were found...\r
40d7a9cf 3660 //\r
3661 if (TotalSize == sizeof(EFI_HANDLE)) {\r
3662 return (NULL);\r
3663 }\r
3664\r
3665 HandleList = AllocateZeroPool(TotalSize);\r
a405b86d 3666 if (HandleList == NULL) {\r
3667 return (NULL);\r
3668 }\r
3669\r
3670 Size = 0;\r
3671 for (GuidWalker = ProtocolGuids ; GuidWalker != NULL && *GuidWalker != NULL ; GuidWalker++){\r
40d7a9cf 3672 TempSize = TotalSize - Size;\r
ff51746b 3673 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &TempSize, HandleList+(Size/sizeof(EFI_HANDLE)));\r
40d7a9cf 3674\r
3675 //\r
3676 // Allow for missing protocols... Only update the 'used' size upon success.\r
3677 //\r
3678 if (!EFI_ERROR(Status)) {\r
ff51746b 3679 Size += TempSize;\r
40d7a9cf 3680 }\r
a405b86d 3681 }\r
ff51746b 3682 ASSERT(HandleList[(TotalSize/sizeof(EFI_HANDLE))-1] == NULL);\r
a405b86d 3683\r
3684 for (HandleWalker1 = HandleList ; HandleWalker1 != NULL && *HandleWalker1 != NULL ; HandleWalker1++) {\r
3685 for (HandleWalker2 = HandleWalker1 + 1; HandleWalker2 != NULL && *HandleWalker2 != NULL ; HandleWalker2++) {\r
3686 if (*HandleWalker1 == *HandleWalker2) {\r
3687 //\r
3688 // copy memory back 1 handle width.\r
3689 //\r
3690 CopyMem(HandleWalker2, HandleWalker2 + 1, TotalSize - ((HandleWalker2-HandleList+1)*sizeof(EFI_HANDLE)));\r
3691 }\r
3692 }\r
3693 }\r
3694\r
3695 return (HandleList);\r
3696}\r
0976f908
CC
3697\r
3698/**\r
3699 Return all supported GUIDs.\r
3700\r
3701 @param[out] Guids The buffer to return all supported GUIDs.\r
3702 @param[in, out] Count On input, the count of GUIDs the buffer can hold,\r
3703 On output, the count of GUIDs to return.\r
3704\r
3705 @retval EFI_INVALID_PARAMETER Count is NULL.\r
3706 @retval EFI_BUFFER_TOO_SMALL Buffer is not enough to hold all GUIDs.\r
3707 @retval EFI_SUCCESS GUIDs are returned successfully.\r
3708**/\r
3709EFI_STATUS\r
3710EFIAPI\r
3711GetAllMappingGuids (\r
3712 OUT EFI_GUID *Guids,\r
3713 IN OUT UINTN *Count\r
3714 )\r
3715{\r
3716 UINTN GuidCount;\r
7c14bc87 3717 UINTN NtGuidCount;\r
0976f908
CC
3718 UINTN Index;\r
3719\r
3720 if (Count == NULL) {\r
3721 return EFI_INVALID_PARAMETER;\r
3722 }\r
3723\r
3724 NtGuidCount = 0;\r
3725 if (PcdGetBool (PcdShellIncludeNtGuids)) {\r
3726 NtGuidCount = ARRAY_SIZE (mGuidStringListNT) - 1;\r
3727 }\r
3728 GuidCount = ARRAY_SIZE (mGuidStringList) - 1;\r
3729\r
3730 if (*Count < NtGuidCount + GuidCount + mGuidListCount) {\r
3731 *Count = NtGuidCount + GuidCount + mGuidListCount;\r
3732 return EFI_BUFFER_TOO_SMALL;\r
3733 }\r
3734\r
3735 for (Index = 0; Index < NtGuidCount; Index++) {\r
3736 CopyGuid (&Guids[Index], mGuidStringListNT[Index].GuidId);\r
3737 }\r
3738\r
3739 for (Index = 0; Index < GuidCount; Index++) {\r
3740 CopyGuid (&Guids[NtGuidCount + Index], mGuidStringList[Index].GuidId);\r
3741 }\r
3742\r
3743 for (Index = 0; Index < mGuidListCount; Index++) {\r
3744 CopyGuid (&Guids[NtGuidCount + GuidCount + Index], mGuidList[Index].GuidId);\r
3745 }\r
3746\r
3747 return EFI_SUCCESS;\r
3748}\r