riscv32: add thread support

Identical to riscv64 except for stack offsets in clone.
This commit is contained in:
Stefan O'Rear 2020-09-03 05:56:46 -04:00 committed by Rich Felker
parent c34a8eedff
commit b28c44de8c
4 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,6 @@
.global __set_thread_area
.type __set_thread_area, %function
__set_thread_area:
mv tp, a0
li a0, 0
ret

View File

@ -0,0 +1,7 @@
.global __unmapself
.type __unmapself, %function
__unmapself:
li a7, 215 # SYS_munmap
ecall
li a7, 93 # SYS_exit
ecall

View 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

View 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