0013-riscv32-Add-jmp_buf-and-sigreturn.patch 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. From 0b4555370e3b615453ce002a375809870fe8d8ed Mon Sep 17 00:00:00 2001
  2. From: Stefan O'Rear <sorear@fastmail.com>
  3. Date: Thu, 3 Sep 2020 05:54:44 -0400
  4. Subject: [PATCH 13/16] riscv32: Add jmp_buf and sigreturn
  5. Largely copied from riscv64 but required recalculation of offsets.
  6. ---
  7. src/setjmp/riscv32/longjmp.S | 42 ++++++++++++++++++++++++++++++++++
  8. src/setjmp/riscv32/setjmp.S | 41 +++++++++++++++++++++++++++++++++
  9. src/signal/riscv32/restore.s | 8 +++++++
  10. src/signal/riscv32/sigsetjmp.s | 23 +++++++++++++++++++
  11. 4 files changed, 114 insertions(+)
  12. create mode 100644 src/setjmp/riscv32/longjmp.S
  13. create mode 100644 src/setjmp/riscv32/setjmp.S
  14. create mode 100644 src/signal/riscv32/restore.s
  15. create mode 100644 src/signal/riscv32/sigsetjmp.s
  16. diff --git a/src/setjmp/riscv32/longjmp.S b/src/setjmp/riscv32/longjmp.S
  17. new file mode 100644
  18. index 00000000..f9cb3318
  19. --- /dev/null
  20. +++ b/src/setjmp/riscv32/longjmp.S
  21. @@ -0,0 +1,42 @@
  22. +.global __longjmp
  23. +.global _longjmp
  24. +.global longjmp
  25. +.type __longjmp, %function
  26. +.type _longjmp, %function
  27. +.type longjmp, %function
  28. +__longjmp:
  29. +_longjmp:
  30. +longjmp:
  31. + lw s0, 0(a0)
  32. + lw s1, 4(a0)
  33. + lw s2, 8(a0)
  34. + lw s3, 12(a0)
  35. + lw s4, 16(a0)
  36. + lw s5, 20(a0)
  37. + lw s6, 24(a0)
  38. + lw s7, 28(a0)
  39. + lw s8, 32(a0)
  40. + lw s9, 36(a0)
  41. + lw s10, 40(a0)
  42. + lw s11, 44(a0)
  43. + lw sp, 48(a0)
  44. + lw ra, 52(a0)
  45. +
  46. +#ifndef __riscv_float_abi_soft
  47. + fld fs0, 56(a0)
  48. + fld fs1, 64(a0)
  49. + fld fs2, 72(a0)
  50. + fld fs3, 80(a0)
  51. + fld fs4, 88(a0)
  52. + fld fs5, 96(a0)
  53. + fld fs6, 104(a0)
  54. + fld fs7, 112(a0)
  55. + fld fs8, 120(a0)
  56. + fld fs9, 128(a0)
  57. + fld fs10, 136(a0)
  58. + fld fs11, 144(a0)
  59. +#endif
  60. +
  61. + seqz a0, a1
  62. + add a0, a0, a1
  63. + ret
  64. diff --git a/src/setjmp/riscv32/setjmp.S b/src/setjmp/riscv32/setjmp.S
  65. new file mode 100644
  66. index 00000000..8a75cf55
  67. --- /dev/null
  68. +++ b/src/setjmp/riscv32/setjmp.S
  69. @@ -0,0 +1,41 @@
  70. +.global __setjmp
  71. +.global _setjmp
  72. +.global setjmp
  73. +.type __setjmp, %function
  74. +.type _setjmp, %function
  75. +.type setjmp, %function
  76. +__setjmp:
  77. +_setjmp:
  78. +setjmp:
  79. + sw s0, 0(a0)
  80. + sw s1, 4(a0)
  81. + sw s2, 8(a0)
  82. + sw s3, 12(a0)
  83. + sw s4, 16(a0)
  84. + sw s5, 20(a0)
  85. + sw s6, 24(a0)
  86. + sw s7, 28(a0)
  87. + sw s8, 32(a0)
  88. + sw s9, 36(a0)
  89. + sw s10, 40(a0)
  90. + sw s11, 44(a0)
  91. + sw sp, 48(a0)
  92. + sw ra, 52(a0)
  93. +
  94. +#ifndef __riscv_float_abi_soft
  95. + fsd fs0, 56(a0)
  96. + fsd fs1, 64(a0)
  97. + fsd fs2, 72(a0)
  98. + fsd fs3, 80(a0)
  99. + fsd fs4, 88(a0)
  100. + fsd fs5, 96(a0)
  101. + fsd fs6, 104(a0)
  102. + fsd fs7, 112(a0)
  103. + fsd fs8, 120(a0)
  104. + fsd fs9, 128(a0)
  105. + fsd fs10, 136(a0)
  106. + fsd fs11, 144(a0)
  107. +#endif
  108. +
  109. + li a0, 0
  110. + ret
  111. diff --git a/src/signal/riscv32/restore.s b/src/signal/riscv32/restore.s
  112. new file mode 100644
  113. index 00000000..40012c75
  114. --- /dev/null
  115. +++ b/src/signal/riscv32/restore.s
  116. @@ -0,0 +1,8 @@
  117. +.global __restore
  118. +.type __restore, %function
  119. +__restore:
  120. +.global __restore_rt
  121. +.type __restore_rt, %function
  122. +__restore_rt:
  123. + li a7, 139 # SYS_rt_sigreturn
  124. + ecall
  125. diff --git a/src/signal/riscv32/sigsetjmp.s b/src/signal/riscv32/sigsetjmp.s
  126. new file mode 100644
  127. index 00000000..c1caeab1
  128. --- /dev/null
  129. +++ b/src/signal/riscv32/sigsetjmp.s
  130. @@ -0,0 +1,23 @@
  131. +.global sigsetjmp
  132. +.global __sigsetjmp
  133. +.type sigsetjmp, %function
  134. +.type __sigsetjmp, %function
  135. +sigsetjmp:
  136. +__sigsetjmp:
  137. + bnez a1, 1f
  138. + tail setjmp
  139. +1:
  140. +
  141. + sw ra, 152(a0)
  142. + sw s0, 164(a0)
  143. + mv s0, a0
  144. +
  145. + call setjmp
  146. +
  147. + mv a1, a0
  148. + mv a0, s0
  149. + lw s0, 164(a0)
  150. + lw ra, 152(a0)
  151. +
  152. +.hidden __sigsetjmp_tail
  153. + tail __sigsetjmp_tail
  154. --
  155. 2.29.2