After booting a large-size ISO RAM disk (HTTP boot option pointing to a ISO 
file) and rebooting the 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 skip updating current memory usage 
statistics (CurrentMemoryTypeInformation) if system allocates a memory buffer 
with a large number of pages. For this case, the problematic BDS code block in 
BmSetMemoryTypeInformationVariable() function will get a 
CurrentMemoryTypeInformation[Index1].NumberOfPages value which is not updated 
with large-size ISO RAM disk usage by Memory page management (it keeps original 
value without RAM disk size. For example, 0x9000) and gets RamDiskSizeInPages 
(ISO RAM disk size) in a big value (For example, 0xC0000). Then, the result 
will become a very big value (0xFFF49000) to be updated into 
MemoryTypeInformation variable to cause the ASSERT in next boot.

ASSERT [DxeCore] u:\MdeModulePkg\Core\Dxe\Gcd\Gcd.c(2273): Length >= 
MinimalMemorySizeNeeded

For fixing this issue, we need to add a check to the problematic BDS code block 
for checking that NumberOfPages is bigger than RamDiskSizeInPages to prevent 
BDS core code updating wrong data (very big value) to MemoryTypeInformation 
variable in this case.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Sunny Wang <[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