summaryrefslogtreecommitdiff
path: root/src/signal
diff options
context:
space:
mode:
authorStefan O'Rear <sorear@fastmail.com>2020-09-03 05:54:44 -0400
committerRich Felker <dalias@aerifal.cx>2024-02-29 16:36:55 -0500
commitc34a8eedff904b7f3d8479bbec0be534e7a01fbb (patch)
treea7fe3d205d4ca457dc6947d3360a98ba61d8dcbf /src/signal
parent11eee89e14ca7ea2ccc02385c3ab7875fb572d46 (diff)
downloadmusl-c34a8eedff904b7f3d8479bbec0be534e7a01fbb.tar.gz
riscv32: add setjmp/longjmp and sigreturn
Largely copied from riscv64 but required recalculation of offsets.
Diffstat (limited to 'src/signal')
-rw-r--r--src/signal/riscv32/restore.s8
-rw-r--r--src/signal/riscv32/sigsetjmp.s23
2 files changed, 31 insertions, 0 deletions
diff --git a/src/signal/riscv32/restore.s b/src/signal/riscv32/restore.s
new file mode 100644
index 00000000..40012c75
--- /dev/null
+++ b/src/signal/riscv32/restore.s
@@ -0,0 +1,8 @@
+.global __restore
+.type __restore, %function
+__restore:
+.global __restore_rt
+.type __restore_rt, %function
+__restore_rt:
+ li a7, 139 # SYS_rt_sigreturn
+ ecall
diff --git a/src/signal/riscv32/sigsetjmp.s b/src/signal/riscv32/sigsetjmp.s
new file mode 100644
index 00000000..c1caeab1
--- /dev/null
+++ b/src/signal/riscv32/sigsetjmp.s
@@ -0,0 +1,23 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp, %function
+.type __sigsetjmp, %function
+sigsetjmp:
+__sigsetjmp:
+ bnez a1, 1f
+ tail setjmp
+1:
+
+ sw ra, 152(a0)
+ sw s0, 164(a0)
+ mv s0, a0
+
+ call setjmp
+
+ mv a1, a0
+ mv a0, s0
+ lw s0, 164(a0)
+ lw ra, 152(a0)
+
+.hidden __sigsetjmp_tail
+ tail __sigsetjmp_tail