os_cpu_common.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. #include "nds32.h"
  2. .set regno, 0
  3. #ifdef __TARGET_IFC_EXT
  4. .set regno, regno+1
  5. #endif
  6. #ifdef __TARGET_ZOL_EXT
  7. .set regno, regno+3
  8. #endif
  9. /* Descend PSW.INTL and enable PSW.AEN */
  10. .macro IntlDescend
  11. mfsr $r1, $PSW
  12. #ifdef __TARGET_ZOL_EXT
  13. /* Also enable ZOL (PSW.AEN) */
  14. xori $r1, $r1, #((1 << 13) | (1 << 1))
  15. #else
  16. addi $r1, $r1, #-2
  17. #endif
  18. mtsr $r1, $PSW
  19. .endm
  20. /* FPU registers */
  21. .macro SAVE_FPU_REGS_00
  22. fsdi.bi $fd3, [$sp], -8
  23. fsdi.bi $fd2, [$sp], -8
  24. fsdi.bi $fd1, [$sp], -8
  25. fsdi $fd0, [$sp+0]
  26. .endm
  27. .macro SAVE_FPU_REGS_01
  28. fsdi.bi $fd7, [$sp], -8
  29. fsdi.bi $fd6, [$sp], -8
  30. fsdi.bi $fd5, [$sp], -8
  31. fsdi.bi $fd4, [$sp], -8
  32. SAVE_FPU_REGS_00
  33. .endm
  34. .macro SAVE_FPU_REGS_02
  35. fsdi.bi $fd15, [$sp], -8
  36. fsdi.bi $fd14, [$sp], -8
  37. fsdi.bi $fd13, [$sp], -8
  38. fsdi.bi $fd12, [$sp], -8
  39. fsdi.bi $fd11, [$sp], -8
  40. fsdi.bi $fd10, [$sp], -8
  41. fsdi.bi $fd9, [$sp], -8
  42. fsdi.bi $fd8, [$sp], -8
  43. SAVE_FPU_REGS_01
  44. .endm
  45. .macro SAVE_FPU_REGS_03
  46. fsdi.bi $fd31, [$sp], -8
  47. fsdi.bi $fd30, [$sp], -8
  48. fsdi.bi $fd29, [$sp], -8
  49. fsdi.bi $fd28, [$sp], -8
  50. fsdi.bi $fd27, [$sp], -8
  51. fsdi.bi $fd26, [$sp], -8
  52. fsdi.bi $fd25, [$sp], -8
  53. fsdi.bi $fd24, [$sp], -8
  54. fsdi.bi $fd23, [$sp], -8
  55. fsdi.bi $fd22, [$sp], -8
  56. fsdi.bi $fd21, [$sp], -8
  57. fsdi.bi $fd20, [$sp], -8
  58. fsdi.bi $fd19, [$sp], -8
  59. fsdi.bi $fd18, [$sp], -8
  60. fsdi.bi $fd17, [$sp], -8
  61. fsdi.bi $fd16, [$sp], -8
  62. SAVE_FPU_REGS_02
  63. .endm
  64. .macro push_fpu
  65. #if defined(__NDS32_EXT_FPU_CONFIG_0__)
  66. addi $sp, $sp, -8
  67. SAVE_FPU_REGS_00
  68. #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
  69. addi $sp, $sp, -8
  70. SAVE_FPU_REGS_01
  71. #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
  72. addi $sp, $sp, -8
  73. SAVE_FPU_REGS_02
  74. #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
  75. addi $sp, $sp, -8
  76. SAVE_FPU_REGS_03
  77. #else
  78. #endif
  79. .endm
  80. .macro RESTORE_FPU_REGS_00
  81. fldi.bi $fd0, [$sp], 8
  82. fldi.bi $fd1, [$sp], 8
  83. fldi.bi $fd2, [$sp], 8
  84. fldi.bi $fd3, [$sp], 8
  85. .endm
  86. .macro RESTORE_FPU_REGS_01
  87. RESTORE_FPU_REGS_00
  88. fldi.bi $fd4, [$sp], 8
  89. fldi.bi $fd5, [$sp], 8
  90. fldi.bi $fd6, [$sp], 8
  91. fldi.bi $fd7, [$sp], 8
  92. .endm
  93. .macro RESTORE_FPU_REGS_02
  94. RESTORE_FPU_REGS_01
  95. fldi.bi $fd8, [$sp], 8
  96. fldi.bi $fd9, [$sp], 8
  97. fldi.bi $fd10, [$sp], 8
  98. fldi.bi $fd11, [$sp], 8
  99. fldi.bi $fd12, [$sp], 8
  100. fldi.bi $fd13, [$sp], 8
  101. fldi.bi $fd14, [$sp], 8
  102. fldi.bi $fd15, [$sp], 8
  103. .endm
  104. .macro RESTORE_FPU_REGS_03
  105. RESTORE_FPU_REGS_02
  106. fldi.bi $fd16, [$sp], 8
  107. fldi.bi $fd17, [$sp], 8
  108. fldi.bi $fd18, [$sp], 8
  109. fldi.bi $fd19, [$sp], 8
  110. fldi.bi $fd20, [$sp], 8
  111. fldi.bi $fd21, [$sp], 8
  112. fldi.bi $fd22, [$sp], 8
  113. fldi.bi $fd23, [$sp], 8
  114. fldi.bi $fd24, [$sp], 8
  115. fldi.bi $fd25, [$sp], 8
  116. fldi.bi $fd26, [$sp], 8
  117. fldi.bi $fd27, [$sp], 8
  118. fldi.bi $fd28, [$sp], 8
  119. fldi.bi $fd29, [$sp], 8
  120. fldi.bi $fd30, [$sp], 8
  121. fldi.bi $fd31, [$sp], 8
  122. .endm
  123. .macro pop_fpu
  124. #if defined(__NDS32_EXT_FPU_CONFIG_0__)
  125. RESTORE_FPU_REGS_00
  126. #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
  127. RESTORE_FPU_REGS_01
  128. #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
  129. RESTORE_FPU_REGS_02
  130. #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
  131. RESTORE_FPU_REGS_03
  132. #else
  133. #endif
  134. .endm
  135. /* FPU Caller registers */
  136. .macro SAVE_FPU_CALLER_REGS_00
  137. addi $sp, $sp, -8
  138. fsdi.bi $fd2, [$sp], -8
  139. fsdi.bi $fd1, [$sp], -8
  140. fsdi $fd0, [$sp+0]
  141. .endm
  142. .macro SAVE_FPU_CALLER_REGS_01
  143. SAVE_FPU_CALLER_REGS_00
  144. .endm
  145. .macro SAVE_FPU_CALLER_REGS_02
  146. addi $sp, $sp, -8
  147. fsdi.bi $fd15, [$sp], -8
  148. fsdi.bi $fd14, [$sp], -8
  149. fsdi.bi $fd13, [$sp], -8
  150. fsdi.bi $fd12, [$sp], -8
  151. fsdi.bi $fd11, [$sp], -8
  152. fsdi.bi $fd2, [$sp], -8
  153. fsdi.bi $fd1, [$sp], -8
  154. fsdi $fd0, [$sp+0]
  155. .endm
  156. .macro SAVE_FPU_CALLER_REGS_03
  157. addi $sp, $sp, -8
  158. fsdi.bi $fd23, [$sp], -8
  159. fsdi.bi $fd22, [$sp], -8
  160. fsdi.bi $fd21, [$sp], -8
  161. fsdi.bi $fd20, [$sp], -8
  162. fsdi.bi $fd19, [$sp], -8
  163. fsdi.bi $fd18, [$sp], -8
  164. fsdi.bi $fd17, [$sp], -8
  165. fsdi.bi $fd16, [$sp], -8
  166. fsdi.bi $fd15, [$sp], -8
  167. fsdi.bi $fd14, [$sp], -8
  168. fsdi.bi $fd13, [$sp], -8
  169. fsdi.bi $fd12, [$sp], -8
  170. fsdi.bi $fd11, [$sp], -8
  171. fsdi.bi $fd2, [$sp], -8
  172. fsdi.bi $fd1, [$sp], -8
  173. fsdi $fd0, [$sp+0]
  174. .endm
  175. .macro push_fpu_caller
  176. #if defined(__NDS32_EXT_FPU_CONFIG_0__)
  177. SAVE_FPU_CALLER_REGS_00
  178. #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
  179. SAVE_FPU_CALLER_REGS_01
  180. #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
  181. SAVE_FPU_CALLER_REGS_02
  182. #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
  183. SAVE_FPU_CALLER_REGS_03
  184. #else
  185. #endif
  186. .endm
  187. .macro RESTORE_FPU_CALLER_REGS_00
  188. fldi.bi $fd0, [$sp], 8
  189. fldi.bi $fd1, [$sp], 8
  190. fldi.bi $fd2, [$sp], 8
  191. .endm
  192. .macro RESTORE_FPU_CALLER_REGS_01
  193. RESTORE_FPU_CALLER_REGS_00
  194. .endm
  195. .macro RESTORE_FPU_CALLER_REGS_02
  196. fldi.bi $fd0, [$sp], 8
  197. fldi.bi $fd1, [$sp], 8
  198. fldi.bi $fd2, [$sp], 8
  199. fldi.bi $fd11, [$sp], 8
  200. fldi.bi $fd12, [$sp], 8
  201. fldi.bi $fd13, [$sp], 8
  202. fldi.bi $fd14, [$sp], 8
  203. fldi.bi $fd15, [$sp], 8
  204. .endm
  205. .macro RESTORE_FPU_CALLER_REGS_03
  206. fldi.bi $fd0, [$sp], 8
  207. fldi.bi $fd1, [$sp], 8
  208. fldi.bi $fd2, [$sp], 8
  209. fldi.bi $fd11, [$sp], 8
  210. fldi.bi $fd12, [$sp], 8
  211. fldi.bi $fd13, [$sp], 8
  212. fldi.bi $fd14, [$sp], 8
  213. fldi.bi $fd15, [$sp], 8
  214. fldi.bi $fd16, [$sp], 8
  215. fldi.bi $fd17, [$sp], 8
  216. fldi.bi $fd18, [$sp], 8
  217. fldi.bi $fd19, [$sp], 8
  218. fldi.bi $fd20, [$sp], 8
  219. fldi.bi $fd21, [$sp], 8
  220. fldi.bi $fd22, [$sp], 8
  221. fldi.bi $fd23, [$sp], 8
  222. .endm
  223. .macro pop_fpu_caller
  224. #if defined(__NDS32_EXT_FPU_CONFIG_0__)
  225. RESTORE_FPU_CALLER_REGS_00
  226. #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
  227. RESTORE_FPU_CALLER_REGS_01
  228. #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
  229. RESTORE_FPU_CALLER_REGS_02
  230. #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
  231. RESTORE_FPU_CALLER_REGS_03
  232. #else
  233. #endif
  234. .endm
  235. /* IFC system register */
  236. .macro MFUSR_IFC R0="$r1"
  237. mfusr \R0, $IFC_LP
  238. .endm
  239. .macro MTUSR_IFC R0="$r1"
  240. mtusr \R0, $IFC_LP
  241. .endm
  242. /* ZOL system registers */
  243. .macro MFUSR_ZOL R0="$r1", R1="$r2", R2="$r3"
  244. mfusr \R0, $LB
  245. mfusr \R1, $LE
  246. mfusr \R2, $LC
  247. .endm
  248. .macro MTUSR_ZOL R0="$r1", R1="$r2", R2="$r3"
  249. mtusr \R0, $LB
  250. mtusr \R1, $LE
  251. mtusr \R2, $LC
  252. .endm
  253. /* Context-switch save and restore routines */
  254. .macro SAVE_ALL
  255. pushm $r6, $r30
  256. mfsr $r1, $IPC
  257. mfsr $r2, $IPSW
  258. .if (regno == 4)
  259. MFUSR_ZOL "$r3","$r4","$r5"
  260. MFUSR_IFC "$r6"
  261. pushm $r0, $r6 /* $0 is dummy */
  262. .else
  263. .if (regno == 3)
  264. MFUSR_ZOL "$r3","$r4","$r5"
  265. pushm $r1, $r5
  266. .else
  267. .if (regno == 1)
  268. MFUSR_IFC "$r3"
  269. pushm $r1, $r3
  270. .else
  271. pushm $r1, $r2
  272. .endif
  273. .endif
  274. .endif
  275. push_fpu
  276. .endm
  277. .macro RESTORE_ALL
  278. pop_fpu
  279. setgie.d
  280. dsb
  281. .if (regno == 4)
  282. popm $r0, $r6 /* $0 is dummy */
  283. MTUSR_ZOL "$r3","$r4","$r5"
  284. MTUSR_IFC "$r6"
  285. .else
  286. .if (regno == 3)
  287. popm $r1, $r5
  288. MTUSR_ZOL "$r3","$r4","$r5"
  289. .else
  290. .if (regno == 1)
  291. popm $r1, $r3
  292. MTUSR_IFC "$r3"
  293. .else
  294. popm $r1, $r2
  295. .endif
  296. .endif
  297. .endif
  298. mtsr $r1, $IPC
  299. mtsr $r2, $IPSW
  300. popm $r6, $r30
  301. popm $r0, $r5
  302. .endm
  303. /* Nested IRQ save and restore routines*/
  304. .macro SAVE_CALLER
  305. pushm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr */
  306. .if (regno == 4)
  307. MFUSR_ZOL "$r1","$r2","$r3"
  308. MFUSR_IFC "$r4"
  309. pushm $r1, $r4
  310. mfsr $r1, $IPC
  311. mfsr $r2, $IPSW
  312. pushm $r1, $r2
  313. .else
  314. mfsr $r1, $IPC
  315. mfsr $r2, $IPSW
  316. .if (regno == 3)
  317. MFUSR_ZOL "$r3","$r4","$r5"
  318. pushm $r0, $r5 /* $0 is dummy */
  319. .else
  320. .if (regno == 1)
  321. MFUSR_IFC "$r3"
  322. pushm $r0, $r3 /* $r0 is dummy */
  323. .else
  324. pushm $r1, $r2
  325. .endif
  326. .endif
  327. .endif
  328. push_fpu_caller
  329. .endm
  330. .macro RESTORE_CALLER
  331. pop_fpu_caller
  332. setgie.d
  333. dsb
  334. .if (regno == 4)
  335. popm $r1, $r2
  336. mtsr $r1, $IPC
  337. mtsr $r2, $IPSW
  338. popm $r1, $r4
  339. MTUSR_ZOL "$r1","$r2","$r3"
  340. MTUSR_IFC "$r4"
  341. .else
  342. .if (regno == 3)
  343. popm $r0, $r5 /* $0 is dummy */
  344. MTUSR_ZOL "$r3","$r4","$r5"
  345. .else
  346. .if (regno == 1)
  347. popm $r0, $r3 /* $0 is dummy */
  348. MTUSR_IFC "$r3"
  349. .else
  350. popm $r1, $r2
  351. .endif
  352. .endif
  353. mtsr $r1, $IPC
  354. mtsr $r2, $IPSW
  355. .endif
  356. popm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr*/
  357. popm $r0, $r5
  358. .endm
  359. /* Non-Nested IRQ save and restore routines */
  360. .macro SAVE_CALLER_UNNESTED
  361. pushm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr */
  362. .if (regno == 1)
  363. MFUSR_IFC "$r1"
  364. pushm $r0, $r1 /* $r0 is dummy */
  365. .endif
  366. push_fpu_caller
  367. .endm
  368. .macro RESTORE_CALLER_UNNESTED
  369. pop_fpu_caller
  370. .if (regno == 1)
  371. setgie.d
  372. dsb
  373. popm $r0, $r1 /* $0 is dummy */
  374. MTUSR_IFC "$r1"
  375. .endif
  376. popm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr*/
  377. popm $r0, $r5
  378. .endm