cpu_gcc.S 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Date Author Notes
  7. * 2018-10-06 ZhaoXiaowei the first version
  8. * 2024-04-28 Shell add generic spinlock implementation
  9. */
  10. .text
  11. .globl rt_hw_get_current_el
  12. rt_hw_get_current_el:
  13. MRS X0, CurrentEL
  14. CMP X0, 0xc
  15. B.EQ 3f
  16. CMP X0, 0x8
  17. B.EQ 2f
  18. CMP X0, 0x4
  19. B.EQ 1f
  20. LDR X0, =0
  21. B 0f
  22. 3:
  23. LDR X0, =3
  24. B 0f
  25. 2:
  26. LDR X0, =2
  27. B 0f
  28. 1:
  29. LDR X0, =1
  30. B 0f
  31. 0:
  32. RET
  33. .globl rt_hw_set_current_vbar
  34. rt_hw_set_current_vbar:
  35. MRS X1, CurrentEL
  36. CMP X1, 0xc
  37. B.EQ 3f
  38. CMP X1, 0x8
  39. B.EQ 2f
  40. CMP X1, 0x4
  41. B.EQ 1f
  42. B 0f
  43. 3:
  44. MSR VBAR_EL3,X0
  45. B 0f
  46. 2:
  47. MSR VBAR_EL2,X0
  48. B 0f
  49. 1:
  50. MSR VBAR_EL1,X0
  51. B 0f
  52. 0:
  53. RET
  54. .globl rt_hw_set_elx_env
  55. rt_hw_set_elx_env:
  56. MRS X1, CurrentEL
  57. CMP X1, 0xc
  58. B.EQ 3f
  59. CMP X1, 0x8
  60. B.EQ 2f
  61. CMP X1, 0x4
  62. B.EQ 1f
  63. B 0f
  64. 3:
  65. MRS X0, SCR_EL3
  66. ORR X0, X0, #0xF /* SCR_EL3.NS|IRQ|FIQ|EA */
  67. MSR SCR_EL3, X0
  68. B 0f
  69. 2:
  70. MRS X0, HCR_EL2
  71. ORR X0, X0, #0x38
  72. MSR HCR_EL2, X0
  73. B 0f
  74. 1:
  75. B 0f
  76. 0:
  77. RET
  78. .globl rt_cpu_vector_set_base
  79. rt_cpu_vector_set_base:
  80. MSR VBAR_EL1,X0
  81. RET
  82. /**
  83. * unsigned long rt_hw_ffz(unsigned long x)
  84. */
  85. .globl rt_hw_ffz
  86. rt_hw_ffz:
  87. mvn x1, x0
  88. clz x0, x1
  89. mov x1, #0x3f
  90. sub x0, x1, x0
  91. ret
  92. .globl rt_hw_clz
  93. rt_hw_clz:
  94. clz x0, x0
  95. ret
  96. /**
  97. * Spinlock (fallback implementation)
  98. */
  99. rt_hw_spin_lock_init:
  100. .weak rt_hw_spin_lock_init
  101. stlr wzr, [x0]
  102. ret
  103. rt_hw_spin_trylock:
  104. .weak rt_hw_spin_trylock
  105. sub sp, sp, #16
  106. ldar w2, [x0]
  107. add x1, sp, 8
  108. stlr w2, [x1]
  109. ldarh w1, [x1]
  110. and w1, w1, 65535
  111. add x3, sp, 10
  112. ldarh w3, [x3]
  113. cmp w1, w3, uxth
  114. beq 1f
  115. mov w0, 0
  116. add sp, sp, 16
  117. ret
  118. 1:
  119. add x1, sp, 10
  120. 2:
  121. ldaxrh w3, [x1]
  122. add w3, w3, 1
  123. stlxrh w4, w3, [x1]
  124. cbnz w4, 2b
  125. add x1, sp, 8
  126. ldar w1, [x1]
  127. 3:
  128. ldaxr w3, [x0]
  129. cmp w3, w2
  130. bne 4f
  131. stxr w4, w1, [x0]
  132. cbnz w4, 3b
  133. 4:
  134. cset w0, eq
  135. add sp, sp, 16
  136. ret
  137. rt_hw_spin_lock:
  138. .weak rt_hw_spin_lock
  139. add x1, x0, 2
  140. 1:
  141. ldxrh w2, [x1]
  142. add w3, w2, 1
  143. stxrh w4, w3, [x1]
  144. cbnz w4, 1b
  145. and w2, w2, 65535
  146. ldarh w1, [x0]
  147. cmp w2, w1, uxth
  148. beq 3f
  149. sevl
  150. 2:
  151. wfe
  152. ldaxrh w1, [x0]
  153. cmp w2, w1
  154. bne 2b
  155. 3:
  156. ret
  157. rt_hw_spin_unlock:
  158. .weak rt_hw_spin_unlock
  159. ldxrh w1, [x0]
  160. add w1, w1, 1
  161. stlxrh w2, w1, [x0]
  162. cbnz w2, rt_hw_spin_unlock
  163. ret