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
|
/** @file
|
||||||
MTRR setting library
|
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
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -214,9 +214,12 @@ MtrrGetAllMtrrs (
|
||||||
/**
|
/**
|
||||||
This function sets all MTRRs (variable and fixed)
|
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 *
|
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.
|
@param[in] MtrrSetting A buffer holding all MTRRs content.
|
||||||
|
|
||||||
|
@ -2882,21 +2885,32 @@ MtrrSetAllMtrrs (
|
||||||
IN MTRR_SETTINGS *MtrrSetting
|
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;
|
return MtrrSetting;
|
||||||
}
|
}
|
||||||
|
|
||||||
MtrrLibPreMtrrChange (&MtrrContext);
|
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);
|
MtrrSetVariableMtrrWorker (&MtrrSetting->Variables);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue