18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci# 38c2ecf20Sopenharmony_ci# arch/i386/setjmp.S 48c2ecf20Sopenharmony_ci# 58c2ecf20Sopenharmony_ci# setjmp/longjmp for the i386 architecture 68c2ecf20Sopenharmony_ci# 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci# 98c2ecf20Sopenharmony_ci# The jmp_buf is assumed to contain the following, in order: 108c2ecf20Sopenharmony_ci# %ebx 118c2ecf20Sopenharmony_ci# %esp 128c2ecf20Sopenharmony_ci# %ebp 138c2ecf20Sopenharmony_ci# %esi 148c2ecf20Sopenharmony_ci# %edi 158c2ecf20Sopenharmony_ci# <return address> 168c2ecf20Sopenharmony_ci# 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci .text 198c2ecf20Sopenharmony_ci .align 4 208c2ecf20Sopenharmony_ci .globl kernel_setjmp 218c2ecf20Sopenharmony_ci .type kernel_setjmp, @function 228c2ecf20Sopenharmony_cikernel_setjmp: 238c2ecf20Sopenharmony_ci#ifdef _REGPARM 248c2ecf20Sopenharmony_ci movl %eax,%edx 258c2ecf20Sopenharmony_ci#else 268c2ecf20Sopenharmony_ci movl 4(%esp),%edx 278c2ecf20Sopenharmony_ci#endif 288c2ecf20Sopenharmony_ci popl %ecx # Return address, and adjust the stack 298c2ecf20Sopenharmony_ci xorl %eax,%eax # Return value 308c2ecf20Sopenharmony_ci movl %ebx,(%edx) 318c2ecf20Sopenharmony_ci movl %esp,4(%edx) # Post-return %esp! 328c2ecf20Sopenharmony_ci pushl %ecx # Make the call/return stack happy 338c2ecf20Sopenharmony_ci movl %ebp,8(%edx) 348c2ecf20Sopenharmony_ci movl %esi,12(%edx) 358c2ecf20Sopenharmony_ci movl %edi,16(%edx) 368c2ecf20Sopenharmony_ci movl %ecx,20(%edx) # Return address 378c2ecf20Sopenharmony_ci RET 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci .size kernel_setjmp,.-kernel_setjmp 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci .text 428c2ecf20Sopenharmony_ci .align 4 438c2ecf20Sopenharmony_ci .globl kernel_longjmp 448c2ecf20Sopenharmony_ci .type kernel_longjmp, @function 458c2ecf20Sopenharmony_cikernel_longjmp: 468c2ecf20Sopenharmony_ci#ifdef _REGPARM 478c2ecf20Sopenharmony_ci xchgl %eax,%edx 488c2ecf20Sopenharmony_ci#else 498c2ecf20Sopenharmony_ci movl 4(%esp),%edx # jmp_ptr address 508c2ecf20Sopenharmony_ci movl 8(%esp),%eax # Return value 518c2ecf20Sopenharmony_ci#endif 528c2ecf20Sopenharmony_ci movl (%edx),%ebx 538c2ecf20Sopenharmony_ci movl 4(%edx),%esp 548c2ecf20Sopenharmony_ci movl 8(%edx),%ebp 558c2ecf20Sopenharmony_ci movl 12(%edx),%esi 568c2ecf20Sopenharmony_ci movl 16(%edx),%edi 578c2ecf20Sopenharmony_ci jmp *20(%edx) 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci .size kernel_longjmp,.-kernel_longjmp 60