123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #
- # 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 kernel_setjmp
- .type kernel_setjmp, @function
- kernel_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 kernel_setjmp,.-kernel_setjmp
- .text
- .align 4
- .globl kernel_longjmp
- .type kernel_longjmp, @function
- kernel_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 kernel_longjmp,.-kernel_longjmp
|