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 setjmp 22 .type setjmp, @function 23 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 setjmp,.-setjmp 38 39 .text 40 .align 4 41 .globl longjmp 42 .type longjmp, @function 43 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 longjmp,.-longjmp 55