From: Laszlo Ersek Date: Fri, 5 May 2017 00:35:21 +0000 (+0200) Subject: OvmfPkg/PlatformPei: handle non-power-of-two spare size for emu variables X-Git-Tag: edk2-stable201903~4070 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=0c79471d6a986b858c35dc577eaeb344cc5c4cdd OvmfPkg/PlatformPei: handle non-power-of-two spare size for emu variables In commit b24fca05751f ("OvmfPkg: introduce 4MB flash image (mainly) for Windows HCK", 2017-04-29), I changed PcdFlashNvStorageFtwSpareSize to 264KB, in the then-new default 4MB build. While PcdFlashNvStorageFtwSpareSize remains exactly half of the entire non-volatile store (which is 528KB), 264KB isn't itself a power of two. This triggers an assertion failure in AllocateAlignedRuntimePages() when PlatformPei calls it from the ReserveEmuVariableNvStore() function, passing PcdFlashNvStorageFtwSpareSize as the Alignment parameter: > ASSERT MdePkg/Library/PeiMemoryAllocationLib/MemoryAllocationLib.c(196): > (Alignment & (Alignment - 1)) == 0 Round up the alignment to the next power of two if necessary. Fixes: b24fca05751f8222acf264853709012e0ab7bf49 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen --- diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c index 77a8a16c15..5e983a8dce 100644 --- a/OvmfPkg/PlatformPei/Platform.c +++ b/OvmfPkg/PlatformPei/Platform.c @@ -504,6 +504,7 @@ ReserveEmuVariableNvStore ( { EFI_PHYSICAL_ADDRESS VariableStore; RETURN_STATUS PcdStatus; + UINT32 Alignment; // // Allocate storage for NV variables early on so it will be @@ -511,16 +512,26 @@ ReserveEmuVariableNvStore ( // across reboots, this allows the NV variable storage to survive // a VM reboot. // + Alignment = PcdGet32 (PcdFlashNvStorageFtwSpareSize); + if ((Alignment & (Alignment - 1)) != 0) { + // + // Round up Alignment to the next power of two. + // + Alignment = GetPowerOfTwo32 (Alignment) << 1; + } + VariableStore = (EFI_PHYSICAL_ADDRESS)(UINTN) AllocateAlignedRuntimePages ( EFI_SIZE_TO_PAGES (2 * PcdGet32 (PcdFlashNvStorageFtwSpareSize)), - PcdGet32 (PcdFlashNvStorageFtwSpareSize) + Alignment ); DEBUG ((EFI_D_INFO, - "Reserved variable store memory: 0x%lX; size: %dkb\n", + "Reserved variable store memory: 0x%lX; size: %dkb, " + "alignment: 0x%x\n", VariableStore, - (2 * PcdGet32 (PcdFlashNvStorageFtwSpareSize)) / 1024 + (2 * PcdGet32 (PcdFlashNvStorageFtwSpareSize)) / 1024, + Alignment )); PcdStatus = PcdSet64S (PcdEmuVariableNvStoreReserved, VariableStore); ASSERT_RETURN_ERROR (PcdStatus);