armv8.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2011-09-15 Bernard first version
  9. */
  10. #ifndef __ARMV8_H__
  11. #define __ARMV8_H__
  12. #include <rtconfig.h>
  13. #ifdef ARCH_USING_HW_THREAD_SELF
  14. #define ARM64_THREAD_REG tpidr_el1
  15. #endif /* ARCH_USING_HW_THREAD_SELF */
  16. #ifdef __ASSEMBLY__
  17. /*********************
  18. * CONTEXT_OFFSET *
  19. *********************/
  20. #define CONTEXT_OFFSET_ELR_EL1 0x0
  21. #define CONTEXT_OFFSET_SPSR_EL1 0x8
  22. #define CONTEXT_OFFSET_SP_EL0 0x10
  23. #define CONTEXT_OFFSET_X30 0x18
  24. #define CONTEXT_OFFSET_FPCR 0x20
  25. #define CONTEXT_OFFSET_FPSR 0x28
  26. #define CONTEXT_OFFSET_X28 0x30
  27. #define CONTEXT_OFFSET_X29 0x38
  28. #define CONTEXT_OFFSET_X26 0x40
  29. #define CONTEXT_OFFSET_X27 0x48
  30. #define CONTEXT_OFFSET_X24 0x50
  31. #define CONTEXT_OFFSET_X25 0x58
  32. #define CONTEXT_OFFSET_X22 0x60
  33. #define CONTEXT_OFFSET_X23 0x68
  34. #define CONTEXT_OFFSET_X20 0x70
  35. #define CONTEXT_OFFSET_X21 0x78
  36. #define CONTEXT_OFFSET_X18 0x80
  37. #define CONTEXT_OFFSET_X19 0x88
  38. #define CONTEXT_OFFSET_X16 0x90
  39. #define CONTEXT_OFFSET_X17 0x98
  40. #define CONTEXT_OFFSET_X14 0xa0
  41. #define CONTEXT_OFFSET_X15 0xa8
  42. #define CONTEXT_OFFSET_X12 0xb0
  43. #define CONTEXT_OFFSET_X13 0xb8
  44. #define CONTEXT_OFFSET_X10 0xc0
  45. #define CONTEXT_OFFSET_X11 0xc8
  46. #define CONTEXT_OFFSET_X8 0xd0
  47. #define CONTEXT_OFFSET_X9 0xd8
  48. #define CONTEXT_OFFSET_X6 0xe0
  49. #define CONTEXT_OFFSET_X7 0xe8
  50. #define CONTEXT_OFFSET_X4 0xf0
  51. #define CONTEXT_OFFSET_X5 0xf8
  52. #define CONTEXT_OFFSET_X2 0x100
  53. #define CONTEXT_OFFSET_X3 0x108
  54. #define CONTEXT_OFFSET_X0 0x110
  55. #define CONTEXT_OFFSET_X1 0x118
  56. #define CONTEXT_OFFSET_Q31 0x120
  57. #define CONTEXT_OFFSET_Q30 0x130
  58. #define CONTEXT_OFFSET_Q29 0x140
  59. #define CONTEXT_OFFSET_Q28 0x150
  60. #define CONTEXT_OFFSET_Q27 0x160
  61. #define CONTEXT_OFFSET_Q26 0x170
  62. #define CONTEXT_OFFSET_Q25 0x180
  63. #define CONTEXT_OFFSET_Q24 0x190
  64. #define CONTEXT_OFFSET_Q23 0x1a0
  65. #define CONTEXT_OFFSET_Q22 0x1b0
  66. #define CONTEXT_OFFSET_Q21 0x1c0
  67. #define CONTEXT_OFFSET_Q20 0x1d0
  68. #define CONTEXT_OFFSET_Q19 0x1e0
  69. #define CONTEXT_OFFSET_Q18 0x1f0
  70. #define CONTEXT_OFFSET_Q17 0x200
  71. #define CONTEXT_OFFSET_Q16 0x210
  72. #define CONTEXT_OFFSET_Q15 0x220
  73. #define CONTEXT_OFFSET_Q14 0x230
  74. #define CONTEXT_OFFSET_Q13 0x240
  75. #define CONTEXT_OFFSET_Q12 0x250
  76. #define CONTEXT_OFFSET_Q11 0x260
  77. #define CONTEXT_OFFSET_Q10 0x270
  78. #define CONTEXT_OFFSET_Q9 0x280
  79. #define CONTEXT_OFFSET_Q8 0x290
  80. #define CONTEXT_OFFSET_Q7 0x2a0
  81. #define CONTEXT_OFFSET_Q6 0x2b0
  82. #define CONTEXT_OFFSET_Q5 0x2c0
  83. #define CONTEXT_OFFSET_Q4 0x2d0
  84. #define CONTEXT_OFFSET_Q3 0x2e0
  85. #define CONTEXT_OFFSET_Q2 0x2f0
  86. #define CONTEXT_OFFSET_Q1 0x300
  87. #define CONTEXT_OFFSET_Q0 0x310
  88. #define CONTEXT_FPU_SIZE (32 * 16)
  89. #define CONTEXT_SIZE (0x120 + CONTEXT_FPU_SIZE)
  90. #else /* !__ASSEMBLY__ */
  91. #include <rttypes.h>
  92. typedef struct { rt_uint64_t value[2]; } rt_uint128_t;
  93. /* the exception stack without VFP registers */
  94. struct rt_hw_exp_stack
  95. {
  96. rt_uint64_t pc;
  97. rt_uint64_t cpsr;
  98. rt_uint64_t sp_el0;
  99. rt_uint64_t x30;
  100. rt_uint64_t fpcr;
  101. rt_uint64_t fpsr;
  102. rt_uint64_t x28;
  103. rt_uint64_t x29;
  104. rt_uint64_t x26;
  105. rt_uint64_t x27;
  106. rt_uint64_t x24;
  107. rt_uint64_t x25;
  108. rt_uint64_t x22;
  109. rt_uint64_t x23;
  110. rt_uint64_t x20;
  111. rt_uint64_t x21;
  112. rt_uint64_t x18;
  113. rt_uint64_t x19;
  114. rt_uint64_t x16;
  115. rt_uint64_t x17;
  116. rt_uint64_t x14;
  117. rt_uint64_t x15;
  118. rt_uint64_t x12;
  119. rt_uint64_t x13;
  120. rt_uint64_t x10;
  121. rt_uint64_t x11;
  122. rt_uint64_t x8;
  123. rt_uint64_t x9;
  124. rt_uint64_t x6;
  125. rt_uint64_t x7;
  126. rt_uint64_t x4;
  127. rt_uint64_t x5;
  128. rt_uint64_t x2;
  129. rt_uint64_t x3;
  130. rt_uint64_t x0;
  131. rt_uint64_t x1;
  132. rt_uint128_t fpu[32];
  133. };
  134. void rt_hw_show_register(struct rt_hw_exp_stack *regs);
  135. #define SP_ELx ((unsigned long)0x01)
  136. #define SP_EL0 ((unsigned long)0x00)
  137. #define PSTATE_EL1 ((unsigned long)0x04)
  138. #define PSTATE_EL2 ((unsigned long)0x08)
  139. #define PSTATE_EL3 ((unsigned long)0x0c)
  140. rt_ubase_t rt_hw_get_current_el(void);
  141. void rt_hw_set_elx_env(void);
  142. void rt_hw_set_current_vbar(rt_ubase_t addr);
  143. /* ESR:generic */
  144. #define ARM64_ABORT_WNR(esr) ((esr) & 0x40)
  145. #define ARM64_ESR_EXTRACT_EC(esr) ((((esr) >> 26) & 0x3fU))
  146. #define ARM64_ESR_EXTRACT_FSC(esr) ((esr) & 0x3f)
  147. /* ESR:EC */
  148. #define ARM64_EC_INST_ABORT_FROM_LO_EXCEPTION (0b100000)
  149. #define ARM64_EC_INST_ABORT_WITHOUT_A_CHANGE (0b100001)
  150. #define ARM64_EC_DATA_ABORT_FROM_LO_EXCEPTION (0b100100)
  151. #define ARM64_EC_DATA_ABORT_WITHOUT_A_CHANGE (0b100101)
  152. /* ESR:FSC */
  153. #define ARM64_FSC_TRANSLATION_FAULT_LEVEL_0 (0b000100)
  154. #define ARM64_FSC_TRANSLATION_FAULT_LEVEL_1 (0b000101)
  155. #define ARM64_FSC_TRANSLATION_FAULT_LEVEL_2 (0b000110)
  156. #define ARM64_FSC_TRANSLATION_FAULT_LEVEL_3 (0b000111)
  157. #define ARM64_FSC_PERMISSION_FAULT_LEVEL_0 (0b001100)
  158. #define ARM64_FSC_PERMISSION_FAULT_LEVEL_1 (0b001101)
  159. #define ARM64_FSC_PERMISSION_FAULT_LEVEL_2 (0b001110)
  160. #define ARM64_FSC_PERMISSION_FAULT_LEVEL_3 (0b001111)
  161. #define ARM64_FSC_ACCESS_FLAG_FAULT_LEVEL_0 (0b001000)
  162. #define ARM64_FSC_ACCESS_FLAG_FAULT_LEVEL_1 (0b001001)
  163. #define ARM64_FSC_ACCESS_FLAG_FAULT_LEVEL_2 (0b001010)
  164. #define ARM64_FSC_ACCESS_FLAG_FAULT_LEVEL_3 (0b001011)
  165. #endif /* __ASSEMBLY__ */
  166. #endif