15c48b108SAl Viro# 25c48b108SAl Viro# arch/i386/setjmp.S 35c48b108SAl Viro# 45c48b108SAl Viro# setjmp/longjmp for the i386 architecture 55c48b108SAl Viro# 65c48b108SAl Viro 75c48b108SAl Viro# 85c48b108SAl Viro# The jmp_buf is assumed to contain the following, in order: 95c48b108SAl Viro# %ebx 105c48b108SAl Viro# %esp 115c48b108SAl Viro# %ebp 125c48b108SAl Viro# %esi 135c48b108SAl Viro# %edi 145c48b108SAl Viro# <return address> 155c48b108SAl Viro# 165c48b108SAl Viro 175c48b108SAl Viro .text 185c48b108SAl Viro .align 4 195c48b108SAl Viro .globl setjmp 205c48b108SAl Viro .type setjmp, @function 215c48b108SAl Virosetjmp: 225c48b108SAl Viro#ifdef _REGPARM 235c48b108SAl Viro movl %eax,%edx 245c48b108SAl Viro#else 255c48b108SAl Viro movl 4(%esp),%edx 265c48b108SAl Viro#endif 275c48b108SAl Viro popl %ecx # Return address, and adjust the stack 285c48b108SAl Viro xorl %eax,%eax # Return value 295c48b108SAl Viro movl %ebx,(%edx) 305c48b108SAl Viro movl %esp,4(%edx) # Post-return %esp! 315c48b108SAl Viro pushl %ecx # Make the call/return stack happy 325c48b108SAl Viro movl %ebp,8(%edx) 335c48b108SAl Viro movl %esi,12(%edx) 345c48b108SAl Viro movl %edi,16(%edx) 355c48b108SAl Viro movl %ecx,20(%edx) # Return address 365c48b108SAl Viro ret 375c48b108SAl Viro 385c48b108SAl Viro .size setjmp,.-setjmp 395c48b108SAl Viro 405c48b108SAl Viro .text 415c48b108SAl Viro .align 4 425c48b108SAl Viro .globl longjmp 435c48b108SAl Viro .type longjmp, @function 445c48b108SAl Virolongjmp: 455c48b108SAl Viro#ifdef _REGPARM 465c48b108SAl Viro xchgl %eax,%edx 475c48b108SAl Viro#else 485c48b108SAl Viro movl 4(%esp),%edx # jmp_ptr address 495c48b108SAl Viro movl 8(%esp),%eax # Return value 505c48b108SAl Viro#endif 515c48b108SAl Viro movl (%edx),%ebx 525c48b108SAl Viro movl 4(%edx),%esp 535c48b108SAl Viro movl 8(%edx),%ebp 545c48b108SAl Viro movl 12(%edx),%esi 555c48b108SAl Viro movl 16(%edx),%edi 565c48b108SAl Viro jmp *20(%edx) 575c48b108SAl Viro 585c48b108SAl Viro .size longjmp,.-longjmp 59