contextinc.asm 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. ;
  2. ; Copyright (c) 2021, Shenzhen Academy of Aerospace Technology
  3. ;
  4. ; SPDX-License-Identifier: Apache-2.0
  5. ;
  6. ; Change Logs:
  7. ; Date Author Notes
  8. ; 2021-11-16 Dystopia the first version
  9. ;
  10. ;-----------------------------------------------------------
  11. ; macro definition
  12. ;-----------------------------------------------------------
  13. SAVE_ALL .macro __rp, __tsr
  14. STW .D2T2 B0,*SP--[2] ; save original B0
  15. MVKL .S2 rt_system_stack_top,B0
  16. MVKH .S2 rt_system_stack_top,B0
  17. LDW .D2T2 *B0,B1 ; system stack
  18. NOP 3
  19. STW .D2T2 B1,*+SP[1] ; save original B1
  20. XOR .D2 SP,B1,B0 ; check current stack types
  21. LDW .D2T2 *+SP[1],B1 ; restore B0/B1
  22. LDW .D2T2 *++SP[2],B0
  23. SHR .S2 B0,12,B0 ; 0 if already using system stack
  24. [B0] STDW .D2T2 SP:DP,*--B1[1] ; thread: save thread sp/dp system stack
  25. [B0] MV .S2 B1,SP ; and switch to system stack
  26. ||[!B0] STDW .D2T2 SP:DP,*--SP[1] ; kernel: nest interrupt save(not support)
  27. SUBAW .D2 SP,2,SP
  28. ADD .D1X SP,-8,A15
  29. || STDW .D2T1 A15:A14,*SP--[16] ; save A15:A14
  30. STDW .D2T2 B13:B12,*SP--[1]
  31. || STDW .D1T1 A13:A12,*A15--[1]
  32. || MVC .S2 __rp,B13
  33. STDW .D2T2 B11:B10,*SP--[1]
  34. || STDW .D1T1 A11:A10,*A15--[1]
  35. || MVC .S2 CSR,B12
  36. STDW .D2T2 B9:B8,*SP--[1]
  37. || STDW .D1T1 A9:A8,*A15--[1]
  38. || MVC .S2 RILC,B11
  39. STDW .D2T2 B7:B6,*SP--[1]
  40. || STDW .D1T1 A7:A6,*A15--[1]
  41. || MVC .S2 ILC,B10
  42. STDW .D2T2 B5:B4,*SP--[1]
  43. || STDW .D1T1 A5:A4,*A15--[1]
  44. STDW .D2T2 B3:B2,*SP--[1]
  45. || STDW .D1T1 A3:A2,*A15--[1]
  46. || MVC .S2 __tsr,B5
  47. STDW .D2T2 B1:B0,*SP--[1]
  48. || STDW .D1T1 A1:A0,*A15--[1]
  49. || MV .S1X B5,A5
  50. STDW .D2T2 B31:B30,*SP--[1]
  51. || STDW .D1T1 A31:A30,*A15--[1]
  52. || MVKL 1,A4
  53. STDW .D2T2 B29:B28,*SP--[1]
  54. || STDW .D1T1 A29:A28,*A15--[1]
  55. STDW .D2T2 B27:B26,*SP--[1]
  56. || STDW .D1T1 A27:A26,*A15--[1]
  57. STDW .D2T2 B25:B24,*SP--[1]
  58. || STDW .D1T1 A25:A24,*A15--[1]
  59. STDW .D2T2 B23:B22,*SP--[1]
  60. || STDW .D1T1 A23:A22,*A15--[1]
  61. STDW .D2T2 B21:B20,*SP--[1]
  62. || STDW .D1T1 A21:A20,*A15--[1]
  63. STDW .D2T2 B19:B18,*SP--[1]
  64. || STDW .D1T1 A19:A18,*A15--[1]
  65. STDW .D2T2 B17:B16,*SP--[1]
  66. || STDW .D1T1 A17:A16,*A15--[1]
  67. STDW .D2T2 B13:B12,*SP--[1] ; save PC and CSR
  68. STDW .D2T2 B11:B10,*SP--[1] ; save RILC and ILC
  69. STDW .D2T1 A5:A4,*SP--[1] ; save TSR and orig A4(stack type)
  70. .endm
  71. RESTORE_ALL .macro __rp, __tsr
  72. LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9)
  73. LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10)
  74. LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12)
  75. ADDAW .D1X SP,30,A15
  76. LDDW .D1T1 *++A15[1],A17:A16
  77. || LDDW .D2T2 *++SP[1],B17:B16
  78. LDDW .D1T1 *++A15[1],A19:A18
  79. || LDDW .D2T2 *++SP[1],B19:B18
  80. LDDW .D1T1 *++A15[1],A21:A20
  81. || LDDW .D2T2 *++SP[1],B21:B20
  82. LDDW .D1T1 *++A15[1],A23:A22
  83. || LDDW .D2T2 *++SP[1],B23:B22
  84. LDDW .D1T1 *++A15[1],A25:A24
  85. || LDDW .D2T2 *++SP[1],B25:B24
  86. LDDW .D1T1 *++A15[1],A27:A26
  87. || LDDW .D2T2 *++SP[1],B27:B26
  88. LDDW .D1T1 *++A15[1],A29:A28
  89. || LDDW .D2T2 *++SP[1],B29:B28
  90. LDDW .D1T1 *++A15[1],A31:A30
  91. || LDDW .D2T2 *++SP[1],B31:B30
  92. LDDW .D1T1 *++A15[1],A1:A0
  93. || LDDW .D2T2 *++SP[1],B1:B0
  94. LDDW .D1T1 *++A15[1],A3:A2
  95. || LDDW .D2T2 *++SP[1],B3:B2
  96. || MVC .S2 B9,__tsr
  97. LDDW .D1T1 *++A15[1],A5:A4
  98. || LDDW .D2T2 *++SP[1],B5:B4
  99. || MVC .S2 B11,RILC
  100. LDDW .D1T1 *++A15[1],A7:A6
  101. || LDDW .D2T2 *++SP[1],B7:B6
  102. || MVC .S2 B10,ILC
  103. LDDW .D1T1 *++A15[1],A9:A8
  104. || LDDW .D2T2 *++SP[1],B9:B8
  105. || MVC .S2 B13,__rp
  106. LDDW .D1T1 *++A15[1],A11:A10
  107. || LDDW .D2T2 *++SP[1],B11:B10
  108. || MVC .S2 B12,CSR
  109. LDDW .D1T1 *++A15[1],A13:A12
  110. || LDDW .D2T2 *++SP[1],B13:B12
  111. MV .D2X A15,SP
  112. || MVKL .S1 rt_system_stack_top,A15
  113. MVKH .S1 rt_system_stack_top,A15
  114. || ADDAW .D1X SP,6,A14
  115. STW .D1T1 A14,*A15 ; save system stack pointer
  116. LDDW .D2T1 *++SP[1],A15:A14
  117. LDDW .D2T2 *+SP[1],SP:DP
  118. NOP 4
  119. .endm
  120. THREAD_SAVE_ALL .macro __rp, __tsr
  121. STDW .D2T2 SP:DP,*--SP[1]
  122. SUBAW .D2 SP,2,SP
  123. ADD .D1X SP,-8,A15
  124. || STDW .D2T1 A15:A14,*SP--[16] ; save A15:A14
  125. STDW .D2T2 B13:B12,*SP--[1]
  126. || STDW .D1T1 A13:A12,*A15--[1]
  127. || MVC .S2 __rp,B13
  128. STDW .D2T2 B11:B10,*SP--[1]
  129. || STDW .D1T1 A11:A10,*A15--[1]
  130. || MVC .S2 CSR,B12
  131. STDW .D2T2 B9:B8,*SP--[1]
  132. || STDW .D1T1 A9:A8,*A15--[1]
  133. || MVC .S2 RILC,B11
  134. STDW .D2T2 B7:B6,*SP--[1]
  135. || STDW .D1T1 A7:A6,*A15--[1]
  136. || MVC .S2 ILC,B10
  137. STDW .D2T2 B5:B4,*SP--[1]
  138. || STDW .D1T1 A5:A4,*A15--[1]
  139. STDW .D2T2 B3:B2,*SP--[1]
  140. || STDW .D1T1 A3:A2,*A15--[1]
  141. || MVC .S2 __tsr,B5
  142. STDW .D2T2 B1:B0,*SP--[1]
  143. || STDW .D1T1 A1:A0,*A15--[1]
  144. || MV .S1X B5,A5
  145. STDW .D2T2 B31:B30,*SP--[1]
  146. || STDW .D1T1 A31:A30,*A15--[1]
  147. || MVKL 1,A4
  148. STDW .D2T2 B29:B28,*SP--[1]
  149. || STDW .D1T1 A29:A28,*A15--[1]
  150. STDW .D2T2 B27:B26,*SP--[1]
  151. || STDW .D1T1 A27:A26,*A15--[1]
  152. STDW .D2T2 B25:B24,*SP--[1]
  153. || STDW .D1T1 A25:A24,*A15--[1]
  154. STDW .D2T2 B23:B22,*SP--[1]
  155. || STDW .D1T1 A23:A22,*A15--[1]
  156. STDW .D2T2 B21:B20,*SP--[1]
  157. || STDW .D1T1 A21:A20,*A15--[1]
  158. STDW .D2T2 B19:B18,*SP--[1]
  159. || STDW .D1T1 A19:A18,*A15--[1]
  160. STDW .D2T2 B17:B16,*SP--[1]
  161. || STDW .D1T1 A17:A16,*A15--[1]
  162. STDW .D2T2 B13:B12,*SP--[1] ; save PC and CSR
  163. STDW .D2T2 B11:B10,*SP--[1] ; save RILC and ILC
  164. STDW .D2T1 A5:A4,*SP--[1] ; save TSR and orig A4(stack type)
  165. .endm