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 <ruiyu.ni@intel.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>
This commit is contained in:
Ruiyu Ni 2017-05-05 10:10:00 +08:00
parent 007b51e180
commit 3654c4623c
1 changed files with 9 additions and 1 deletions

View File

@ -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;
}
}