From: Ray Ni <ray.ni@intel.com>
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>
---
UefiCpuPkg/Include/Library/MtrrLib.h | 9 ++++++---
UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 26 ++++++++++++++++++++------
2 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/UefiCpuPkg/Include/Library/MtrrLib.h b/UefiCpuPkg/Include/Library/MtrrLib.h
index 683d9f2c14..94cf615901 100644
--- a/UefiCpuPkg/Include/Library/MtrrLib.h
+++ b/UefiCpuPkg/Include/Library/MtrrLib.h
@@ -1,7 +1,7 @@
/** @file
MTRR setting library
- Copyright (c) 2008 - 2020, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2008 - 2023, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -214,9 +214,12 @@ MtrrGetAllMtrrs (
/**
This function sets all MTRRs (variable and fixed)
- @param[in] MtrrSetting A buffer to hold all MTRRs content.
+ Note: The behavior of this function is to program everything in MtrrSetting to hardware.
+ MTRR might not be enabled due to enable bit is clear in MtrrSetting->MtrrDefType.
- @return The pointer of MtrrSetting
+ @param[in] MtrrSetting A buffer holding all MTRRs content.
+
+ @retval The pointer of MtrrSetting
**/
MTRR_SETTINGS *
diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
index b63c4b1c26..9a01f1417f 100644
--- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
+++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
@@ -2868,7 +2868,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.
@@ -2881,21 +2884,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);
--
2.36.1.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#108566): https://edk2.groups.io/g/devel/message/108566
Mute This Topic: https://groups.io/mt/101331028/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-