summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/PlatformPei
diff options
context:
space:
mode:
authorLaszlo Ersek <lersek@redhat.com>2017-05-05 02:35:21 +0200
committerLaszlo Ersek <lersek@redhat.com>2017-05-05 18:02:12 +0200
commit0c79471d6a986b858c35dc577eaeb344cc5c4cdd (patch)
tree175fcb68c35e04b11f140cd98c50730df9e5ff92 /OvmfPkg/PlatformPei
parent6e49d01cfb43db92f8b698ec16d811981c2da22b (diff)
downloadedk2-0c79471d6a986b858c35dc577eaeb344cc5c4cdd.tar.gz
edk2-0c79471d6a986b858c35dc577eaeb344cc5c4cdd.tar.bz2
edk2-0c79471d6a986b858c35dc577eaeb344cc5c4cdd.zip
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 <lersek@redhat.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Diffstat (limited to 'OvmfPkg/PlatformPei')
-rw-r--r--OvmfPkg/PlatformPei/Platform.c17
1 files changed, 14 insertions, 3 deletions
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);