]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg/dh: Modify the dump of BusSpecificDriverOverride protocol
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index 2db8a3a2cf180f820ab813ef18edd05760bc36bf..ce2b49b5a24515088f84b84484a667926f9df738 100644 (file)
 \r
 #include "UefiHandleParsingLib.h"\r
 #include "IndustryStandard/Acpi10.h"\r
+#include <PiDxe.h>\r
+#include <Protocol/FirmwareVolume2.h>\r
 \r
 EFI_HANDLE        mHandleParsingHiiHandle = NULL;\r
 HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
 GUID_INFO_BLOCK   *mGuidList;\r
 UINTN             mGuidListCount;\r
+\r
+/**\r
+  Function to find the file name associated with a LoadedImageProtocol.\r
+\r
+  @param[in] LoadedImage     An instance of LoadedImageProtocol.\r
+\r
+  @retval                    A string representation of the file name associated\r
+                             with LoadedImage, or NULL if no name can be found.\r
+**/\r
+CHAR16*\r
+FindLoadedImageFileName (\r
+  IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage\r
+  )\r
+{\r
+  EFI_GUID                       *NameGuid;\r
+  EFI_STATUS                     Status;\r
+  EFI_FIRMWARE_VOLUME2_PROTOCOL  *Fv;\r
+  VOID                           *Buffer;\r
+  UINTN                          BufferSize;\r
+  UINT32                         AuthenticationStatus;\r
+\r
+  if ((LoadedImage == NULL) || (LoadedImage->FilePath == NULL)) {\r
+    return NULL;\r
+  }\r
+\r
+  NameGuid = EfiGetNameGuidFromFwVolDevicePathNode((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath);\r
+\r
+  if (NameGuid == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.\r
+  //\r
+  Status = gBS->HandleProtocol (LoadedImage->DeviceHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID**) &Fv);\r
+\r
+  //\r
+  // FirmwareVolume2Protocol is PI, and is not required to be available.\r
+  //\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Read the user interface section of the image.\r
+  //\r
+  Buffer = NULL;\r
+  Status = Fv->ReadSection(Fv, NameGuid, EFI_SECTION_USER_INTERFACE, 0, &Buffer, &BufferSize, &AuthenticationStatus);\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // ReadSection returns just the section data, without any section header. For\r
+  // a user interface section, the only data is the file name.\r
+  //\r
+  return Buffer;\r
+}\r
+\r
 /**\r
   Function to translate the EFI_MEMORY_TYPE into a string.\r
 \r
@@ -169,21 +231,12 @@ LoadedImageProtocolDumpInformation(
   EFI_STATUS                        Status;\r
   CHAR16                            *RetVal;\r
   CHAR16                            *Temp;\r
+  CHAR16                            *FileName;\r
+  CHAR8                             *PdbFileName;\r
   CHAR16                            *FilePath;\r
   CHAR16                            *CodeType;\r
   CHAR16                            *DataType;\r
 \r
-  if (!Verbose) {\r
-    return (CatSPrint(NULL, L"LoadedImage"));\r
-  }\r
-\r
-  HandleParsingHiiInit();\r
-\r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
-  if (Temp == NULL) {\r
-    return NULL;\r
-  }\r
-\r
   Status = gBS->OpenProtocol (\r
                 TheHandle,\r
                 &gEfiLoadedImageProtocolGuid,\r
@@ -194,23 +247,52 @@ LoadedImageProtocolDumpInformation(
                );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    SHELL_FREE_NON_NULL (Temp);\r
     return NULL;\r
   }\r
 \r
+  FileName = FindLoadedImageFileName(LoadedImage);\r
   FilePath = ConvertDevicePathToText(LoadedImage->FilePath, TRUE, TRUE);\r
+  if (!Verbose) {\r
+    if (FileName == NULL) {\r
+      FileName = FilePath;\r
+    } else {\r
+      SHELL_FREE_NON_NULL(FilePath);\r
+    }\r
+    RetVal = CatSPrint(NULL, FileName);\r
+    SHELL_FREE_NON_NULL(FileName);\r
+    return RetVal;\r
+  }\r
 \r
+  HandleParsingHiiInit();\r
+  RetVal = NULL;\r
+  if (FileName != NULL) {\r
+    Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_NAME), NULL);\r
+\r
+    if (Temp != NULL) {\r
+      RetVal = CatSPrint(NULL, Temp, FileName);\r
+    }\r
+\r
+    SHELL_FREE_NON_NULL(Temp);\r
+    SHELL_FREE_NON_NULL(FileName);\r
+  }\r
+\r
+  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
+  if (Temp == NULL) {\r
+    return NULL;\r
+  }\r
+  PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);\r
   DataType = ConvertMemoryType(LoadedImage->ImageDataType);\r
   CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);\r
 \r
   RetVal = CatSPrint(\r
-             NULL,\r
+             RetVal,\r
              Temp,\r
              LoadedImage->Revision,\r
              LoadedImage->ParentHandle,\r
              LoadedImage->SystemTable,\r
              LoadedImage->DeviceHandle,\r
              FilePath,\r
+             PdbFileName,\r
              LoadedImage->LoadOptionsSize,\r
              LoadedImage->LoadOptions,\r
              LoadedImage->ImageBase,\r
@@ -771,6 +853,50 @@ ConvertDevicePathToShortText(
   return (Temp);\r
 }\r
 \r
+/**\r
+  Function to dump protocol information.\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
+  @param[in] Protocol       The protocol is needed to dump.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+STATIC CHAR16*\r
+EFIAPI\r
+DevicePathProtocolDumpInformationEx (\r
+  IN CONST EFI_HANDLE   TheHandle,\r
+  IN CONST BOOLEAN      Verbose,\r
+  IN       EFI_GUID     *Protocol\r
+)\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
+  CHAR16                            *DevPathStr;\r
+  CHAR16                            *DevPathStrTemp;\r
+  UINTN                             Size;\r
+  EFI_STATUS                        Status;\r
+  DevPathStr     = NULL;\r
+  DevPathStrTemp = NULL;\r
+  Status = gBS->OpenProtocol(TheHandle, Protocol, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
+  if (!EFI_ERROR(Status)) {\r
+    DevPathStr = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
+    if (Verbose) {\r
+      Size = StrSize(DevPathStr) + sizeof(CHAR16) * 2;\r
+      DevPathStrTemp = AllocateZeroPool (Size);\r
+      if (DevPathStrTemp != NULL) {\r
+        StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), L"  ", 2);\r
+        StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), DevPathStr, StrLen (DevPathStr));\r
+      }\r
+      FreePool (DevPathStr);\r
+      DevPathStr = DevPathStrTemp;\r
+    }\r
+    gBS->CloseProtocol(TheHandle, Protocol, gImageHandle, NULL);\r
+  }\r
+  return DevPathStr;\r
+}\r
+\r
 /**\r
   Function to dump information about DevicePath protocol.\r
 \r
@@ -788,17 +914,7 @@ DevicePathProtocolDumpInformation(
   IN CONST BOOLEAN    Verbose\r
   )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
-  CHAR16                            *Temp;\r
-  EFI_STATUS                        Status;\r
-  Temp = NULL;\r
-\r
-  Status = gBS->OpenProtocol(TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  if (!EFI_ERROR(Status)) {\r
-    Temp = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
-    gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\r
-  }\r
-  return (Temp);\r
+  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiDevicePathProtocolGuid);\r
 }\r
 \r
 /**\r
@@ -818,17 +934,86 @@ LoadedImageDevicePathProtocolDumpInformation(
   IN CONST BOOLEAN    Verbose\r
   )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
-  CHAR16                            *Temp;\r
-  EFI_STATUS                        Status;\r
-  Temp = NULL;\r
+  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiLoadedImageDevicePathProtocolGuid);\r
+}\r
 \r
-  Status = gBS->OpenProtocol(TheHandle, &gEfiLoadedImageDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  if (!EFI_ERROR(Status)) {\r
-    Temp = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
-    gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\r
+/**\r
+  Function to dump information about BusSpecificDriverOverride 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
+BusSpecificDriverOverrideProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS                                Status;\r
+  CHAR16                                    *GetString;\r
+  CHAR16                                    *RetVal;\r
+  CHAR16                                    *TempRetVal;\r
+  EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
+  EFI_LOADED_IMAGE_PROTOCOL                 *LoadedImage;\r
+  EFI_HANDLE                                ImageHandle;\r
+  UINTN                                     Size;\r
+\r
+  if (!Verbose) {\r
+    return NULL;\r
   }\r
-  return (Temp);\r
+  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
@@ -1517,7 +1702,7 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_DEVICE_PATH_VTUTF8),    &gEfiVTUTF8Guid,                                  NULL},\r
   {STRING_TOKEN(STR_DRIVER_BINDING),        &gEfiDriverBindingProtocolGuid,                   NULL},\r
   {STRING_TOKEN(STR_PLATFORM_OVERRIDE),     &gEfiPlatformDriverOverrideProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_BUS_OVERRIDE),          &gEfiBusSpecificDriverOverrideProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_BUS_OVERRIDE),          &gEfiBusSpecificDriverOverrideProtocolGuid,       BusSpecificDriverOverrideProtocolDumpInformation},\r
   {STRING_TOKEN(STR_DRIVER_DIAG),           &gEfiDriverDiagnosticsProtocolGuid,               NULL},\r
   {STRING_TOKEN(STR_DRIVER_DIAG2),          &gEfiDriverDiagnostics2ProtocolGuid,              NULL},\r
   {STRING_TOKEN(STR_DRIVER_CN),             &gEfiComponentNameProtocolGuid,                   NULL},\r