/* * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #include call_stub: // push a pointer to arguments and a pointer to ourselves on the stack lea 4(%esp), %eax push %eax call 1f 1: pop %eax subl $(1b - call_stub), %eax push %eax // call the wrapper function movl (call_stub_callback_address - call_stub)(%eax), %eax call *%eax // returns a pointer to the actual function lea 8(%esp), %esp jmp *%eax .align 4 call_stub_callback_address: .long 0 call_stub_end: // size_t arch_call_stub_size(); FUNCTION(arch_call_stub_size): movl $(call_stub_end - call_stub), %eax ret FUNCTION_END(arch_call_stub_size) // void arch_init_call_stub(void* stub, // void* (*callback)(const void* stub, const void* args), // void* function); FUNCTION(arch_init_call_stub): push %ebp movl %esp, %ebp // stub address to %edi push %edi movl 8(%ebp), %edi // copy the stub movl $(call_stub_end - call_stub), %eax push %eax movl $call_stub, %eax push %eax push %edi call memcpy lea 12(%esp), %esp // set the callback address in the stub movl 12(%ebp), %eax movl %eax, (call_stub_callback_address - call_stub)(%edi) // restore %edi pop %edi movl %ebp, %esp pop %ebp ret FUNCTION_END(arch_init_call_stub)