|
|
title "Stubless Support" ;++ ; ; Copyright (C) 2000 Microsoft Corporation ; ; Module Name: ; ; stubless.asm ; ; Abstract: ; ; This module contains interpreter support routines for the AMD64 platform. ; ; Author: ; ; David N. Cutler 30-Dec-2000 ; ; Environment: ; ; User mode. ; ;--
include ksamd64.inc
extern ObjectStublessClient:proc extern __chkstk:proc
; ; Define object stubless client macro. ;
STUBLESS_CLIENT macro Method
LEAF_ENTRY ObjectStublessClient&Method, _TEXT$00
mov r10d, Method ; set method number jmp ObjectStubless ; finish in common code
LEAF_END ObjectStublessClient&Method, _TEXT$00
endm
; ; Generate stubless client thunks. ;
index = 3
rept (1023 - 3 + 1)
STUBLESS_CLIENT %index
index = index + 1
endm
subttl "Common Object Stubless Client Code" ;++ ; ; long ; ObjectStubless ( ; ... ; ) ; ; Routine description: ; ; This function is jumped to from the corresponding linkage stub and calls ; the object stubless client routine to invoke the ultimate function. ; ; N.B. Only three of the possible floating argument registers are saved. ; The first argument is the "this" pointer, and therefore, cannot be ; a floating value. ; ; Arguments: ; ; ... ; ; Implicit Arguments: ; ; Method (r10d) - Supplies the method number from the thunk code. ; ; Return Value: ; ; The value as returned by the target function. ; ;--
OsFrame struct SavedXmm1 dq ? ; saved nonvolatile registers SavedXmm2 dq ? ; SavedXmm3 dq ? ; OsFrame ends
NESTED_ENTRY ObjectStubless, _TEXT$00
alloc_stack sizeof OsFrame ; allocate stack frame save_xmm xmm1, OsFrame.SavedXmm1 ; save nonvolatile registers save_xmm xmm2, OsFrame.SavedXmm2 ; save_xmm xmm3, OsFrame.SavedXmm3 ;
END_PROLOGUE
mov sizeof OsFrame + 8[rsp], rcx ; save register arguments in mov sizeof OsFrame + 16[rsp], rdx ; home addresses mov sizeof OsFrame + 24[rsp], r8 ; mov sizeof OsFrame + 32[rsp], r9 ; lea rcx, sizeof OsFrame + 8[rsp] ; set address of argument list mov rdx, rsp ; set address of floating registers mov r8d, r10d ; set method number call ObjectStublessClient ; add rsp, sizeof OsFrame ; deallocate stack frame ret ; return
NESTED_END ObjectStubless, _TEXT$00
subttl "Invoke Function with Parameter List" ;++ ; ; REGISTER_TYPE ; Invoke ( ; MANAGER_FUNCTION Function, ; REGISTER_TYPE *ArgumentList, ; ULONG Arguments ; ) ; ; Routine description: ; ; This function builds an appropriate argument list and calls the specified ; function. ; ; Arguments: ; ; Function (rcx) - Supplies a pointer to the target function. ; ; ArgumentList (rdx) - Supplies a pointer to the argument list. ; ; Arguments (r8d) - Supplies the number of arguments. ; ; Return Value: ; ; The value as returned by the target function. ; ;--
NESTED_ENTRY Invoke, _TEXT$00
push_reg rdi ; save nonvolatile registers push_reg rsi ; push_reg rbp ; set_frame rbp, 0 ; set frame pointer
END_PROLOGUE
mov eax, r8d ; round to even argument count inc eax ; and al, 0feh ; shl eax, 3 ; compute number of bytes call __chkstk ; check stack allocation sub rsp, rax ; allocate argument list mov r10, rcx ; save address of function mov rsi, rdx ; set source argument list address mov rdi, rsp ; set destination argument list address mov ecx, r8d ; set number of arguments rep movsq ; copy arguments to the stack
; ; N.B. All four argument registers are loaded regardless of the actual number ; of arguments. ; ; N.B. The first argument cannot be in a floating point register and therefore ; xmm0 is not loaded. ;
mov rcx, 0[rsp] ; load first four argument registers mov rdx, 8[rsp] ; movq xmm1, 8[rsp] ; mov r8, 16[rsp] ; movq xmm2, 16[rsp] ; mov r9, 24[rsp] ; movq xmm3, 24[rsp] ; call r10 ; call target function mov rsp, rbp ; deallocate argument list pop rbp ; restore nonvolatile register pop rsi ; pop rdi ; ret ;
NESTED_END Invoke, _TEXT$00
end
|