diff options
author | Stefan O'Rear <sorear@fastmail.com> | 2020-09-03 05:56:46 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2024-02-29 16:36:55 -0500 |
commit | b28c44de8c3131b45588f61569b1711c987ba1c3 (patch) | |
tree | 7d96859d2728bdf84695978b22c53e6563c896c8 /src/thread/riscv32/clone.s | |
parent | c34a8eedff904b7f3d8479bbec0be534e7a01fbb (diff) | |
download | musl-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.s | 34 |
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 |