mirror of https://github.com/acidanthera/audk.git
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:
parent
007b51e180
commit
3654c4623c
|
@ -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;
|
||||
//
|
||||
|
@ -916,6 +921,9 @@ MtrrLibGetMtrrNumber (
|
|||
if (*SubLeft != 0) {
|
||||
BaseAddress = SubtractiveBaseAddress;
|
||||
Length = SubtractiveLength;
|
||||
} else {
|
||||
BaseAddress = OriginalBaseAddress;
|
||||
Length = OriginalLength;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue