23 lines
563 B
ArmAsm
23 lines
563 B
ArmAsm
|
.text
|
||
|
|
||
|
// upcall_call_c_stack(void (*fn)(), void *new_esp)
|
||
|
//
|
||
|
// Note that we could use |enter| and |leave| but the manuals tell me they're
|
||
|
// slower.
|
||
|
#if defined(__APPLE__) || defined(_WIN32)
|
||
|
.globl _upcall_call_c_stack
|
||
|
_upcall_call_c_stack:
|
||
|
#else
|
||
|
.globl upcall_call_c_stack
|
||
|
upcall_call_c_stack:
|
||
|
#endif
|
||
|
pushl %ebp
|
||
|
movl %esp,%ebp // save esp
|
||
|
movl 8(%esp),%eax // eax = callee
|
||
|
movl 12(%esp),%esp // switch stack
|
||
|
calll *%eax
|
||
|
movl %ebp,%esp // would like to use "leave" but it's slower
|
||
|
popl %ebp
|
||
|
ret
|
||
|
|