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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
  2. .text
  3. .code64
  4. /* Must match jmp_buf structure layout */
  5. .struct 0
  6. env_retaddr: .quad 0
  7. env_stack: .quad 0
  8. env_rbx: .quad 0
  9. env_rbp: .quad 0
  10. env_r12: .quad 0
  11. env_r13: .quad 0
  12. env_r14: .quad 0
  13. env_r15: .quad 0
  14. .previous
  15. /*
  16. * Save stack context for non-local goto
  17. */
  18. .globl setjmp
  19. setjmp:
  20. /* Save return address */
  21. movq 0(%rsp), %rax
  22. movq %rax, env_retaddr(%rdi)
  23. /* Save stack pointer */
  24. movq %rsp, env_stack(%rdi)
  25. /* Save other registers */
  26. movq %rbx, env_rbx(%rdi)
  27. movq %rbp, env_rbp(%rdi)
  28. movq %r12, env_r12(%rdi)
  29. movq %r13, env_r13(%rdi)
  30. movq %r14, env_r14(%rdi)
  31. movq %r15, env_r15(%rdi)
  32. /* Return 0 when returning as setjmp() */
  33. xorq %rax, %rax
  34. ret
  35. .size setjmp, . - setjmp
  36. /*
  37. * Non-local jump to a saved stack context
  38. */
  39. .globl longjmp
  40. longjmp:
  41. /* Get result in %rax */
  42. movq %rsi, %rax
  43. /* Force result to non-zero */
  44. testq %rax, %rax
  45. jnz 1f
  46. incq %rax
  47. 1: /* Restore stack pointer */
  48. movq env_stack(%rdi), %rsp
  49. /* Restore other registers */
  50. movq env_rbx(%rdi), %rbx
  51. movq env_rbp(%rdi), %rbp
  52. movq env_r12(%rdi), %r12
  53. movq env_r13(%rdi), %r13
  54. movq env_r14(%rdi), %r14
  55. movq env_r15(%rdi), %r15
  56. /* Replace return address on the new stack */
  57. popq %rcx /* discard */
  58. pushq env_retaddr(%rdi)
  59. /* Return to setjmp() caller */
  60. ret
  61. .size longjmp, . - longjmp