summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRay Ni <ray.ni@intel.com>2022-09-29 12:23:55 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-10-09 08:22:02 +0000
commit0d89ceae31f54befd1cfaa2e36eb7a03bdcd94b0 (patch)
treeae8ad4d93b013d2de3009aeab70edf28d64517cd
parent5b76b4a9f974d3ff57b7c9c43f3f4b72794a2feb (diff)
downloadedk2-0d89ceae31f54befd1cfaa2e36eb7a03bdcd94b0.tar.gz
edk2-0d89ceae31f54befd1cfaa2e36eb7a03bdcd94b0.tar.bz2
edk2-0d89ceae31f54befd1cfaa2e36eb7a03bdcd94b0.zip
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>
-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;
}