about summary refs log tree commit diff
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
musl-c34a8eedff904b7f3d8479bbec0be534e7a01fbb.tar.xz
musl-c34a8eedff904b7f3d8479bbec0be534e7a01fbb.zip
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