Alexandre Julliard : ntdll: Reimplement the i386 relay entry point in assembler.
Alexandre Julliard
julliard at winehq.org
Thu May 23 14:42:19 CDT 2013
Module: wine
Branch: master
Commit: fb75238f7e3bc5611912ed7103d39f5a3c65d11b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fb75238f7e3bc5611912ed7103d39f5a3c65d11b
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu May 23 13:16:23 2013 +0200
ntdll: Reimplement the i386 relay entry point in assembler.
---
dlls/ntdll/relay.c | 67 +++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 58 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c
index f677082..6736d0f 100644
--- a/dlls/ntdll/relay.c
+++ b/dlls/ntdll/relay.c
@@ -416,15 +416,64 @@ __ASM_GLOBAL_FUNC( call_entry_point,
__ASM_CFI(".cfi_same_value %ebp\n\t")
"ret" )
-static LONGLONG WINAPI relay_call( struct relay_descr *descr, unsigned int idx, const INT_PTR *stack )
-{
- BYTE nb_args = LOBYTE(HIWORD(idx));
- BYTE flags = HIBYTE(HIWORD(idx));
- void *func = relay_trace_entry( descr, idx, stack );
- LONGLONG ret = call_entry_point( func, nb_args, stack + 1, flags );
- relay_trace_exit( descr, idx, stack, ret );
- return ret;
-}
+extern LONGLONG WINAPI relay_call( struct relay_descr *descr, unsigned int idx, const INT_PTR *stack );
+__ASM_GLOBAL_FUNC( relay_call,
+ "pushl %ebp\n\t"
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
+ __ASM_CFI(".cfi_rel_offset %ebp,0\n\t")
+ "movl %esp,%ebp\n\t"
+ __ASM_CFI(".cfi_def_cfa_register %ebp\n\t")
+ "pushl %esi\n\t"
+ __ASM_CFI(".cfi_rel_offset %esi,-4\n\t")
+ "pushl %edi\n\t"
+ __ASM_CFI(".cfi_rel_offset %edi,-8\n\t")
+ "pushl %ecx\n\t"
+ __ASM_CFI(".cfi_rel_offset %ecx,-12\n\t")
+ /* trace the parameters */
+ "pushl 16(%ebp)\n\t"
+ "pushl 12(%ebp)\n\t"
+ "pushl 8(%ebp)\n\t"
+ "call " __ASM_NAME("relay_trace_entry") "\n\t"
+ /* copy the arguments*/
+ "movzbl 14(%ebp),%ecx\n\t" /* number of args */
+ "jecxz 1f\n\t"
+ "leal 0(,%ecx,4),%edx\n\t"
+ "subl %edx,%esp\n\t"
+ "andl $~15,%esp\n\t"
+ "movl 16(%ebp),%esi\n\t"
+ "addl $4,%esi\n\t"
+ "movl %esp,%edi\n\t"
+ "cld\n\t"
+ "rep; movsl\n\t"
+ "testb $2,15(%ebp)\n\t" /* (flags & 2) -> thiscall */
+ "jz 1f\n\t"
+ "popl %ecx\n"
+ /* call the entry point */
+ "1:\tcall *%eax\n\t"
+ "movl %eax,%esi\n\t"
+ "movl %edx,%edi\n\t"
+ /* trace the return value */
+ "leal -20(%ebp),%esp\n\t"
+ "pushl %edx\n\t"
+ "pushl %eax\n\t"
+ "pushl 16(%ebp)\n\t"
+ "pushl 12(%ebp)\n\t"
+ "pushl 8(%ebp)\n\t"
+ "call " __ASM_NAME("relay_trace_exit") "\n\t"
+ /* restore return value and return */
+ "leal -12(%ebp),%esp\n\t"
+ "movl %esi,%eax\n\t"
+ "movl %edi,%edx\n\t"
+ "popl %ecx\n\t"
+ __ASM_CFI(".cfi_same_value %ecx\n\t")
+ "popl %edi\n\t"
+ __ASM_CFI(".cfi_same_value %edi\n\t")
+ "popl %esi\n\t"
+ __ASM_CFI(".cfi_same_value %esi\n\t")
+ "popl %ebp\n\t"
+ __ASM_CFI(".cfi_def_cfa %esp,4\n\t")
+ __ASM_CFI(".cfi_same_value %ebp\n\t")
+ "ret $12" )
void WINAPI __regs_relay_call_regs( struct relay_descr *descr, unsigned int idx,
unsigned int orig_eax, unsigned int ret_addr,
More information about the wine-cvs
mailing list