Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / arch / x86 / um / setjmp_64.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #
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
22         .globl kernel_setjmp
23         .type kernel_setjmp, @function
24 kernel_setjmp:
25         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
38         .size kernel_setjmp,.-kernel_setjmp
39
40         .text
41         .align 4
42         .globl kernel_longjmp
43         .type kernel_longjmp, @function
44 kernel_longjmp:
45         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
55         .size kernel_longjmp,.-kernel_longjmp