Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #
0003 # arch/i386/setjmp.S
0004 #
0005 # setjmp/longjmp for the i386 architecture
0006 #
0007 
0008 #
0009 # The jmp_buf is assumed to contain the following, in order:
0010 #   %ebx
0011 #   %esp
0012 #   %ebp
0013 #   %esi
0014 #   %edi
0015 #   <return address>
0016 #
0017 
0018     .text
0019     .align 4
0020     .globl kernel_setjmp
0021     .type kernel_setjmp, @function
0022 kernel_setjmp:
0023 #ifdef _REGPARM
0024     movl %eax,%edx
0025 #else
0026     movl 4(%esp),%edx
0027 #endif
0028     popl %ecx           # Return address, and adjust the stack
0029     xorl %eax,%eax          # Return value
0030     movl %ebx,(%edx)
0031     movl %esp,4(%edx)       # Post-return %esp!
0032     pushl %ecx          # Make the call/return stack happy
0033     movl %ebp,8(%edx)
0034     movl %esi,12(%edx)
0035     movl %edi,16(%edx)
0036     movl %ecx,20(%edx)      # Return address
0037     RET
0038 
0039     .size kernel_setjmp,.-kernel_setjmp
0040 
0041     .text
0042     .align 4
0043     .globl kernel_longjmp
0044     .type kernel_longjmp, @function
0045 kernel_longjmp:
0046 #ifdef _REGPARM
0047     xchgl %eax,%edx
0048 #else
0049     movl 4(%esp),%edx       # jmp_ptr address
0050     movl 8(%esp),%eax       # Return value
0051 #endif
0052     movl (%edx),%ebx
0053     movl 4(%edx),%esp
0054     movl 8(%edx),%ebp
0055     movl 12(%edx),%esi
0056     movl 16(%edx),%edi
0057     jmp *20(%edx)
0058 
0059     .size kernel_longjmp,.-kernel_longjmp