diff options
Diffstat (limited to 'UefiCpuPkg/Library/MtrrLib/MtrrLib.c')
-rw-r--r-- | UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 30 |
1 files changed, 22 insertions, 8 deletions
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;
}
|