MdePkg/BaseLib: Add support for the VMGEXIT instruction

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

VMGEXIT is a new instruction used for Hypervisor/Guest communication when
running as an SEV-ES guest. A VMGEXIT will cause an automatic exit (AE)
to occur, resulting in a #VMEXIT with an exit code value of 0x403.

Since SEV-ES is only supported in X64, provide the necessary X64 support
to execute the VMGEXIT instruction, which is coded as "rep vmmcall". For
IA32, since "vmmcall" is not supported in NASM 32-bit mode and VMGEXIT
should never be called, provide a stub implementation that is identical
to CpuBreakpoint().

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Tom Lendacky 2020-08-12 15:21:35 -05:00 committed by mergify[bot]
parent 9b3ca509ab
commit f8422f1e0b
4 changed files with 86 additions and 0 deletions

View File

@ -7848,6 +7848,20 @@ AsmXGetBv (
); );
/**
Executes a VMGEXIT instruction (VMMCALL with a REP prefix)
Executes a VMGEXIT instruction. This function is only available on IA-32 and
x64.
**/
VOID
EFIAPI
AsmVmgExit (
VOID
);
/** /**
Patch the immediate operand of an IA32 or X64 instruction such that the byte, Patch the immediate operand of an IA32 or X64 instruction such that the byte,
word, dword or qword operand is encoded at the end of the instruction's word, dword or qword operand is encoded at the end of the instruction's

View File

@ -184,6 +184,7 @@
Ia32/DisableCache.nasm| GCC Ia32/DisableCache.nasm| GCC
Ia32/RdRand.nasm Ia32/RdRand.nasm
Ia32/XGetBv.nasm Ia32/XGetBv.nasm
Ia32/VmgExit.nasm
Ia32/DivS64x64Remainder.c Ia32/DivS64x64Remainder.c
Ia32/InternalSwitchStack.c | MSFT Ia32/InternalSwitchStack.c | MSFT
@ -317,6 +318,7 @@
X64/DisablePaging64.nasm X64/DisablePaging64.nasm
X64/RdRand.nasm X64/RdRand.nasm
X64/XGetBv.nasm X64/XGetBv.nasm
X64/VmgExit.nasm
ChkStkGcc.c | GCC ChkStkGcc.c | GCC
[Sources.EBC] [Sources.EBC]

View File

@ -0,0 +1,38 @@
;------------------------------------------------------------------------------
;
; Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
; Module Name:
;
; VmgExit.Asm
;
; Abstract:
;
; AsmVmgExit function
;
; Notes:
;
;------------------------------------------------------------------------------
SECTION .text
;------------------------------------------------------------------------------
; VOID
; EFIAPI
; AsmVmgExit (
; VOID
; );
;------------------------------------------------------------------------------
global ASM_PFX(AsmVmgExit)
ASM_PFX(AsmVmgExit):
;
; NASM doesn't support the vmmcall instruction in 32-bit mode and NASM versions
; before 2.12 cannot translate the 64-bit "rep vmmcall" instruction into elf32
; format. Given that VMGEXIT does not make sense on IA32, provide a stub
; implementation that is identical to CpuBreakpoint(). In practice, AsmVmgExit()
; should never be called on IA32.
;
int 3
ret

View File

@ -0,0 +1,32 @@
;------------------------------------------------------------------------------
;
; Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
; Module Name:
;
; VmgExit.Asm
;
; Abstract:
;
; AsmVmgExit function
;
; Notes:
;
;------------------------------------------------------------------------------
DEFAULT REL
SECTION .text
;------------------------------------------------------------------------------
; VOID
; EFIAPI
; AsmVmgExit (
; VOID
; );
;------------------------------------------------------------------------------
global ASM_PFX(AsmVmgExit)
ASM_PFX(AsmVmgExit):
rep vmmcall
ret