1# 2# arch/x86_64/setjmp.S 3# 4# setjmp/longjmp for the x86-64 architecture 5# 6 7# 8# The jmp_buf is assumed to contain the following, in order: 9# %rbx 10# %rsp (post-return) 11# %rbp 12# %r12 13# %r13 14# %r14 15# %r15 16# <return address> 17# 18 19 .text 20 .align 4 21 .globl kernel_setjmp 22 .type kernel_setjmp, @function 23kernel_setjmp: 24 pop %rsi # Return address, and adjust the stack 25 xorl %eax,%eax # Return value 26 movq %rbx,(%rdi) 27 movq %rsp,8(%rdi) # Post-return %rsp! 28 push %rsi # Make the call/return stack happy 29 movq %rbp,16(%rdi) 30 movq %r12,24(%rdi) 31 movq %r13,32(%rdi) 32 movq %r14,40(%rdi) 33 movq %r15,48(%rdi) 34 movq %rsi,56(%rdi) # Return address 35 ret 36 37 .size kernel_setjmp,.-kernel_setjmp 38 39 .text 40 .align 4 41 .globl kernel_longjmp 42 .type kernel_longjmp, @function 43kernel_longjmp: 44 movl %esi,%eax # Return value (int) 45 movq (%rdi),%rbx 46 movq 8(%rdi),%rsp 47 movq 16(%rdi),%rbp 48 movq 24(%rdi),%r12 49 movq 32(%rdi),%r13 50 movq 40(%rdi),%r14 51 movq 48(%rdi),%r15 52 jmp *56(%rdi) 53 54 .size kernel_longjmp,.-kernel_longjmp 55