diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index bd61ffc240..c9440f01ef 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; }