setjmp.S 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * (C) 2018 Alexander Graf <agraf@suse.de>
  4. */
  5. #include <config.h>
  6. #include <linux/linkage.h>
  7. #ifdef CONFIG_ARCH_RV64I
  8. #define STORE_IDX(reg, idx) sd reg, (idx*8)(a0)
  9. #define LOAD_IDX(reg, idx) ld reg, (idx*8)(a0)
  10. #else
  11. #define STORE_IDX(reg, idx) sw reg, (idx*4)(a0)
  12. #define LOAD_IDX(reg, idx) lw reg, (idx*4)(a0)
  13. #endif
  14. .pushsection .text.setjmp, "ax"
  15. ENTRY(setjmp)
  16. /* Preserve all callee-saved registers and the SP */
  17. STORE_IDX(s0, 0)
  18. STORE_IDX(s1, 1)
  19. STORE_IDX(s2, 2)
  20. STORE_IDX(s3, 3)
  21. STORE_IDX(s4, 4)
  22. STORE_IDX(s5, 5)
  23. STORE_IDX(s6, 6)
  24. STORE_IDX(s7, 7)
  25. STORE_IDX(s8, 8)
  26. STORE_IDX(s9, 9)
  27. STORE_IDX(s10, 10)
  28. STORE_IDX(s11, 11)
  29. STORE_IDX(ra, 12)
  30. STORE_IDX(sp, 13)
  31. li a0, 0
  32. ret
  33. ENDPROC(setjmp)
  34. .popsection
  35. .pushsection .text.longjmp, "ax"
  36. ENTRY(longjmp)
  37. LOAD_IDX(s0, 0)
  38. LOAD_IDX(s1, 1)
  39. LOAD_IDX(s2, 2)
  40. LOAD_IDX(s3, 3)
  41. LOAD_IDX(s4, 4)
  42. LOAD_IDX(s5, 5)
  43. LOAD_IDX(s6, 6)
  44. LOAD_IDX(s7, 7)
  45. LOAD_IDX(s8, 8)
  46. LOAD_IDX(s9, 9)
  47. LOAD_IDX(s10, 10)
  48. LOAD_IDX(s11, 11)
  49. LOAD_IDX(ra, 12)
  50. LOAD_IDX(sp, 13)
  51. /* Move the return value in place, but return 1 if passed 0. */
  52. seqz a0, a1
  53. add a0, a0, a1
  54. ret
  55. ENDPROC(longjmp)
  56. .popsection