]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c
ShellPkg/pci: Fix extended register dumping for MFVC capability
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / LoadPciRom.c
index 8f1015800003c1851d950c208865d6a8b54a9db1..7be658dc879e7a74d82d1d0a643a9eb9fe5c4ecc 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for LoadPciRom shell Debug1 function.\r
 \r
-  Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -25,7 +26,6 @@
   @retval EFI_ABORTED     The abort mechanism was received.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 LoadPciRomConnectAllDriversToAllControllers (\r
   VOID\r
   );\r
@@ -44,7 +44,6 @@ LoadPciRomConnectAllDriversToAllControllers (
   @retval Other value             Unknown error.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 LoadEfiDriversFromRomImage (\r
   VOID                      *RomBar,\r
   UINTN                     RomSize,\r
@@ -94,7 +93,7 @@ ShellCommandRunLoadPciRom (
   Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
   if (EFI_ERROR(Status)) {\r
     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"loadpcirom", ProblemParam);  \r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -102,7 +101,7 @@ ShellCommandRunLoadPciRom (
     }\r
   } else {\r
     if (ShellCommandLineGetCount(Package) < 2) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"loadpcirom");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       if (ShellCommandLineGetFlag(Package, L"-nc")) {\r
@@ -121,7 +120,7 @@ ShellCommandRunLoadPciRom (
          ){\r
         Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
         if (EFI_ERROR(Status)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, Param, Status);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Param);  \r
           ShellStatus = SHELL_ACCESS_DENIED;\r
           break;\r
         }\r
@@ -135,21 +134,25 @@ ShellCommandRunLoadPciRom (
             ; Node = (EFI_SHELL_FILE_INFO*)GetNextNode(&FileList->Link, &Node->Link)\r
            ){\r
           if (EFI_ERROR(Node->Status)){\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, Node->FullName);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName);  \r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
             continue;\r
           }\r
           if (FileHandleIsDirectory(Node->Handle) == EFI_SUCCESS) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, Node->FullName);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName);  \r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
             continue;\r
           }\r
           SourceSize  = (UINTN) Node->Info->FileSize;\r
           File1Buffer = AllocateZeroPool (SourceSize);\r
-          ASSERT(File1Buffer != NULL);\r
+          if (File1Buffer == NULL) {\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"loadpcirom");\r
+            ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+            continue;\r
+          }\r
           Status = gEfiShellProtocol->ReadFile(Node->Handle, &SourceSize, File1Buffer);\r
           if (EFI_ERROR(Status)) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_READ_FAIL), gShellDebug1HiiHandle, Node->FullName);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_READ_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName);  \r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
           } else {\r
             Status = LoadEfiDriversFromRomImage (\r
@@ -163,7 +166,7 @@ ShellCommandRunLoadPciRom (
           FreePool(File1Buffer);\r
         }\r
       } else if (ShellStatus == SHELL_SUCCESS) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_SPEC), gShellDebug1HiiHandle);\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_SPEC), gShellDebug1HiiHandle, "loadpcirom");  \r
         ShellStatus = SHELL_NOT_FOUND;\r
       }\r
       if (FileList != NULL && !IsListEmpty(&FileList->Link)) {\r
@@ -194,7 +197,6 @@ ShellCommandRunLoadPciRom (
   @retval Other value             Unknown error.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 LoadEfiDriversFromRomImage (\r
   VOID                      *RomBar,\r
   UINTN                     RomSize,\r
@@ -221,6 +223,7 @@ LoadEfiDriversFromRomImage (
   VOID                          *DecompressedImageBuffer;\r
   UINT32                        ImageLength;\r
   EFI_DECOMPRESS_PROTOCOL       *Decompress;\r
+  UINT32                        InitializationSize;\r
 \r
   ImageIndex    = 0;\r
   ReturnStatus     = EFI_NOT_FOUND;\r
@@ -230,27 +233,46 @@ LoadEfiDriversFromRomImage (
 \r
     EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *) (UINTN) RomBarOffset;\r
 \r
-    if (EfiRomHeader->Signature != 0xaa55) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_CORRUPT), gShellDebug1HiiHandle, FileName, ImageIndex);\r
+    if (EfiRomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_CORRUPT), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex);  \r
 //      PrintToken (STRING_TOKEN (STR_LOADPCIROM_IMAGE_CORRUPT), HiiHandle, ImageIndex);\r
       return ReturnStatus;\r
     }\r
 \r
+    //\r
+    // If the pointer to the PCI Data Structure is invalid, no further images can be located. \r
+    // The PCI Data Structure must be DWORD aligned. \r
+    //\r
+    if (EfiRomHeader->PcirOffset == 0 ||\r
+        (EfiRomHeader->PcirOffset & 3) != 0 ||\r
+        RomBarOffset - (UINTN)RomBar + EfiRomHeader->PcirOffset + sizeof (PCI_DATA_STRUCTURE) > RomSize) {\r
+      break;\r
+    }\r
+\r
     Pcir      = (PCI_DATA_STRUCTURE *) (UINTN) (RomBarOffset + EfiRomHeader->PcirOffset);\r
+    //\r
+    // If a valid signature is not present in the PCI Data Structure, no further images can be located.\r
+    //\r
+    if (Pcir->Signature != PCI_DATA_STRUCTURE_SIGNATURE) {\r
+      break;\r
+    }\r
     ImageSize = Pcir->ImageLength * 512;\r
+    if (RomBarOffset - (UINTN)RomBar + ImageSize > RomSize) {\r
+      break;\r
+    }\r
 \r
     if ((Pcir->CodeType == PCI_CODE_TYPE_EFI_IMAGE) &&\r
-        (EfiRomHeader->EfiSignature == EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE)\r
-       ) {\r
+        (EfiRomHeader->EfiSignature == EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE) &&\r
+        ((EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) ||\r
+         (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER))) {\r
+\r
+      ImageOffset             = EfiRomHeader->EfiImageHeaderOffset;\r
+      InitializationSize      = EfiRomHeader->InitializationSize * 512;\r
 \r
-      if ((EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) ||\r
-          (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER)\r
-         ) {\r
-        ImageOffset             = EfiRomHeader->EfiImageHeaderOffset;\r
-        ImageSize               = EfiRomHeader->InitializationSize * 512;\r
+      if (InitializationSize <= ImageSize && ImageOffset < InitializationSize) {\r
 \r
         ImageBuffer             = (VOID *) (UINTN) (RomBarOffset + ImageOffset);\r
-        ImageLength             = ImageSize - ImageOffset;\r
+        ImageLength             = InitializationSize - ImageOffset;\r
         DecompressedImageBuffer = NULL;\r
 \r
         //\r
@@ -318,12 +340,12 @@ LoadEfiDriversFromRomImage (
                         &ImageHandle\r
                        );\r
           if (EFI_ERROR (Status)) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_LOAD_FAIL), gShellDebug1HiiHandle, FileName, ImageIndex, Status);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_LOAD_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex);  \r
 //            PrintToken (STRING_TOKEN (STR_LOADPCIROM_LOAD_IMAGE_ERROR), HiiHandle, ImageIndex, Status);\r
           } else {\r
             Status = gBS->StartImage (ImageHandle, NULL, NULL);\r
             if (EFI_ERROR (Status)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_START_FAIL), gShellDebug1HiiHandle, FileName, ImageIndex, Status);\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_START_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex);  \r
 //              PrintToken (STRING_TOKEN (STR_LOADPCIROM_START_IMAGE), HiiHandle, ImageIndex, Status);\r
             } else {\r
               ReturnStatus = Status;\r
@@ -352,98 +374,36 @@ LoadEfiDriversFromRomImage (
   @retval EFI_ABORTED     The abort mechanism was received.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 LoadPciRomConnectAllDriversToAllControllers (\r
   VOID\r
   )\r
-\r
 {\r
   EFI_STATUS  Status;\r
-  UINTN       AllHandleCount;\r
-  EFI_HANDLE  *AllHandleBuffer;\r
-  UINTN       Index;\r
   UINTN       HandleCount;\r
   EFI_HANDLE  *HandleBuffer;\r
-  UINTN       *HandleType;\r
-  UINTN       HandleIndex;\r
-  BOOLEAN     Parent;\r
-  BOOLEAN     Device;\r
-\r
-  Status = gBS->LocateHandleBuffer(\r
-            AllHandles,\r
-            NULL,\r
-            NULL,\r
-            &AllHandleCount,\r
-            &AllHandleBuffer\r
-           );\r
+  UINTN       Index;\r
+\r
+  Status = gBS->LocateHandleBuffer (\r
+                  AllHandles,\r
+                  NULL,\r
+                  NULL,\r
+                  &HandleCount,\r
+                  &HandleBuffer\r
+                  );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
-  for (Index = 0; Index < AllHandleCount; Index++) {\r
+  for (Index = 0; Index < HandleCount; Index++) {\r
     if (ShellGetExecutionBreakFlag ()) {\r
       Status = EFI_ABORTED;\r
-      goto Done;\r
-    }\r
-    //\r
-    // Scan the handle database\r
-    //\r
-    Status = ParseHandleDatabaseByRelationshipWithType(\r
-      NULL,\r
-      AllHandleBuffer[Index],\r
-      &HandleCount,\r
-      &HandleBuffer,\r
-      &HandleType\r
-     );\r
-/*\r
-    Status = LibScanHandleDatabase (\r
-              NULL,\r
-              NULL,\r
-              AllHandleBuffer[Index],\r
-              NULL,\r
-              &HandleCount,\r
-              &HandleBuffer,\r
-              &HandleType\r
-             );\r
-*/\r
-    if (EFI_ERROR (Status)) {\r
-      goto Done;\r
-    }\r
-\r
-    Device = TRUE;\r
-    if ((HandleType[Index] & HR_DRIVER_BINDING_HANDLE) != 0) {\r
-      Device = FALSE;\r
-    }\r
-\r
-    if ((HandleType[Index] & HR_IMAGE_HANDLE) != 0) {\r
-      Device = FALSE;\r
-    }\r
-\r
-    if (Device) {\r
-      Parent = FALSE;\r
-      for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
-        if ((HandleType[HandleIndex] & HR_PARENT_HANDLE) != 0) {\r
-          Parent = TRUE;\r
-        }\r
-      }\r
-\r
-      if (!Parent) {\r
-        if ((HandleType[Index] & HR_DEVICE_HANDLE) != 0) {\r
-          Status = gBS->ConnectController (\r
-                        AllHandleBuffer[Index],\r
-                        NULL,\r
-                        NULL,\r
-                        TRUE\r
-                       );\r
-        }\r
-      }\r
+      break;\r
     }\r
+    gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
+  }\r
 \r
+  if (HandleBuffer != NULL) {\r
     FreePool (HandleBuffer);\r
-    FreePool (HandleType);\r
   }\r
-\r
-Done:\r
-  FreePool (AllHandleBuffer);\r
   return Status;\r
 }\r