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 |
60 | |