From 0d89ceae31f54befd1cfaa2e36eb7a03bdcd94b0 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Thu, 29 Sep 2022 12:23:55 +0800 Subject: UefiCpuPkg/MtrrLib: Fix MtrrGetAllMtrrs to return correct MTRR setting. The patch fixes the following issues in the original implementation: 1. MtrrSetting contains random value if MTRR is not supported. 2. Unconditionally access fixed MTRR on CPU that may not support fixed MTRR. 3. The maximum number of Variable MTRR entries are initialized, while the portion exceeding the maximum number remains uninitialized. Signed-off-by: Ray Ni Signed-off-by: Yuanhao Xie Cc: Eric Dong Cc: Rahul Kumar Cc: Gerd Hoffmann Reviewed-by: Eric Dong Reviewed-by: Ray Ni --- UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index bd61ffc..c9440f0 100644 --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -2824,29 +2824,43 @@ MtrrGetAllMtrrs ( OUT MTRR_SETTINGS *MtrrSetting ) { - if (!IsMtrrSupported ()) { + BOOLEAN FixedMtrrSupported; + UINT32 VariableMtrrCount; + MSR_IA32_MTRR_DEF_TYPE_REGISTER *MtrrDefType; + + ZeroMem (MtrrSetting, sizeof (*MtrrSetting)); + + MtrrDefType = (MSR_IA32_MTRR_DEF_TYPE_REGISTER *)&MtrrSetting->MtrrDefType; + if (!MtrrLibIsMtrrSupported (&FixedMtrrSupported, &VariableMtrrCount)) { return MtrrSetting; } // + // Get MTRR_DEF_TYPE value + // + MtrrDefType->Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); + + // + // Enabling the Fixed MTRR bit when unsupported is not allowed. + // + ASSERT (FixedMtrrSupported || (MtrrDefType->Bits.FE == 0)); + + // // Get fixed MTRRs // - MtrrGetFixedMtrrWorker (&MtrrSetting->Fixed); + if (MtrrDefType->Bits.FE == 1) { + MtrrGetFixedMtrrWorker (&MtrrSetting->Fixed); + } // // Get variable MTRRs // MtrrGetVariableMtrrWorker ( NULL, - GetVariableMtrrCountWorker (), + VariableMtrrCount, &MtrrSetting->Variables ); - // - // Get MTRR_DEF_TYPE value - // - MtrrSetting->MtrrDefType = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); - return MtrrSetting; } -- cgit v1.1