kvm_csr.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
  4. */
  5. #ifndef __ASM_LOONGARCH_KVM_CSR_H__
  6. #define __ASM_LOONGARCH_KVM_CSR_H__
  7. #include <linux/uaccess.h>
  8. #include <linux/kvm_host.h>
  9. #include <asm/loongarch.h>
  10. #include <asm/kvm_vcpu.h>
  11. #define gcsr_read(csr) \
  12. ({ \
  13. register unsigned long __v; \
  14. __asm__ __volatile__( \
  15. " gcsrrd %[val], %[reg]\n\t" \
  16. : [val] "=r" (__v) \
  17. : [reg] "i" (csr) \
  18. : "memory"); \
  19. __v; \
  20. })
  21. #define gcsr_write(v, csr) \
  22. ({ \
  23. register unsigned long __v = v; \
  24. __asm__ __volatile__ ( \
  25. " gcsrwr %[val], %[reg]\n\t" \
  26. : [val] "+r" (__v) \
  27. : [reg] "i" (csr) \
  28. : "memory"); \
  29. __v; \
  30. })
  31. #define gcsr_xchg(v, m, csr) \
  32. ({ \
  33. register unsigned long __v = v; \
  34. __asm__ __volatile__( \
  35. " gcsrxchg %[val], %[mask], %[reg]\n\t" \
  36. : [val] "+r" (__v) \
  37. : [mask] "r" (m), [reg] "i" (csr) \
  38. : "memory"); \
  39. __v; \
  40. })
  41. /* Guest CSRS read and write */
  42. #define read_gcsr_crmd() gcsr_read(LOONGARCH_CSR_CRMD)
  43. #define write_gcsr_crmd(val) gcsr_write(val, LOONGARCH_CSR_CRMD)
  44. #define read_gcsr_prmd() gcsr_read(LOONGARCH_CSR_PRMD)
  45. #define write_gcsr_prmd(val) gcsr_write(val, LOONGARCH_CSR_PRMD)
  46. #define read_gcsr_euen() gcsr_read(LOONGARCH_CSR_EUEN)
  47. #define write_gcsr_euen(val) gcsr_write(val, LOONGARCH_CSR_EUEN)
  48. #define read_gcsr_misc() gcsr_read(LOONGARCH_CSR_MISC)
  49. #define write_gcsr_misc(val) gcsr_write(val, LOONGARCH_CSR_MISC)
  50. #define read_gcsr_ecfg() gcsr_read(LOONGARCH_CSR_ECFG)
  51. #define write_gcsr_ecfg(val) gcsr_write(val, LOONGARCH_CSR_ECFG)
  52. #define read_gcsr_estat() gcsr_read(LOONGARCH_CSR_ESTAT)
  53. #define write_gcsr_estat(val) gcsr_write(val, LOONGARCH_CSR_ESTAT)
  54. #define read_gcsr_era() gcsr_read(LOONGARCH_CSR_ERA)
  55. #define write_gcsr_era(val) gcsr_write(val, LOONGARCH_CSR_ERA)
  56. #define read_gcsr_badv() gcsr_read(LOONGARCH_CSR_BADV)
  57. #define write_gcsr_badv(val) gcsr_write(val, LOONGARCH_CSR_BADV)
  58. #define read_gcsr_badi() gcsr_read(LOONGARCH_CSR_BADI)
  59. #define write_gcsr_badi(val) gcsr_write(val, LOONGARCH_CSR_BADI)
  60. #define read_gcsr_eentry() gcsr_read(LOONGARCH_CSR_EENTRY)
  61. #define write_gcsr_eentry(val) gcsr_write(val, LOONGARCH_CSR_EENTRY)
  62. #define read_gcsr_asid() gcsr_read(LOONGARCH_CSR_ASID)
  63. #define write_gcsr_asid(val) gcsr_write(val, LOONGARCH_CSR_ASID)
  64. #define read_gcsr_pgdl() gcsr_read(LOONGARCH_CSR_PGDL)
  65. #define write_gcsr_pgdl(val) gcsr_write(val, LOONGARCH_CSR_PGDL)
  66. #define read_gcsr_pgdh() gcsr_read(LOONGARCH_CSR_PGDH)
  67. #define write_gcsr_pgdh(val) gcsr_write(val, LOONGARCH_CSR_PGDH)
  68. #define write_gcsr_pgd(val) gcsr_write(val, LOONGARCH_CSR_PGD)
  69. #define read_gcsr_pgd() gcsr_read(LOONGARCH_CSR_PGD)
  70. #define read_gcsr_pwctl0() gcsr_read(LOONGARCH_CSR_PWCTL0)
  71. #define write_gcsr_pwctl0(val) gcsr_write(val, LOONGARCH_CSR_PWCTL0)
  72. #define read_gcsr_pwctl1() gcsr_read(LOONGARCH_CSR_PWCTL1)
  73. #define write_gcsr_pwctl1(val) gcsr_write(val, LOONGARCH_CSR_PWCTL1)
  74. #define read_gcsr_stlbpgsize() gcsr_read(LOONGARCH_CSR_STLBPGSIZE)
  75. #define write_gcsr_stlbpgsize(val) gcsr_write(val, LOONGARCH_CSR_STLBPGSIZE)
  76. #define read_gcsr_rvacfg() gcsr_read(LOONGARCH_CSR_RVACFG)
  77. #define write_gcsr_rvacfg(val) gcsr_write(val, LOONGARCH_CSR_RVACFG)
  78. #define read_gcsr_cpuid() gcsr_read(LOONGARCH_CSR_CPUID)
  79. #define write_gcsr_cpuid(val) gcsr_write(val, LOONGARCH_CSR_CPUID)
  80. #define read_gcsr_prcfg1() gcsr_read(LOONGARCH_CSR_PRCFG1)
  81. #define write_gcsr_prcfg1(val) gcsr_write(val, LOONGARCH_CSR_PRCFG1)
  82. #define read_gcsr_prcfg2() gcsr_read(LOONGARCH_CSR_PRCFG2)
  83. #define write_gcsr_prcfg2(val) gcsr_write(val, LOONGARCH_CSR_PRCFG2)
  84. #define read_gcsr_prcfg3() gcsr_read(LOONGARCH_CSR_PRCFG3)
  85. #define write_gcsr_prcfg3(val) gcsr_write(val, LOONGARCH_CSR_PRCFG3)
  86. #define read_gcsr_kscratch0() gcsr_read(LOONGARCH_CSR_KS0)
  87. #define write_gcsr_kscratch0(val) gcsr_write(val, LOONGARCH_CSR_KS0)
  88. #define read_gcsr_kscratch1() gcsr_read(LOONGARCH_CSR_KS1)
  89. #define write_gcsr_kscratch1(val) gcsr_write(val, LOONGARCH_CSR_KS1)
  90. #define read_gcsr_kscratch2() gcsr_read(LOONGARCH_CSR_KS2)
  91. #define write_gcsr_kscratch2(val) gcsr_write(val, LOONGARCH_CSR_KS2)
  92. #define read_gcsr_kscratch3() gcsr_read(LOONGARCH_CSR_KS3)
  93. #define write_gcsr_kscratch3(val) gcsr_write(val, LOONGARCH_CSR_KS3)
  94. #define read_gcsr_kscratch4() gcsr_read(LOONGARCH_CSR_KS4)
  95. #define write_gcsr_kscratch4(val) gcsr_write(val, LOONGARCH_CSR_KS4)
  96. #define read_gcsr_kscratch5() gcsr_read(LOONGARCH_CSR_KS5)
  97. #define write_gcsr_kscratch5(val) gcsr_write(val, LOONGARCH_CSR_KS5)
  98. #define read_gcsr_kscratch6() gcsr_read(LOONGARCH_CSR_KS6)
  99. #define write_gcsr_kscratch6(val) gcsr_write(val, LOONGARCH_CSR_KS6)
  100. #define read_gcsr_kscratch7() gcsr_read(LOONGARCH_CSR_KS7)
  101. #define write_gcsr_kscratch7(val) gcsr_write(val, LOONGARCH_CSR_KS7)
  102. #define read_gcsr_timerid() gcsr_read(LOONGARCH_CSR_TMID)
  103. #define write_gcsr_timerid(val) gcsr_write(val, LOONGARCH_CSR_TMID)
  104. #define read_gcsr_timercfg() gcsr_read(LOONGARCH_CSR_TCFG)
  105. #define write_gcsr_timercfg(val) gcsr_write(val, LOONGARCH_CSR_TCFG)
  106. #define read_gcsr_timertick() gcsr_read(LOONGARCH_CSR_TVAL)
  107. #define write_gcsr_timertick(val) gcsr_write(val, LOONGARCH_CSR_TVAL)
  108. #define read_gcsr_timeroffset() gcsr_read(LOONGARCH_CSR_CNTC)
  109. #define write_gcsr_timeroffset(val) gcsr_write(val, LOONGARCH_CSR_CNTC)
  110. #define read_gcsr_llbctl() gcsr_read(LOONGARCH_CSR_LLBCTL)
  111. #define write_gcsr_llbctl(val) gcsr_write(val, LOONGARCH_CSR_LLBCTL)
  112. #define read_gcsr_tlbidx() gcsr_read(LOONGARCH_CSR_TLBIDX)
  113. #define write_gcsr_tlbidx(val) gcsr_write(val, LOONGARCH_CSR_TLBIDX)
  114. #define read_gcsr_tlbrentry() gcsr_read(LOONGARCH_CSR_TLBRENTRY)
  115. #define write_gcsr_tlbrentry(val) gcsr_write(val, LOONGARCH_CSR_TLBRENTRY)
  116. #define read_gcsr_tlbrbadv() gcsr_read(LOONGARCH_CSR_TLBRBADV)
  117. #define write_gcsr_tlbrbadv(val) gcsr_write(val, LOONGARCH_CSR_TLBRBADV)
  118. #define read_gcsr_tlbrera() gcsr_read(LOONGARCH_CSR_TLBRERA)
  119. #define write_gcsr_tlbrera(val) gcsr_write(val, LOONGARCH_CSR_TLBRERA)
  120. #define read_gcsr_tlbrsave() gcsr_read(LOONGARCH_CSR_TLBRSAVE)
  121. #define write_gcsr_tlbrsave(val) gcsr_write(val, LOONGARCH_CSR_TLBRSAVE)
  122. #define read_gcsr_tlbrelo0() gcsr_read(LOONGARCH_CSR_TLBRELO0)
  123. #define write_gcsr_tlbrelo0(val) gcsr_write(val, LOONGARCH_CSR_TLBRELO0)
  124. #define read_gcsr_tlbrelo1() gcsr_read(LOONGARCH_CSR_TLBRELO1)
  125. #define write_gcsr_tlbrelo1(val) gcsr_write(val, LOONGARCH_CSR_TLBRELO1)
  126. #define read_gcsr_tlbrehi() gcsr_read(LOONGARCH_CSR_TLBREHI)
  127. #define write_gcsr_tlbrehi(val) gcsr_write(val, LOONGARCH_CSR_TLBREHI)
  128. #define read_gcsr_tlbrprmd() gcsr_read(LOONGARCH_CSR_TLBRPRMD)
  129. #define write_gcsr_tlbrprmd(val) gcsr_write(val, LOONGARCH_CSR_TLBRPRMD)
  130. #define read_gcsr_directwin0() gcsr_read(LOONGARCH_CSR_DMWIN0)
  131. #define write_gcsr_directwin0(val) gcsr_write(val, LOONGARCH_CSR_DMWIN0)
  132. #define read_gcsr_directwin1() gcsr_read(LOONGARCH_CSR_DMWIN1)
  133. #define write_gcsr_directwin1(val) gcsr_write(val, LOONGARCH_CSR_DMWIN1)
  134. #define read_gcsr_directwin2() gcsr_read(LOONGARCH_CSR_DMWIN2)
  135. #define write_gcsr_directwin2(val) gcsr_write(val, LOONGARCH_CSR_DMWIN2)
  136. #define read_gcsr_directwin3() gcsr_read(LOONGARCH_CSR_DMWIN3)
  137. #define write_gcsr_directwin3(val) gcsr_write(val, LOONGARCH_CSR_DMWIN3)
  138. /* Guest related CSRs */
  139. #define read_csr_gtlbc() csr_read64(LOONGARCH_CSR_GTLBC)
  140. #define write_csr_gtlbc(val) csr_write64(val, LOONGARCH_CSR_GTLBC)
  141. #define read_csr_trgp() csr_read64(LOONGARCH_CSR_TRGP)
  142. #define read_csr_gcfg() csr_read64(LOONGARCH_CSR_GCFG)
  143. #define write_csr_gcfg(val) csr_write64(val, LOONGARCH_CSR_GCFG)
  144. #define read_csr_gstat() csr_read64(LOONGARCH_CSR_GSTAT)
  145. #define write_csr_gstat(val) csr_write64(val, LOONGARCH_CSR_GSTAT)
  146. #define read_csr_gintc() csr_read64(LOONGARCH_CSR_GINTC)
  147. #define write_csr_gintc(val) csr_write64(val, LOONGARCH_CSR_GINTC)
  148. #define read_csr_gcntc() csr_read64(LOONGARCH_CSR_GCNTC)
  149. #define write_csr_gcntc(val) csr_write64(val, LOONGARCH_CSR_GCNTC)
  150. #define __BUILD_GCSR_OP(name) __BUILD_CSR_COMMON(gcsr_##name)
  151. __BUILD_CSR_OP(gcfg)
  152. __BUILD_CSR_OP(gstat)
  153. __BUILD_CSR_OP(gtlbc)
  154. __BUILD_CSR_OP(gintc)
  155. __BUILD_GCSR_OP(llbctl)
  156. __BUILD_GCSR_OP(tlbidx)
  157. #define set_gcsr_estat(val) \
  158. gcsr_xchg(val, val, LOONGARCH_CSR_ESTAT)
  159. #define clear_gcsr_estat(val) \
  160. gcsr_xchg(~(val), val, LOONGARCH_CSR_ESTAT)
  161. #define kvm_read_hw_gcsr(id) gcsr_read(id)
  162. #define kvm_write_hw_gcsr(id, val) gcsr_write(val, id)
  163. #define kvm_save_hw_gcsr(csr, gid) (csr->csrs[gid] = gcsr_read(gid))
  164. #define kvm_restore_hw_gcsr(csr, gid) (gcsr_write(csr->csrs[gid], gid))
  165. #define kvm_read_clear_hw_gcsr(csr, gid) (csr->csrs[gid] = gcsr_write(0, gid))
  166. int kvm_emu_iocsr(larch_inst inst, struct kvm_run *run, struct kvm_vcpu *vcpu);
  167. static __always_inline unsigned long kvm_read_sw_gcsr(struct loongarch_csrs *csr, int gid)
  168. {
  169. return csr->csrs[gid];
  170. }
  171. static __always_inline void kvm_write_sw_gcsr(struct loongarch_csrs *csr, int gid, unsigned long val)
  172. {
  173. csr->csrs[gid] = val;
  174. }
  175. static __always_inline void kvm_set_sw_gcsr(struct loongarch_csrs *csr,
  176. int gid, unsigned long val)
  177. {
  178. csr->csrs[gid] |= val;
  179. }
  180. static __always_inline void kvm_change_sw_gcsr(struct loongarch_csrs *csr,
  181. int gid, unsigned long mask, unsigned long val)
  182. {
  183. unsigned long _mask = mask;
  184. csr->csrs[gid] &= ~_mask;
  185. csr->csrs[gid] |= val & _mask;
  186. }
  187. #define KVM_PMU_EVENT_ENABLED (CSR_PERFCTRL_PLV0 | CSR_PERFCTRL_PLV1 | \
  188. CSR_PERFCTRL_PLV2 | CSR_PERFCTRL_PLV3)
  189. #endif /* __ASM_LOONGARCH_KVM_CSR_H__ */