audk/MdePkg/Library/BaseLib/X64/VmgExitSvsm.nasm

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

95 lines
2.1 KiB
NASM
Raw Normal View History

;------------------------------------------------------------------------------
;
; Copyright (C) 2024, Advanced Micro Devices, Inc. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
; Module Name:
;
; VmgExitSvsm.Asm
;
; Abstract:
;
; AsmVmgExitSvsm function
;
; Notes:
;
;------------------------------------------------------------------------------
DEFAULT REL
SECTION .text
;------------------------------------------------------------------------------
; typedef struct {
; VOID *Caa;
; UINT64 RaxIn;
; UINT64 RcxIn;
; UINT64 RdxIn;
; UINT64 R8In;
; UINT64 R9In;
; UINT64 RaxOut;
; UINT64 RcxOut;
; UINT64 RdxOut;
; UINT64 R8Out;
; UINT64 R9Out;
; UINT8 *CallPending;
; } SVSM_CALL_DATA;
;
; UINT32
; EFIAPI
; AsmVmgExitSvsm (
; SVSM_CALL_DATA *SvsmCallData
; );
;------------------------------------------------------------------------------
global ASM_PFX(AsmVmgExitSvsm)
ASM_PFX(AsmVmgExitSvsm):
push r10
push r11
push r12
;
; Calling convention has SvsmCallData in RCX. Move RCX to R12 in order to
; properly populate the SVSM register state.
;
mov r12, rcx
mov rax, [r12 + 8]
mov rcx, [r12 + 16]
mov rdx, [r12 + 24]
mov r8, [r12 + 32]
mov r9, [r12 + 40]
;
; Set CA call pending
;
mov r10, [r12]
mov byte [r10], 1
rep vmmcall
mov [r12 + 48], rax
mov [r12 + 56], rcx
mov [r12 + 64], rdx
mov [r12 + 72], r8
mov [r12 + 80], r9
;
; Perform the atomic exchange and return the CA call pending value.
; The call pending value is a one-byte field at offset 0 into the CA,
; which is currently the value in R10.
;
mov r11, [r12 + 88] ; Get CallPending address
mov cl, byte [r11]
xchg byte [r10], cl
mov byte [r11], cl ; Return the exchanged value
pop r12
pop r11
pop r10
;
; RAX has the value to be returned from the SVSM
;
ret