blob: 1b5d40d4ff46d28dc545db3e3732115e3c02c1c7 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Jeff Dike13c06be2006-09-25 23:32:59 -07002#
3# arch/x86_64/setjmp.S
4#
5# setjmp/longjmp for the x86-64 architecture
6#
7
8#
9# The jmp_buf is assumed to contain the following, in order:
10# %rbx
11# %rsp (post-return)
12# %rbp
13# %r12
14# %r13
15# %r14
16# %r15
17# <return address>
18#
19
20 .text
21 .align 4
Florian Fainellif44f1e72017-05-23 17:32:31 -070022 .globl kernel_setjmp
23 .type kernel_setjmp, @function
24kernel_setjmp:
Jeff Dike13c06be2006-09-25 23:32:59 -070025 pop %rsi # Return address, and adjust the stack
26 xorl %eax,%eax # Return value
27 movq %rbx,(%rdi)
28 movq %rsp,8(%rdi) # Post-return %rsp!
29 push %rsi # Make the call/return stack happy
30 movq %rbp,16(%rdi)
31 movq %r12,24(%rdi)
32 movq %r13,32(%rdi)
33 movq %r14,40(%rdi)
34 movq %r15,48(%rdi)
35 movq %rsi,56(%rdi) # Return address
36 ret
37
Florian Fainellif44f1e72017-05-23 17:32:31 -070038 .size kernel_setjmp,.-kernel_setjmp
Jeff Dike13c06be2006-09-25 23:32:59 -070039
40 .text
41 .align 4
Florian Fainellif44f1e72017-05-23 17:32:31 -070042 .globl kernel_longjmp
43 .type kernel_longjmp, @function
44kernel_longjmp:
Jeff Dike13c06be2006-09-25 23:32:59 -070045 movl %esi,%eax # Return value (int)
46 movq (%rdi),%rbx
47 movq 8(%rdi),%rsp
48 movq 16(%rdi),%rbp
49 movq 24(%rdi),%r12
50 movq 32(%rdi),%r13
51 movq 40(%rdi),%r14
52 movq 48(%rdi),%r15
53 jmp *56(%rdi)
54
Florian Fainellif44f1e72017-05-23 17:32:31 -070055 .size kernel_longjmp,.-kernel_longjmp