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