contextinc.asm 6.2 KB

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