On 05/22/20 16:48, Laszlo Ersek wrote: > On 05/19/20 23:50, Lendacky, Thomas wrote: >> 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.jus...@intel.com> >> Cc: Laszlo Ersek <ler...@redhat.com> >> Cc: Ard Biesheuvel <ard.biesheu...@arm.com> >> Signed-off-by: Tom Lendacky <thomas.lenda...@amd.com> >> --- >> .../Library/VmgExitLib/X64/VmgExitVcHandler.c | 48 +++++++++++++++++++ >> 1 file changed, 48 insertions(+) >> >> diff --git a/OvmfPkg/Library/VmgExitLib/X64/VmgExitVcHandler.c >> b/OvmfPkg/Library/VmgExitLib/X64/VmgExitVcHandler.c >> index 0b7f24fd962c..bf1555234d69 100644 >> --- a/OvmfPkg/Library/VmgExitLib/X64/VmgExitVcHandler.c >> +++ b/OvmfPkg/Library/VmgExitLib/X64/VmgExitVcHandler.c >> @@ -875,6 +875,50 @@ WbinvdExit ( >> return 0; >> } >> >> +/** >> + Handle a VMMCALL event. >> + >> + Use the VMGEXIT instruction to handle either a VMMCALL event.
(2) pls drop the word "either". Thanks Laszlo >> + >> + @param[in, out] Ghcb Pointer to the Guest-Hypervisor >> Communication >> + Block >> + @param[in, out] Regs x64 processor context >> + @param[in] InstructionData Instruction parsing context >> + >> + @retval 0 Event handled successfully >> + @retval Others New exception value to propagate >> + >> +**/ >> +STATIC >> +UINT64 >> +VmmCallExit ( >> + IN OUT GHCB *Ghcb, >> + IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, >> + IN SEV_ES_INSTRUCTION_DATA *InstructionData >> + ) >> +{ >> + UINT64 Status; >> + >> + DecodeModRm (Regs, InstructionData); >> + >> + Ghcb->SaveArea.Rax = Regs->Rax; >> + GhcbSetRegValid (Ghcb, GhcbRax); >> + Ghcb->SaveArea.Cpl = (UINT8) (Regs->Cs & 0x3); >> + GhcbSetRegValid (Ghcb, GhcbCpl); >> + >> + Status = VmgExit (Ghcb, SVM_EXIT_VMMCALL, 0, 0); >> + if (Status) { > > (1) Please write (Status > 0) or (Status != 0). > > Acked-by: Laszlo Ersek <ler...@redhat.com> > > Thanks > Laszlo > >> + return Status; >> + } >> + >> + if (!GhcbIsRegValid (Ghcb, GhcbRax)) { >> + return UnsupportedExit (Ghcb, Regs, InstructionData); >> + } >> + Regs->Rax = Ghcb->SaveArea.Rax; >> + >> + return 0; >> +} >> + >> /** >> Handle an MSR event. >> >> @@ -1395,6 +1439,10 @@ VmgExitHandleVc ( >> NaeExit = MsrExit; >> break; >> >> + case SVM_EXIT_VMMCALL: >> + NaeExit = VmmCallExit; >> + break; >> + >> case SVM_EXIT_WBINVD: >> NaeExit = WbinvdExit; >> break; >> > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#60151): https://edk2.groups.io/g/devel/message/60151 Mute This Topic: https://groups.io/mt/74336577/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-