entry.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __ASM_CSKY_ENTRY_H
  3. #define __ASM_CSKY_ENTRY_H
  4. #include <asm/setup.h>
  5. #include <abi/regdef.h>
  6. #define LSAVE_PC 8
  7. #define LSAVE_PSR 12
  8. #define LSAVE_A0 24
  9. #define LSAVE_A1 28
  10. #define LSAVE_A2 32
  11. #define LSAVE_A3 36
  12. #define LSAVE_A4 40
  13. #define LSAVE_A5 44
  14. #define KSPTOUSP
  15. #define USPTOKSP
  16. #define usp cr<14, 1>
  17. .macro SAVE_ALL epc_inc
  18. subi sp, 152
  19. stw tls, (sp, 0)
  20. stw lr, (sp, 4)
  21. RD_MEH lr
  22. WR_MEH lr
  23. mfcr lr, epc
  24. movi tls, \epc_inc
  25. add lr, tls
  26. stw lr, (sp, 8)
  27. mfcr lr, epsr
  28. stw lr, (sp, 12)
  29. btsti lr, 31
  30. bf 1f
  31. addi lr, sp, 152
  32. br 2f
  33. 1:
  34. mfcr lr, usp
  35. 2:
  36. stw lr, (sp, 16)
  37. stw a0, (sp, 20)
  38. stw a0, (sp, 24)
  39. stw a1, (sp, 28)
  40. stw a2, (sp, 32)
  41. stw a3, (sp, 36)
  42. addi sp, 40
  43. stm r4-r13, (sp)
  44. addi sp, 40
  45. stm r16-r30, (sp)
  46. #ifdef CONFIG_CPU_HAS_HILO
  47. mfhi lr
  48. stw lr, (sp, 60)
  49. mflo lr
  50. stw lr, (sp, 64)
  51. mfcr lr, cr14
  52. stw lr, (sp, 68)
  53. #endif
  54. subi sp, 80
  55. .endm
  56. .macro RESTORE_ALL
  57. ldw tls, (sp, 0)
  58. ldw lr, (sp, 4)
  59. ldw a0, (sp, 8)
  60. mtcr a0, epc
  61. ldw a0, (sp, 12)
  62. mtcr a0, epsr
  63. btsti a0, 31
  64. ldw a0, (sp, 16)
  65. mtcr a0, usp
  66. mtcr a0, ss0
  67. #ifdef CONFIG_CPU_HAS_HILO
  68. ldw a0, (sp, 140)
  69. mthi a0
  70. ldw a0, (sp, 144)
  71. mtlo a0
  72. ldw a0, (sp, 148)
  73. mtcr a0, cr14
  74. #endif
  75. ldw a0, (sp, 24)
  76. ldw a1, (sp, 28)
  77. ldw a2, (sp, 32)
  78. ldw a3, (sp, 36)
  79. addi sp, 40
  80. ldm r4-r13, (sp)
  81. addi sp, 40
  82. ldm r16-r30, (sp)
  83. addi sp, 72
  84. bf 1f
  85. mfcr sp, ss0
  86. 1:
  87. rte
  88. .endm
  89. .macro SAVE_REGS_FTRACE
  90. subi sp, 152
  91. stw tls, (sp, 0)
  92. stw lr, (sp, 4)
  93. mfcr lr, psr
  94. stw lr, (sp, 12)
  95. addi lr, sp, 152
  96. stw lr, (sp, 16)
  97. stw a0, (sp, 20)
  98. stw a0, (sp, 24)
  99. stw a1, (sp, 28)
  100. stw a2, (sp, 32)
  101. stw a3, (sp, 36)
  102. addi sp, 40
  103. stm r4-r13, (sp)
  104. addi sp, 40
  105. stm r16-r30, (sp)
  106. #ifdef CONFIG_CPU_HAS_HILO
  107. mfhi lr
  108. stw lr, (sp, 60)
  109. mflo lr
  110. stw lr, (sp, 64)
  111. mfcr lr, cr14
  112. stw lr, (sp, 68)
  113. #endif
  114. subi sp, 80
  115. .endm
  116. .macro RESTORE_REGS_FTRACE
  117. ldw tls, (sp, 0)
  118. #ifdef CONFIG_CPU_HAS_HILO
  119. ldw a0, (sp, 140)
  120. mthi a0
  121. ldw a0, (sp, 144)
  122. mtlo a0
  123. ldw a0, (sp, 148)
  124. mtcr a0, cr14
  125. #endif
  126. ldw a0, (sp, 24)
  127. ldw a1, (sp, 28)
  128. ldw a2, (sp, 32)
  129. ldw a3, (sp, 36)
  130. addi sp, 40
  131. ldm r4-r13, (sp)
  132. addi sp, 40
  133. ldm r16-r30, (sp)
  134. addi sp, 72
  135. .endm
  136. .macro SAVE_SWITCH_STACK
  137. subi sp, 64
  138. stm r4-r11, (sp)
  139. stw lr, (sp, 32)
  140. stw r16, (sp, 36)
  141. stw r17, (sp, 40)
  142. stw r26, (sp, 44)
  143. stw r27, (sp, 48)
  144. stw r28, (sp, 52)
  145. stw r29, (sp, 56)
  146. stw r30, (sp, 60)
  147. #ifdef CONFIG_CPU_HAS_HILO
  148. subi sp, 16
  149. mfhi lr
  150. stw lr, (sp, 0)
  151. mflo lr
  152. stw lr, (sp, 4)
  153. mfcr lr, cr14
  154. stw lr, (sp, 8)
  155. #endif
  156. .endm
  157. .macro RESTORE_SWITCH_STACK
  158. #ifdef CONFIG_CPU_HAS_HILO
  159. ldw lr, (sp, 0)
  160. mthi lr
  161. ldw lr, (sp, 4)
  162. mtlo lr
  163. ldw lr, (sp, 8)
  164. mtcr lr, cr14
  165. addi sp, 16
  166. #endif
  167. ldm r4-r11, (sp)
  168. ldw lr, (sp, 32)
  169. ldw r16, (sp, 36)
  170. ldw r17, (sp, 40)
  171. ldw r26, (sp, 44)
  172. ldw r27, (sp, 48)
  173. ldw r28, (sp, 52)
  174. ldw r29, (sp, 56)
  175. ldw r30, (sp, 60)
  176. addi sp, 64
  177. .endm
  178. /* MMU registers operators. */
  179. .macro RD_MIR rx
  180. mfcr \rx, cr<0, 15>
  181. .endm
  182. .macro RD_MEH rx
  183. mfcr \rx, cr<4, 15>
  184. .endm
  185. .macro RD_MCIR rx
  186. mfcr \rx, cr<8, 15>
  187. .endm
  188. .macro RD_PGDR rx
  189. mfcr \rx, cr<29, 15>
  190. .endm
  191. .macro RD_PGDR_K rx
  192. mfcr \rx, cr<28, 15>
  193. .endm
  194. .macro WR_MEH rx
  195. mtcr \rx, cr<4, 15>
  196. .endm
  197. .macro WR_MCIR rx
  198. mtcr \rx, cr<8, 15>
  199. .endm
  200. #ifdef CONFIG_PAGE_OFFSET_80000000
  201. #define MSA_SET cr<30, 15>
  202. #define MSA_CLR cr<31, 15>
  203. #endif
  204. #ifdef CONFIG_PAGE_OFFSET_A0000000
  205. #define MSA_SET cr<31, 15>
  206. #define MSA_CLR cr<30, 15>
  207. #endif
  208. .macro SETUP_MMU
  209. /* Init psr and enable ee */
  210. lrw r6, DEFAULT_PSR_VALUE
  211. mtcr r6, psr
  212. psrset ee
  213. /* Invalid I/Dcache BTB BHT */
  214. movi r6, 7
  215. lsli r6, 16
  216. addi r6, (1<<4) | 3
  217. mtcr r6, cr17
  218. /* Invalid all TLB */
  219. bgeni r6, 26
  220. mtcr r6, cr<8, 15> /* Set MCIR */
  221. /* Check MMU on/off */
  222. mfcr r6, cr18
  223. btsti r6, 0
  224. bt 1f
  225. /* MMU off: setup mapping tlb entry */
  226. movi r6, 0
  227. mtcr r6, cr<6, 15> /* Set MPR with 4K page size */
  228. grs r6, 1f /* Get current pa by PC */
  229. bmaski r7, (PAGE_SHIFT + 1) /* r7 = 0x1fff */
  230. andn r6, r7
  231. mtcr r6, cr<4, 15> /* Set MEH */
  232. mov r8, r6
  233. movi r7, 0x00000006
  234. or r8, r7
  235. mtcr r8, cr<2, 15> /* Set MEL0 */
  236. movi r7, 0x00001006
  237. or r8, r7
  238. mtcr r8, cr<3, 15> /* Set MEL1 */
  239. bgeni r8, 28
  240. mtcr r8, cr<8, 15> /* Set MCIR to write TLB */
  241. br 2f
  242. 1:
  243. /*
  244. * MMU on: use origin MSA value from bootloader
  245. *
  246. * cr<30/31, 15> MSA register format:
  247. * 31 - 29 | 28 - 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
  248. * BA Reserved SH WA B SO SEC C D V
  249. */
  250. mfcr r6, MSA_SET /* Get MSA */
  251. 2:
  252. lsri r6, 29
  253. lsli r6, 29
  254. addi r6, 0x1ce
  255. mtcr r6, MSA_SET /* Set MSA */
  256. movi r6, 0
  257. mtcr r6, MSA_CLR /* Clr MSA */
  258. /* enable MMU */
  259. mfcr r6, cr18
  260. bseti r6, 0
  261. mtcr r6, cr18
  262. jmpi 3f /* jump to va */
  263. 3:
  264. .endm
  265. #endif /* __ASM_CSKY_ENTRY_H */