xref: /reactos/dll/win32/rpcrt4/msvc.S (revision 171a9206)
1
2#if defined(_M_IX86) || defined(_M_AMD64)
3#include <asm.inc>
4#elif defined(_M_ARM)
5#include <kxarm.h>
6#endif
7
8#ifdef _M_IX86
9.code32
10
11EXTERN _ndr_client_call:PROC
12
13PUBLIC _call_stubless_func
14_call_stubless_func:
15
16    mov ecx,[esp+4]        /* This Pointer */
17    mov ecx,[ecx]          /* This->lpVtbl */
18    mov ecx,[ecx-8]        /* MIDL_STUBLESS_PROXY_INFO */
19    mov edx,[ecx+8]        /* Info->FormatStringOffset */
20    mov edx,[edx+eax*2]    /* FormatStringOffset[index] */
21    and edx, 0000FFFFh
22    add edx,[ecx+4]        /* info->ProcFormatString + offset */
23    mov eax, [edx+8]       /* arguments size */
24    and eax, 0000FFFFh
25    push eax
26    lea eax, [esp+8]       /* &This */
27    push eax
28    push edx               /* format string */
29    push [ecx]             /* info->pstubdesc */
30    call _ndr_client_call
31    lea esp, [esp+12]
32    pop edx                /* arguments size */
33    mov ecx, [esp]         /* return address */
34    add esp, edx
35    jmp ecx
36
37#elif _M_AMD64
38.code64
39
40EXTERN ndr_client_call:PROC
41
42PUBLIC call_stubless_func
43FUNC call_stubless_func
44    mov [rsp + 8], rcx
45    .SAVEREG rcx, 8
46    mov [rsp + 10h], rdx
47    .SAVEREG rdx, 10h
48    mov [rsp + 18h], r8
49    .SAVEREG r8, 18h
50    mov [rsp + 20h], r9
51    .SAVEREG r9, 20h
52    sub rsp, 38h
53    .ALLOCSTACK 38h
54    .ENDPROLOG
55
56    lea r8, [rsp +38h + 8]   /* &This */
57    mov rcx, [rcx]           /* This->lpVtbl */
58    mov rcx, [rcx - 10h]     /* MIDL_STUBLESS_PROXY_INFO */
59    mov rdx, [rcx + 10h]     /* info->FormatStringOffset */
60    movzx rdx, word ptr [rdx+r10*2] /* FormatStringOffset[index] */
61    add rdx, [rcx + 8]       /* info->ProcFormatString + offset */
62    mov rcx, [rcx]           /* info->pStubDesc */
63
64    movaps [rsp + 20h], xmm1
65    movaps [rsp + 28h], xmm2
66    movaps [rsp + 30h], xmm3
67    lea r9, [rsp + 18h]      /* fpu_args */
68    call ndr_client_call
69    add rsp, 38h
70    ret
71ENDFUNC
72
73PUBLIC call_server_func
74FUNC call_server_func
75    push rbp
76    .PUSHREG rbp
77    mov rbp, rsp
78    push rsi
79    .PUSHREG rsi
80    push rdi
81    .PUSHREG rdi
82    .ENDPROLOG
83
84    mov rax, rcx   /* function to call */
85    mov rcx, 32    /* allocate max(32,stack_size) bytes of stack space */
86    cmp r8, rcx
87    cmovg rcx, r8
88    sub rsp, rcx
89    and rsp, NOT 15
90    mov rcx, r8
91    shr rcx, 3
92    mov rdi, rsp
93    mov rsi, rdx
94    rep movsq       /* copy arguments */
95    mov rcx, [rsp]
96    mov rdx, [rsp + 8]
97    mov r8, [rsp + 16]
98    mov r9, [rsp + 24]
99    movd xmm0, rcx
100    movd xmm1, rdx
101    movd xmm2, r8
102    movd xmm3, r9
103    call rax
104
105    lea rsp, [rbp - 16] /* restore stack */
106    pop rdi
107    pop rsi
108    pop rbp
109    ret
110ENDFUNC
111
112
113PUBLIC NdrClientCall2
114FUNC NdrClientCall2
115    mov [rsp + 18h], r8
116    .SAVEREG r8, 18h
117    mov [rsp + 20h], r9
118    .SAVEREG r9, 20h
119    sub rsp, 28h
120    .ALLOCSTACK 28h
121    .ENDPROLOG
122
123    lea r8, [rsp + 28h + 18h]
124    xor r9, r9
125    call ndr_client_call
126
127    add rsp, 28h
128    ret
129ENDFUNC
130
131EXTERN ndr_async_client_call:PROC
132PUBLIC NdrAsyncClientCall
133FUNC NdrAsyncClientCall
134    mov [rsp + 18h], r8
135    .SAVEREG r8, 18h
136    mov [rsp + 20h], r9
137    .SAVEREG r9, 20h
138    sub rsp, 28h
139    .ALLOCSTACK 28h
140    .ENDPROLOG
141
142    lea r8, [rsp + 28h + 18h]
143    call ndr_async_client_call
144
145    add rsp, 28h
146    ret
147ENDFUNC
148
149#elif _M_ARM
150TEXTAREA
151
152    LEAF_ENTRY call_stubless_func
153
154    /* Unimplemented */
155    __assertfail
156    bx lr
157
158    LEAF_END call_stubless_func
159
160    LEAF_ENTRY call_server_func
161
162    /* Unimplemented */
163    __assertfail
164    bx lr
165
166    LEAF_END call_server_func
167
168#endif
169
170END
171