blob: c56942e1a38caccb006119b50de77053459fb8c4 [file] [log] [blame]
Jeff Dike13c06be2006-09-25 23:32:59 -07001#
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
Florian Fainellif44f1e72017-05-23 17:32:31 -070021 .globl kernel_setjmp
22 .type kernel_setjmp, @function
23kernel_setjmp:
Jeff Dike13c06be2006-09-25 23:32:59 -070024 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
Florian Fainellif44f1e72017-05-23 17:32:31 -070037 .size kernel_setjmp,.-kernel_setjmp
Jeff Dike13c06be2006-09-25 23:32:59 -070038
39 .text
40 .align 4
Florian Fainellif44f1e72017-05-23 17:32:31 -070041 .globl kernel_longjmp
42 .type kernel_longjmp, @function
43kernel_longjmp:
Jeff Dike13c06be2006-09-25 23:32:59 -070044 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
Florian Fainellif44f1e72017-05-23 17:32:31 -070054 .size kernel_longjmp,.-kernel_longjmp