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 22kernel_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 45kernel_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