Can we put this patch to downstream directly? Why it must be upstream?
> -----Original Message----- > From: Xu, Min M <min.m...@intel.com> > Sent: Tuesday, November 22, 2022 10:17 PM > To: devel@edk2.groups.io > Cc: Xu, Min M <min.m...@intel.com>; Dong, Eric <eric.d...@intel.com>; > Ni, Ray <ray...@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com>; Yao, Jiewen <jiewen....@intel.com>; > Huang, Yanbo <yanbo.hu...@intel.com> > Subject: [PATCH V1 1/1] UefiCpuPkg: Add back VmgExitLib to fix > downstream incompatibility issue > > From: Min M Xu <min.m...@intel.com> > > VmgExitLib is renamed as CcExitLib in commit a89f558d3c. This brought > incompatibility issues for platforms downstream. This patch adds back > VmgExitLib (VmgExitLib.h & VmgExitLibNull) to fix the issue this time > and we will work out the long term solution later. After the > incompatibility of downstream is resolved, this patch will be reverted. > > Cc: Eric Dong <eric.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Jiewen Yao <jiewen....@intel.com> > Cc: Huang Yanbo <yanbo.hu...@intel.com> > Signed-off-by: Min Xu <min.m...@intel.com> > --- > UefiCpuPkg/Include/Library/VmgExitLib.h | 173 ++++++++++++++++++ > .../Library/VmgExitLibNull/VmTdExitNull.c | 38 ++++ > .../Library/VmgExitLibNull/VmgExitLibNull.c | 165 +++++++++++++++++ > .../Library/VmgExitLibNull/VmgExitLibNull.inf | 28 +++ > .../Library/VmgExitLibNull/VmgExitLibNull.uni | 15 ++ > UefiCpuPkg/UefiCpuPkg.dec | 3 + > UefiCpuPkg/UefiCpuPkg.dsc | 2 + > 7 files changed, 424 insertions(+) > create mode 100644 UefiCpuPkg/Include/Library/VmgExitLib.h > create mode 100644 UefiCpuPkg/Library/VmgExitLibNull/VmTdExitNull.c > create mode 100644 UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c > create mode 100644 > UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > create mode 100644 > UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.uni > > diff --git a/UefiCpuPkg/Include/Library/VmgExitLib.h > b/UefiCpuPkg/Include/Library/VmgExitLib.h > new file mode 100644 > index 000000000000..9fab90afd226 > --- /dev/null > +++ b/UefiCpuPkg/Include/Library/VmgExitLib.h > @@ -0,0 +1,173 @@ > +/** @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> > + > +#define VE_EXCEPTION 20 > + > +/** > + 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. > + > + @retval 0 VMGEXIT succeeded. > + @return Exception number to be propagated, VMGEXIT > + processing did not succeed. > + > +**/ > +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 > + @param[in, out] InterruptState A pointer to hold the current interrupt > + state, used for restoring in VmgDone () > + > +**/ > +VOID > +EFIAPI > +VmgInit ( > + IN OUT GHCB *Ghcb, > + IN OUT BOOLEAN *InterruptState > + ); > + > +/** > + 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 > + @param[in] InterruptState An indicator to conditionally (re)enable > + interrupts > + > +**/ > +VOID > +EFIAPI > +VmgDone ( > + IN OUT GHCB *Ghcb, > + IN BOOLEAN InterruptState > + ); > + > +/** > + Marks a specified offset as valid in the GHCB. > + > + The ValidBitmap area represents the areas of the GHCB that have been > marked > + valid. Set the bit in ValidBitmap for the input offset. > + > + @param[in, out] Ghcb A pointer to the GHCB > + @param[in] Offset Qword offset in the GHCB to mark valid > + > +**/ > +VOID > +EFIAPI > +VmgSetOffsetValid ( > + IN OUT GHCB *Ghcb, > + IN GHCB_REGISTER Offset > + ); > + > +/** > + Checks if a specified offset is valid in the GHCB. > + > + The ValidBitmap area represents the areas of the GHCB that have been > marked > + valid. Return whether the bit in the ValidBitmap is set for the input > offset. > + > + @param[in] Ghcb A pointer to the GHCB > + @param[in] Offset Qword offset in the GHCB to mark valid > + > + @retval TRUE Offset is marked valid in the GHCB > + @retval FALSE Offset is not marked valid in the GHCB > + > +**/ > +BOOLEAN > +EFIAPI > +VmgIsOffsetValid ( > + IN GHCB *Ghcb, > + IN GHCB_REGISTER Offset > + ); > + > +/** > + 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 > + ); > + > +/** > + Handle a #VE exception. > + > + Performs the necessary processing to handle a #VE exception. > + > + The base library function returns an error equal to VE_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 #VE not supported, (new) exception > value to > + propagate provided > + @retval EFI_PROTOCOL_ERROR #VE handling failed, (new) exception > value to > + propagate provided > + > +**/ > +EFI_STATUS > +EFIAPI > +VmTdExitHandleVe ( > + IN OUT EFI_EXCEPTION_TYPE *ExceptionType, > + IN OUT EFI_SYSTEM_CONTEXT SystemContext > + ); > + > +#endif > diff --git a/UefiCpuPkg/Library/VmgExitLibNull/VmTdExitNull.c > b/UefiCpuPkg/Library/VmgExitLibNull/VmTdExitNull.c > new file mode 100644 > index 000000000000..6a4e8087cb89 > --- /dev/null > +++ b/UefiCpuPkg/Library/VmgExitLibNull/VmTdExitNull.c > @@ -0,0 +1,38 @@ > +/** @file > + > + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include <Base.h> > +#include <Uefi.h> > +#include <Library/VmgExitLib.h> > + > +/** > + Handle a #VE exception. > + > + Performs the necessary processing to handle a #VE exception. > + > + @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 #VE not supported, (new) exception > value to > + propagate provided > + @retval EFI_PROTOCOL_ERROR #VE handling failed, (new) exception > value to > + propagate provided > + > +**/ > +EFI_STATUS > +EFIAPI > +VmTdExitHandleVe ( > + IN OUT EFI_EXCEPTION_TYPE *ExceptionType, > + IN OUT EFI_SYSTEM_CONTEXT SystemContext > + ) > +{ > + *ExceptionType = VE_EXCEPTION; > + > + return EFI_UNSUPPORTED; > +} > diff --git a/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c > b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c > new file mode 100644 > index 000000000000..d661d8597434 > --- /dev/null > +++ b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.c > @@ -0,0 +1,165 @@ > +/** @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. > + > + @retval 0 VMGEXIT succeeded. > + @return Exception number to be propagated, VMGEXIT > + processing did not succeed. > + > +**/ > +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. > + > + @param[in, out] Ghcb A pointer to the GHCB > + @param[in, out] InterruptState A pointer to hold the current interrupt > + state, used for restoring in VmgDone () > + > +**/ > +VOID > +EFIAPI > +VmgInit ( > + IN OUT GHCB *Ghcb, > + IN OUT BOOLEAN *InterruptState > + ) > +{ > +} > + > +/** > + 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 > + @param[in] InterruptState An indicator to conditionally (re)enable > + interrupts > + > +**/ > +VOID > +EFIAPI > +VmgDone ( > + IN OUT GHCB *Ghcb, > + IN BOOLEAN InterruptState > + ) > +{ > +} > + > +/** > + Marks a field at the specified offset as valid in the GHCB. > + > + The ValidBitmap area represents the areas of the GHCB that have been > marked > + valid. Set the bit in ValidBitmap for the input offset. > + > + @param[in, out] Ghcb Pointer to the Guest-Hypervisor Communication > Block > + @param[in] Offset Qword offset in the GHCB to mark valid > + > +**/ > +VOID > +EFIAPI > +VmgSetOffsetValid ( > + IN OUT GHCB *Ghcb, > + IN GHCB_REGISTER Offset > + ) > +{ > +} > + > +/** > + Checks if a specified offset is valid in the GHCB. > + > + The ValidBitmap area represents the areas of the GHCB that have been > marked > + valid. Return whether the bit in the ValidBitmap is set for the input > offset. > + > + @param[in] Ghcb A pointer to the GHCB > + @param[in] Offset Qword offset in the GHCB to mark valid > + > + @retval TRUE Offset is marked valid in the GHCB > + @retval FALSE Offset is not marked valid in the GHCB > + > +**/ > +BOOLEAN > +EFIAPI > +VmgIsOffsetValid ( > + IN GHCB *Ghcb, > + IN GHCB_REGISTER Offset > + ) > +{ > + return FALSE; > +} > + > +/** > + 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.inf > b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > new file mode 100644 > index 000000000000..06d3b0e7e63e > --- /dev/null > +++ b/UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > @@ -0,0 +1,28 @@ > +## @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 = cbd1992f-c26e-42f9-94d9-57d0468c4c56 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = VmgExitLib > + > +[Sources.common] > + VmgExitLibNull.c > + VmTdExitNull.c > + > +[Packages] > + MdePkg/MdePkg.dec > + UefiCpuPkg/UefiCpuPkg.dec > + > +[LibraryClasses] > + BaseLib > + > 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." > + > diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec > index cff239d5283e..8058b679412f 100644 > --- a/UefiCpuPkg/UefiCpuPkg.dec > +++ b/UefiCpuPkg/UefiCpuPkg.dec > @@ -53,6 +53,9 @@ > ## > MpInitLib|Include/Library/MpInitLib.h > > + ## @libraryclass Provides function to support VMGEXIT processing. > + VmgExitLib|Include/Library/VmgExitLib.h > + > ## @libraryclass Provides function to support CcExit processing. > CcExitLib|Include/Library/CcExitLib.h > > diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc > index 67b0ce46e455..57c74ba844d2 100644 > --- a/UefiCpuPkg/UefiCpuPkg.dsc > +++ b/UefiCpuPkg/UefiCpuPkg.dsc > @@ -59,6 +59,7 @@ > > PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/Base > PeCoffGetEntryPointLib.inf > > PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BaseP > eCoffExtraActionLibNull.inf > > TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/T > pmMeasurementLibNull.inf > + VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf > MicrocodeLib|UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf > > SmmCpuRendezvousLib|UefiCpuPkg/Library/SmmCpuRendezvousLib/Smm > CpuRendezvousLib.inf > @@ -163,6 +164,7 @@ > UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf > UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf > > UefiCpuPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.inf > + UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf > UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf > UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf > UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf > -- > 2.29.2.windows.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#96555): https://edk2.groups.io/g/devel/message/96555 Mute This Topic: https://groups.io/mt/95195860/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-