123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- From 3a1861e54d4e891229a3ff94d00ba4da7030d81c Mon Sep 17 00:00:00 2001
- From: Stefan O'Rear <sorear@fastmail.com>
- Date: Thu, 3 Sep 2020 05:56:46 -0400
- Subject: [PATCH 14/15] riscv32: Add thread support
- Identical to riscv64 except for stack offsets in clone.
- ---
- src/thread/riscv32/__set_thread_area.s | 6 +++++
- src/thread/riscv32/__unmapself.s | 7 ++++++
- src/thread/riscv32/clone.s | 34 ++++++++++++++++++++++++++
- src/thread/riscv32/syscall_cp.s | 29 ++++++++++++++++++++++
- 4 files changed, 76 insertions(+)
- create mode 100644 src/thread/riscv32/__set_thread_area.s
- create mode 100644 src/thread/riscv32/__unmapself.s
- create mode 100644 src/thread/riscv32/clone.s
- create mode 100644 src/thread/riscv32/syscall_cp.s
- diff --git a/src/thread/riscv32/__set_thread_area.s b/src/thread/riscv32/__set_thread_area.s
- new file mode 100644
- index 00000000..828154d2
- --- /dev/null
- +++ b/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
- diff --git a/src/thread/riscv32/__unmapself.s b/src/thread/riscv32/__unmapself.s
- new file mode 100644
- index 00000000..2849119c
- --- /dev/null
- +++ b/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
- 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
- diff --git a/src/thread/riscv32/syscall_cp.s b/src/thread/riscv32/syscall_cp.s
- new file mode 100644
- index 00000000..079d1ba0
- --- /dev/null
- +++ b/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
- --
- 2.28.0
|