mirror of https://github.com/acidanthera/audk.git
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@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
parent
f8422f1e0b
commit
8714978781
|
@ -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.
|
||||
|
||||
@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
|
||||
|
||||
**/
|
||||
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
|
|
@ -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.
|
||||
|
||||
@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.
|
||||
|
||||
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;
|
||||
}
|
|
@ -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
|
||||
|
|
@ -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."
|
||||
|
|
@ -53,6 +53,9 @@
|
|||
##
|
||||
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 }}
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
|
||||
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
|
||||
TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
|
||||
VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf
|
||||
|
||||
[LibraryClasses.common.SEC]
|
||||
PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf
|
||||
|
@ -143,6 +144,7 @@
|
|||
UefiCpuPkg/Library/SmmCpuPlatformHookLibNull/SmmCpuPlatformHookLibNull.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
|
||||
|
|
Loading…
Reference in New Issue