From c03beb762a7f1a08c0c91ccd8968500b2ccf5959 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Sun, 26 Jul 2015 07:38:12 +0000 Subject: MdeModulePkg PiSmmCore: Remove a hidden assumption of SMRAM reservation that assumes the SMRAM reserved range is only at the end of the SMRAM descriptor. // // This range has reserved area, calculate the left free size // gSmmCorePrivate->SmramRanges[Index].PhysicalSize = SmramResRegion->SmramReservedStart - gSmmCorePrivate->SmramRanges[Index].CpuStart; Imagine the following scenario where we just reserve the first page of the SMRAM range: SMRAM Descriptor: Start: 0x80000000 Size: 0x02000000 Reserved Range: Start: 0x80000000 Size: 0x00001000 In this case the adjustment to the SMRAM range size yields zero: ReservedStart - SMRAM Start is 0x80000000 - 0x80000000 = 0. So even though most of the range is still free the IPL code decides its unusable. The problem comes from the email thread: [edk2] PiSmmIpl SMRAM Reservation Logic. http://thread.gmane.org/gmane.comp.bios.tianocore.devel/15268 Also to follow the idea in the email thread, the patch is to 1. Keep only one copy of full SMRAM ranges in gSmmCorePrivate->SmramRanges, split record for SmmConfiguration->SmramReservedRegions and SMM Core that will be marked to be EFI_ALLOCATED in gSmmCorePrivate->SmramRanges. 2. Handle SmmConfiguration->SmramReservedRegions at beginning of, at end of, in the middle of, or cross multiple SmramRanges. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng Reviewed-by: Jiewen Yao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18031 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/PiSmmCoreMemoryAllocationLib/MemoryAllocationLib.c | 4 ++-- .../PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationServices.h | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) (limited to 'MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib') diff --git a/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/MemoryAllocationLib.c b/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/MemoryAllocationLib.c index 892ba0a040..5e13a3eda2 100644 --- a/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/MemoryAllocationLib.c +++ b/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/MemoryAllocationLib.c @@ -919,11 +919,11 @@ PiSmmCoreMemoryAllocationLibConstructor ( // SmmInitializeMemoryServices (SmmCorePrivate->SmramRangeCount, SmmCorePrivate->SmramRanges); - mSmmCoreMemoryAllocLibSmramRangeCount = SmmCorePrivate->FullSmramRangeCount; + mSmmCoreMemoryAllocLibSmramRangeCount = SmmCorePrivate->SmramRangeCount; Size = mSmmCoreMemoryAllocLibSmramRangeCount * sizeof (EFI_SMRAM_DESCRIPTOR); mSmmCoreMemoryAllocLibSmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocatePool (Size); ASSERT (mSmmCoreMemoryAllocLibSmramRanges != NULL); - CopyMem (mSmmCoreMemoryAllocLibSmramRanges, SmmCorePrivate->FullSmramRanges, Size); + CopyMem (mSmmCoreMemoryAllocLibSmramRanges, SmmCorePrivate->SmramRanges, Size); return EFI_SUCCESS; } diff --git a/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationServices.h b/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationServices.h index 6ae499b0de..a2b89acf5d 100644 --- a/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationServices.h +++ b/MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationServices.h @@ -94,9 +94,6 @@ typedef struct { EFI_PHYSICAL_ADDRESS PiSmmCoreImageBase; UINT64 PiSmmCoreImageSize; EFI_PHYSICAL_ADDRESS PiSmmCoreEntryPoint; - - UINTN FullSmramRangeCount; - EFI_SMRAM_DESCRIPTOR *FullSmramRanges; } SMM_CORE_PRIVATE_DATA; /** -- cgit v1.2.3