ext_context.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-10-10 RT-Thread the first version,
  9. * compatible to riscv-v-spec-1.0
  10. */
  11. #ifndef __EXT_CONTEXT_H__
  12. #define __EXT_CONTEXT_H__
  13. #ifdef __ASSEMBLY__
  14. /**
  15. * extension context maintenance
  16. */
  17. #include "cpuport.h"
  18. #include "encoding.h"
  19. #include "vector_encoding.h"
  20. /**
  21. * ==================================
  22. * FPU EXTENSION
  23. * ==================================
  24. */
  25. #ifdef ENABLE_FPU
  26. #define FPU_CTX_F0_OFF REGBYTES * 0 /* offsetof(fpu_context_t, fpustatus.f[0]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  27. #define FPU_CTX_F1_OFF REGBYTES * 1 /* offsetof(fpu_context_t, fpustatus.f[1]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  28. #define FPU_CTX_F2_OFF REGBYTES * 2 /* offsetof(fpu_context_t, fpustatus.f[2]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  29. #define FPU_CTX_F3_OFF REGBYTES * 3 /* offsetof(fpu_context_t, fpustatus.f[3]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  30. #define FPU_CTX_F4_OFF REGBYTES * 4 /* offsetof(fpu_context_t, fpustatus.f[4]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  31. #define FPU_CTX_F5_OFF REGBYTES * 5 /* offsetof(fpu_context_t, fpustatus.f[5]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  32. #define FPU_CTX_F6_OFF REGBYTES * 6 /* offsetof(fpu_context_t, fpustatus.f[6]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  33. #define FPU_CTX_F7_OFF REGBYTES * 7 /* offsetof(fpu_context_t, fpustatus.f[7]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  34. #define FPU_CTX_F8_OFF REGBYTES * 8 /* offsetof(fpu_context_t, fpustatus.f[8]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  35. #define FPU_CTX_F9_OFF REGBYTES * 9 /* offsetof(fpu_context_t, fpustatus.f[9]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  36. #define FPU_CTX_F10_OFF REGBYTES * 10 /* offsetof(fpu_context_t, fpustatus.f[10]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  37. #define FPU_CTX_F11_OFF REGBYTES * 11 /* offsetof(fpu_context_t, fpustatus.f[11]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  38. #define FPU_CTX_F12_OFF REGBYTES * 12 /* offsetof(fpu_context_t, fpustatus.f[12]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  39. #define FPU_CTX_F13_OFF REGBYTES * 13 /* offsetof(fpu_context_t, fpustatus.f[13]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  40. #define FPU_CTX_F14_OFF REGBYTES * 14 /* offsetof(fpu_context_t, fpustatus.f[14]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  41. #define FPU_CTX_F15_OFF REGBYTES * 15 /* offsetof(fpu_context_t, fpustatus.f[15]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  42. #define FPU_CTX_F16_OFF REGBYTES * 16 /* offsetof(fpu_context_t, fpustatus.f[16]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  43. #define FPU_CTX_F17_OFF REGBYTES * 17 /* offsetof(fpu_context_t, fpustatus.f[17]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  44. #define FPU_CTX_F18_OFF REGBYTES * 18 /* offsetof(fpu_context_t, fpustatus.f[18]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  45. #define FPU_CTX_F19_OFF REGBYTES * 19 /* offsetof(fpu_context_t, fpustatus.f[19]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  46. #define FPU_CTX_F20_OFF REGBYTES * 20 /* offsetof(fpu_context_t, fpustatus.f[20]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  47. #define FPU_CTX_F21_OFF REGBYTES * 21 /* offsetof(fpu_context_t, fpustatus.f[21]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  48. #define FPU_CTX_F22_OFF REGBYTES * 22 /* offsetof(fpu_context_t, fpustatus.f[22]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  49. #define FPU_CTX_F23_OFF REGBYTES * 23 /* offsetof(fpu_context_t, fpustatus.f[23]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  50. #define FPU_CTX_F24_OFF REGBYTES * 24 /* offsetof(fpu_context_t, fpustatus.f[24]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  51. #define FPU_CTX_F25_OFF REGBYTES * 25 /* offsetof(fpu_context_t, fpustatus.f[25]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  52. #define FPU_CTX_F26_OFF REGBYTES * 26 /* offsetof(fpu_context_t, fpustatus.f[26]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  53. #define FPU_CTX_F27_OFF REGBYTES * 27 /* offsetof(fpu_context_t, fpustatus.f[27]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  54. #define FPU_CTX_F28_OFF REGBYTES * 28 /* offsetof(fpu_context_t, fpustatus.f[28]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  55. #define FPU_CTX_F29_OFF REGBYTES * 29 /* offsetof(fpu_context_t, fpustatus.f[29]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  56. #define FPU_CTX_F30_OFF REGBYTES * 30 /* offsetof(fpu_context_t, fpustatus.f[30]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  57. #define FPU_CTX_F31_OFF REGBYTES * 31 /* offsetof(fpu_context_t, fpustatus.f[31]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  58. #endif /* ENABLE_FPU */
  59. /**
  60. * ==================================
  61. * VECTOR EXTENSION
  62. * ==================================
  63. */
  64. #ifdef ENABLE_VECTOR
  65. #define VEC_FRAME_VSTART (0 * REGBYTES)
  66. #define VEC_FRAME_VTYPE (1 * REGBYTES)
  67. #define VEC_FRAME_VL (2 * REGBYTES)
  68. #define VEC_FRAME_VCSR (3 * REGBYTES)
  69. #define VEC_FRAME_V0 (4 * REGBYTES)
  70. .macro GET_VEC_FRAME_LEN, xreg
  71. csrr \xreg, vlenb
  72. slli \xreg, \xreg, 5
  73. addi \xreg, \xreg, 4 * REGBYTES
  74. .endm
  75. /**
  76. * @brief save vector extension hardware state
  77. *
  78. * @param dst register storing bottom of storage block
  79. *
  80. */
  81. .macro SAVE_VECTOR, dst
  82. mv t1, \dst
  83. csrr t0, vstart
  84. STORE t0, VEC_FRAME_VSTART(t1)
  85. csrr t0, vtype
  86. STORE t0, VEC_FRAME_VTYPE(t1)
  87. csrr t0, vl
  88. STORE t0, VEC_FRAME_VL(t1)
  89. csrr t0, vcsr
  90. STORE t0, VEC_FRAME_VCSR(t1)
  91. addi t1, t1, VEC_FRAME_V0
  92. // config vector setting,
  93. // t2 is updated to length of a vector group in bytes
  94. VEC_CONFIG_SETVLI(t2, x0, VEC_IMM_SEW_8, VEC_IMM_LMUL_8)
  95. vse8.v v0, (t1)
  96. add t1, t1, t2
  97. vse8.v v8, (t1)
  98. add t1, t1, t2
  99. vse8.v v16, (t1)
  100. add t1, t1, t2
  101. vse8.v v24, (t1)
  102. .endm
  103. /**
  104. * @brief restore vector extension hardware states
  105. *
  106. * @param dst register storing bottom of storage block
  107. *
  108. */
  109. .macro RESTORE_VECTOR, dst
  110. // restore vector registers first since it will modify vector states
  111. mv t0, \dst
  112. addi t1, t0, VEC_FRAME_V0
  113. VEC_CONFIG_SETVLI(t2, x0, VEC_IMM_SEW_8, VEC_IMM_LMUL_8)
  114. vle8.v v0, (t1)
  115. add t1, t1, t2
  116. vle8.v v8, (t1)
  117. add t1, t1, t2
  118. vle8.v v16, (t1)
  119. add t1, t1, t2
  120. vle8.v v24, (t1)
  121. mv t1, t0
  122. LOAD t0, VEC_FRAME_VSTART(t1)
  123. csrw vstart, t0
  124. LOAD t0, VEC_FRAME_VCSR(t1)
  125. csrw vcsr, t0
  126. LOAD t0, VEC_FRAME_VTYPE(t1)
  127. LOAD t3, VEC_FRAME_VL(t1)
  128. VEC_CONFIG_SET_VL_VTYPE(t3, t0)
  129. .endm
  130. #endif /* ENABLE_VECTOR */
  131. #endif /* __ASSEMBLY__ */
  132. #endif /* __EXT_CONTEXT_H__ */