]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c
OvmfPkg/VmgExitLib: Implement library support for VmgExitLib in OVMF
[mirror_edk2.git] / OvmfPkg / Library / VmgExitLib / VmgExitVcHandler.c
CommitLineData
61bacc0f
TL
1/** @file\r
2 X64 #VC Exception Handler functon.\r
3\r
4 Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include <Base.h>\r
10#include <Uefi.h>\r
11#include <Library/BaseMemoryLib.h>\r
12#include <Library/VmgExitLib.h>\r
13#include <Register/Amd/Msr.h>\r
14\r
15/**\r
16 Handle a #VC exception.\r
17\r
18 Performs the necessary processing to handle a #VC exception.\r
19\r
20 @param[in, out] ExceptionType Pointer to an EFI_EXCEPTION_TYPE to be set\r
21 as value to use on error.\r
22 @param[in, out] SystemContext Pointer to EFI_SYSTEM_CONTEXT\r
23\r
24 @retval EFI_SUCCESS Exception handled\r
25 @retval EFI_UNSUPPORTED #VC not supported, (new) exception value to\r
26 propagate provided\r
27 @retval EFI_PROTOCOL_ERROR #VC handling failed, (new) exception value to\r
28 propagate provided\r
29\r
30**/\r
31EFI_STATUS\r
32EFIAPI\r
33VmgExitHandleVc (\r
34 IN OUT EFI_EXCEPTION_TYPE *ExceptionType,\r
35 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
36 )\r
37{\r
38 MSR_SEV_ES_GHCB_REGISTER Msr;\r
39 EFI_SYSTEM_CONTEXT_X64 *Regs;\r
40 GHCB *Ghcb;\r
41 UINT64 ExitCode, Status;\r
42 EFI_STATUS VcRet;\r
43\r
44 VcRet = EFI_SUCCESS;\r
45\r
46 Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);\r
47 ASSERT (Msr.GhcbInfo.Function == 0);\r
48 ASSERT (Msr.Ghcb != 0);\r
49\r
50 Regs = SystemContext.SystemContextX64;\r
51 Ghcb = Msr.Ghcb;\r
52\r
53 VmgInit (Ghcb);\r
54\r
55 ExitCode = Regs->ExceptionData;\r
56 switch (ExitCode) {\r
57 default:\r
58 Status = VmgExit (Ghcb, SVM_EXIT_UNSUPPORTED, ExitCode, 0);\r
59 if (Status == 0) {\r
60 Regs->ExceptionData = 0;\r
61 *ExceptionType = GP_EXCEPTION;\r
62 } else {\r
63 GHCB_EVENT_INJECTION Event;\r
64\r
65 Event.Uint64 = Status;\r
66 if (Event.Elements.ErrorCodeValid != 0) {\r
67 Regs->ExceptionData = Event.Elements.ErrorCode;\r
68 } else {\r
69 Regs->ExceptionData = 0;\r
70 }\r
71\r
72 *ExceptionType = Event.Elements.Vector;\r
73 }\r
74\r
75 VcRet = EFI_PROTOCOL_ERROR;\r
76 }\r
77\r
78 VmgDone (Ghcb);\r
79\r
80 return VcRet;\r
81}\r