]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/PciBusNoEnumerationDxe/PciRomTable.c
MdeModulePkg PciBusDxe and DuetPkg PciBusNoEnumerationDxe: Update ResetPowerManagemen...
[mirror_edk2.git] / DuetPkg / PciBusNoEnumerationDxe / PciRomTable.c
index ce72176d249a9016dae32b4dd7a285c71ea0a121..5085431b08a2328fe1c32fe5847a5a0e802310e5 100644 (file)
@@ -1,7 +1,7 @@
 /*++\r
 \r
-Copyright (c) 2005 - 2007, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
+Copyright (c) 2005 - 2012, 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
 http://opensource.org/licenses/bsd-license.php                                            \r
@@ -21,7 +21,7 @@ Revision History
 \r
 --*/\r
 \r
-#include "pcibus.h"\r
+#include "PciBus.h"\r
 \r
 typedef struct {\r
   EFI_HANDLE  ImageHandle;\r
@@ -31,13 +31,12 @@ typedef struct {
   UINT8       Func;\r
 } EFI_PCI_ROM_IMAGE_MAPPING;\r
 \r
-static UINTN                      mNumberOfPciRomImages     = 0;\r
-static UINTN                      mMaxNumberOfPciRomImages  = 0;\r
-static EFI_PCI_ROM_IMAGE_MAPPING  *mRomImageTable           = NULL;\r
+UINTN                      mNumberOfPciRomImages     = 0;\r
+UINTN                      mMaxNumberOfPciRomImages  = 0;\r
+EFI_PCI_ROM_IMAGE_MAPPING  *mRomImageTable           = NULL;\r
 \r
-static CHAR16 mHexDigit[17] = L"0123456789ABCDEF";\r
+CHAR16 mHexDigit[17] = L"0123456789ABCDEF";\r
 \r
-static\r
 VOID\r
 PciRomAddImageMapping (\r
   IN EFI_HANDLE  ImageHandle,\r
@@ -77,7 +76,6 @@ PciRomAddImageMapping (
   mNumberOfPciRomImages++;\r
 }\r
 \r
-static\r
 VOID\r
 HexToString (\r
   CHAR16  *String,\r
@@ -135,6 +133,7 @@ Returns:
   VOID                          *DecompressedImageBuffer;\r
   UINT32                        ImageLength;\r
   EFI_DECOMPRESS_PROTOCOL       *Decompress;\r
+  UINT32                        InitializationSize;\r
 \r
   RomBar = (VOID *) (UINTN) PciOptionRomDescriptor->RomAddress;\r
   RomSize = (UINTN) PciOptionRomDescriptor->RomLength;\r
@@ -153,24 +152,44 @@ Returns:
 \r
     EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *) (UINTN) RomBarOffset;\r
 \r
-    if (EfiRomHeader->Signature != 0xaa55) {\r
+\r
+    if (EfiRomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {\r
       return retStatus;\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
     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
+        (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
-      if ((EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) ||\r
-          (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) ) {\r
+      ImageOffset             = EfiRomHeader->EfiImageHeaderOffset;\r
+      InitializationSize      = EfiRomHeader->InitializationSize * 512;\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
@@ -310,7 +329,7 @@ Returns:
           return Status;\r
         }\r
 \r
-        PciGetBusRange (Descriptors, &MinBus, &MaxBus, NULL);\r
+        PciGetBusRange (&Descriptors, &MinBus, &MaxBus, NULL);\r
         if ((MinBus <= PciOptionRomDescriptor->Bus) && (PciOptionRomDescriptor->Bus <= MaxBus)) {\r
           Status = PciRomLoadEfiDriversFromRomImage (This, PciOptionRomDescriptor);\r
           PciOptionRomDescriptor->DontLoadEfiRom |= 2;\r