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 <ray.ni@intel.com>
Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com>

Cc: Eric Dong <eric.dong@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>

Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
This commit is contained in:
Ray Ni 2022-09-29 12:23:55 +08:00 committed by mergify[bot]
parent 5b76b4a9f9
commit 0d89ceae31
1 changed files with 22 additions and 8 deletions

View File

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