From a93e23f9ed7caafd683e0adaa40562c9449b0f3c Mon Sep 17 00:00:00 2001 From: rsun3 Date: Wed, 28 Sep 2011 07:50:58 +0000 Subject: 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 --- .../Bus/Pci/PciBusDxe/PciOptionRomSupport.c | 41 ++++++++++++++++------ 1 file changed, 30 insertions(+), 11 deletions(-) (limited to 'MdeModulePkg') diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c index 0fd5a32..8fd0b3d 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)); -- cgit v1.1