From 22921b02abdf31eafdd823d1233fb6fc6f3b03cc Mon Sep 17 00:00:00 2001 From: li-elvin Date: Thu, 15 Nov 2012 02:10:44 +0000 Subject: [PATCH 1/1] Remove 0xc8000 check when searching PNP header. Remove the check about the size of Init code when validating if PCI 3.0 OPROM is successfully started. Signed-off-by: Li Elvin Reviewed-by: Ni Ruiyu git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13944 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Csm/LegacyBiosDxe/LegacyPci.c | 96 +++++++++---------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c index e32ebacd94..910ed41b37 100644 --- a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c +++ b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c @@ -1500,54 +1500,52 @@ UpdateBevBcvTable ( } } - if (PciPtr >= (EFI_LEGACY_EXPANSION_ROM_HEADER *) ((UINTN) 0xc8000)) { - while (TRUE) { - Status = FindNextPnpExpansionHeader (Private, Instance, &PnpPtr); - Instance = NOT_FIRST_INSTANCE; - if (EFI_ERROR (Status)) { - break; - } - // - // There can be additional $PnP headers within the OPROM. - // Example: SCSI can have one per drive. - // - BbsTable[BbsIndex].BootPriority = BBS_UNPRIORITIZED_ENTRY; - BbsTable[BbsIndex].DeviceType = DeviceType; - BbsTable[BbsIndex].Bus = (UINT32) Bus; - BbsTable[BbsIndex].Device = (UINT32) Device; - BbsTable[BbsIndex].Function = (UINT32) Function; - BbsTable[BbsIndex].StatusFlags.OldPosition = 0; - BbsTable[BbsIndex].StatusFlags.Reserved1 = 0; - BbsTable[BbsIndex].StatusFlags.Enabled = 0; - BbsTable[BbsIndex].StatusFlags.Failed = 0; - BbsTable[BbsIndex].StatusFlags.MediaPresent = 0; - BbsTable[BbsIndex].StatusFlags.Reserved2 = 0; - BbsTable[BbsIndex].Class = PnpPtr->Class; - BbsTable[BbsIndex].SubClass = PnpPtr->SubClass; - BbsTable[BbsIndex].DescStringOffset = PnpPtr->ProductNamePointer; - BbsTable[BbsIndex].DescStringSegment = mBbsRomSegment; - BbsTable[BbsIndex].MfgStringOffset = PnpPtr->MfgPointer; - BbsTable[BbsIndex].MfgStringSegment = mBbsRomSegment; - BbsTable[BbsIndex].BootHandlerSegment = mBbsRomSegment; - - // - // Have seen case where PXE base code have PnP expansion ROM - // header but no Bcv or Bev vectors. - // - if (PnpPtr->Bcv != 0) { - BbsTable[BbsIndex].BootHandlerOffset = PnpPtr->Bcv; - ++BbsIndex; - } + while (TRUE) { + Status = FindNextPnpExpansionHeader (Private, Instance, &PnpPtr); + Instance = NOT_FIRST_INSTANCE; + if (EFI_ERROR (Status)) { + break; + } + // + // There can be additional $PnP headers within the OPROM. + // Example: SCSI can have one per drive. + // + BbsTable[BbsIndex].BootPriority = BBS_UNPRIORITIZED_ENTRY; + BbsTable[BbsIndex].DeviceType = DeviceType; + BbsTable[BbsIndex].Bus = (UINT32) Bus; + BbsTable[BbsIndex].Device = (UINT32) Device; + BbsTable[BbsIndex].Function = (UINT32) Function; + BbsTable[BbsIndex].StatusFlags.OldPosition = 0; + BbsTable[BbsIndex].StatusFlags.Reserved1 = 0; + BbsTable[BbsIndex].StatusFlags.Enabled = 0; + BbsTable[BbsIndex].StatusFlags.Failed = 0; + BbsTable[BbsIndex].StatusFlags.MediaPresent = 0; + BbsTable[BbsIndex].StatusFlags.Reserved2 = 0; + BbsTable[BbsIndex].Class = PnpPtr->Class; + BbsTable[BbsIndex].SubClass = PnpPtr->SubClass; + BbsTable[BbsIndex].DescStringOffset = PnpPtr->ProductNamePointer; + BbsTable[BbsIndex].DescStringSegment = mBbsRomSegment; + BbsTable[BbsIndex].MfgStringOffset = PnpPtr->MfgPointer; + BbsTable[BbsIndex].MfgStringSegment = mBbsRomSegment; + BbsTable[BbsIndex].BootHandlerSegment = mBbsRomSegment; + + // + // Have seen case where PXE base code have PnP expansion ROM + // header but no Bcv or Bev vectors. + // + if (PnpPtr->Bcv != 0) { + BbsTable[BbsIndex].BootHandlerOffset = PnpPtr->Bcv; + ++BbsIndex; + } - if (PnpPtr->Bev != 0) { - BbsTable[BbsIndex].BootHandlerOffset = PnpPtr->Bev; - BbsTable[BbsIndex].DeviceType = BBS_BEV_DEVICE; - ++BbsIndex; - } + if (PnpPtr->Bev != 0) { + BbsTable[BbsIndex].BootHandlerOffset = PnpPtr->Bev; + BbsTable[BbsIndex].DeviceType = BBS_BEV_DEVICE; + ++BbsIndex; + } - if ((PnpPtr == (LEGACY_PNP_EXPANSION_HEADER *) PciPtr) || (PnpPtr > (LEGACY_PNP_EXPANSION_HEADER *) RomEnd)) { - break; - } + if ((PnpPtr == (LEGACY_PNP_EXPANSION_HEADER *) PciPtr) || (PnpPtr > (LEGACY_PNP_EXPANSION_HEADER *) RomEnd)) { + break; } } @@ -2557,10 +2555,10 @@ LegacyBiosInstallRom ( // // The ROM could have updated it's size so we need to read again. // - if ((((EFI_LEGACY_EXPANSION_ROM_HEADER *) RuntimeAddress)->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) && - (((EFI_LEGACY_EXPANSION_ROM_HEADER *) InitAddress)->Size512 == 0)) { + if (((EFI_LEGACY_EXPANSION_ROM_HEADER *) RuntimeAddress)->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) { // - // The INIT function didn't copy the RUNTIME code to RuntimeAddress + // Now we check the signature (0xaa55) to judge whether the run-time code is truly generated by INIT function. + // If signature is not valid, that means the INIT function didn't copy the run-time code to RuntimeAddress. // *RuntimeImageLength = 0; } else { -- 2.39.2