[edk2-devel] [PATCH v9 08/46] UefiCpuPkg: Implement library support for VMGEXIT

Dong, Eric eric.dong at intel.com
Fri Jun 12 00:56:35 UTC 2020


Reviewed-by: Eric Dong <eric.dong at intel.com>

Thanks,
Eric
> -----Original Message-----
> From: Tom Lendacky <thomas.lendacky at amd.com>
> Sent: Friday, June 5, 2020 9:27 PM
> To: devel at edk2.groups.io
> Cc: Brijesh Singh <brijesh.singh at amd.com>; Ard Biesheuvel
> <ard.biesheuvel at arm.com>; Dong, Eric <eric.dong at intel.com>; Justen,
> Jordan L <jordan.l.justen at intel.com>; Laszlo Ersek <lersek at redhat.com>;
> Gao, Liming <liming.gao at intel.com>; Kinney, Michael D
> <michael.d.kinney at intel.com>; Ni, Ray <ray.ni at 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.dong at intel.com>
> Cc: Ray Ni <ray.ni at intel.com>
> Cc: Laszlo Ersek <lersek at redhat.com>
> Signed-off-by: Tom Lendacky <thomas.lendacky at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list