Laszlo, Reviewed-by: Michael Kinney <michael.d.kin...@intel.com>
Mike > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Laszlo > Ersek > Sent: Tuesday, November 3, 2015 1:01 PM > To: edk2-de...@ml01.01.org > Cc: Paolo Bonzini <pbonz...@redhat.com> > Subject: [edk2] [PATCH v4 21/41] OvmfPkg: SmmCpuFeaturesLib: remove > unnecessary bits > > From: Paolo Bonzini <pbonz...@redhat.com> > > SMRR and MTRR support is not needed on a virtual platform. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > Acked-by: Laszlo Ersek <ler...@redhat.com> > [ler...@redhat.com: insert space between ASSERT and (), convert to CRLF] > Cc: Paolo Bonzini <pbonz...@redhat.com> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Laszlo Ersek <ler...@redhat.com> > --- > > Notes: > v3: > - new in v3 > > OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf | 4 - > OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 180 > ++------------------ > 2 files changed, 18 insertions(+), 166 deletions(-) > > diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > index b04c028..656dd08 100644 > --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > @@ -32,8 +32,4 @@ [Packages] > [LibraryClasses] > BaseLib > PcdLib > - MemoryAllocationLib > DebugLib > - > -[Pcd] > - gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## > SOMETIMES_CONSUMES > diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c > b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c > index dd09387..078ea96 100644 > --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c > +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c > @@ -15,46 +15,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > #include <PiSmm.h> > #include <Library/SmmCpuFeaturesLib.h> > #include <Library/BaseLib.h> > -#include <Library/MtrrLib.h> > #include <Library/PcdLib.h> > #include <Library/MemoryAllocationLib.h> > #include <Library/DebugLib.h> > -#include <Register/Cpuid.h> > #include <Register/SmramSaveStateMap.h> > > -// > -// Machine Specific Registers (MSRs) > -// > -#define SMM_FEATURES_LIB_IA32_MTRR_CAP 0x0FE > -#define SMM_FEATURES_LIB_IA32_FEATURE_CONTROL 0x03A > -#define SMM_FEATURES_LIB_IA32_SMRR_PHYSBASE 0x1F2 > -#define SMM_FEATURES_LIB_IA32_SMRR_PHYSMASK 0x1F3 > -#define SMM_FEATURES_LIB_IA32_CORE_SMRR_PHYSBASE 0x0A0 > -#define SMM_FEATURES_LIB_IA32_CORE_SMRR_PHYSMASK 0x0A1 > -#define EFI_MSR_SMRR_MASK 0xFFFFF000 > -#define EFI_MSR_SMRR_PHYS_MASK_VALID BIT11 > - > -// > -// Set default value to assume SMRR is not supported > -// > -BOOLEAN mSmrrSupported = FALSE; > - > -// > -// Set default value to assume IA-32 Architectural MSRs are used > -// > -UINT32 mSmrrPhysBaseMsr = SMM_FEATURES_LIB_IA32_SMRR_PHYSBASE; > -UINT32 mSmrrPhysMaskMsr = SMM_FEATURES_LIB_IA32_SMRR_PHYSMASK; > - > -// > -// Set default value to assume MTRRs need to be configured on each SMI > -// > -BOOLEAN mNeedConfigureMtrrs = TRUE; > - > -// > -// Array for state of SMRR enable on all CPUs > -// > -BOOLEAN *mSmrrEnabled; > - > /** > The constructor function > > @@ -68,91 +33,9 @@ SmmCpuFeaturesLibConstructor ( > IN EFI_SYSTEM_TABLE *SystemTable > ) > { > - UINT32 RegEax; > - UINT32 RegEdx; > - UINTN FamilyId; > - UINTN ModelId; > - > // > - // Retrieve CPU Family and Model > + // No need to program SMRRs on our virtual platform. > // > - AsmCpuid (CPUID_VERSION_INFO, &RegEax, NULL, NULL, &RegEdx); > - FamilyId = (RegEax >> 8) & 0xf; > - ModelId = (RegEax >> 4) & 0xf; > - if (FamilyId == 0x06 || FamilyId == 0x0f) { > - ModelId = ModelId | ((RegEax >> 12) & 0xf0); > - } > - > - // > - // Check CPUID(CPUID_VERSION_INFO).EDX[12] for MTRR capability > - // > - if ((RegEdx & BIT12) != 0) { > - // > - // Check MTRR_CAP MSR bit 11 for SMRR support > - // > - if ((AsmReadMsr64 (SMM_FEATURES_LIB_IA32_MTRR_CAP) & BIT11) != 0) { > - mSmrrSupported = TRUE; > - } > - } > - > - // > - // Intel(R) 64 and IA-32 Architectures Software Developer's Manual > - // Volume 3C, Section 35.3 MSRs in the Intel(R) Atom(TM) Processor Family > - // > - // If CPU Family/Model is 06_1CH, 06_26H, 06_27H, 06_35H or 06_36H, then > - // SMRR Physical Base and SMM Physical Mask MSRs are not available. > - // > - if (FamilyId == 0x06) { > - if (ModelId == 0x1C || ModelId == 0x26 || ModelId == 0x27 || ModelId == > 0x35 || ModelId == 0x36) { > - mSmrrSupported = FALSE; > - } > - } > - > - // > - // Intel(R) 64 and IA-32 Architectures Software Developer's Manual > - // Volume 3C, Section 35.2 MSRs in the Intel(R) Core(TM) 2 Processor Family > - // > - // If CPU Family/Model is 06_0F or 06_17, then use Intel(R) Core(TM) 2 > - // Processor Family MSRs > - // > - if (FamilyId == 0x06) { > - if (ModelId == 0x17 || ModelId == 0x0f) { > - mSmrrPhysBaseMsr = SMM_FEATURES_LIB_IA32_CORE_SMRR_PHYSBASE; > - mSmrrPhysMaskMsr = SMM_FEATURES_LIB_IA32_CORE_SMRR_PHYSMASK; > - } > - } > - > - // > - // Intel(R) 64 and IA-32 Architectures Software Developer's Manual > - // Volume 3C, Section 34.4.2 SMRAM Caching > - // An IA-32 processor does not automatically write back and invalidate > its > - // caches before entering SMM or before exiting SMM. Because of this > behavior, > - // care must be taken in the placement of the SMRAM in system memory and > in > - // the caching of the SMRAM to prevent cache incoherence when switching > back > - // and forth between SMM and protected mode operation. > - // > - // An IA-32 processor is a processor that does not support the Intel 64 > - // Architecture. Support for the Intel 64 Architecture can be detected > from > - // CPUID(CPUID_EXTENDED_CPU_SIG).EDX[29] > - // > - // If an IA-32 processor is detected, then set mNeedConfigureMtrrs to TRUE, > - // so caches are flushed on SMI entry and SMI exit, the interrupted code > - // MTRRs are saved/restored, and MTRRs for SMM are loaded. > - // > - AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL); > - if (RegEax >= CPUID_EXTENDED_CPU_SIG) { > - AsmCpuid (CPUID_EXTENDED_CPU_SIG, NULL, NULL, NULL, &RegEdx); > - if ((RegEdx & BIT29) != 0) { > - mNeedConfigureMtrrs = FALSE; > - } > - } > - > - // > - // Allocate array for state of SMRR enable on all CPUs > - // > - mSmrrEnabled = (BOOLEAN *)AllocatePool (sizeof (BOOLEAN) * PcdGet32 > (PcdCpuMaxLogicalProcessorNumber)); > - ASSERT (mSmrrEnabled != NULL); > - > return EFI_SUCCESS; > } > > @@ -190,7 +73,6 @@ SmmCpuFeaturesInitializeProcessor ( > ) > { > SMRAM_SAVE_STATE_MAP *CpuState; > - UINT64 FeatureControl; > > // > // Configure SMBASE. > @@ -199,37 +81,8 @@ SmmCpuFeaturesInitializeProcessor ( > CpuState->x86.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex]; > > // > - // Intel(R) 64 and IA-32 Architectures Software Developer's Manual > - // Volume 3C, Section 35.2 MSRs in the Intel(R) Core(TM) 2 Processor Family > + // No need to program SMRRs on our virtual platform. > // > - // If Intel(R) Core(TM) Core(TM) 2 Processor Family MSRs are being used, > then > - // make sure SMRR Enable(BIT3) of MSR_FEATURE_CONTROL MSR(0x3A) is set > before > - // accessing SMRR base/mask MSRs. If Lock(BIT0) of MSR_FEATURE_CONTROL > MSR(0x3A) > - // is set, then the MSR is locked and can not be modified. > - // > - if (mSmrrSupported && mSmrrPhysBaseMsr == > SMM_FEATURES_LIB_IA32_CORE_SMRR_PHYSBASE) { > - FeatureControl = AsmReadMsr64 (SMM_FEATURES_LIB_IA32_FEATURE_CONTROL); > - if ((FeatureControl & BIT3) == 0) { > - if ((FeatureControl & BIT0) == 0) { > - AsmWriteMsr64 (SMM_FEATURES_LIB_IA32_FEATURE_CONTROL, FeatureControl > | BIT3); > - } else { > - mSmrrSupported = FALSE; > - } > - } > - } > - > - // > - // If SMRR is supported, then program SMRR base/mask MSRs. > - // The EFI_MSR_SMRR_PHYS_MASK_VALID bit is not set until the first normal > SMI. > - // The code that initializes SMM environment is running in normal mode > - // from SMRAM region. If SMRR is enabled here, then the SMRAM region > - // is protected and the normal mode code execution will fail. > - // > - if (mSmrrSupported) { > - AsmWriteMsr64 (mSmrrPhysBaseMsr, CpuHotPlugData->SmrrBase | > MTRR_CACHE_WRITE_BACK); > - AsmWriteMsr64 (mSmrrPhysMaskMsr, (~(CpuHotPlugData->SmrrSize - 1) & > EFI_MSR_SMRR_MASK)); > - mSmrrEnabled[CpuIndex] = FALSE; > - } > } > > /** > @@ -242,7 +95,7 @@ SmmCpuFeaturesInitializeProcessor ( > the value of the instruction pointer from the SMRAM save state that was > replaced. If this function returns 0, then the SMRAM save state was not > modified. > - > + > This function is called during the very first SMI on each CPU after > SmmCpuFeaturesInitializeProcessor() to set a flag in normal execution mode > to signal that the SMBASE of each CPU has been updated before the default > @@ -364,7 +217,7 @@ SmmCpuFeaturesNeedConfigureMtrrs ( > VOID > ) > { > - return mNeedConfigureMtrrs; > + return FALSE; > } > > /** > @@ -377,9 +230,9 @@ SmmCpuFeaturesDisableSmrr ( > VOID > ) > { > - if (mSmrrSupported && mNeedConfigureMtrrs) { > - AsmWriteMsr64 (mSmrrPhysMaskMsr, AsmReadMsr64(mSmrrPhysMaskMsr) & > ~EFI_MSR_SMRR_PHYS_MASK_VALID); > - } > + // > + // No SMRR support, nothing to do > + // > } > > /** > @@ -392,9 +245,9 @@ SmmCpuFeaturesReenableSmrr ( > VOID > ) > { > - if (mSmrrSupported && mNeedConfigureMtrrs) { > - AsmWriteMsr64 (mSmrrPhysMaskMsr, AsmReadMsr64(mSmrrPhysMaskMsr) | > EFI_MSR_SMRR_PHYS_MASK_VALID); > - } > + // > + // No SMRR support, nothing to do > + // > } > > /** > @@ -411,12 +264,8 @@ SmmCpuFeaturesRendezvousEntry ( > ) > { > // > - // If SMRR is supported and this is the first normal SMI, then enable SMRR > + // No SMRR support, nothing to do > // > - if (mSmrrSupported && !mSmrrEnabled[CpuIndex]) { > - AsmWriteMsr64 (mSmrrPhysMaskMsr, AsmReadMsr64 (mSmrrPhysMaskMsr) | > EFI_MSR_SMRR_PHYS_MASK_VALID); > - mSmrrEnabled[CpuIndex] = TRUE; > - } > } > > /** > @@ -454,6 +303,7 @@ SmmCpuFeaturesIsSmmRegisterSupported ( > IN SMM_REG_NAME RegName > ) > { > + ASSERT (RegName == SmmRegFeatureControl); > return FALSE; > } > > @@ -476,6 +326,11 @@ SmmCpuFeaturesGetSmmRegister ( > IN SMM_REG_NAME RegName > ) > { > + // > + // This is called for SmmRegSmmDelayed, SmmRegSmmBlocked, SmmRegSmmEnable. > + // The last of these should actually be SmmRegSmmDisable, so we can just > + // return FALSE. > + // > return 0; > } > > @@ -498,6 +353,7 @@ SmmCpuFeaturesSetSmmRegister ( > IN UINT64 Value > ) > { > + ASSERT (FALSE); > } > > /** > -- > 1.8.3.1 > > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel