Alexandre Julliard : rpcrt4: Implement stubless proxy entry thunks for x86_64.
Alexandre Julliard
julliard at winehq.org
Wed Jun 15 13:42:58 CDT 2011
Module: wine
Branch: master
Commit: b02457a108ce1365ec48dce13088c5747fea99c0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b02457a108ce1365ec48dce13088c5747fea99c0
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jun 15 12:49:24 2011 +0200
rpcrt4: Implement stubless proxy entry thunks for x86_64.
---
dlls/rpcrt4/cproxy.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/dlls/rpcrt4/cproxy.c b/dlls/rpcrt4/cproxy.c
index ed7faf7..b5be7ae 100644
--- a/dlls/rpcrt4/cproxy.c
+++ b/dlls/rpcrt4/cproxy.c
@@ -116,6 +116,53 @@ static inline void init_thunk( struct thunk *thunk, unsigned int index )
thunk->handler = (char *)call_stubless_func - (char *)(&thunk->handler + 1);
}
+#elif defined(__x86_64__)
+
+extern void call_stubless_func(void);
+__ASM_GLOBAL_FUNC(call_stubless_func,
+ "movq %rcx,0x8(%rsp)\n\t"
+ "movq %rdx,0x10(%rsp)\n\t"
+ "movq %r8,0x18(%rsp)\n\t"
+ "movq %r9,0x20(%rsp)\n\t"
+ "leaq 0x8(%rsp),%r8\n\t" /* &This */
+ "movq (%rcx),%rcx\n\t" /* This->lpVtbl */
+ "movq -0x10(%rcx),%rcx\n\t" /* MIDL_STUBLESS_PROXY_INFO */
+ "movq 0x10(%rcx),%rdx\n\t" /* info->FormatStringOffset */
+ "movzwq (%rdx,%r10,2),%rdx\n\t" /* FormatStringOffset[index] */
+ "addq 8(%rcx),%rdx\n\t" /* info->ProcFormatString + offset */
+ "movq (%rcx),%rcx\n\t" /* info->pStubDesc */
+ "subq $0x28,%rsp\n\t"
+ __ASM_CFI(".cfi_adjust_cfa_offset 0x28\n\t")
+ "call " __ASM_NAME("ndr_client_call") "\n\t"
+ "addq $0x28,%rsp\n\t"
+ __ASM_CFI(".cfi_adjust_cfa_offset -0x28\n\t")
+ "ret" );
+
+#include "pshpack1.h"
+struct thunk
+{
+ BYTE mov_r10[3];
+ DWORD index;
+ BYTE mov_rax[2];
+ void *call_stubless;
+ BYTE jmp_rax[2];
+};
+#include "poppack.h"
+
+static const struct thunk thunk_template =
+{
+ { 0x49, 0xc7, 0xc2 }, 0, /* movq $index,%r10 */
+ { 0x48, 0xb8 }, 0, /* movq $call_stubless_func,%rax */
+ { 0xff, 0xe0 } /* jmp *%rax */
+};
+
+static inline void init_thunk( struct thunk *thunk, unsigned int index )
+{
+ *thunk = thunk_template;
+ thunk->index = index;
+ thunk->call_stubless = call_stubless_func;
+}
+
#else /* __i386__ */
#warning You must implement stubless proxies for your CPU
More information about the wine-cvs
mailing list