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>
This commit is contained in:
Ray Ni 2022-09-29 12:48:19 +08:00 committed by mergify[bot]
parent cc070b88e4
commit 1217f59d23
2 changed files with 26 additions and 9 deletions

View File

@ -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 *

View File

@ -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.
//
MtrrSetFixedMtrrWorker (&MtrrSetting->Fixed);
ASSERT (FixedMtrrSupported || (MtrrDefType->Bits.FE == 0));
//
// Set variable MTRRs
// If the hardware supports Fixed MTRR, it is sufficient
// to set MTRRs regardless of whether Fixed MTRR bit is enabled.
//
if (FixedMtrrSupported) {
MtrrSetFixedMtrrWorker (&MtrrSetting->Fixed);
}
//
// Set Variable MTRRs
//
MtrrSetVariableMtrrWorker (&MtrrSetting->Variables);