From 1217f59d23b7c1cc6fa3be658f9ec00bfe0854c0 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Thu, 29 Sep 2022 12:48:19 +0800 Subject: 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 Signed-off-by: Yuanhao Xie Cc: Eric Dong Cc: Rahul Kumar Cc: Gerd Hoffmann Reviewed-by: Eric Dong Reviewed-by: Ray Ni --- 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.
+ Copyright (c) 2008 - 2023, Intel Corporation. All rights reserved.
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 255a8ebf81..e9bb153304 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); -- cgit v1.2.3