2006-09-26 14:32:59 +08:00
|
|
|
#
|
|
|
|
# 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
|
2017-05-24 08:32:31 +08:00
|
|
|
.globl kernel_setjmp
|
|
|
|
.type kernel_setjmp, @function
|
|
|
|
kernel_setjmp:
|
2006-09-26 14:32:59 +08:00
|
|
|
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
|
|
|
|
|
2017-05-24 08:32:31 +08:00
|
|
|
.size kernel_setjmp,.-kernel_setjmp
|
2006-09-26 14:32:59 +08:00
|
|
|
|
|
|
|
.text
|
|
|
|
.align 4
|
2017-05-24 08:32:31 +08:00
|
|
|
.globl kernel_longjmp
|
|
|
|
.type kernel_longjmp, @function
|
|
|
|
kernel_longjmp:
|
2006-09-26 14:32:59 +08:00
|
|
|
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)
|
|
|
|
|
2017-05-24 08:32:31 +08:00
|
|
|
.size kernel_longjmp,.-kernel_longjmp
|