#include <asm_defs.h>
call_stub:
push %r9
push %r8
push %rcx
push %rdx
push %rsi
push %rdi
lea call_stub(%rip), %rdi
mov %rsp, %rsi
movq (call_stub_callback_address - call_stub)(%rdi), %rax
call *%rax
pop %rdi
pop %rsi
pop %rdx
pop %rcx
pop %r8
pop %r9
jmp *%rax
.align 8
call_stub_callback_address:
.long 0
call_stub_end:
FUNCTION(arch_call_stub_size):
movq $(call_stub_end - call_stub), %rax
ret
FUNCTION_END(arch_call_stub_size)
FUNCTION(arch_init_call_stub):
push %rbp
movq %rsp, %rbp
push %rsi
push %rdi
movq $(call_stub_end - call_stub), %rdx
lea call_stub(%rip), %rsi
call memcpy@plt
pop %rdi
pop %rsi
movq %rsi, (call_stub_callback_address - call_stub)(%rdi)
movq %rbp, %rsp
pop %rbp
ret
FUNCTION_END(arch_init_call_stub)