blob: e8a094b0eb3f451f57088d4b8a425d7c9cac6c44 [file] [log] [blame]
;------------------------------------------------------------------------------
;*
;* Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR>
;* SPDX-License-Identifier: BSD-2-Clause-Patent
;*
;*
;------------------------------------------------------------------------------
DEFAULT REL
SECTION .text
%macro tdcall 0
db 0x66,0x0f,0x01,0xcc
%endmacro
%macro tdcall_push_regs 0
push rbp
mov rbp, rsp
push r15
push r14
push r13
push r12
push rbx
push rsi
push rdi
%endmacro
%macro tdcall_pop_regs 0
pop rdi
pop rsi
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
%endmacro
%define number_of_regs_pushed 8
%define number_of_parameters 4
;
; Keep these in sync for push_regs/pop_regs, code below
; uses them to find 5th or greater parameters
;
%define first_variable_on_stack_offset \
((number_of_regs_pushed * 8) + (number_of_parameters * 8) + 8)
%define second_variable_on_stack_offset \
((first_variable_on_stack_offset) + 8)
; TdCall (
; UINT64 Leaf, // Rcx
; UINT64 P1, // Rdx
; UINT64 P2, // R8
; UINT64 P3, // R9
; UINT64 Results, // rsp + 0x28
; )
global ASM_PFX(TdCall)
ASM_PFX(TdCall):
tdcall_push_regs
mov rax, rcx
mov rcx, rdx
mov rdx, r8
mov r8, r9
tdcall
; exit if tdcall reports failure.
test rax, rax
jnz .exit
; test if caller wanted results
mov r12, [rsp + first_variable_on_stack_offset ]
test r12, r12
jz .exit
mov [r12 + 0 ], rcx
mov [r12 + 8 ], rdx
mov [r12 + 16], r8
mov [r12 + 24], r9
mov [r12 + 32], r10
mov [r12 + 40], r11
.exit:
tdcall_pop_regs
ret