GNU Linux-libre 4.14.266-gnu1
[releases.git] / arch / x86 / um / setjmp_32.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #
3 # arch/i386/setjmp.S
4 #
5 # setjmp/longjmp for the i386 architecture
6 #
7
8 #
9 # The jmp_buf is assumed to contain the following, in order:
10 #       %ebx
11 #       %esp
12 #       %ebp
13 #       %esi
14 #       %edi
15 #       <return address>
16 #
17
18         .text
19         .align 4
20         .globl kernel_setjmp
21         .type kernel_setjmp, @function
22 kernel_setjmp:
23 #ifdef _REGPARM
24         movl %eax,%edx
25 #else
26         movl 4(%esp),%edx
27 #endif
28         popl %ecx                       # Return address, and adjust the stack
29         xorl %eax,%eax                  # Return value
30         movl %ebx,(%edx)
31         movl %esp,4(%edx)               # Post-return %esp!
32         pushl %ecx                      # Make the call/return stack happy
33         movl %ebp,8(%edx)
34         movl %esi,12(%edx)
35         movl %edi,16(%edx)
36         movl %ecx,20(%edx)              # Return address
37         ret
38
39         .size kernel_setjmp,.-kernel_setjmp
40
41         .text
42         .align 4
43         .globl kernel_longjmp
44         .type kernel_longjmp, @function
45 kernel_longjmp:
46 #ifdef _REGPARM
47         xchgl %eax,%edx
48 #else
49         movl 4(%esp),%edx               # jmp_ptr address
50         movl 8(%esp),%eax               # Return value
51 #endif
52         movl (%edx),%ebx
53         movl 4(%edx),%esp
54         movl 8(%edx),%ebp
55         movl 12(%edx),%esi
56         movl 16(%edx),%edi
57         jmp *20(%edx)
58
59         .size kernel_longjmp,.-kernel_longjmp