0014-riscv32-Add-thread-support.patch 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. From 3a1861e54d4e891229a3ff94d00ba4da7030d81c Mon Sep 17 00:00:00 2001
  2. From: Stefan O'Rear <sorear@fastmail.com>
  3. Date: Thu, 3 Sep 2020 05:56:46 -0400
  4. Subject: [PATCH 14/15] riscv32: Add thread support
  5. Identical to riscv64 except for stack offsets in clone.
  6. ---
  7. src/thread/riscv32/__set_thread_area.s | 6 +++++
  8. src/thread/riscv32/__unmapself.s | 7 ++++++
  9. src/thread/riscv32/clone.s | 34 ++++++++++++++++++++++++++
  10. src/thread/riscv32/syscall_cp.s | 29 ++++++++++++++++++++++
  11. 4 files changed, 76 insertions(+)
  12. create mode 100644 src/thread/riscv32/__set_thread_area.s
  13. create mode 100644 src/thread/riscv32/__unmapself.s
  14. create mode 100644 src/thread/riscv32/clone.s
  15. create mode 100644 src/thread/riscv32/syscall_cp.s
  16. diff --git a/src/thread/riscv32/__set_thread_area.s b/src/thread/riscv32/__set_thread_area.s
  17. new file mode 100644
  18. index 00000000..828154d2
  19. --- /dev/null
  20. +++ b/src/thread/riscv32/__set_thread_area.s
  21. @@ -0,0 +1,6 @@
  22. +.global __set_thread_area
  23. +.type __set_thread_area, %function
  24. +__set_thread_area:
  25. + mv tp, a0
  26. + li a0, 0
  27. + ret
  28. diff --git a/src/thread/riscv32/__unmapself.s b/src/thread/riscv32/__unmapself.s
  29. new file mode 100644
  30. index 00000000..2849119c
  31. --- /dev/null
  32. +++ b/src/thread/riscv32/__unmapself.s
  33. @@ -0,0 +1,7 @@
  34. +.global __unmapself
  35. +.type __unmapself, %function
  36. +__unmapself:
  37. + li a7, 215 # SYS_munmap
  38. + ecall
  39. + li a7, 93 # SYS_exit
  40. + ecall
  41. diff --git a/src/thread/riscv32/clone.s b/src/thread/riscv32/clone.s
  42. new file mode 100644
  43. index 00000000..3102239d
  44. --- /dev/null
  45. +++ b/src/thread/riscv32/clone.s
  46. @@ -0,0 +1,34 @@
  47. +# __clone(func, stack, flags, arg, ptid, tls, ctid)
  48. +# a0, a1, a2, a3, a4, a5, a6
  49. +
  50. +# syscall(SYS_clone, flags, stack, ptid, tls, ctid)
  51. +# a7 a0, a1, a2, a3, a4
  52. +
  53. +.global __clone
  54. +.type __clone, %function
  55. +__clone:
  56. + # Save func and arg to stack
  57. + addi a1, a1, -16
  58. + sw a0, 0(a1)
  59. + sw a3, 4(a1)
  60. +
  61. + # Call SYS_clone
  62. + mv a0, a2
  63. + mv a2, a4
  64. + mv a3, a5
  65. + mv a4, a6
  66. + li a7, 220 # SYS_clone
  67. + ecall
  68. +
  69. + beqz a0, 1f
  70. + # Parent
  71. + ret
  72. +
  73. + # Child
  74. +1: lw a1, 0(sp)
  75. + lw a0, 4(sp)
  76. + jalr a1
  77. +
  78. + # Exit
  79. + li a7, 93 # SYS_exit
  80. + ecall
  81. diff --git a/src/thread/riscv32/syscall_cp.s b/src/thread/riscv32/syscall_cp.s
  82. new file mode 100644
  83. index 00000000..079d1ba0
  84. --- /dev/null
  85. +++ b/src/thread/riscv32/syscall_cp.s
  86. @@ -0,0 +1,29 @@
  87. +.global __cp_begin
  88. +.hidden __cp_begin
  89. +.global __cp_end
  90. +.hidden __cp_end
  91. +.global __cp_cancel
  92. +.hidden __cp_cancel
  93. +.hidden __cancel
  94. +.global __syscall_cp_asm
  95. +.hidden __syscall_cp_asm
  96. +.type __syscall_cp_asm, %function
  97. +__syscall_cp_asm:
  98. +__cp_begin:
  99. + lw t0, 0(a0)
  100. + bnez t0, __cp_cancel
  101. +
  102. + mv t0, a1
  103. + mv a0, a2
  104. + mv a1, a3
  105. + mv a2, a4
  106. + mv a3, a5
  107. + mv a4, a6
  108. + mv a5, a7
  109. + lw a6, 0(sp)
  110. + mv a7, t0
  111. + ecall
  112. +__cp_end:
  113. + ret
  114. +__cp_cancel:
  115. + tail __cancel
  116. --
  117. 2.28.0