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 <David.Woodhouse@intel.com>
Reviewed-by: Elvin Li <elvin.li@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17131 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
David Woodhouse 2015-04-08 01:44:22 +00:00 committed by li-elvin
parent 881644d741
commit ff247afd22
2 changed files with 31 additions and 3 deletions

View File

@ -1238,6 +1238,24 @@ GenericLegacyBoot (
0x40000, 0x40000,
&Granularity &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 // Lock attributes of the Legacy Region if chipset supports
// //

View File

@ -1,6 +1,6 @@
/** @file /** @file
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -2284,6 +2284,7 @@ LegacyBiosInstallRom (
UINT32 LocalTime; UINT32 LocalTime;
UINT32 StartBbsIndex; UINT32 StartBbsIndex;
UINT32 EndBbsIndex; UINT32 EndBbsIndex;
UINT32 MaxRomAddr;
UINTN TempData; UINTN TempData;
UINTN InitAddress; UINTN InitAddress;
UINTN RuntimeAddress; UINTN RuntimeAddress;
@ -2299,6 +2300,15 @@ LegacyBiosInstallRom (
Function = 0; Function = 0;
VideoMode = 0; VideoMode = 0;
PhysicalAddress = 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); PciProgramAllInterruptLineRegisters (Private);
@ -2331,7 +2341,7 @@ LegacyBiosInstallRom (
// then test if there is enough space for its RT code // then test if there is enough space for its RT code
// //
RuntimeAddress = Private->OptionRom; 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__)); 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)); gBS->FreePages (PhysicalAddress, EFI_SIZE_TO_PAGES (ImageSize));
// //
@ -2349,7 +2359,7 @@ LegacyBiosInstallRom (
// test if there is enough space for its INIT code // test if there is enough space for its INIT code
// //
InitAddress = PCI_START_ADDRESS (Private->OptionRom); 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__)); 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 // Report Status Code to indicate that there is no enough space for OpROM