summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>2011-09-28 07:50:58 +0000
committerrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>2011-09-28 07:50:58 +0000
commita93e23f9ed7caafd683e0adaa40562c9449b0f3c (patch)
tree224dd101d150a8b841d0e8ccf83dcac878529bde
parent4cb0548d01d9098cb34171d99a47201aeb39bd01 (diff)
downloadedk2-a93e23f9ed7caafd683e0adaa40562c9449b0f3c.tar.gz
edk2-a93e23f9ed7caafd683e0adaa40562c9449b0f3c.tar.bz2
edk2-a93e23f9ed7caafd683e0adaa40562c9449b0f3c.zip
MdeModulePkg PCI Bus Driver: Add more checks before dispatching an EFI PCI Option ROM image.
* Check if the machine type of the image is supported by the current UEFI system. * Ignore the image if it is an EFI application as required by the UEFI spec. Signed-off-by: rsun3 Reviewed-by: li-elvin git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12465 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
index 0fd5a3298d..8fd0b3dbc6 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
@@ -670,6 +670,27 @@ ProcessOpRomImage (
Indicator = Pcir->Indicator;
//
+ // Skip the image if it is not an EFI PCI Option ROM image
+ //
+ if (Pcir->CodeType != PCI_CODE_TYPE_EFI_IMAGE) {
+ goto NextImage;
+ }
+
+ //
+ // Skip the EFI PCI Option ROM image if its machine type is not supported
+ //
+ if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (EfiRomHeader->EfiMachineType)) {
+ goto NextImage;
+ }
+
+ //
+ // Ignore the EFI PCI Option ROM image if it is an EFI application
+ //
+ if (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {
+ goto NextImage;
+ }
+
+ //
// Create Pci Option Rom Image device path header
//
EfiOpRomImageNode.Header.Type = MEDIA_DEVICE_PATH;
@@ -686,19 +707,16 @@ ProcessOpRomImage (
//
BufferSize = 0;
Buffer = NULL;
- Status = EFI_SUCCESS;
ImageHandle = NULL;
- if (!EFI_ERROR (Status)) {
- Status = gBS->LoadImage (
- FALSE,
- gPciBusDriverBinding.DriverBindingHandle,
- PciOptionRomImageDevicePath,
- Buffer,
- BufferSize,
- &ImageHandle
- );
- }
+ Status = gBS->LoadImage (
+ FALSE,
+ gPciBusDriverBinding.DriverBindingHandle,
+ PciOptionRomImageDevicePath,
+ Buffer,
+ BufferSize,
+ &ImageHandle
+ );
FreePool (PciOptionRomImageDevicePath);
@@ -719,6 +737,7 @@ ProcessOpRomImage (
}
}
+NextImage:
RomBarOffset += ImageSize;
} while (((Indicator & 0x80) == 0x00) && ((UINTN) (RomBarOffset - (UINT8 *) RomBar) < PciDevice->RomSize));