]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/VmgExitLib: Add support for VMMCALL NAE events
authorTom Lendacky <thomas.lendacky@amd.com>
Wed, 12 Aug 2020 20:21:38 +0000 (15:21 -0500)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 17 Aug 2020 02:46:39 +0000 (02:46 +0000)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

Under SEV-ES, a VMMCALL intercept generates a #VC exception. VMGEXIT must
be used to allow the hypervisor to handle this intercept.

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c

index ddaa19c7bcb41c3f6aefce25c9d750b24298e022..dbea9c1f6afff6530f29ac6cee9ed9ea5091579d 100644 (file)
@@ -883,6 +883,50 @@ WbinvdExit (
   return VmgExit (Ghcb, SVM_EXIT_WBINVD, 0, 0);\r
 }\r
 \r
+/**\r
+  Handle a VMMCALL event.\r
+\r
+  Use the VMGEXIT instruction to handle a VMMCALL event.\r
+\r
+  @param[in, out] Ghcb             Pointer to the Guest-Hypervisor Communication\r
+                                   Block\r
+  @param[in, out] Regs             x64 processor context\r
+  @param[in]      InstructionData  Instruction parsing context\r
+\r
+  @retval 0                        Event handled successfully\r
+  @return                          New exception value to propagate\r
+\r
+**/\r
+STATIC\r
+UINT64\r
+VmmCallExit (\r
+  IN OUT GHCB                     *Ghcb,\r
+  IN OUT EFI_SYSTEM_CONTEXT_X64   *Regs,\r
+  IN     SEV_ES_INSTRUCTION_DATA  *InstructionData\r
+  )\r
+{\r
+  UINT64  Status;\r
+\r
+  DecodeModRm (Regs, InstructionData);\r
+\r
+  Ghcb->SaveArea.Rax = Regs->Rax;\r
+  GhcbSetRegValid (Ghcb, GhcbRax);\r
+  Ghcb->SaveArea.Cpl = (UINT8) (Regs->Cs & 0x3);\r
+  GhcbSetRegValid (Ghcb, GhcbCpl);\r
+\r
+  Status = VmgExit (Ghcb, SVM_EXIT_VMMCALL, 0, 0);\r
+  if (Status != 0) {\r
+    return Status;\r
+  }\r
+\r
+  if (!GhcbIsRegValid (Ghcb, GhcbRax)) {\r
+    return UnsupportedExit (Ghcb, Regs, InstructionData);\r
+  }\r
+  Regs->Rax = Ghcb->SaveArea.Rax;\r
+\r
+  return 0;\r
+}\r
+\r
 /**\r
   Handle an MSR event.\r
 \r
@@ -1397,6 +1441,10 @@ VmgExitHandleVc (
     NaeExit = MsrExit;\r
     break;\r
 \r
+  case SVM_EXIT_VMMCALL:\r
+    NaeExit = VmmCallExit;\r
+    break;\r
+\r
   case SVM_EXIT_WBINVD:\r
     NaeExit = WbinvdExit;\r
     break;\r