Reviewed-by: Ray Ni <ray...@intel.com> > -----Original Message----- > From: abner.ch...@amd.com <abner.ch...@amd.com> > Sent: Monday, October 31, 2022 10:49 AM > To: devel@edk2.groups.io > Cc: Abdul Lateef Attar <abdat...@amd.com>; Garrett Kirkendall > <garrett.kirkend...@amd.com>; Paul Grimes <paul.gri...@amd.com>; Dong, > Eric <eric.d...@intel.com>; Ni, Ray <ray...@intel.com>; Kumar, Rahul R > <rahul.r.ku...@intel.com> > Subject: [PATCH V3 2/3] UefiCpuPkg/SmmCpuFeaturesLib: Abstract arch > dependent code > > From: Abner Chang <abner.ch...@amd.com> > > BZ# 4093: Abstract SmmCpuFeaturesLib for sharing common code > > This change stripped away the code that can be > shared with other archs or vendors from Intel > implementation and put in to the common file, > leaves the Intel X86 implementation in the > IntelSmmCpuFeatureLib. Also updates the header > file and INF file. > > Signed-off-by: Abner Chang <abner.ch...@amd.com> > Cc: Abdul Lateef Attar <abdat...@amd.com> > Cc: Garrett Kirkendall <garrett.kirkend...@amd.com> > Cc: Paul Grimes <paul.gri...@amd.com> > Cc: Eric Dong <eric.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Rahul Kumar <rahul1.ku...@intel.com> > --- > .../SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf | 1 + > .../SmmCpuFeaturesLibStm.inf | 1 + > .../StandaloneMmCpuFeaturesLib.inf | 1 + > .../SmmCpuFeaturesLib/CpuFeaturesLib.h | 6 + > .../IntelSmmCpuFeaturesLib.c | 206 +---------------- > .../SmmCpuFeaturesLibCommon.c | 216 ++++++++++++++++++ > 6 files changed, 227 insertions(+), 204 deletions(-) > create mode 100644 > UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibCommon.c > > diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > index 6254a14698a..9ac7dde78f8 100644 > --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > @@ -20,6 +20,7 @@ > CpuFeaturesLib.h > IntelSmmCpuFeaturesLib.c > SmmCpuFeaturesLib.c > + SmmCpuFeaturesLibCommon.c > SmmCpuFeaturesLibNoStm.c > TraditionalMmCpuFeaturesLib.c > > diff --git > a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf > index d64d8e66b38..86d367e0a09 100644 > --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf > +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf > @@ -20,6 +20,7 @@ > [Sources] > CpuFeaturesLib.h > IntelSmmCpuFeaturesLib.c > + SmmCpuFeaturesLibCommon.c > SmmStm.c > SmmStm.h > TraditionalMmCpuFeaturesLib.c > diff --git > a/UefiCpuPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.i > nf > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.i > nf > index 5935b3e1fd6..b1f60a55055 100644 > --- > a/UefiCpuPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.i > nf > +++ > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.i > nf > @@ -21,6 +21,7 @@ > [Sources] > CpuFeaturesLib.h > IntelSmmCpuFeaturesLib.c > + SmmCpuFeaturesLibCommon.c > StandaloneMmCpuFeaturesLib.c > SmmCpuFeaturesLibNoStm.c > > diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h > index 8a1c2adc5c4..fd3e902547c 100644 > --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h > +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h > @@ -9,6 +9,12 @@ > #ifndef CPU_FEATURES_LIB_H_ > #define CPU_FEATURES_LIB_H_ > > +#include <Library/SmmCpuFeaturesLib.h> > +#include <Library/BaseLib.h> > +#include <Library/PcdLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/DebugLib.h> > + > /** > Performs library initialization. > > diff --git > a/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c > index 75a0ec8e948..cb4897b21e3 100644 > --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c > +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c > @@ -7,16 +7,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > -#include <PiMm.h> > -#include <Library/SmmCpuFeaturesLib.h> > -#include <Library/BaseLib.h> > +#include "CpuFeaturesLib.h" > + > #include <Library/MtrrLib.h> > -#include <Library/PcdLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/DebugLib.h> > #include <Register/Intel/Cpuid.h> > #include <Register/Intel/SmramSaveStateMap.h> > -#include "CpuFeaturesLib.h" > > // > // Machine Specific Registers (MSRs) > @@ -287,64 +282,6 @@ SmmCpuFeaturesInitializeProcessor ( > FinishSmmCpuFeaturesInitializeProcessor (); > } > > -/** > - This function updates the SMRAM save state on the currently executing > CPU > - to resume execution at a specific address after an RSM instruction. This > - function must evaluate the SMRAM save state to determine the execution > mode > - the RSM instruction resumes and update the resume execution address > with > - either NewInstructionPointer32 or NewInstructionPoint. The auto HALT > restart > - flag in the SMRAM save state must always be cleared. This function returns > - 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 > - SMBASE address is used for the first SMI to the next CPU. > - > - @param[in] CpuIndex The index of the CPU to hook. The > value > - must be between 0 and the NumberOfCpus > - field in the System Management System > Table > - (SMST). > - @param[in] CpuState Pointer to SMRAM Save State Map for the > - currently executing CPU. > - @param[in] NewInstructionPointer32 Instruction pointer to use if > resuming to > - 32-bit execution mode from 64-bit SMM. > - @param[in] NewInstructionPointer Instruction pointer to use if resuming > to > - same execution mode as SMM. > - > - @retval 0 This function did modify the SMRAM save state. > - @retval > 0 The original instruction pointer value from the SMRAM save > state > - before it was replaced. > -**/ > -UINT64 > -EFIAPI > -SmmCpuFeaturesHookReturnFromSmm ( > - IN UINTN CpuIndex, > - IN SMRAM_SAVE_STATE_MAP *CpuState, > - IN UINT64 NewInstructionPointer32, > - IN UINT64 NewInstructionPointer > - ) > -{ > - return 0; > -} > - > -/** > - Hook point in normal execution mode that allows the one CPU that was > elected > - as monarch during System Management Mode initialization to perform > additional > - initialization actions immediately after all of the CPUs have processed > their > - first SMI and called SmmCpuFeaturesInitializeProcessor() relocating > SMBASE > - into a buffer in SMRAM and called > SmmCpuFeaturesHookReturnFromSmm(). > -**/ > -VOID > -EFIAPI > -SmmCpuFeaturesSmmRelocationComplete ( > - VOID > - ) > -{ > -} > - > /** > Determines if MTRR registers must be configured to set SMRAM cache- > ability > when executing in System Management Mode. > @@ -414,48 +351,6 @@ SmmCpuFeaturesRendezvousEntry ( > } > } > > -/** > - Processor specific hook point each time a CPU exits System Management > Mode. > - > - @param[in] CpuIndex The index of the CPU that is exiting SMM. The value > must > - be between 0 and the NumberOfCpus field in the System > - Management System Table (SMST). > -**/ > -VOID > -EFIAPI > -SmmCpuFeaturesRendezvousExit ( > - IN UINTN CpuIndex > - ) > -{ > -} > - > -/** > - Check to see if an SMM register is supported by a specified CPU. > - > - @param[in] CpuIndex The index of the CPU to check for SMM register > support. > - The value must be between 0 and the NumberOfCpus field > - in the System Management System Table (SMST). > - @param[in] RegName Identifies the SMM register to check for support. > - > - @retval TRUE The SMM register specified by RegName is supported by > the CPU > - specified by CpuIndex. > - @retval FALSE The SMM register specified by RegName is not supported > by the > - CPU specified by CpuIndex. > -**/ > -BOOLEAN > -EFIAPI > -SmmCpuFeaturesIsSmmRegisterSupported ( > - IN UINTN CpuIndex, > - IN SMM_REG_NAME RegName > - ) > -{ > - if (FeaturePcdGet (PcdSmmFeatureControlEnable) && (RegName == > SmmRegFeatureControl)) { > - return TRUE; > - } > - > - return FALSE; > -} > - > /** > Returns the current value of the SMM register for the specified CPU. > If the SMM register is not supported, then 0 is returned. > @@ -506,100 +401,3 @@ SmmCpuFeaturesSetSmmRegister ( > } > } > > -/** > - Read an SMM Save State register on the target processor. If this function > - returns EFI_UNSUPPORTED, then the caller is responsible for reading the > - SMM Save Sate register. > - > - @param[in] CpuIndex The index of the CPU to read the SMM Save State. > The > - value must be between 0 and the NumberOfCpus field in > - the System Management System Table (SMST). > - @param[in] Register The SMM Save State register to read. > - @param[in] Width The number of bytes to read from the CPU save state. > - @param[out] Buffer Upon return, this holds the CPU register value read > - from the save state. > - > - @retval EFI_SUCCESS The register was read from Save State. > - @retval EFI_INVALID_PARAMETER Buffer is NULL. > - @retval EFI_UNSUPPORTED This function does not support reading > Register. > - > -**/ > -EFI_STATUS > -EFIAPI > -SmmCpuFeaturesReadSaveStateRegister ( > - IN UINTN CpuIndex, > - IN EFI_SMM_SAVE_STATE_REGISTER Register, > - IN UINTN Width, > - OUT VOID *Buffer > - ) > -{ > - return EFI_UNSUPPORTED; > -} > - > -/** > - Writes an SMM Save State register on the target processor. If this > function > - returns EFI_UNSUPPORTED, then the caller is responsible for writing the > - SMM Save Sate register. > - > - @param[in] CpuIndex The index of the CPU to write the SMM Save State. > The > - value must be between 0 and the NumberOfCpus field in > - the System Management System Table (SMST). > - @param[in] Register The SMM Save State register to write. > - @param[in] Width The number of bytes to write to the CPU save state. > - @param[in] Buffer Upon entry, this holds the new CPU register value. > - > - @retval EFI_SUCCESS The register was written to Save State. > - @retval EFI_INVALID_PARAMETER Buffer is NULL. > - @retval EFI_UNSUPPORTED This function does not support writing > Register. > -**/ > -EFI_STATUS > -EFIAPI > -SmmCpuFeaturesWriteSaveStateRegister ( > - IN UINTN CpuIndex, > - IN EFI_SMM_SAVE_STATE_REGISTER Register, > - IN UINTN Width, > - IN CONST VOID *Buffer > - ) > -{ > - return EFI_UNSUPPORTED; > -} > - > -/** > - This function is hook point called after the > gEfiSmmReadyToLockProtocolGuid > - notification is completely processed. > -**/ > -VOID > -EFIAPI > -SmmCpuFeaturesCompleteSmmReadyToLock ( > - VOID > - ) > -{ > -} > - > -/** > - This API provides a method for a CPU to allocate a specific region for > storing > page tables. > - > - This API can be called more once to allocate memory for page tables. > - > - Allocates the number of 4KB pages of type EfiRuntimeServicesData and > returns a pointer to the > - allocated buffer. The buffer returned is aligned on a 4KB boundary. If > Pages is 0, then NULL > - is returned. If there is not enough memory remaining to satisfy the > request, then NULL is > - returned. > - > - This function can also return NULL if there is no preference on where the > page tables are allocated in SMRAM. > - > - @param Pages The number of 4 KB pages to allocate. > - > - @return A pointer to the allocated buffer for page tables. > - @retval NULL Fail to allocate a specific region for storing page > tables, > - Or there is no preference on where the page tables are > allocated > in SMRAM. > - > -**/ > -VOID * > -EFIAPI > -SmmCpuFeaturesAllocatePageTableMemory ( > - IN UINTN Pages > - ) > -{ > - return NULL; > -} > diff --git > a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibCommon.c > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibCommon.c > new file mode 100644 > index 00000000000..7777e52740e > --- /dev/null > +++ > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibCommon.c > @@ -0,0 +1,216 @@ > +/** @file > +Implementation shared across all library instances. > + > +Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR> > +Copyright (c) Microsoft Corporation.<BR> > +SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <PiMm.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 "CpuFeaturesLib.h" > + > +/** > + This function updates the SMRAM save state on the currently executing > CPU > + to resume execution at a specific address after an RSM instruction. This > + function must evaluate the SMRAM save state to determine the execution > mode > + the RSM instruction resumes and update the resume execution address > with > + either NewInstructionPointer32 or NewInstructionPoint. The auto HALT > restart > + flag in the SMRAM save state must always be cleared. This function > returns > + 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 > + SMBASE address is used for the first SMI to the next CPU. > + > + @param[in] CpuIndex The index of the CPU to hook. The > value > + must be between 0 and the NumberOfCpus > + field in the System Management System > Table > + (SMST). > + @param[in] CpuState Pointer to SMRAM Save State Map for the > + currently executing CPU. > + @param[in] NewInstructionPointer32 Instruction pointer to use if > resuming to > + 32-bit execution mode from 64-bit SMM. > + @param[in] NewInstructionPointer Instruction pointer to use if resuming > to > + same execution mode as SMM. > + > + @retval 0 This function did modify the SMRAM save state. > + @retval > 0 The original instruction pointer value from the SMRAM save > state > + before it was replaced. > +**/ > +UINT64 > +EFIAPI > +SmmCpuFeaturesHookReturnFromSmm ( > + IN UINTN CpuIndex, > + IN SMRAM_SAVE_STATE_MAP *CpuState, > + IN UINT64 NewInstructionPointer32, > + IN UINT64 NewInstructionPointer > + ) > +{ > + return 0; > +} > + > +/** > + Hook point in normal execution mode that allows the one CPU that was > elected > + as monarch during System Management Mode initialization to perform > additional > + initialization actions immediately after all of the CPUs have processed > their > + first SMI and called SmmCpuFeaturesInitializeProcessor() relocating > SMBASE > + into a buffer in SMRAM and called > SmmCpuFeaturesHookReturnFromSmm(). > +**/ > +VOID > +EFIAPI > +SmmCpuFeaturesSmmRelocationComplete ( > + VOID > + ) > +{ > +} > + > +/** > + Processor specific hook point each time a CPU exits System Management > Mode. > + > + @param[in] CpuIndex The index of the CPU that is exiting SMM. The > value must > + be between 0 and the NumberOfCpus field in the System > + Management System Table (SMST). > +**/ > +VOID > +EFIAPI > +SmmCpuFeaturesRendezvousExit ( > + IN UINTN CpuIndex > + ) > +{ > +} > + > +/** > + Check to see if an SMM register is supported by a specified CPU. > + > + @param[in] CpuIndex The index of the CPU to check for SMM register > support. > + The value must be between 0 and the NumberOfCpus field > + in the System Management System Table (SMST). > + @param[in] RegName Identifies the SMM register to check for support. > + > + @retval TRUE The SMM register specified by RegName is supported by > the CPU > + specified by CpuIndex. > + @retval FALSE The SMM register specified by RegName is not supported > by the > + CPU specified by CpuIndex. > +**/ > +BOOLEAN > +EFIAPI > +SmmCpuFeaturesIsSmmRegisterSupported ( > + IN UINTN CpuIndex, > + IN SMM_REG_NAME RegName > + ) > +{ > + if (FeaturePcdGet (PcdSmmFeatureControlEnable) && (RegName == > SmmRegFeatureControl)) { > + return TRUE; > + } > + > + return FALSE; > +} > + > +/** > + Read an SMM Save State register on the target processor. If this function > + returns EFI_UNSUPPORTED, then the caller is responsible for reading the > + SMM Save Sate register. > + > + @param[in] CpuIndex The index of the CPU to read the SMM Save State. > The > + value must be between 0 and the NumberOfCpus field in > + the System Management System Table (SMST). > + @param[in] Register The SMM Save State register to read. > + @param[in] Width The number of bytes to read from the CPU save > state. > + @param[out] Buffer Upon return, this holds the CPU register value read > + from the save state. > + > + @retval EFI_SUCCESS The register was read from Save State. > + @retval EFI_INVALID_PARAMETER Buffer is NULL. > + @retval EFI_UNSUPPORTED This function does not support reading > Register. > + > +**/ > +EFI_STATUS > +EFIAPI > +SmmCpuFeaturesReadSaveStateRegister ( > + IN UINTN CpuIndex, > + IN EFI_SMM_SAVE_STATE_REGISTER Register, > + IN UINTN Width, > + OUT VOID *Buffer > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Writes an SMM Save State register on the target processor. If this > function > + returns EFI_UNSUPPORTED, then the caller is responsible for writing the > + SMM Save Sate register. > + > + @param[in] CpuIndex The index of the CPU to write the SMM Save State. > The > + value must be between 0 and the NumberOfCpus field in > + the System Management System Table (SMST). > + @param[in] Register The SMM Save State register to write. > + @param[in] Width The number of bytes to write to the CPU save state. > + @param[in] Buffer Upon entry, this holds the new CPU register value. > + > + @retval EFI_SUCCESS The register was written to Save State. > + @retval EFI_INVALID_PARAMETER Buffer is NULL. > + @retval EFI_UNSUPPORTED This function does not support writing > Register. > +**/ > +EFI_STATUS > +EFIAPI > +SmmCpuFeaturesWriteSaveStateRegister ( > + IN UINTN CpuIndex, > + IN EFI_SMM_SAVE_STATE_REGISTER Register, > + IN UINTN Width, > + IN CONST VOID *Buffer > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + This function is hook point called after the > gEfiSmmReadyToLockProtocolGuid > + notification is completely processed. > +**/ > +VOID > +EFIAPI > +SmmCpuFeaturesCompleteSmmReadyToLock ( > + VOID > + ) > +{ > +} > + > +/** > + This API provides a method for a CPU to allocate a specific region for > storing page tables. > + > + This API can be called more once to allocate memory for page tables. > + > + Allocates the number of 4KB pages of type EfiRuntimeServicesData and > returns a pointer to the > + allocated buffer. The buffer returned is aligned on a 4KB boundary. If > Pages is 0, then NULL > + is returned. If there is not enough memory remaining to satisfy the > request, then NULL is > + returned. > + > + This function can also return NULL if there is no preference on where the > page tables are allocated in SMRAM. > + > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer for page tables. > + @retval NULL Fail to allocate a specific region for storing page > tables, > + Or there is no preference on where the page tables are > allocated > in SMRAM. > + > +**/ > +VOID * > +EFIAPI > +SmmCpuFeaturesAllocatePageTableMemory ( > + IN UINTN Pages > + ) > +{ > + return NULL; > +} > -- > 2.37.1.windows.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#95769): https://edk2.groups.io/g/devel/message/95769 Mute This Topic: https://groups.io/mt/94677851/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-