setjmp_32.S 1.0 KB

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