| /** @file | |
| Public header file for the CcExitLib. | |
| This library class defines some routines used for below CcExit handler. | |
| - Invoking the VMGEXIT instruction in support of SEV-ES and to handle | |
| #VC exceptions. | |
| - Handle #VE exception in TDX. | |
| Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> | |
| Copyright (c) 2020 - 2022, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef CC_EXIT_LIB_H_ | |
| #define CC_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 | |
| CcExitVmgExit ( | |
| 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 CcExitVmgDone () | |
| **/ | |
| VOID | |
| EFIAPI | |
| CcExitVmgInit ( | |
| 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 | |
| CcExitVmgDone ( | |
| 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 | |
| CcExitVmgSetOffsetValid ( | |
| 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 | |
| CcExitVmgIsOffsetValid ( | |
| 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 | |
| CcExitHandleVc ( | |
| 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 | |
| CcExitHandleVe ( | |
| IN OUT EFI_EXCEPTION_TYPE *ExceptionType, | |
| IN OUT EFI_SYSTEM_CONTEXT SystemContext | |
| ); | |
| #endif |