sbi_trap.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2019 Western Digital Corporation or its affiliates.
  5. *
  6. * Authors:
  7. * Anup Patel <anup.patel@wdc.com>
  8. */
  9. #ifndef __SBI_TRAP_H__
  10. #define __SBI_TRAP_H__
  11. /* clang-format off */
  12. /** Index of zero member in sbi_trap_regs */
  13. #define SBI_TRAP_REGS_zero 0
  14. /** Index of ra member in sbi_trap_regs */
  15. #define SBI_TRAP_REGS_ra 1
  16. /** Index of sp member in sbi_trap_regs */
  17. #define SBI_TRAP_REGS_sp 2
  18. /** Index of gp member in sbi_trap_regs */
  19. #define SBI_TRAP_REGS_gp 3
  20. /** Index of tp member in sbi_trap_regs */
  21. #define SBI_TRAP_REGS_tp 4
  22. /** Index of t0 member in sbi_trap_regs */
  23. #define SBI_TRAP_REGS_t0 5
  24. /** Index of t1 member in sbi_trap_regs */
  25. #define SBI_TRAP_REGS_t1 6
  26. /** Index of t2 member in sbi_trap_regs */
  27. #define SBI_TRAP_REGS_t2 7
  28. /** Index of s0 member in sbi_trap_regs */
  29. #define SBI_TRAP_REGS_s0 8
  30. /** Index of s1 member in sbi_trap_regs */
  31. #define SBI_TRAP_REGS_s1 9
  32. /** Index of a0 member in sbi_trap_regs */
  33. #define SBI_TRAP_REGS_a0 10
  34. /** Index of a1 member in sbi_trap_regs */
  35. #define SBI_TRAP_REGS_a1 11
  36. /** Index of a2 member in sbi_trap_regs */
  37. #define SBI_TRAP_REGS_a2 12
  38. /** Index of a3 member in sbi_trap_regs */
  39. #define SBI_TRAP_REGS_a3 13
  40. /** Index of a4 member in sbi_trap_regs */
  41. #define SBI_TRAP_REGS_a4 14
  42. /** Index of a5 member in sbi_trap_regs */
  43. #define SBI_TRAP_REGS_a5 15
  44. /** Index of a6 member in sbi_trap_regs */
  45. #define SBI_TRAP_REGS_a6 16
  46. /** Index of a7 member in sbi_trap_regs */
  47. #define SBI_TRAP_REGS_a7 17
  48. /** Index of s2 member in sbi_trap_regs */
  49. #define SBI_TRAP_REGS_s2 18
  50. /** Index of s3 member in sbi_trap_regs */
  51. #define SBI_TRAP_REGS_s3 19
  52. /** Index of s4 member in sbi_trap_regs */
  53. #define SBI_TRAP_REGS_s4 20
  54. /** Index of s5 member in sbi_trap_regs */
  55. #define SBI_TRAP_REGS_s5 21
  56. /** Index of s6 member in sbi_trap_regs */
  57. #define SBI_TRAP_REGS_s6 22
  58. /** Index of s7 member in sbi_trap_regs */
  59. #define SBI_TRAP_REGS_s7 23
  60. /** Index of s8 member in sbi_trap_regs */
  61. #define SBI_TRAP_REGS_s8 24
  62. /** Index of s9 member in sbi_trap_regs */
  63. #define SBI_TRAP_REGS_s9 25
  64. /** Index of s10 member in sbi_trap_regs */
  65. #define SBI_TRAP_REGS_s10 26
  66. /** Index of s11 member in sbi_trap_regs */
  67. #define SBI_TRAP_REGS_s11 27
  68. /** Index of t3 member in sbi_trap_regs */
  69. #define SBI_TRAP_REGS_t3 28
  70. /** Index of t4 member in sbi_trap_regs */
  71. #define SBI_TRAP_REGS_t4 29
  72. /** Index of t5 member in sbi_trap_regs */
  73. #define SBI_TRAP_REGS_t5 30
  74. /** Index of t6 member in sbi_trap_regs */
  75. #define SBI_TRAP_REGS_t6 31
  76. /** Index of mepc member in sbi_trap_regs */
  77. #define SBI_TRAP_REGS_mepc 32
  78. /** Index of mstatus member in sbi_trap_regs */
  79. #define SBI_TRAP_REGS_mstatus 33
  80. /** Index of mstatusH member in sbi_trap_regs */
  81. #define SBI_TRAP_REGS_mstatusH 34
  82. /** Last member index in sbi_trap_regs */
  83. #define SBI_TRAP_REGS_last 35
  84. /** Index of epc member in sbi_trap_info */
  85. #define SBI_TRAP_INFO_epc 0
  86. /** Index of cause member in sbi_trap_info */
  87. #define SBI_TRAP_INFO_cause 1
  88. /** Index of tval member in sbi_trap_info */
  89. #define SBI_TRAP_INFO_tval 2
  90. /** Index of tval2 member in sbi_trap_info */
  91. #define SBI_TRAP_INFO_tval2 3
  92. /** Index of tinst member in sbi_trap_info */
  93. #define SBI_TRAP_INFO_tinst 4
  94. /** Last member index in sbi_trap_info */
  95. #define SBI_TRAP_INFO_last 5
  96. /* clang-format on */
  97. /** Get offset of member with name 'x' in sbi_trap_regs */
  98. #define SBI_TRAP_REGS_OFFSET(x) ((SBI_TRAP_REGS_##x) * __SIZEOF_POINTER__)
  99. /** Size (in bytes) of sbi_trap_regs */
  100. #define SBI_TRAP_REGS_SIZE SBI_TRAP_REGS_OFFSET(last)
  101. /** Get offset of member with name 'x' in sbi_trap_info */
  102. #define SBI_TRAP_INFO_OFFSET(x) ((SBI_TRAP_INFO_##x) * __SIZEOF_POINTER__)
  103. /** Size (in bytes) of sbi_trap_info */
  104. #define SBI_TRAP_INFO_SIZE SBI_TRAP_INFO_OFFSET(last)
  105. #ifndef __ASSEMBLER__
  106. #include <sbi/sbi_types.h>
  107. /** Representation of register state at time of trap/interrupt */
  108. struct sbi_trap_regs {
  109. /** zero register state */
  110. unsigned long zero;
  111. /** ra register state */
  112. unsigned long ra;
  113. /** sp register state */
  114. unsigned long sp;
  115. /** gp register state */
  116. unsigned long gp;
  117. /** tp register state */
  118. unsigned long tp;
  119. /** t0 register state */
  120. unsigned long t0;
  121. /** t1 register state */
  122. unsigned long t1;
  123. /** t2 register state */
  124. unsigned long t2;
  125. /** s0 register state */
  126. unsigned long s0;
  127. /** s1 register state */
  128. unsigned long s1;
  129. /** a0 register state */
  130. unsigned long a0;
  131. /** a1 register state */
  132. unsigned long a1;
  133. /** a2 register state */
  134. unsigned long a2;
  135. /** a3 register state */
  136. unsigned long a3;
  137. /** a4 register state */
  138. unsigned long a4;
  139. /** a5 register state */
  140. unsigned long a5;
  141. /** a6 register state */
  142. unsigned long a6;
  143. /** a7 register state */
  144. unsigned long a7;
  145. /** s2 register state */
  146. unsigned long s2;
  147. /** s3 register state */
  148. unsigned long s3;
  149. /** s4 register state */
  150. unsigned long s4;
  151. /** s5 register state */
  152. unsigned long s5;
  153. /** s6 register state */
  154. unsigned long s6;
  155. /** s7 register state */
  156. unsigned long s7;
  157. /** s8 register state */
  158. unsigned long s8;
  159. /** s9 register state */
  160. unsigned long s9;
  161. /** s10 register state */
  162. unsigned long s10;
  163. /** s11 register state */
  164. unsigned long s11;
  165. /** t3 register state */
  166. unsigned long t3;
  167. /** t4 register state */
  168. unsigned long t4;
  169. /** t5 register state */
  170. unsigned long t5;
  171. /** t6 register state */
  172. unsigned long t6;
  173. /** mepc register state */
  174. unsigned long mepc;
  175. /** mstatus register state */
  176. unsigned long mstatus;
  177. /** mstatusH register state (only for 32-bit) */
  178. unsigned long mstatusH;
  179. };
  180. /** Representation of trap details */
  181. struct sbi_trap_info {
  182. /** epc Trap program counter */
  183. unsigned long epc;
  184. /** cause Trap exception cause */
  185. unsigned long cause;
  186. /** tval Trap value */
  187. unsigned long tval;
  188. /** tval2 Trap value 2 */
  189. unsigned long tval2;
  190. /** tinst Trap instruction */
  191. unsigned long tinst;
  192. };
  193. int sbi_trap_redirect(struct sbi_trap_regs *regs,
  194. struct sbi_trap_info *trap);
  195. struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs);
  196. void __noreturn sbi_trap_exit(const struct sbi_trap_regs *regs);
  197. #endif
  198. #endif