stackframe.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4. */
  5. #ifndef _ASM_STACKFRAME_H
  6. #define _ASM_STACKFRAME_H
  7. #include <linux/threads.h>
  8. #include <asm/asm.h>
  9. #include <asm/asmmacro.h>
  10. #include <asm/asm-offsets.h>
  11. #include <asm/loongarch.h>
  12. #include <asm/thread_info.h>
  13. /* Make the addition of cfi info a little easier. */
  14. .macro cfi_rel_offset reg offset=0 docfi=0
  15. .if \docfi
  16. .cfi_rel_offset \reg, \offset
  17. .endif
  18. .endm
  19. .macro cfi_st reg offset=0 docfi=0
  20. cfi_rel_offset \reg, \offset, \docfi
  21. LONG_S \reg, sp, \offset
  22. .endm
  23. .macro cfi_restore reg offset=0 docfi=0
  24. .if \docfi
  25. .cfi_restore \reg
  26. .endif
  27. .endm
  28. .macro cfi_ld reg offset=0 docfi=0
  29. LONG_L \reg, sp, \offset
  30. cfi_restore \reg \offset \docfi
  31. .endm
  32. .macro BACKUP_T0T1
  33. csrwr t0, EXCEPTION_KS0
  34. csrwr t1, EXCEPTION_KS1
  35. .endm
  36. .macro RELOAD_T0T1
  37. csrrd t0, EXCEPTION_KS0
  38. csrrd t1, EXCEPTION_KS1
  39. .endm
  40. .macro SAVE_TEMP docfi=0
  41. RELOAD_T0T1
  42. cfi_st t0, PT_R12, \docfi
  43. cfi_st t1, PT_R13, \docfi
  44. cfi_st t2, PT_R14, \docfi
  45. cfi_st t3, PT_R15, \docfi
  46. cfi_st t4, PT_R16, \docfi
  47. cfi_st t5, PT_R17, \docfi
  48. cfi_st t6, PT_R18, \docfi
  49. cfi_st t7, PT_R19, \docfi
  50. cfi_st t8, PT_R20, \docfi
  51. .endm
  52. .macro SAVE_STATIC docfi=0
  53. cfi_st s0, PT_R23, \docfi
  54. cfi_st s1, PT_R24, \docfi
  55. cfi_st s2, PT_R25, \docfi
  56. cfi_st s3, PT_R26, \docfi
  57. cfi_st s4, PT_R27, \docfi
  58. cfi_st s5, PT_R28, \docfi
  59. cfi_st s6, PT_R29, \docfi
  60. cfi_st s7, PT_R30, \docfi
  61. cfi_st s8, PT_R31, \docfi
  62. .endm
  63. /*
  64. * get_saved_sp returns the SP for the current CPU by looking in the
  65. * kernelsp array for it. It stores the current sp in t0 and loads the
  66. * new value in sp.
  67. */
  68. .macro get_saved_sp docfi=0
  69. la.abs t1, kernelsp
  70. #ifdef CONFIG_SMP
  71. csrrd t0, PERCPU_BASE_KS
  72. LONG_ADD t1, t1, t0
  73. #endif
  74. move t0, sp
  75. .if \docfi
  76. .cfi_register sp, t0
  77. .endif
  78. LONG_L sp, t1, 0
  79. .endm
  80. .macro set_saved_sp stackp temp temp2
  81. la.abs \temp, kernelsp
  82. #ifdef CONFIG_SMP
  83. LONG_ADD \temp, \temp, u0
  84. #endif
  85. LONG_S \stackp, \temp, 0
  86. .endm
  87. .macro SAVE_SOME docfi=0
  88. csrrd t1, LOONGARCH_CSR_PRMD
  89. andi t1, t1, 0x3 /* extract pplv bit */
  90. move t0, sp
  91. beqz t1, 8f
  92. /* Called from user mode, new stack. */
  93. get_saved_sp docfi=\docfi
  94. 8:
  95. PTR_ADDI sp, sp, -PT_SIZE
  96. .if \docfi
  97. .cfi_def_cfa sp, 0
  98. .endif
  99. cfi_st t0, PT_R3, \docfi
  100. cfi_rel_offset sp, PT_R3, \docfi
  101. LONG_S zero, sp, PT_R0
  102. csrrd t0, LOONGARCH_CSR_PRMD
  103. LONG_S t0, sp, PT_PRMD
  104. csrrd t0, LOONGARCH_CSR_CRMD
  105. LONG_S t0, sp, PT_CRMD
  106. csrrd t0, LOONGARCH_CSR_EUEN
  107. LONG_S t0, sp, PT_EUEN
  108. csrrd t0, LOONGARCH_CSR_ECFG
  109. LONG_S t0, sp, PT_ECFG
  110. csrrd t0, LOONGARCH_CSR_ESTAT
  111. PTR_S t0, sp, PT_ESTAT
  112. cfi_st ra, PT_R1, \docfi
  113. cfi_st a0, PT_R4, \docfi
  114. cfi_st a1, PT_R5, \docfi
  115. cfi_st a2, PT_R6, \docfi
  116. cfi_st a3, PT_R7, \docfi
  117. cfi_st a4, PT_R8, \docfi
  118. cfi_st a5, PT_R9, \docfi
  119. cfi_st a6, PT_R10, \docfi
  120. cfi_st a7, PT_R11, \docfi
  121. csrrd ra, LOONGARCH_CSR_ERA
  122. LONG_S ra, sp, PT_ERA
  123. .if \docfi
  124. .cfi_rel_offset ra, PT_ERA
  125. .endif
  126. cfi_st tp, PT_R2, \docfi
  127. cfi_st fp, PT_R22, \docfi
  128. /* Set thread_info if we're coming from user mode */
  129. csrrd t0, LOONGARCH_CSR_PRMD
  130. andi t0, t0, 0x3 /* extract pplv bit */
  131. beqz t0, 9f
  132. li.d tp, ~_THREAD_MASK
  133. and tp, tp, sp
  134. cfi_st u0, PT_R21, \docfi
  135. csrrd u0, PERCPU_BASE_KS
  136. 9:
  137. .endm
  138. .macro SAVE_ALL docfi=0
  139. SAVE_SOME \docfi
  140. SAVE_TEMP \docfi
  141. SAVE_STATIC \docfi
  142. .endm
  143. .macro RESTORE_TEMP docfi=0
  144. cfi_ld t0, PT_R12, \docfi
  145. cfi_ld t1, PT_R13, \docfi
  146. cfi_ld t2, PT_R14, \docfi
  147. cfi_ld t3, PT_R15, \docfi
  148. cfi_ld t4, PT_R16, \docfi
  149. cfi_ld t5, PT_R17, \docfi
  150. cfi_ld t6, PT_R18, \docfi
  151. cfi_ld t7, PT_R19, \docfi
  152. cfi_ld t8, PT_R20, \docfi
  153. .endm
  154. .macro RESTORE_STATIC docfi=0
  155. cfi_ld s0, PT_R23, \docfi
  156. cfi_ld s1, PT_R24, \docfi
  157. cfi_ld s2, PT_R25, \docfi
  158. cfi_ld s3, PT_R26, \docfi
  159. cfi_ld s4, PT_R27, \docfi
  160. cfi_ld s5, PT_R28, \docfi
  161. cfi_ld s6, PT_R29, \docfi
  162. cfi_ld s7, PT_R30, \docfi
  163. cfi_ld s8, PT_R31, \docfi
  164. .endm
  165. .macro RESTORE_SOME docfi=0
  166. LONG_L a0, sp, PT_PRMD
  167. andi a0, a0, 0x3 /* extract pplv bit */
  168. beqz a0, 8f
  169. cfi_ld u0, PT_R21, \docfi
  170. 8:
  171. LONG_L a0, sp, PT_ERA
  172. csrwr a0, LOONGARCH_CSR_ERA
  173. LONG_L a0, sp, PT_PRMD
  174. csrwr a0, LOONGARCH_CSR_PRMD
  175. cfi_ld ra, PT_R1, \docfi
  176. cfi_ld a0, PT_R4, \docfi
  177. cfi_ld a1, PT_R5, \docfi
  178. cfi_ld a2, PT_R6, \docfi
  179. cfi_ld a3, PT_R7, \docfi
  180. cfi_ld a4, PT_R8, \docfi
  181. cfi_ld a5, PT_R9, \docfi
  182. cfi_ld a6, PT_R10, \docfi
  183. cfi_ld a7, PT_R11, \docfi
  184. cfi_ld tp, PT_R2, \docfi
  185. cfi_ld fp, PT_R22, \docfi
  186. .endm
  187. .macro RESTORE_SP_AND_RET docfi=0
  188. cfi_ld sp, PT_R3, \docfi
  189. ertn
  190. .endm
  191. .macro RESTORE_ALL_AND_RET docfi=0
  192. RESTORE_STATIC \docfi
  193. RESTORE_TEMP \docfi
  194. RESTORE_SOME \docfi
  195. RESTORE_SP_AND_RET \docfi
  196. .endm
  197. #endif /* _ASM_STACKFRAME_H */