summaryrefslogtreecommitdiff
path: root/UefiCpuPkg/Library
diff options
context:
space:
mode:
authorRay Ni <ray.ni@intel.com>2022-09-29 12:48:19 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-10-09 08:22:02 +0000
commit1217f59d23b7c1cc6fa3be658f9ec00bfe0854c0 (patch)
treefc520c3c716cc6a3ef2c939d15ccf2b1fa0f73fc /UefiCpuPkg/Library
parentcc070b88e4ffef9d7acf3965058a4ab737f3cbde (diff)
downloadedk2-1217f59d23b7c1cc6fa3be658f9ec00bfe0854c0.zip
edk2-1217f59d23b7c1cc6fa3be658f9ec00bfe0854c0.tar.gz
edk2-1217f59d23b7c1cc6fa3be658f9ec00bfe0854c0.tar.bz2
UefiCpuPkg/MtrrLib: Fix MtrrSetAllMtrrs to handle absent fixed MTRRs.
Update MtrrSetAllMtrrs to not access fixed MTRRs if CPU doesn't support them. 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>
Diffstat (limited to 'UefiCpuPkg/Library')
-rw-r--r--UefiCpuPkg/Library/MtrrLib/MtrrLib.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
index 255a8eb..e9bb153 100644
--- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
+++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
@@ -2869,7 +2869,10 @@ MtrrGetAllMtrrs (
}
/**
- This function sets all MTRRs (variable and fixed)
+ This function sets all MTRRs includes Variable and Fixed.
+
+ The behavior of this function is to program everything in MtrrSetting to hardware.
+ MTRRs might not be enabled because the enable bit is clear in MtrrSetting->MtrrDefType.
@param[in] MtrrSetting A buffer holding all MTRRs content.
@@ -2882,21 +2885,32 @@ MtrrSetAllMtrrs (
IN MTRR_SETTINGS *MtrrSetting
)
{
- MTRR_CONTEXT MtrrContext;
+ BOOLEAN FixedMtrrSupported;
+ MSR_IA32_MTRR_DEF_TYPE_REGISTER *MtrrDefType;
+ MTRR_CONTEXT MtrrContext;
- if (!IsMtrrSupported ()) {
+ MtrrDefType = (MSR_IA32_MTRR_DEF_TYPE_REGISTER *)&MtrrSetting->MtrrDefType;
+ if (!MtrrLibIsMtrrSupported (&FixedMtrrSupported, NULL)) {
return MtrrSetting;
}
MtrrLibPreMtrrChange (&MtrrContext);
//
- // Set fixed MTRRs
+ // Enabling the Fixed MTRR bit when unsupported is not allowed.
+ //
+ ASSERT (FixedMtrrSupported || (MtrrDefType->Bits.FE == 0));
+
+ //
+ // If the hardware supports Fixed MTRR, it is sufficient
+ // to set MTRRs regardless of whether Fixed MTRR bit is enabled.
//
- MtrrSetFixedMtrrWorker (&MtrrSetting->Fixed);
+ if (FixedMtrrSupported) {
+ MtrrSetFixedMtrrWorker (&MtrrSetting->Fixed);
+ }
//
- // Set variable MTRRs
+ // Set Variable MTRRs
//
MtrrSetVariableMtrrWorker (&MtrrSetting->Variables);