1 /** @file
2   Public header file for the VMGEXIT Support library class.
3 
4   This library class defines some routines used when invoking the VMGEXIT
5   instruction in support of SEV-ES and to handle #VC exceptions.
6 
7   Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>
8   SPDX-License-Identifier: BSD-2-Clause-Patent
9 
10 **/
11 
12 #ifndef __VMG_EXIT_LIB_H__
13 #define __VMG_EXIT_LIB_H__
14 
15 #include <Protocol/DebugSupport.h>
16 #include <Register/Amd/Ghcb.h>
17 
18 
19 /**
20   Perform VMGEXIT.
21 
22   Sets the necessary fields of the GHCB, invokes the VMGEXIT instruction and
23   then handles the return actions.
24 
25   @param[in, out]  Ghcb       A pointer to the GHCB
26   @param[in]       ExitCode   VMGEXIT code to be assigned to the SwExitCode
27                               field of the GHCB.
28   @param[in]       ExitInfo1  VMGEXIT information to be assigned to the
29                               SwExitInfo1 field of the GHCB.
30   @param[in]       ExitInfo2  VMGEXIT information to be assigned to the
31                               SwExitInfo2 field of the GHCB.
32 
33   @retval  0                  VMGEXIT succeeded.
34   @return                     Exception number to be propagated, VMGEXIT
35                               processing did not succeed.
36 
37 **/
38 UINT64
39 EFIAPI
40 VmgExit (
41   IN OUT GHCB                *Ghcb,
42   IN     UINT64              ExitCode,
43   IN     UINT64              ExitInfo1,
44   IN     UINT64              ExitInfo2
45   );
46 
47 /**
48   Perform pre-VMGEXIT initialization/preparation.
49 
50   Performs the necessary steps in preparation for invoking VMGEXIT. Must be
51   called before setting any fields within the GHCB.
52 
53   @param[in, out]  Ghcb       A pointer to the GHCB
54 
55 **/
56 VOID
57 EFIAPI
58 VmgInit (
59   IN OUT GHCB                *Ghcb
60   );
61 
62 /**
63   Perform post-VMGEXIT cleanup.
64 
65   Performs the necessary steps to cleanup after invoking VMGEXIT. Must be
66   called after obtaining needed fields within the GHCB.
67 
68   @param[in, out]  Ghcb       A pointer to the GHCB
69 
70 **/
71 VOID
72 EFIAPI
73 VmgDone (
74   IN OUT GHCB                *Ghcb
75   );
76 
77 /**
78   Handle a #VC exception.
79 
80   Performs the necessary processing to handle a #VC exception.
81 
82   The base library function returns an error equal to VC_EXCEPTION,
83   to be propagated to the standard exception handling stack.
84 
85   @param[in, out]  ExceptionType  Pointer to an EFI_EXCEPTION_TYPE to be set
86                                   as value to use on error.
87   @param[in, out]  SystemContext  Pointer to EFI_SYSTEM_CONTEXT
88 
89   @retval  EFI_SUCCESS            Exception handled
90   @retval  EFI_UNSUPPORTED        #VC not supported, (new) exception value to
91                                   propagate provided
92   @retval  EFI_PROTOCOL_ERROR     #VC handling failed, (new) exception value to
93                                   propagate provided
94 
95 **/
96 EFI_STATUS
97 EFIAPI
98 VmgExitHandleVc (
99   IN OUT EFI_EXCEPTION_TYPE  *ExceptionType,
100   IN OUT EFI_SYSTEM_CONTEXT  SystemContext
101   );
102 
103 #endif
104