mirror of
https://github.com/geode-sdk/geode.git
synced 2024-12-04 05:01:06 -05:00
70 lines
No EOL
1.6 KiB
C
70 lines
No EOL
1.6 KiB
C
#if defined(ENABLE_CLOSURE_BRIDGE_TEMPLATE)
|
|
|
|
#if defined(__WIN32__) || defined(__APPLE__)
|
|
#define xcdecl(s) "_" s
|
|
#else
|
|
#define xcdecl(s) s
|
|
#endif
|
|
|
|
#define xASM(x) __asm(x)
|
|
|
|
__attribute__((naked)) void closure_bridge_template() {
|
|
// flags register
|
|
xASM("pushfq");
|
|
|
|
// general register
|
|
xASM("sub rsp, #(16*8)");
|
|
xASM("mov [rsp+16*0], rax");
|
|
xASM("mov [rsp+16*1], rbx");
|
|
xASM("mov [rsp+16*2], rcx");
|
|
xASM("mov [rsp+16*3], rdx");
|
|
xASM("mov [rsp+16*4], rbp");
|
|
xASM("mov [rsp+16*5], rsp");
|
|
xASM("mov [rsp+16*6], rdi");
|
|
xASM("mov [rsp+16*7], rsi");
|
|
xASM("mov [rsp+16*8], r8");
|
|
xASM("mov [rsp+16*9], r9");
|
|
xASM("mov [rsp+16*10], r10");
|
|
xASM("mov [rsp+16*11], r11");
|
|
xASM("mov [rsp+16*12], r12");
|
|
xASM("mov [rsp+16*13], r13");
|
|
xASM("mov [rsp+16*14], r14");
|
|
xASM("mov [rsp+16*15], r15");
|
|
|
|
// ======= Jump to UnifiedInterface Bridge Handle =======
|
|
|
|
// prepare args
|
|
// @rdi: data_address
|
|
// @rsi: RegisterContext stack address
|
|
xASM("mov rdi, rsp");
|
|
xASM("mov rsi, [rsp-16*8]");
|
|
xASM("call " xcdecl("intercept_routing_common_bridge_handler"));
|
|
|
|
// ======= RegisterContext Restore =======
|
|
|
|
// general register
|
|
xASM("pop r15");
|
|
xASM("pop r14");
|
|
xASM("pop r13");
|
|
xASM("pop r12");
|
|
xASM("pop r11");
|
|
xASM("pop r10");
|
|
xASM("pop r9");
|
|
xASM("pop r8");
|
|
xASM("pop rsi");
|
|
xASM("pop rdi");
|
|
xASM("pop rsp");
|
|
xASM("pop rbp");
|
|
xASM("pop rdx");
|
|
xASM("pop rcx");
|
|
xASM("pop rbx");
|
|
xASM("pop rax");
|
|
|
|
// flags register
|
|
xASM("popfq");
|
|
|
|
// trick: use the 'carry_data' placeholder, as the return address
|
|
xASM("ret");
|
|
};
|
|
|
|
#endif |