From: "Chang, Abner" <abner.chang@amd.com>
To: "Attar, AbdulLateef (Abdul Lateef)" <AbdulLateef.Attar@amd.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Attar, AbdulLateef (Abdul Lateef)" <AbdulLateef.Attar@amd.com>,
"Grimes, Paul" <Paul.Grimes@amd.com>,
"Kirkendall, Garrett" <Garrett.Kirkendall@amd.com>,
Eric Dong <eric.dong@intel.com>, Ray Ni <ray.ni@intel.com>,
Rahul Kumar <rahul1.kumar@intel.com>
Subject: Re: [PATCH v3 5/6] UefiCpuPkg: Initial implementation of AMD's SmmCpuFeaturesLib
Date: Thu, 19 Jan 2023 04:08:27 +0000 [thread overview]
Message-ID: <MN2PR12MB3966B0C1A815B93FBA632329EAC49@MN2PR12MB3966.namprd12.prod.outlook.com> (raw)
In-Reply-To: <d78d97494af0c78dbd1ff91ba39cf361de2d5127.1674060385.git.abdattar@amd.com>
[AMD Official Use Only - General]
Reviewed-by: Abner Chang <abner.chang@amd.com>
> -----Original Message-----
> From: Abdul Lateef Attar <abdattar@amd.com>
> Sent: Thursday, January 19, 2023 1:01 AM
> To: devel@edk2.groups.io
> Cc: Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>;
> Grimes, Paul <Paul.Grimes@amd.com>; Kirkendall, Garrett
> <Garrett.Kirkendall@amd.com>; Chang, Abner <Abner.Chang@amd.com>;
> Eric Dong <eric.dong@intel.com>; Ray Ni <ray.ni@intel.com>; Rahul Kumar
> <rahul1.kumar@intel.com>
> Subject: [PATCH v3 5/6] UefiCpuPkg: Initial implementation of AMD's
> SmmCpuFeaturesLib
>
> From: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4182
>
> Adds initial defination for AMD's SmmCpuFeaturesLib library implementation.
> All function's body either empty or just returns value. Its initial skeleton of
> library implementation.
>
> Cc: Paul Grimes <paul.grimes@amd.com>
> Cc: Garrett Kirkendall <garrett.kirkendall@amd.com>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Rahul Kumar <rahul1.kumar@intel.com>
> Signed-off-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
> ---
> UefiCpuPkg/UefiCpuPkg.dsc | 8 +
> .../AmdSmmCpuFeaturesLib.inf | 33 ++
> .../SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c | 345
> ++++++++++++++++++
> 3 files changed, 386 insertions(+)
> create mode 100644
> UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf
> create mode 100644
> UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c
>
> diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index
> 99f7532ce00b..1833d35fb354 100644
> --- a/UefiCpuPkg/UefiCpuPkg.dsc
> +++ b/UefiCpuPkg/UefiCpuPkg.dsc
> @@ -178,6 +178,13 @@ [Components.IA32, Components.X64]
> <LibraryClasses>
> SmmCpuFeaturesLib|UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFea
> turesLibStm.inf }+ UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
> {+ <Defines>+ FILE_GUID = B7242C74-BD21-49EE-84B4-07162E8C080D+
> <LibraryClasses>+
> SmmCpuFeaturesLib|UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCp
> uFeaturesLib.inf+
> SmmCpuPlatformHookLib|UefiCpuPkg/Library/SmmCpuPlatformHookLibNull
> /SmmCpuPlatformHookLibNull.inf+ }
> UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
> UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf
> UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf@
> @ -194,6 +201,7 @@ [Components.IA32, Components.X64]
>
> UnitTestResultReportLib|UnitTestFrameworkPkg/Library/UnitTestResultRep
> ortLib/UnitTestResultReportLibConOut.inf }
> UefiCpuPkg/Library/SmmSmramSaveStateLib/AmdSmmSmramSaveStateLib.
> inf+ UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf
> [Components.X64]
> UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHan
> dlerLibUnitTest.infdiff --git
> a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf
> new file mode 100644
> index 000000000000..4c77efc64462
> --- /dev/null
> +++
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf
> @@ -0,0 +1,33 @@
> +## @file+# The CPU specific programming for PiSmmCpuDxeSmm
> module.+#+# Copyright (c) 2009 - 2016, Intel Corporation. All rights
> reserved.<BR>+# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights
> reserved.<BR>+# SPDX-License-Identifier: BSD-2-Clause-
> Patent+#+##++[Defines]+ INF_VERSION = 0x00010005+
> BASE_NAME = SmmCpuFeaturesLib+ MODULE_UNI_FILE =
> SmmCpuFeaturesLib.uni+ FILE_GUID = 5849E964-78EC-428E-8CBD-
> 848A7E359134+ MODULE_TYPE = DXE_SMM_DRIVER+
> VERSION_STRING = 1.0+ LIBRARY_CLASS =
> SmmCpuFeaturesLib+ CONSTRUCTOR =
> SmmCpuFeaturesLibConstructor++[Sources]+ SmmCpuFeaturesLib.c+
> SmmCpuFeaturesLibCommon.c+ AmdSmmCpuFeaturesLib.c++[Packages]+
> MdePkg/MdePkg.dec+ UefiCpuPkg/UefiCpuPkg.dec++[LibraryClasses]+
> BaseLib+ PcdLib+ MemoryAllocationLib+ DebugLibdiff --git
> a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c
> new file mode 100644
> index 000000000000..c74e1a0c0c5b
> --- /dev/null
> +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c
> @@ -0,0 +1,345 @@
> +/** @file+Implementation specific to the SmmCpuFeatureLib library
> instance+for AMD based platforms.++Copyright (c) 2010 - 2019, Intel
> Corporation. All rights reserved.<BR>+Copyright (c) Microsoft
> Corporation.<BR>+Copyright (C) 2023 Advanced Micro Devices, Inc. All rights
> reserved.<BR>+SPDX-License-Identifier: BSD-2-Clause-
> Patent++**/++#include <Library/SmmCpuFeaturesLib.h>+#include
> <Uefi/UefiBaseType.h>++/**+ 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_PARAMTER Buffer is NULL.+ @retval EFI_UNSUPPORTED
> This function does not support reading
> Register.++**/+EFI_STATUS+EFIAPI+SmmCpuFeaturesReadSaveStateRegist
> er (+ IN UINTN CpuIndex,+ IN
> EFI_SMM_SAVE_STATE_REGISTER Register,+ IN UINTN Width,+
> OUT VOID *Buffer+ )+{+ return EFI_SUCCESS;+}++/**+ 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_PARAMTER Buffer is NULL.+ @retval EFI_UNSUPPORTED
> This function does not support writing
> Register.+**/+EFI_STATUS+EFIAPI+SmmCpuFeaturesWriteSaveStateRegiste
> r (+ IN UINTN CpuIndex,+ IN EFI_SMM_SAVE_STATE_REGISTER
> Register,+ IN UINTN Width,+ IN CONST VOID
> *Buffer+ )+{+ return EFI_SUCCESS;+}++/**+ Performs library
> initialization.++ This initialization function contains common functionality
> shared betwen all+ library instance
> constructors.++**/+VOID+CpuFeaturesLibInitialization (+
> VOID+ )+{+}++/**+ Called during the very first SMI into System
> Management Mode to initialize+ CPU features, including SMBASE, for the
> currently executing CPU. Since this+ is the first SMI, the SMRAM Save State
> Map is at the default address of+ AMD_SMM_DEFAULT_SMBASE +
> SMRAM_SAVE_STATE_MAP_OFFSET. The currently executing+ CPU is
> specified by CpuIndex and CpuIndex can be used to access information+
> about the currently executing CPU in the ProcessorInfo array and the+
> HotPlugCpuData data structure.++ @param[in] CpuIndex The index of
> the CPU to initialize. The value+ must be between 0 and the
> NumberOfCpus field in+ the System Management System
> Table (SMST).+ @param[in] IsMonarch TRUE if the CpuIndex is the index
> of the CPU that+ was elected as monarch during System
> Management+ Mode initialization.+ FALSE if the
> CpuIndex is not the index of the CPU+ that was elected as
> monarch during System+ Management Mode initialization.+
> @param[in] ProcessorInfo Pointer to an array of
> EFI_PROCESSOR_INFORMATION+ structures.
> ProcessorInfo[CpuIndex] contains the+ information for the
> currently executing CPU.+ @param[in] CpuHotPlugData Pointer to the
> CPU_HOT_PLUG_DATA structure that+ contains the ApidId and
> SmBase arrays.+**/+VOID+EFIAPI+SmmCpuFeaturesInitializeProcessor (+
> IN UINTN CpuIndex,+ IN BOOLEAN IsMonarch,+ IN
> EFI_PROCESSOR_INFORMATION *ProcessorInfo,+ IN
> CPU_HOT_PLUG_DATA *CpuHotPlugData+ )+{+}++/**+ 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;+}++/**+ Return the size, in bytes,
> of a custom SMI Handler in bytes. If 0 is+ returned, then a custom SMI
> handler is not provided by this library,+ and the default SMI handler must be
> used.++ @retval 0 Use the default SMI handler.+ @retval > 0 Use the SMI
> handler installed by SmmCpuFeaturesInstallSmiHandler()+ The caller is
> required to allocate enough SMRAM for each CPU to+ support the
> size of the custom SMI
> handler.+**/+UINTN+EFIAPI+SmmCpuFeaturesGetSmiHandlerSize (+
> VOID+ )+{+ return 0;+}++/**+ Install a custom SMI handler for the CPU
> specified by CpuIndex. This function+ is only called if
> SmmCpuFeaturesGetSmiHandlerSize() returns a size is greater+ than zero
> and is called by the CPU that was elected as monarch during System+
> Management Mode initialization.++ @param[in] CpuIndex The index of the
> CPU to install the custom SMI handler.+ The value must be
> between 0 and the NumberOfCpus field+ in the System
> Management System Table (SMST).+ @param[in] SmBase The SMBASE
> address for the CPU specified by CpuIndex.+ @param[in] SmiStack The
> stack to use when an SMI is processed by the+ the CPU specified
> by CpuIndex.+ @param[in] StackSize The size, in bytes, if the stack used
> when an SMI is+ processed by the CPU specified by CpuIndex.+
> @param[in] GdtBase The base address of the GDT to use when an SMI is+
> processed by the CPU specified by CpuIndex.+ @param[in] GdtSize The
> size, in bytes, of the GDT used when an SMI is+ processed by the
> CPU specified by CpuIndex.+ @param[in] IdtBase The base address of the
> IDT to use when an SMI is+ processed by the CPU specified by
> CpuIndex.+ @param[in] IdtSize The size, in bytes, of the IDT used when an
> SMI is+ processed by the CPU specified by CpuIndex.+
> @param[in] Cr3 The base address of the page tables to use when an
> SMI+ is processed by the CPU specified by
> CpuIndex.+**/+VOID+EFIAPI+SmmCpuFeaturesInstallSmiHandler (+ IN
> UINTN CpuIndex,+ IN UINT32 SmBase,+ IN VOID *SmiStack,+ IN UINTN
> StackSize,+ IN UINTN GdtBase,+ IN UINTN GdtSize,+ IN UINTN IdtBase,+
> IN UINTN IdtSize,+ IN UINT32 Cr3+ )+{+}++/**+ Determines if MTRR
> registers must be configured to set SMRAM cache-ability+ when executing
> in System Management Mode.++ @retval TRUE MTRR registers must be
> configured to set SMRAM cache-ability.+ @retval FALSE MTRR registers do
> not need to be configured to set SMRAM+ cache-
> ability.+**/+BOOLEAN+EFIAPI+SmmCpuFeaturesNeedConfigureMtrrs (+
> VOID+ )+{+ return FALSE;+}++/**+ Disable SMRR register if SMRR is
> supported and SmmCpuFeaturesNeedConfigureMtrrs()+ returns
> TRUE.+**/+VOID+EFIAPI+SmmCpuFeaturesDisableSmrr (+
> VOID+ )+{+}++/**+ Enable SMRR register if SMRR is supported and
> SmmCpuFeaturesNeedConfigureMtrrs()+ returns
> TRUE.+**/+VOID+EFIAPI+SmmCpuFeaturesReenableSmrr (+
> VOID+ )+{+}++/**+ Processor specific hook point each time a CPU enters
> System Management Mode.++ @param[in] CpuIndex The index of the CPU
> that has entered SMM. The value+ must be between 0 and the
> NumberOfCpus field in the+ System Management System Table
> (SMST).+**/+VOID+EFIAPI+SmmCpuFeaturesRendezvousEntry (+ IN UINTN
> CpuIndex+ )+{+}++/**+ Returns the current value of the SMM register for
> the specified CPU.+ If the SMM register is not supported, then 0 is
> returned.++ @param[in] CpuIndex The index of the CPU to read the SMM
> register. 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 read.++ @return The
> value of the SMM register specified by RegName from the CPU+
> specified by
> CpuIndex.+**/+UINT64+EFIAPI+SmmCpuFeaturesGetSmmRegister (+ IN
> UINTN CpuIndex,+ IN SMM_REG_NAME RegName+ )+{+ return
> 0;+}++/**+ Sets the value of an SMM register on a specified CPU.+ If the
> SMM register is not supported, then no action is performed.++ @param[in]
> CpuIndex The index of the CPU to write the SMM register. 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 write.+ registers are read-only.+
> @param[in] Value The value to write to the SMM
> register.+**/+VOID+EFIAPI+SmmCpuFeaturesSetSmmRegister (+ IN UINTN
> CpuIndex,+ IN SMM_REG_NAME RegName,+ IN UINT64
> Value+ )+{+}++/**+ 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+SmmCpuFeaturesIsSmmRegisterSupport
> ed (+ IN UINTN CpuIndex,+ IN SMM_REG_NAME RegName+ )+{+
> return FALSE;+}--
> 2.25.1
next prev parent reply other threads:[~2023-01-19 4:08 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-18 17:01 [PATCH v3 0/6] Adds AmdSmmCpuFeaturesLib for AMD Family Abdul Lateef Attar
2023-01-18 17:01 ` [PATCH v3 1/6] MdePkg: Adds AMD SMRAM save state map Abdul Lateef Attar
2023-01-19 4:05 ` Chang, Abner
2023-01-18 17:01 ` [PATCH v3 2/6] UefiCpuPkg: Adds SmmSmramSaveStateLib library class Abdul Lateef Attar
2023-01-19 4:05 ` Chang, Abner
2023-01-18 17:01 ` [PATCH v3 3/6] UefiCpuPkg: Implements " Abdul Lateef Attar
2023-01-19 3:44 ` Chang, Abner
2023-01-18 17:01 ` [PATCH v3 4/6] UefiCpuPkg/SmmCpuFeaturesLib: Restructure arch-dependent code Abdul Lateef Attar
2023-01-19 4:06 ` [edk2-devel] " Chang, Abner
2023-01-18 17:01 ` [PATCH v3 5/6] UefiCpuPkg: Initial implementation of AMD's SmmCpuFeaturesLib Abdul Lateef Attar
2023-01-19 4:08 ` Chang, Abner [this message]
2023-01-18 17:01 ` [PATCH v3 6/6] UefiCpuPkg: Implements SmmCpuFeaturesLib for AMD Family Abdul Lateef Attar
2023-01-19 4:10 ` Chang, Abner
2023-01-19 4:17 ` [PATCH v3 0/6] Adds AmdSmmCpuFeaturesLib " Chang, Abner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MN2PR12MB3966B0C1A815B93FBA632329EAC49@MN2PR12MB3966.namprd12.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox