From dc38ac830cba15375137c846949062c20eddaf5a Mon Sep 17 00:00:00 2001 From: Ruiyu Ni Date: Fri, 5 May 2017 10:10:00 +0800 Subject: UefiCpuPkg/MtrrLib: Don't report OutOfResource when MTRR is enough The MTRR calculation algorithm contains a bug that when left subtraction cannot produce better MTRR solution, it forgets to restore the BaseAddress/Length so that MtrrLibGetMtrrNumber() returns bigger value of actual required MTRR numbers. As a result, the MtrrLib reports OutOfResource but actually the MTRR is enough. MEMORY_RANGE mC[] = { 0, 0x100000, CacheUncacheable, 0x100000, 0x89F00000, CacheWriteBack, 0x8A000000, 0x75000000, CacheUncacheable, 0xFF000000, 0x01000000, CacheWriteProtected, 0x100000000, 0x7F00000000, CacheUncacheable, 0xFC240000, 0x2000, CacheWriteCombining // <-- trigger the error }; Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni Reviewed-by: Jeff Fan (cherry picked from commit 3654c4623c9b37ddc64426995fa399d8626b7ced) --- Core/UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Core/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/Core/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index 9d1927262a..cf1af29936 100644 --- a/Core/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/Core/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -851,6 +851,8 @@ MtrrLibGetMtrrNumber ( UINT64 SubtractiveLength; UINT64 BaseAlignment; UINT32 Index; + UINT64 OriginalBaseAddress; + UINT64 OriginalLength; *SubLeft = 0; *SubRight = 0; @@ -861,6 +863,9 @@ MtrrLibGetMtrrNumber ( // Get the optimal left subtraction solution. // if (BaseAddress != 0) { + + OriginalBaseAddress = BaseAddress; + OriginalLength = Length; SubtractiveBaseAddress = 0; SubtractiveLength = 0; // @@ -915,7 +920,10 @@ MtrrLibGetMtrrNumber ( // if (*SubLeft != 0) { BaseAddress = SubtractiveBaseAddress; - Length = SubtractiveLength; + Length = SubtractiveLength; + } else { + BaseAddress = OriginalBaseAddress; + Length = OriginalLength; } } -- cgit v1.2.3