mirror of https://github.com/acidanthera/audk.git
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:
parent
9b3ca509ab
commit
f8422f1e0b
|
@ -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,
|
||||
word, dword or qword operand is encoded at the end of the instruction's
|
||||
|
|
|
@ -184,6 +184,7 @@
|
|||
Ia32/DisableCache.nasm| GCC
|
||||
Ia32/RdRand.nasm
|
||||
Ia32/XGetBv.nasm
|
||||
Ia32/VmgExit.nasm
|
||||
|
||||
Ia32/DivS64x64Remainder.c
|
||||
Ia32/InternalSwitchStack.c | MSFT
|
||||
|
@ -317,6 +318,7 @@
|
|||
X64/DisablePaging64.nasm
|
||||
X64/RdRand.nasm
|
||||
X64/XGetBv.nasm
|
||||
X64/VmgExit.nasm
|
||||
ChkStkGcc.c | GCC
|
||||
|
||||
[Sources.EBC]
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue