mirror of https://github.com/acidanthera/audk.git
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:
parent
cc070b88e4
commit
1217f59d23
|
@ -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 *
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue