summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
diff options
context:
space:
mode:
Diffstat (limited to 'UefiCpuPkg/Library/MtrrLib/MtrrLib.c')
-rw-r--r--UefiCpuPkg/Library/MtrrLib/MtrrLib.c30
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;
}