12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #
- # arch/x86_64/setjmp.S
- #
- # setjmp/longjmp for the x86-64 architecture
- #
- #
- # The jmp_buf is assumed to contain the following, in order:
- # %rbx
- # %rsp (post-return)
- # %rbp
- # %r12
- # %r13
- # %r14
- # %r15
- # <return address>
- #
- .text
- .align 4
- .globl setjmp
- .type setjmp, @function
- setjmp:
- pop %rsi # Return address, and adjust the stack
- xorl %eax,%eax # Return value
- movq %rbx,(%rdi)
- movq %rsp,8(%rdi) # Post-return %rsp!
- push %rsi # Make the call/return stack happy
- movq %rbp,16(%rdi)
- movq %r12,24(%rdi)
- movq %r13,32(%rdi)
- movq %r14,40(%rdi)
- movq %r15,48(%rdi)
- movq %rsi,56(%rdi) # Return address
- ret
- .size setjmp,.-setjmp
- .text
- .align 4
- .globl longjmp
- .type longjmp, @function
- longjmp:
- movl %esi,%eax # Return value (int)
- movq (%rdi),%rbx
- movq 8(%rdi),%rsp
- movq 16(%rdi),%rbp
- movq 24(%rdi),%r12
- movq 32(%rdi),%r13
- movq 40(%rdi),%r14
- movq 48(%rdi),%r15
- jmp *56(%rdi)
- .size longjmp,.-longjmp
|