summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunny Wang <sunnywang@hpe.com>2016-06-23 15:45:00 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2016-06-27 10:38:09 +0800
commitfb5848c588688d1e3cd3f175ff888549adddd024 (patch)
treefaa143f95b5145f7a134775a6f9550e92e111cd3
parent6771c1d65885d7e9a0dd0e5878a41b05df178420 (diff)
downloadedk2-fb5848c588688d1e3cd3f175ff888549adddd024.zip
edk2-fb5848c588688d1e3cd3f175ff888549adddd024.tar.gz
edk2-fb5848c588688d1e3cd3f175ff888549adddd024.tar.bz2
MdeModulePkg/UefiBootManagerLib: Fix data in MemoryTypeInformation
After booting a large-size ISO RAM disk (HTTP boot option pointing to a ISO file) and reboot system, system will possibly run into the following ASSERT because the BDS core code doesn't consider the case that Memory page management (Page.c) would possibly NOT update current memory usage statistics(CurrentMemoryTypeInformation) if system allocates a memory buffer with a large number of pages. ASSERT [DxeCore] u:\MdeModulePkg\Core\Dxe\Gcd\Gcd.c(2273): Length >= MinimalMemorySizeNeeded The BDS code block for skipping counting reserved memory occupied by RAM Disk didn't consider the Memory page management's behavior mentioned above, which caused that the CurrentMemoryTypeInformation[Index1].NumberOfPages will be updated to a "very big value" because RamDiskSizeInPages is bigger than CurrentMemoryTypeInformation[Index1].NumberOfPages. For example, NumberOfPages is 0x9000 (current use) and RamDiskSizeInPages is 0xC0000 (ISO image size). The result will become a very big value 0xFFF49000. Therefore, we need to add a check to prevent BDS core code updating wrong data (very big value) to MemoryTypeInformation variable. This code change is a improvement for fixing this issue for most cases. There is still a corner case even when the memory bins don't include the RAM disk memory, the memory used by all other modules exceeds RamDiskSizeInPages. Ray will send the other patch to fix this corner case. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Sunny Wang <sunnywang@hpe.com> Reviewed-by: Samer El-Haj-Mahmoud <elhaj@hpe.com> Reviewed-by: Ruiyu Ni <Ruiyu.ni@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
-rw-r--r--MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c b/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c
index 29c1bfa..93502fe 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c
@@ -2,6 +2,7 @@
Misc library functions.
Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -231,7 +232,8 @@ BmSetMemoryTypeInformationVariable (
//
// Do not count the reserved memory occupied by RAM Disk.
//
- if (CurrentMemoryTypeInformation[Index1].Type == EfiReservedMemoryType) {
+ if ((CurrentMemoryTypeInformation[Index1].Type == EfiReservedMemoryType) &&
+ (CurrentMemoryTypeInformation[Index1].NumberOfPages > ((UINT32) RamDiskSizeInPages))) {
CurrentMemoryTypeInformation[Index1].NumberOfPages -= (UINT32) RamDiskSizeInPages;
}