You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

setjmp.S 1.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
  2. .text
  3. .arch i386
  4. .code32
  5. /* Must match jmp_buf structure layout */
  6. .struct 0
  7. env_retaddr: .long 0
  8. env_stack: .long 0
  9. env_ebx: .long 0
  10. env_esi: .long 0
  11. env_edi: .long 0
  12. env_ebp: .long 0
  13. .previous
  14. /*
  15. * Save stack context for non-local goto
  16. */
  17. .globl setjmp
  18. setjmp:
  19. /* Get jmp_buf pointer in %edx */
  20. movl 4(%esp),%edx
  21. /* Save return address */
  22. movl 0(%esp),%eax
  23. movl %eax, env_retaddr(%edx)
  24. /* Save stack pointer */
  25. movl %esp, env_stack(%edx)
  26. /* Save other registers */
  27. movl %ebx, env_ebx(%edx)
  28. movl %esi, env_esi(%edx)
  29. movl %edi, env_edi(%edx)
  30. movl %ebp, env_ebp(%edx)
  31. /* Return 0 when returning as setjmp() */
  32. xorl %eax, %eax
  33. ret
  34. .size setjmp, . - setjmp
  35. /*
  36. * Non-local jump to a saved stack context
  37. */
  38. .globl longjmp
  39. longjmp:
  40. /* Get jmp_buf pointer in %edx */
  41. movl 4(%esp),%edx
  42. /* Get result in %eax */
  43. movl 8(%esp),%eax
  44. /* Force result to non-zero */
  45. testl %eax, %eax
  46. jnz 1f
  47. incl %eax
  48. 1: /* Restore stack pointer */
  49. movl env_stack(%edx), %esp
  50. /* Restore other registers */
  51. movl env_ebx(%edx), %ebx
  52. movl env_esi(%edx), %esi
  53. movl env_edi(%edx), %edi
  54. movl env_ebp(%edx), %ebp
  55. /* Replace return address on the new stack */
  56. popl %ecx /* discard */
  57. pushl env_retaddr(%edx)
  58. /* Return to setjmp() caller */
  59. ret
  60. .size longjmp, . - longjmp