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 <[email protected]>
Reviewed-by: Samer El-Haj-Mahmoud <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>
Reviewed-by: Star Zeng <[email protected]>
---
 MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

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;
     }
 
-- 
2.5.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to