mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
riscv32: add thread support
Identical to riscv64 except for stack offsets in clone.
This commit is contained in:
parent
c34a8eedff
commit
b28c44de8c
4 changed files with 76 additions and 0 deletions
6
src/thread/riscv32/__set_thread_area.s
Normal file
6
src/thread/riscv32/__set_thread_area.s
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
.global __set_thread_area
|
||||||
|
.type __set_thread_area, %function
|
||||||
|
__set_thread_area:
|
||||||
|
mv tp, a0
|
||||||
|
li a0, 0
|
||||||
|
ret
|
7
src/thread/riscv32/__unmapself.s
Normal file
7
src/thread/riscv32/__unmapself.s
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
.global __unmapself
|
||||||
|
.type __unmapself, %function
|
||||||
|
__unmapself:
|
||||||
|
li a7, 215 # SYS_munmap
|
||||||
|
ecall
|
||||||
|
li a7, 93 # SYS_exit
|
||||||
|
ecall
|
34
src/thread/riscv32/clone.s
Normal file
34
src/thread/riscv32/clone.s
Normal file
|
@ -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
|
29
src/thread/riscv32/syscall_cp.s
Normal file
29
src/thread/riscv32/syscall_cp.s
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
.global __cp_begin
|
||||||
|
.hidden __cp_begin
|
||||||
|
.global __cp_end
|
||||||
|
.hidden __cp_end
|
||||||
|
.global __cp_cancel
|
||||||
|
.hidden __cp_cancel
|
||||||
|
.hidden __cancel
|
||||||
|
.global __syscall_cp_asm
|
||||||
|
.hidden __syscall_cp_asm
|
||||||
|
.type __syscall_cp_asm, %function
|
||||||
|
__syscall_cp_asm:
|
||||||
|
__cp_begin:
|
||||||
|
lw t0, 0(a0)
|
||||||
|
bnez t0, __cp_cancel
|
||||||
|
|
||||||
|
mv t0, a1
|
||||||
|
mv a0, a2
|
||||||
|
mv a1, a3
|
||||||
|
mv a2, a4
|
||||||
|
mv a3, a5
|
||||||
|
mv a4, a6
|
||||||
|
mv a5, a7
|
||||||
|
lw a6, 0(sp)
|
||||||
|
mv a7, t0
|
||||||
|
ecall
|
||||||
|
__cp_end:
|
||||||
|
ret
|
||||||
|
__cp_cancel:
|
||||||
|
tail __cancel
|
Loading…
Add table
Reference in a new issue