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
|
MpInitLib|Include/Library/MpInitLib.h
|
||||||
|
|
||||||
|
## @libraryclass Provides function to support VMGEXIT processing.
|
||||||
|
VmgExitLib|Include/Library/VmgExitLib.h
|
||||||
|
|
||||||
[Guids]
|
[Guids]
|
||||||
gUefiCpuPkgTokenSpaceGuid = { 0xac05bf33, 0x995a, 0x4ed4, { 0xaa, 0xb8, 0xef, 0x7a, 0xe8, 0xf, 0x5c, 0xb0 }}
|
gUefiCpuPkgTokenSpaceGuid = { 0xac05bf33, 0x995a, 0x4ed4, { 0xaa, 0xb8, 0xef, 0x7a, 0xe8, 0xf, 0x5c, 0xb0 }}
|
||||||
gMsegSmramGuid = { 0x5802bce4, 0xeeee, 0x4e33, { 0xa1, 0x30, 0xeb, 0xad, 0x27, 0xf0, 0xe4, 0x39 }}
|
gMsegSmramGuid = { 0x5802bce4, 0xeeee, 0x4e33, { 0xa1, 0x30, 0xeb, 0xad, 0x27, 0xf0, 0xe4, 0x39 }}
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
|
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
|
||||||
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
|
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
|
||||||
TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
|
TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
|
||||||
|
VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf
|
||||||
|
|
||||||
[LibraryClasses.common.SEC]
|
[LibraryClasses.common.SEC]
|
||||||
PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf
|
PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf
|
||||||
|
@ -143,6 +144,7 @@
|
||||||
UefiCpuPkg/Library/SmmCpuPlatformHookLibNull/SmmCpuPlatformHookLibNull.inf
|
UefiCpuPkg/Library/SmmCpuPlatformHookLibNull/SmmCpuPlatformHookLibNull.inf
|
||||||
UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf
|
UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf
|
||||||
UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf
|
UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf
|
||||||
|
UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf
|
||||||
UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
|
UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf
|
||||||
UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
|
UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf
|
||||||
UefiCpuPkg/SecCore/SecCore.inf
|
UefiCpuPkg/SecCore/SecCore.inf
|
||||||
|
|
Loading…
Reference in New Issue