Reviewed-by: Eric Dong <eric.d...@intel.com> Thanks, Eric > -----Original Message----- > From: Tom Lendacky <thomas.lenda...@amd.com> > Sent: Friday, June 5, 2020 9:27 PM > To: devel@edk2.groups.io > Cc: Brijesh Singh <brijesh.si...@amd.com>; Ard Biesheuvel > <ard.biesheu...@arm.com>; Dong, Eric <eric.d...@intel.com>; Justen, > Jordan L <jordan.l.jus...@intel.com>; Laszlo Ersek <ler...@redhat.com>; > Gao, Liming <liming....@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com>; Ni, Ray <ray...@intel.com> > Subject: [PATCH v9 08/46] UefiCpuPkg: Implement library support for > VMGEXIT > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198 > > To support handling #VC exceptions and issuing VMGEXIT instructions, > create a library with functions that can be used to perform these > #VC/VMGEXIT related operations. This includes functions for: > - Handling #VC exceptions > - Preparing for and issuing a VMGEXIT > - Performing MMIO-related write operations to support flash emulation > - Performing AP related boot opeations > > The base functions in this driver will not do anything and will return > an error if a return value is required. It is expected that other packages > (like OvmfPkg) will create a version of the library to fully support an > SEV-ES guest. > > Cc: Eric Dong <eric.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Laszlo Ersek <ler...@redhat.com> > Signed-off-by: Tom Lendacky <thomas.lenda...@amd.com> > --- > UefiCpuPkg/UefiCpuPkg.dec | 3 + > UefiCpuPkg/UefiCpuPkg.dsc | 2 + > UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf | 27 +++++ > UefiCpuPkg/Include/Library/VmgExitLib.h | 103 +++++++++++++++++ > UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c | 121 > ++++++++++++++++++++ > UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.uni | 15 +++ > 6 files changed, 271 insertions(+) > > diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec > index df5d02bae6b4..cb92f34b6f55 100644 > --- a/UefiCpuPkg/UefiCpuPkg.dec > +++ b/UefiCpuPkg/UefiCpuPkg.dec > @@ -53,6 +53,9 @@ [LibraryClasses.IA32, LibraryClasses.X64] > ## > > MpInitLib|Include/Library/MpInitLib.h > > > > + ## @libraryclass Provides function to support VMGEXIT processing. > > + VmgExitLib|Include/Library/VmgExitLib.h > > + > > [Guids] > > gUefiCpuPkgTokenSpaceGuid = { 0xac05bf33, 0x995a, 0x4ed4, { 0xaa, > 0xb8, 0xef, 0x7a, 0xe8, 0xf, 0x5c, 0xb0 }} > > gMsegSmramGuid = { 0x5802bce4, 0xeeee, 0x4e33, { 0xa1, > 0x30, > 0xeb, 0xad, 0x27, 0xf0, 0xe4, 0x39 }} > > diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc > index afa304128221..f0e58b90ff0a 100644 > --- a/UefiCpuPkg/UefiCpuPkg.dsc > +++ b/UefiCpuPkg/UefiCpuPkg.dsc > @@ -56,6 +56,7 @@ [LibraryClasses] > > PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/Base > PeCoffGetEntryPointLib.inf > > > PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BaseP > eCoffExtraActionLibNull.inf > > > TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/Tp > mMeasurementLibNull.inf > > + VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > > > > [LibraryClasses.common.SEC] > > > PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.i > nf > > @@ -143,6 +144,7 @@ [Components.IA32, Components.X64] > > UefiCpuPkg/Library/SmmCpuPlatformHookLibNull/SmmCpuPlatformHookLib > Null.inf > > UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > > UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf > > + UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > > UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf > > UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf > > UefiCpuPkg/SecCore/SecCore.inf > > diff --git a/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > new file mode 100644 > index 000000000000..d8770a21c355 > --- /dev/null > +++ b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > @@ -0,0 +1,27 @@ > +## @file > > +# VMGEXIT Support Library. > > +# > > +# Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > +# > > +## > > + > > +[Defines] > > + INF_VERSION = 0x00010005 > > + BASE_NAME = VmgExitLibNull > > + MODULE_UNI_FILE = VmgExitLibNull.uni > > + FILE_GUID = 3cd7368f-ef9b-4a9b-9571-2ed93813677e > > + MODULE_TYPE = BASE > > + VERSION_STRING = 1.0 > > + LIBRARY_CLASS = VmgExitLib > > + > > +[Sources.common] > > + VmgExitLibNull.c > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + UefiCpuPkg/UefiCpuPkg.dec > > + > > +[LibraryClasses] > > + BaseLib > > + > > diff --git a/UefiCpuPkg/Include/Library/VmgExitLib.h > b/UefiCpuPkg/Include/Library/VmgExitLib.h > new file mode 100644 > index 000000000000..0b2f39026a4a > --- /dev/null > +++ b/UefiCpuPkg/Include/Library/VmgExitLib.h > @@ -0,0 +1,103 @@ > +/** @file > > + Public header file for the VMGEXIT Support library class. > > + > > + This library class defines some routines used when invoking the VMGEXIT > > + instruction in support of SEV-ES and to handle #VC exceptions. > > + > > + Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#ifndef __VMG_EXIT_LIB_H__ > > +#define __VMG_EXIT_LIB_H__ > > + > > +#include <Protocol/DebugSupport.h> > > +#include <Register/Amd/Ghcb.h> > > + > > + > > +/** > > + Perform VMGEXIT. > > + > > + Sets the necessary fields of the GHCB, invokes the VMGEXIT instruction > and > > + then handles the return actions. > > + > > + @param[in, out] Ghcb A pointer to the GHCB > > + @param[in] ExitCode VMGEXIT code to be assigned to the SwExitCode > > + field of the GHCB. > > + @param[in] ExitInfo1 VMGEXIT information to be assigned to the > > + SwExitInfo1 field of the GHCB. > > + @param[in] ExitInfo2 VMGEXIT information to be assigned to the > > + SwExitInfo2 field of the GHCB. > > + > > + @return 0 VMGEXIT succeeded. > > + @return Others VMGEXIT processing did not succeed. Exception > > + number to be propagated. > > + > > +**/ > > +UINT64 > > +EFIAPI > > +VmgExit ( > > + IN OUT GHCB *Ghcb, > > + IN UINT64 ExitCode, > > + IN UINT64 ExitInfo1, > > + IN UINT64 ExitInfo2 > > + ); > > + > > +/** > > + Perform pre-VMGEXIT initialization/preparation. > > + > > + Performs the necessary steps in preparation for invoking VMGEXIT. Must > be > > + called before setting any fields within the GHCB. > > + > > + @param[in, out] Ghcb A pointer to the GHCB > > + > > +**/ > > +VOID > > +EFIAPI > > +VmgInit ( > > + IN OUT GHCB *Ghcb > > + ); > > + > > +/** > > + Perform post-VMGEXIT cleanup. > > + > > + Performs the necessary steps to cleanup after invoking VMGEXIT. Must be > > + called after obtaining needed fields within the GHCB. > > + > > + @param[in, out] Ghcb A pointer to the GHCB > > + > > +**/ > > +VOID > > +EFIAPI > > +VmgDone ( > > + IN OUT GHCB *Ghcb > > + ); > > + > > +/** > > + Handle a #VC exception. > > + > > + Performs the necessary processing to handle a #VC exception. > > + > > + The base library function returns an error equal to VC_EXCEPTION, > > + to be propagated to the standard exception handling stack. > > + > > + @param[in, out] ExceptionType Pointer to an EFI_EXCEPTION_TYPE to be > set > > + as value to use on error. > > + @param[in, out] SystemContext Pointer to EFI_SYSTEM_CONTEXT > > + > > + @retval EFI_SUCCESS Exception handled > > + @retval EFI_UNSUPPORTED #VC not supported, (new) exception > value to > > + propagate provided > > + @retval EFI_PROTOCOL_ERROR #VC handling failed, (new) exception > value to > > + propagate provided > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +VmgExitHandleVc ( > > + IN OUT EFI_EXCEPTION_TYPE *ExceptionType, > > + IN OUT EFI_SYSTEM_CONTEXT SystemContext > > + ); > > + > > +#endif > > diff --git a/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c > b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c > new file mode 100644 > index 000000000000..30a239df298e > --- /dev/null > +++ b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c > @@ -0,0 +1,121 @@ > +/** @file > > + VMGEXIT Base Support Library. > > + > > + Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#include <Base.h> > > +#include <Uefi.h> > > +#include <Library/VmgExitLib.h> > > + > > +/** > > + Perform VMGEXIT. > > + > > + Sets the necessary fields of the GHCB, invokes the VMGEXIT instruction > and > > + then handles the return actions. > > + > > + The base library function returns an error in the form of a > > + GHCB_EVENT_INJECTION representing a GP_EXCEPTION. > > + > > + @param[in, out] Ghcb A pointer to the GHCB > > + @param[in] ExitCode VMGEXIT code to be assigned to the SwExitCode > > + field of the GHCB. > > + @param[in] ExitInfo1 VMGEXIT information to be assigned to the > > + SwExitInfo1 field of the GHCB. > > + @param[in] ExitInfo2 VMGEXIT information to be assigned to the > > + SwExitInfo2 field of the GHCB. > > + > > + @return 0 VMGEXIT succeeded. > > + @return Others VMGEXIT processing did not succeed. Exception > > + event to be propagated. > > + > > +**/ > > +UINT64 > > +EFIAPI > > +VmgExit ( > > + IN OUT GHCB *Ghcb, > > + IN UINT64 ExitCode, > > + IN UINT64 ExitInfo1, > > + IN UINT64 ExitInfo2 > > + ) > > +{ > > + GHCB_EVENT_INJECTION Event; > > + > > + Event.Uint64 = 0; > > + Event.Elements.Vector = GP_EXCEPTION; > > + Event.Elements.Type = GHCB_EVENT_INJECTION_TYPE_EXCEPTION; > > + Event.Elements.Valid = 1; > > + > > + return Event.Uint64; > > +} > > + > > +/** > > + Perform pre-VMGEXIT initialization/preparation. > > + > > + Performs the necessary steps in preparation for invoking VMGEXIT. Must > be > > + called before setting any fields within the GHCB. > > + > > + The base library function does nothing. > > + > > + @param[in, out] Ghcb A pointer to the GHCB > > + > > +**/ > > +VOID > > +EFIAPI > > +VmgInit ( > > + IN OUT GHCB *Ghcb > > + ) > > +{ > > +} > > + > > +/** > > + Perform post-VMGEXIT cleanup. > > + > > + Performs the necessary steps to cleanup after invoking VMGEXIT. Must be > > + called after obtaining needed fields within the GHCB. > > + > > + The base library function does nothing. > > + > > + @param[in, out] Ghcb A pointer to the GHCB > > + > > +**/ > > +VOID > > +EFIAPI > > +VmgDone ( > > + IN OUT GHCB *Ghcb > > + ) > > +{ > > +} > > + > > +/** > > + Handle a #VC exception. > > + > > + Performs the necessary processing to handle a #VC exception. > > + > > + The base library function returns an error equal to VC_EXCEPTION, > > + to be propagated to the standard exception handling stack. > > + > > + @param[in, out] ExceptionType Pointer to an EFI_EXCEPTION_TYPE to be > set > > + as value to use on error. > > + @param[in, out] SystemContext Pointer to EFI_SYSTEM_CONTEXT > > + > > + @retval EFI_SUCCESS Exception handled > > + @retval EFI_UNSUPPORTED #VC not supported, (new) exception > value to > > + propagate provided > > + @retval EFI_PROTOCOL_ERROR #VC handling failed, (new) exception > value to > > + propagate provided > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +VmgExitHandleVc ( > > + IN OUT EFI_EXCEPTION_TYPE *ExceptionType, > > + IN OUT EFI_SYSTEM_CONTEXT SystemContext > > + ) > > +{ > > + *ExceptionType = VC_EXCEPTION; > > + > > + return EFI_UNSUPPORTED; > > +} > > diff --git a/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.uni > b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.uni > new file mode 100644 > index 000000000000..8639bc0e8ce9 > --- /dev/null > +++ b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.uni > @@ -0,0 +1,15 @@ > +// /** @file > > +// VMGEXIT support library instance. > > +// > > +// VMGEXIT support library instance. > > +// > > +// Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> > > +// SPDX-License-Identifier: BSD-2-Clause-Patent > > +// > > +// **/ > > + > > + > > +#string STR_MODULE_ABSTRACT #language en-US "VMGEXIT support > NULL library instance" > > + > > +#string STR_MODULE_DESCRIPTION #language en-US "VMGEXIT > support NULL library instance." > > + > > -- > 2.27.0
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#61179): https://edk2.groups.io/g/devel/message/61179 Mute This Topic: https://groups.io/mt/74692413/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-