]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c
ShellPkg/[hex]edit: use SimpleTextInEx to read console
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / LoadPciRom.c
index 0084f87ca16ac2fee660554708b37be3941f4f25..7be658dc879e7a74d82d1d0a643a9eb9fe5c4ecc 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for LoadPciRom shell Debug1 function.\r
 \r
-  Copyright (c) 2005 - 2010, 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
 #include <IndustryStandard/PeImage.h>\r
 #include <Protocol/Decompress.h>\r
 \r
+/**\r
+  Connects all available drives and controllers.\r
+\r
+  @retval EFI_SUCCESS     The operation was successful.\r
+  @retval EFI_ABORTED     The abort mechanism was received.\r
+**/\r
 EFI_STATUS\r
-EFIAPI\r
 LoadPciRomConnectAllDriversToAllControllers (\r
   VOID\r
   );\r
 \r
-EFI_STATUS\r
-EFIAPI\r
-InitializeLoadPciRom (\r
-  IN EFI_HANDLE        ImageHandle,\r
-  IN EFI_SYSTEM_TABLE  *SystemTable\r
-  );\r
+/**\r
+  Command entry point.\r
+\r
+  @param[in] RomBar       The Rom Base address.\r
+  @param[in] RomSize      The Rom size.\r
+  @param[in] FileName     The file name.\r
 \r
+  @retval EFI_SUCCESS             The command completed successfully.\r
+  @retval EFI_INVALID_PARAMETER   Command usage error.\r
+  @retval EFI_UNSUPPORTED         Protocols unsupported.\r
+  @retval EFI_OUT_OF_RESOURCES    Out of memory.\r
+  @retval Other value             Unknown error.\r
+**/\r
 EFI_STATUS\r
-EFIAPI\r
 LoadEfiDriversFromRomImage (\r
   VOID                      *RomBar,\r
   UINTN                     RomSize,\r
@@ -44,6 +55,12 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
   {NULL, TypeMax}\r
   };\r
 \r
+/**\r
+  Function for 'loadpcirom' command.\r
+\r
+  @param[in] ImageHandle  Handle to the Image (NULL if Internal).\r
+  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).\r
+**/\r
 SHELL_STATUS\r
 EFIAPI\r
 ShellCommandRunLoadPciRom (\r
@@ -76,18 +93,18 @@ 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
       ASSERT(FALSE);\r
     }\r
   } else {\r
-    if (ShellCommandLineGetCount(Package) < 1) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
+    if (ShellCommandLineGetCount(Package) < 2) {\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
+      if (ShellCommandLineGetFlag(Package, L"-nc")) {\r
         Connect = FALSE;\r
       } else {\r
         Connect = TRUE;\r
@@ -103,15 +120,12 @@ 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_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Param);  \r
           ShellStatus = SHELL_ACCESS_DENIED;\r
           break;\r
         }\r
       }\r
-      if (FileList == NULL || IsListEmpty(&FileList->Link)) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle);\r
-      } else if (ShellStatus == SHELL_SUCCESS) {\r
-\r
-\r
+      if (ShellStatus == SHELL_SUCCESS  && FileList != NULL) {\r
         //\r
         // loop through the list and make sure we are not aborting...\r
         //\r
@@ -120,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 = AllocatePool (SourceSize);\r
-          ASSERT(File1Buffer != NULL);\r
+          File1Buffer = AllocateZeroPool (SourceSize);\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
@@ -147,6 +165,9 @@ ShellCommandRunLoadPciRom (
           }\r
           FreePool(File1Buffer);\r
         }\r
+      } else if (ShellStatus == SHELL_SUCCESS) {\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
         Status = ShellCloseFileMetaArg(&FileList);\r
@@ -162,31 +183,26 @@ ShellCommandRunLoadPciRom (
   return (ShellStatus);\r
 }\r
 \r
+/**\r
+  Command entry point.\r
+\r
+  @param[in] RomBar       The Rom Base address.\r
+  @param[in] RomSize      The Rom size.\r
+  @param[in] FileName     The file name.\r
+\r
+  @retval EFI_SUCCESS             The command completed successfully.\r
+  @retval EFI_INVALID_PARAMETER   Command usage error.\r
+  @retval EFI_UNSUPPORTED         Protocols unsupported.\r
+  @retval EFI_OUT_OF_RESOURCES    Out of memory.\r
+  @retval Other value             Unknown error.\r
+**/\r
 EFI_STATUS\r
 LoadEfiDriversFromRomImage (\r
   VOID                      *RomBar,\r
   UINTN                     RomSize,\r
   CONST CHAR16              *FileName\r
   )\r
-/*++\r
 \r
-Routine Description:\r
-  Command entry point.\r
-\r
-Arguments:\r
-\r
-  RomBar   - Rom\r
-  RomSize  - Rom size\r
-  FileName - The file name\r
-\r
-Returns:\r
-  EFI_SUCCESS             - The command completed successfully\r
-  EFI_INVALID_PARAMETER   - Command usage error\r
-  EFI_UNSUPPORTED         - Protocols unsupported\r
-  EFI_OUT_OF_RESOURCES    - Out of memory\r
-  Other value             - Unknown error\r
-\r
-**/\r
 {\r
   EFI_PCI_EXPANSION_ROM_HEADER  *EfiRomHeader;\r
   PCI_DATA_STRUCTURE            *Pcir;\r
@@ -196,7 +212,7 @@ Returns:
   UINT16                        ImageOffset;\r
   EFI_HANDLE                    ImageHandle;\r
   EFI_STATUS                    Status;\r
-  EFI_STATUS                    retStatus;\r
+  EFI_STATUS                    ReturnStatus;\r
   CHAR16                        RomFileName[280];\r
   EFI_DEVICE_PATH_PROTOCOL      *FilePath;\r
   BOOLEAN                       SkipImage;\r
@@ -207,36 +223,56 @@ Returns:
   VOID                          *DecompressedImageBuffer;\r
   UINT32                        ImageLength;\r
   EFI_DECOMPRESS_PROTOCOL       *Decompress;\r
+  UINT32                        InitializationSize;\r
 \r
   ImageIndex    = 0;\r
-  retStatus     = EFI_NOT_FOUND;\r
+  ReturnStatus     = EFI_NOT_FOUND;\r
   RomBarOffset  = (UINTN) RomBar;\r
 \r
   do {\r
 \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 retStatus;\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
@@ -262,9 +298,9 @@ Returns:
                                   &ScratchSize\r
                                  );\r
             if (!EFI_ERROR (Status)) {\r
-              DecompressedImageBuffer = AllocatePool (DestinationSize);\r
+              DecompressedImageBuffer = AllocateZeroPool (DestinationSize);\r
               if (ImageBuffer != NULL) {\r
-                Scratch = AllocatePool (ScratchSize);\r
+                Scratch = AllocateZeroPool (ScratchSize);\r
                 if (Scratch != NULL) {\r
                   Status = Decompress->Decompress (\r
                                         Decompress,\r
@@ -304,15 +340,15 @@ Returns:
                         &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
-              retStatus = Status;\r
+              ReturnStatus = Status;\r
             }\r
           }\r
         }\r
@@ -328,101 +364,46 @@ Returns:
     ImageIndex++;\r
   } while (((Pcir->Indicator & 0x80) == 0x00) && ((RomBarOffset - (UINTN) RomBar) < RomSize));\r
 \r
-  return retStatus;\r
+  return ReturnStatus;\r
 }\r
 \r
+/**\r
+  Connects all available drives and controllers.\r
+\r
+  @retval EFI_SUCCESS     The operation was successful.\r
+  @retval EFI_ABORTED     The abort mechanism was received.\r
+**/\r
 EFI_STATUS\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