stackframe.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-02-02 lizhirui first version
  9. * 2021-02-11 lizhirui fixed gp save/store bug
  10. */
  11. #ifndef __STACKFRAME_H__
  12. #define __STACKFRAME_H__
  13. #include "cpuport.h"
  14. .macro SAVE_ALL
  15. addi sp, sp, -33 * REGBYTES
  16. STORE x1, 1 * REGBYTES(sp)
  17. csrr x1, SRC_XSTATUS
  18. STORE x1, 2 * REGBYTES(sp)
  19. csrr x1, SRC_XEPC
  20. STORE x1, 0 * REGBYTES(sp)
  21. STORE x3, 3 * REGBYTES(sp)
  22. STORE x4, 4 * REGBYTES(sp)
  23. STORE x5, 5 * REGBYTES(sp)
  24. STORE x6, 6 * REGBYTES(sp)
  25. STORE x7, 7 * REGBYTES(sp)
  26. STORE x8, 8 * REGBYTES(sp)
  27. STORE x9, 9 * REGBYTES(sp)
  28. STORE x10, 10 * REGBYTES(sp)
  29. STORE x11, 11 * REGBYTES(sp)
  30. STORE x12, 12 * REGBYTES(sp)
  31. STORE x13, 13 * REGBYTES(sp)
  32. STORE x14, 14 * REGBYTES(sp)
  33. STORE x15, 15 * REGBYTES(sp)
  34. STORE x16, 16 * REGBYTES(sp)
  35. STORE x17, 17 * REGBYTES(sp)
  36. STORE x18, 18 * REGBYTES(sp)
  37. STORE x19, 19 * REGBYTES(sp)
  38. STORE x20, 20 * REGBYTES(sp)
  39. STORE x21, 21 * REGBYTES(sp)
  40. STORE x22, 22 * REGBYTES(sp)
  41. STORE x23, 23 * REGBYTES(sp)
  42. STORE x24, 24 * REGBYTES(sp)
  43. STORE x25, 25 * REGBYTES(sp)
  44. STORE x26, 26 * REGBYTES(sp)
  45. STORE x27, 27 * REGBYTES(sp)
  46. STORE x28, 28 * REGBYTES(sp)
  47. STORE x29, 29 * REGBYTES(sp)
  48. STORE x30, 30 * REGBYTES(sp)
  49. STORE x31, 31 * REGBYTES(sp)
  50. csrr t0, SRC_XSCRATCH
  51. STORE t0, 32 * REGBYTES(sp)
  52. .endm
  53. .macro RESTORE_ALL_ONLY
  54. /* resw ra to sepc */
  55. LOAD x1, 0 * REGBYTES(sp)
  56. csrw SRC_XEPC, x1
  57. LOAD x1, 2 * REGBYTES(sp)
  58. csrw SRC_XSTATUS, x1
  59. LOAD x1, 1 * REGBYTES(sp)
  60. LOAD x3, 3 * REGBYTES(sp)
  61. LOAD x4, 4 * REGBYTES(sp)
  62. LOAD x5, 5 * REGBYTES(sp)
  63. LOAD x6, 6 * REGBYTES(sp)
  64. LOAD x7, 7 * REGBYTES(sp)
  65. LOAD x8, 8 * REGBYTES(sp)
  66. LOAD x9, 9 * REGBYTES(sp)
  67. LOAD x10, 10 * REGBYTES(sp)
  68. LOAD x11, 11 * REGBYTES(sp)
  69. LOAD x12, 12 * REGBYTES(sp)
  70. LOAD x13, 13 * REGBYTES(sp)
  71. LOAD x14, 14 * REGBYTES(sp)
  72. LOAD x15, 15 * REGBYTES(sp)
  73. LOAD x16, 16 * REGBYTES(sp)
  74. LOAD x17, 17 * REGBYTES(sp)
  75. LOAD x18, 18 * REGBYTES(sp)
  76. LOAD x19, 19 * REGBYTES(sp)
  77. LOAD x20, 20 * REGBYTES(sp)
  78. LOAD x21, 21 * REGBYTES(sp)
  79. LOAD x22, 22 * REGBYTES(sp)
  80. LOAD x23, 23 * REGBYTES(sp)
  81. LOAD x24, 24 * REGBYTES(sp)
  82. LOAD x25, 25 * REGBYTES(sp)
  83. LOAD x26, 26 * REGBYTES(sp)
  84. LOAD x27, 27 * REGBYTES(sp)
  85. LOAD x28, 28 * REGBYTES(sp)
  86. LOAD x29, 29 * REGBYTES(sp)
  87. LOAD x30, 30 * REGBYTES(sp)
  88. LOAD x31, 31 * REGBYTES(sp)
  89. addi sp, sp, 33 * REGBYTES
  90. .endm
  91. .macro RESTORE_ALL
  92. /* resw ra to sepc */
  93. LOAD x1, 0 * REGBYTES(sp)
  94. csrw SRC_XEPC, x1
  95. LOAD x1, 2 * REGBYTES(sp)
  96. csrw SRC_XSTATUS, x1
  97. LOAD x1, 1 * REGBYTES(sp)
  98. LOAD x3, 3 * REGBYTES(sp)
  99. LOAD x4, 4 * REGBYTES(sp)
  100. LOAD x5, 5 * REGBYTES(sp)
  101. LOAD x6, 6 * REGBYTES(sp)
  102. LOAD x7, 7 * REGBYTES(sp)
  103. LOAD x8, 8 * REGBYTES(sp)
  104. LOAD x9, 9 * REGBYTES(sp)
  105. LOAD x10, 10 * REGBYTES(sp)
  106. LOAD x11, 11 * REGBYTES(sp)
  107. LOAD x12, 12 * REGBYTES(sp)
  108. LOAD x13, 13 * REGBYTES(sp)
  109. LOAD x14, 14 * REGBYTES(sp)
  110. LOAD x15, 15 * REGBYTES(sp)
  111. LOAD x16, 16 * REGBYTES(sp)
  112. LOAD x17, 17 * REGBYTES(sp)
  113. LOAD x18, 18 * REGBYTES(sp)
  114. LOAD x19, 19 * REGBYTES(sp)
  115. LOAD x20, 20 * REGBYTES(sp)
  116. LOAD x21, 21 * REGBYTES(sp)
  117. LOAD x22, 22 * REGBYTES(sp)
  118. LOAD x23, 23 * REGBYTES(sp)
  119. LOAD x24, 24 * REGBYTES(sp)
  120. LOAD x25, 25 * REGBYTES(sp)
  121. LOAD x26, 26 * REGBYTES(sp)
  122. LOAD x27, 27 * REGBYTES(sp)
  123. LOAD x28, 28 * REGBYTES(sp)
  124. LOAD x29, 29 * REGBYTES(sp)
  125. LOAD x30, 30 * REGBYTES(sp)
  126. LOAD x31, 31 * REGBYTES(sp)
  127. //restore user sp
  128. LOAD sp, 32 * REGBYTES(sp)
  129. .endm
  130. .macro RESTORE_SYS_GP
  131. .option push
  132. .option norelax
  133. la gp, __global_pointer$
  134. .option pop
  135. .endm
  136. #endif