Browse Source

riscv32: add thread support

Identical to riscv64 except for stack offsets in clone.
master
Stefan O'Rear 6 years ago
committed by Rich Felker
parent
commit
b28c44de8c
  1. 6
      src/thread/riscv32/__set_thread_area.s
  2. 7
      src/thread/riscv32/__unmapself.s
  3. 34
      src/thread/riscv32/clone.s
  4. 29
      src/thread/riscv32/syscall_cp.s

6
src/thread/riscv32/__set_thread_area.s

@ -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

@ -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

@ -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

@ -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…
Cancel
Save