+ Size = 0;\r
+ GetString = NULL;\r
+ RetVal = NULL;\r
+ TempRetVal = NULL;\r
+ ImageHandle = 0;\r
+\r
+ Status = gBS->OpenProtocol (\r
+ TheHandle,\r
+ &gEfiBusSpecificDriverOverrideProtocolGuid,\r
+ (VOID**)&BusSpecificDriverOverride,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+ HandleParsingHiiInit ();\r
+ GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_BSDO_DUMP_MAIN), NULL);\r
+ if (GetString == NULL) {\r
+ return NULL;\r
+ }\r
+ do {\r
+ Status = BusSpecificDriverOverride->GetDriver (\r
+ BusSpecificDriverOverride,\r
+ &ImageHandle\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = gBS->HandleProtocol (\r
+ ImageHandle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ (VOID **) &LoadedImage\r
+ );\r
+ if(!EFI_ERROR (Status)) {\r
+ TempRetVal = CatSPrint (\r
+ TempRetVal,\r
+ GetString,\r
+ ConvertHandleToHandleIndex (ImageHandle),\r
+ ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE)\r
+ );\r
+ StrnCatGrow (&RetVal, &Size, TempRetVal, 0);\r
+ SHELL_FREE_NON_NULL (TempRetVal);\r
+ }\r
+ }\r
+ } while (!EFI_ERROR (Status));\r
+\r
+ SHELL_FREE_NON_NULL (GetString);\r
+ return RetVal;\r
+}\r
+\r
+/**\r
+ Function to dump information about BlockIo protocol.\r
+\r
+ This will allocate the return buffer from boot services pool.\r
+\r
+ @param[in] TheHandle The handle that has the protocol installed.\r
+ @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
+\r
+ @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+BlockIoProtocolDumpInformation (\r
+ IN CONST EFI_HANDLE TheHandle,\r
+ IN CONST BOOLEAN Verbose\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+ EFI_BLOCK_IO_MEDIA *BlockMedia;\r
+ CHAR16 *GetString;\r
+ CHAR16 *RetVal;\r
+\r
+ if (!Verbose) {\r
+ return NULL;\r
+ }\r
+ GetString = NULL;\r
+ RetVal = NULL;\r
+\r
+ Status = gBS->OpenProtocol (\r
+ TheHandle,\r
+ &gEfiBlockIoProtocolGuid,\r
+ (VOID**)&BlockIo,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+ BlockMedia = BlockIo->Media;\r
+ //\r
+ // Per spec:\r
+ // The function (ReadBlocks) must return EFI_NO_MEDIA or\r
+ // EFI_MEDIA_CHANGED even if LBA, BufferSize, or Buffer are invalid so the caller can probe\r
+ // for changes in media state.\r
+ //\r
+ BlockIo->ReadBlocks (\r
+ BlockIo,\r
+ BlockIo->Media->MediaId,\r
+ 0,\r
+ 0,\r
+ NULL\r
+ );\r
+\r
+ HandleParsingHiiInit ();\r
+ GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_BLOCKIO_INFO), NULL);\r
+ if (GetString == NULL) {\r
+ return NULL;\r
+ }\r
+ RetVal = CatSPrint (\r
+ RetVal,\r
+ GetString,\r
+ BlockMedia->RemovableMedia ? L"Removable " : L"Fixed ",\r
+ BlockMedia->MediaPresent ? L"" : L"not-present ",\r
+ BlockMedia->MediaId,\r
+ BlockMedia->BlockSize,\r
+ BlockMedia->LastBlock,\r
+ MultU64x32 (BlockMedia->LastBlock + 1, BlockMedia->BlockSize),\r
+ BlockMedia->LogicalPartition ? L"partition" : L"raw",\r
+ BlockMedia->ReadOnly ? L"ro" : L"rw",\r
+ BlockMedia->WriteCaching ? L"cached" : L"!cached"\r
+ );\r
+\r
+ SHELL_FREE_NON_NULL (GetString);\r
+ return RetVal;\r
+}\r
+\r
+/**\r
+ Function to dump information about DebugSupport Protocol.\r
+\r
+ @param[in] TheHandle The handle that has the protocol installed.\r
+ @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
+\r
+ @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+DebugSupportProtocolDumpInformation (\r
+ IN CONST EFI_HANDLE TheHandle,\r
+ IN CONST BOOLEAN Verbose\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_DEBUG_SUPPORT_PROTOCOL *DebugSupport;\r
+ CHAR16 *GetString;\r
+ CHAR16 *RetVal;\r
+\r
+ if (!Verbose) {\r
+ return NULL;\r
+ }\r
+ GetString = NULL;\r
+ RetVal = NULL;\r
+ Status = gBS->OpenProtocol (\r
+ TheHandle,\r
+ &gEfiDebugSupportProtocolGuid,\r
+ (VOID**)&DebugSupport,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+ HandleParsingHiiInit ();\r
+ GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_DEBUGSUPPORT_INFO), NULL);\r
+ if (GetString == NULL) {\r
+ return NULL;\r
+ }\r
+ //\r
+ // Dump Debug support info\r
+ //\r
+ switch (DebugSupport->Isa) {\r
+ case (IsaIa32):\r
+ RetVal = CatSPrint (RetVal, GetString, L"IA-32");\r
+ break;\r
+ case (IsaIpf):\r
+ RetVal = CatSPrint (RetVal, GetString, L"IPF");\r
+ break;\r
+ case (IsaEbc):\r
+ RetVal = CatSPrint (RetVal, GetString, L"EBC");\r
+ break;\r
+ default:\r
+ SHELL_FREE_NON_NULL (GetString);\r
+ GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_DEBUGSUPPORT_UNKNOWN), NULL);\r
+ RetVal = GetString != NULL ? CatSPrint (RetVal, GetString, DebugSupport->Isa) : NULL;\r
+ break;\r
+ }\r
+\r
+ SHELL_FREE_NON_NULL (GetString);\r
+ return RetVal;\r
+}\r
+\r
+/**\r
+ Function to dump information about PciIoProtocol.\r
+\r
+ This will allocate the return buffer from boot services pool.\r
+\r
+ @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
+ @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
+\r
+ @retval A poitner to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+PciIoProtocolDumpInformation (\r
+ IN CONST EFI_HANDLE TheHandle,\r
+ IN CONST BOOLEAN Verbose\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+ PCI_TYPE00 Pci;\r
+ UINTN Segment;\r
+ UINTN Bus;\r
+ UINTN Device;\r
+ UINTN Function;\r
+ UINTN Index;\r
+ CHAR16 *GetString;\r
+ CHAR16 *TempRetVal;\r
+ CHAR16 *RetVal;\r
+\r
+ if (!Verbose) {\r
+ return (NULL);\r
+ }\r
+ RetVal = NULL;\r
+ GetString = NULL;\r
+ TempRetVal = NULL;\r
+ Status = gBS->OpenProtocol (\r
+ TheHandle,\r
+ &gEfiPciIoProtocolGuid,\r
+ (VOID**)&PciIo,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+\r
+ if (EFI_ERROR(Status)) {\r
+ return NULL;\r
+ }\r
+ PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0, sizeof (Pci), &Pci);\r
+ PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);\r
+ HandleParsingHiiInit ();\r
+ GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIIO_DUMP_MAIN), NULL);\r
+ if (GetString == NULL) {\r
+ return NULL;\r
+ }\r
+ RetVal = CatSPrint (\r
+ NULL,\r
+ GetString,\r
+ Segment,\r
+ Bus,\r
+ Device,\r
+ Function,\r
+ PciIo->RomSize,\r
+ PciIo->RomImage,\r
+ Pci.Hdr.VendorId,\r
+ Pci.Hdr.DeviceId,\r
+ Pci.Hdr.ClassCode[0],\r
+ Pci.Hdr.ClassCode[1],\r
+ Pci.Hdr.ClassCode[2]\r
+ );\r
+ for (Index = 0; Index < sizeof (Pci); Index ++) {\r
+ if ((Index % 0x10) == 0) {\r
+ TempRetVal = CatSPrint (RetVal, L"\r\n %02x", *((UINT8 *) (&Pci) + Index));\r
+ } else {\r
+ TempRetVal = CatSPrint (RetVal, L"%02x", *((UINT8 *) (&Pci) + Index));\r
+ }\r
+ FreePool (RetVal);\r
+ RetVal = TempRetVal;\r
+ TempRetVal = NULL;\r
+ }\r
+\r
+ FreePool(GetString);\r
+ return RetVal;\r
+}\r
+\r
+/**\r
+ Function to dump information about UsbIoProtocol.\r
+\r
+ This will allocate the return buffer from boot services pool.\r
+\r
+ @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
+ @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
+\r
+ @retval A poitner to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+UsbIoProtocolDumpInformation (\r
+ IN CONST EFI_HANDLE TheHandle,\r
+ IN CONST BOOLEAN Verbose\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_USB_IO_PROTOCOL *UsbIo;\r
+ EFI_USB_INTERFACE_DESCRIPTOR InterfaceDesc;\r
+ CHAR16 *GetString;\r
+ CHAR16 *RetVal;\r
+\r
+ if (!Verbose) {\r
+ return (NULL);\r
+ }\r
+ RetVal = NULL;\r
+ GetString = NULL;\r
+ Status = gBS->OpenProtocol (\r
+ TheHandle,\r
+ &gEfiUsbIoProtocolGuid,\r
+ (VOID**)&UsbIo,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+\r
+ if (EFI_ERROR(Status)) {\r
+ return NULL;\r
+ }\r
+ UsbIo->UsbGetInterfaceDescriptor (UsbIo, &InterfaceDesc);\r
+ HandleParsingHiiInit ();\r
+ GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_USBIO_DUMP_MAIN), NULL);\r
+ if (GetString == NULL) {\r
+ return NULL;\r
+ }\r
+ RetVal = CatSPrint (\r
+ NULL,\r
+ GetString,\r
+ InterfaceDesc.InterfaceNumber,\r
+ InterfaceDesc.InterfaceClass,\r
+ InterfaceDesc.InterfaceSubClass,\r
+ InterfaceDesc.InterfaceProtocol\r
+ );\r
+\r
+ FreePool (GetString);\r
+ return RetVal;\r