about summary refs log tree commit diff
path: root/src/thread/riscv32/clone.s
diff options
context:
space:
mode:
authorStefan O'Rear <sorear@fastmail.com>2020-09-03 05:56:46 -0400
committerRich Felker <dalias@aerifal.cx>2024-02-29 16:36:55 -0500
commitb28c44de8c3131b45588f61569b1711c987ba1c3 (patch)
tree7d96859d2728bdf84695978b22c53e6563c896c8 /src/thread/riscv32/clone.s
parentc34a8eedff904b7f3d8479bbec0be534e7a01fbb (diff)
downloadmusl-b28c44de8c3131b45588f61569b1711c987ba1c3.tar.gz
musl-b28c44de8c3131b45588f61569b1711c987ba1c3.tar.xz
musl-b28c44de8c3131b45588f61569b1711c987ba1c3.zip
riscv32: add thread support
Identical to riscv64 except for stack offsets in clone.
Diffstat (limited to 'src/thread/riscv32/clone.s')
-rw-r--r--src/thread/riscv32/clone.s34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/thread/riscv32/clone.s b/src/thread/riscv32/clone.s
new file mode 100644
index 00000000..3102239d
--- /dev/null
+++ b/src/thread/riscv32/clone.s
@@ -0,0 +1,34 @@
+# __clone(func, stack, flags, arg, ptid, tls, ctid)
+#           a0,    a1,    a2,  a3,   a4,  a5,   a6
+
+# syscall(SYS_clone, flags, stack, ptid, tls, ctid)
+#                a7     a0,    a1,   a2,  a3,   a4
+
+.global __clone
+.type  __clone, %function
+__clone:
+	# Save func and arg to stack
+	addi a1, a1, -16
+	sw a0, 0(a1)
+	sw a3, 4(a1)
+
+	# Call SYS_clone
+	mv a0, a2
+	mv a2, a4
+	mv a3, a5
+	mv a4, a6
+	li a7, 220 # SYS_clone
+	ecall
+
+	beqz a0, 1f
+	# Parent
+	ret
+
+	# Child
+1:      lw a1, 0(sp)
+	lw a0, 4(sp)
+	jalr a1
+
+	# Exit
+	li a7, 93 # SYS_exit
+	ecall