Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
5.4 KiB

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.
;
; 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
P1Home dq ? ; argument home addresses
P2Home dq ? ;
P3Home dq ? ;
P4Home dq ? ;
SavedXmm0 dq ? ; saved floating argument registers
SavedXmm1 dq ? ;
SavedXmm2 dq ? ;
SavedXmm3 dq ? ;
Fill dq ? ;
OsFrame ends
NESTED_ENTRY ObjectStubless, _TEXT$00
mov 8[rsp], rcx ; save integer argument registers
mov 16[rsp], rdx ;
mov 24[rsp], r8 ;
mov 32[rsp], r9 ;
alloc_stack sizeof OsFrame ; allocate stack frame
END_PROLOGUE
movq OsFrame.SavedXmm0[rsp], xmm0 ; save floating argument registers
movq OsFrame.SavedXmm1[rsp], xmm1 ;
movq OsFrame.SavedXmm2[rsp], xmm2 ;
movq OsFrame.SavedXmm3[rsp], xmm3;
lea rcx, sizeof OsFrame + 8[rsp] ; set integer arguments address
lea rdx, OsFrame.SavedXmm0[rsp] ; set floating arguments address
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 FloatArgMask,
; 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.
;
; FloatArgMask (r8d) - Supplies the floating argument register mask (not
; used.
;
; Arguments (r9d) - 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, r9d ; 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, r9d ; 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.
;
mov rcx, 0[rsp] ; load first four argument registers
movq xmm0, 0[rsp] ;
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