sbi_trap.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. /** Last member index in sbi_trap_regs */
  81. #define SBI_TRAP_REGS_last 34
  82. /* clang-format on */
  83. /** Get offset of member with name 'x' in sbi_trap_regs */
  84. #define SBI_TRAP_REGS_OFFSET(x) ((SBI_TRAP_REGS_##x) * __SIZEOF_POINTER__)
  85. /** Size (in bytes) of sbi_trap_regs */
  86. #define SBI_TRAP_REGS_SIZE SBI_TRAP_REGS_OFFSET(last)
  87. #ifndef __ASSEMBLY__
  88. #include <sbi/sbi_types.h>
  89. /** Representation of register state at time of trap/interrupt */
  90. struct sbi_trap_regs {
  91. /** zero register state */
  92. unsigned long zero;
  93. /** ra register state */
  94. unsigned long ra;
  95. /** sp register state */
  96. unsigned long sp;
  97. /** gp register state */
  98. unsigned long gp;
  99. /** tp register state */
  100. unsigned long tp;
  101. /** t0 register state */
  102. unsigned long t0;
  103. /** t1 register state */
  104. unsigned long t1;
  105. /** t2 register state */
  106. unsigned long t2;
  107. /** s0 register state */
  108. unsigned long s0;
  109. /** s1 register state */
  110. unsigned long s1;
  111. /** a0 register state */
  112. unsigned long a0;
  113. /** a1 register state */
  114. unsigned long a1;
  115. /** a2 register state */
  116. unsigned long a2;
  117. /** a3 register state */
  118. unsigned long a3;
  119. /** a4 register state */
  120. unsigned long a4;
  121. /** a5 register state */
  122. unsigned long a5;
  123. /** a6 register state */
  124. unsigned long a6;
  125. /** a7 register state */
  126. unsigned long a7;
  127. /** s2 register state */
  128. unsigned long s2;
  129. /** s3 register state */
  130. unsigned long s3;
  131. /** s4 register state */
  132. unsigned long s4;
  133. /** s5 register state */
  134. unsigned long s5;
  135. /** s6 register state */
  136. unsigned long s6;
  137. /** s7 register state */
  138. unsigned long s7;
  139. /** s8 register state */
  140. unsigned long s8;
  141. /** s9 register state */
  142. unsigned long s9;
  143. /** s10 register state */
  144. unsigned long s10;
  145. /** s11 register state */
  146. unsigned long s11;
  147. /** t3 register state */
  148. unsigned long t3;
  149. /** t4 register state */
  150. unsigned long t4;
  151. /** t5 register state */
  152. unsigned long t5;
  153. /** t6 register state */
  154. unsigned long t6;
  155. /** mepc register state */
  156. unsigned long mepc;
  157. /** mstatus register state */
  158. unsigned long mstatus;
  159. } __packed;
  160. struct sbi_scratch;
  161. int sbi_trap_redirect(struct sbi_trap_regs *regs, struct sbi_scratch *scratch,
  162. ulong epc, ulong cause, ulong tval);
  163. void sbi_trap_handler(struct sbi_trap_regs *regs, struct sbi_scratch *scratch);
  164. #endif
  165. #endif