From ff247afd2286ba61cbbe52c57a06102b8223b76e Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 8 Apr 2015 01:44:22 +0000 Subject: IntelFrameworkModulePkg: Update LegacyBiosDxe to use UmaAddress and UmaSize in CSM 0.98. The UmaAddress/UmaSize fields allows the CSM to have writable memory between the top of the option ROMs and the start of its read-only code segment. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: David Woodhouse Reviewed-by: Elvin Li git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17131 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Csm/LegacyBiosDxe/LegacyBootSupport.c | 18 ++++++++++++++++++ IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c | 16 +++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) (limited to 'IntelFrameworkModulePkg') diff --git a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c index e51acd0551..6c2688b4a4 100644 --- a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c +++ b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c @@ -1238,6 +1238,24 @@ GenericLegacyBoot ( 0x40000, &Granularity ); + + if ((Private->Legacy16Table->TableLength >= OFFSET_OF (EFI_COMPATIBILITY16_TABLE, HiPermanentMemoryAddress)) && + ((Private->Legacy16Table->UmaAddress != 0) && (Private->Legacy16Table->UmaSize != 0))) { + // + // Here we could reduce UmaAddress down as far as Private->OptionRom, taking into + // account the granularity of the access control. + // + DEBUG((EFI_D_INFO, "Unlocking UMB RAM region 0x%x-0x%x\n", Private->Legacy16Table->UmaAddress, + Private->Legacy16Table->UmaAddress + Private->Legacy16Table->UmaSize)); + + Private->LegacyRegion->UnLock ( + Private->LegacyRegion, + Private->Legacy16Table->UmaAddress, + Private->Legacy16Table->UmaSize, + &Granularity + ); + } + // // Lock attributes of the Legacy Region if chipset supports // diff --git a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c index 7299fc0e6b..9d84ab0000 100644 --- a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c +++ b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyPci.c @@ -1,6 +1,6 @@ /** @file -Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -2284,6 +2284,7 @@ LegacyBiosInstallRom ( UINT32 LocalTime; UINT32 StartBbsIndex; UINT32 EndBbsIndex; + UINT32 MaxRomAddr; UINTN TempData; UINTN InitAddress; UINTN RuntimeAddress; @@ -2299,6 +2300,15 @@ LegacyBiosInstallRom ( Function = 0; VideoMode = 0; PhysicalAddress = 0; + MaxRomAddr = PcdGet32 (PcdEndOpromShadowAddress); + + if ((Private->Legacy16Table->TableLength >= OFFSET_OF(EFI_COMPATIBILITY16_TABLE, HiPermanentMemoryAddress)) && + (Private->Legacy16Table->UmaAddress != 0) && + (Private->Legacy16Table->UmaSize != 0) && + (MaxRomAddr > (Private->Legacy16Table->UmaAddress))) { + MaxRomAddr = Private->Legacy16Table->UmaAddress; + } + PciProgramAllInterruptLineRegisters (Private); @@ -2331,7 +2341,7 @@ LegacyBiosInstallRom ( // then test if there is enough space for its RT code // RuntimeAddress = Private->OptionRom; - if (RuntimeAddress + *RuntimeImageLength > PcdGet32 (PcdEndOpromShadowAddress)) { + if (RuntimeAddress + *RuntimeImageLength > MaxRomAddr) { DEBUG ((EFI_D_ERROR, "return LegacyBiosInstallRom(%d): EFI_OUT_OF_RESOURCES (no more space for OpROM)\n", __LINE__)); gBS->FreePages (PhysicalAddress, EFI_SIZE_TO_PAGES (ImageSize)); // @@ -2349,7 +2359,7 @@ LegacyBiosInstallRom ( // test if there is enough space for its INIT code // InitAddress = PCI_START_ADDRESS (Private->OptionRom); - if (InitAddress + ImageSize > PcdGet32 (PcdEndOpromShadowAddress)) { + if (InitAddress + ImageSize > MaxRomAddr) { DEBUG ((EFI_D_ERROR, "return LegacyBiosInstallRom(%d): EFI_OUT_OF_RESOURCES (no more space for OpROM)\n", __LINE__)); // // Report Status Code to indicate that there is no enough space for OpROM -- cgit v1.2.3