csr.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2015 Regents of the University of California
  4. */
  5. #ifndef _ASM_RISCV_CSR_H
  6. #define _ASM_RISCV_CSR_H
  7. #include <asm/asm.h>
  8. // #include <dragonstub/linux/bits.h>
  9. /* Status register flags */
  10. #define SR_SIE _AC(0x00000002, UL) /* Supervisor Interrupt Enable */
  11. #define SR_MIE _AC(0x00000008, UL) /* Machine Interrupt Enable */
  12. #define SR_SPIE _AC(0x00000020, UL) /* Previous Supervisor IE */
  13. #define SR_MPIE _AC(0x00000080, UL) /* Previous Machine IE */
  14. #define SR_SPP _AC(0x00000100, UL) /* Previously Supervisor */
  15. #define SR_MPP _AC(0x00001800, UL) /* Previously Machine */
  16. #define SR_SUM _AC(0x00040000, UL) /* Supervisor User Memory Access */
  17. #define SR_FS _AC(0x00006000, UL) /* Floating-point Status */
  18. #define SR_FS_OFF _AC(0x00000000, UL)
  19. #define SR_FS_INITIAL _AC(0x00002000, UL)
  20. #define SR_FS_CLEAN _AC(0x00004000, UL)
  21. #define SR_FS_DIRTY _AC(0x00006000, UL)
  22. #define SR_VS _AC(0x00000600, UL) /* Vector Status */
  23. #define SR_VS_OFF _AC(0x00000000, UL)
  24. #define SR_VS_INITIAL _AC(0x00000200, UL)
  25. #define SR_VS_CLEAN _AC(0x00000400, UL)
  26. #define SR_VS_DIRTY _AC(0x00000600, UL)
  27. #define SR_XS _AC(0x00018000, UL) /* Extension Status */
  28. #define SR_XS_OFF _AC(0x00000000, UL)
  29. #define SR_XS_INITIAL _AC(0x00008000, UL)
  30. #define SR_XS_CLEAN _AC(0x00010000, UL)
  31. #define SR_XS_DIRTY _AC(0x00018000, UL)
  32. #define SR_FS_VS (SR_FS | SR_VS) /* Vector and Floating-Point Unit */
  33. #ifndef CONFIG_64BIT
  34. #define SR_SD _AC(0x80000000, UL) /* FS/VS/XS dirty */
  35. #else
  36. #define SR_SD _AC(0x8000000000000000, UL) /* FS/VS/XS dirty */
  37. #endif
  38. #ifdef CONFIG_64BIT
  39. #define SR_UXL _AC(0x300000000, UL) /* XLEN mask for U-mode */
  40. #define SR_UXL_32 _AC(0x100000000, UL) /* XLEN = 32 for U-mode */
  41. #define SR_UXL_64 _AC(0x200000000, UL) /* XLEN = 64 for U-mode */
  42. #endif
  43. /* SATP flags */
  44. #ifndef CONFIG_64BIT
  45. #define SATP_PPN _AC(0x003FFFFF, UL)
  46. #define SATP_MODE_32 _AC(0x80000000, UL)
  47. #define SATP_MODE_SHIFT 31
  48. #define SATP_ASID_BITS 9
  49. #define SATP_ASID_SHIFT 22
  50. #define SATP_ASID_MASK _AC(0x1FF, UL)
  51. #else
  52. #define SATP_PPN _AC(0x00000FFFFFFFFFFF, UL)
  53. #define SATP_MODE_39 _AC(0x8000000000000000, UL)
  54. #define SATP_MODE_48 _AC(0x9000000000000000, UL)
  55. #define SATP_MODE_57 _AC(0xa000000000000000, UL)
  56. #define SATP_MODE_SHIFT 60
  57. #define SATP_ASID_BITS 16
  58. #define SATP_ASID_SHIFT 44
  59. #define SATP_ASID_MASK _AC(0xFFFF, UL)
  60. #endif
  61. /* Exception cause high bit - is an interrupt if set */
  62. #define CAUSE_IRQ_FLAG (_AC(1, UL) << (__riscv_xlen - 1))
  63. /* Interrupt causes (minus the high bit) */
  64. #define IRQ_S_SOFT 1
  65. #define IRQ_VS_SOFT 2
  66. #define IRQ_M_SOFT 3
  67. #define IRQ_S_TIMER 5
  68. #define IRQ_VS_TIMER 6
  69. #define IRQ_M_TIMER 7
  70. #define IRQ_S_EXT 9
  71. #define IRQ_VS_EXT 10
  72. #define IRQ_M_EXT 11
  73. #define IRQ_S_GEXT 12
  74. #define IRQ_PMU_OVF 13
  75. #define IRQ_LOCAL_MAX (IRQ_PMU_OVF + 1)
  76. #define IRQ_LOCAL_MASK GENMASK((IRQ_LOCAL_MAX - 1), 0)
  77. /* Exception causes */
  78. #define EXC_INST_MISALIGNED 0
  79. #define EXC_INST_ACCESS 1
  80. #define EXC_INST_ILLEGAL 2
  81. #define EXC_BREAKPOINT 3
  82. #define EXC_LOAD_MISALIGNED 4
  83. #define EXC_LOAD_ACCESS 5
  84. #define EXC_STORE_MISALIGNED 6
  85. #define EXC_STORE_ACCESS 7
  86. #define EXC_SYSCALL 8
  87. #define EXC_HYPERVISOR_SYSCALL 9
  88. #define EXC_SUPERVISOR_SYSCALL 10
  89. #define EXC_INST_PAGE_FAULT 12
  90. #define EXC_LOAD_PAGE_FAULT 13
  91. #define EXC_STORE_PAGE_FAULT 15
  92. #define EXC_INST_GUEST_PAGE_FAULT 20
  93. #define EXC_LOAD_GUEST_PAGE_FAULT 21
  94. #define EXC_VIRTUAL_INST_FAULT 22
  95. #define EXC_STORE_GUEST_PAGE_FAULT 23
  96. /* PMP configuration */
  97. #define PMP_R 0x01
  98. #define PMP_W 0x02
  99. #define PMP_X 0x04
  100. #define PMP_A 0x18
  101. #define PMP_A_TOR 0x08
  102. #define PMP_A_NA4 0x10
  103. #define PMP_A_NAPOT 0x18
  104. #define PMP_L 0x80
  105. /* HSTATUS flags */
  106. #ifdef CONFIG_64BIT
  107. #define HSTATUS_VSXL _AC(0x300000000, UL)
  108. #define HSTATUS_VSXL_SHIFT 32
  109. #endif
  110. #define HSTATUS_VTSR _AC(0x00400000, UL)
  111. #define HSTATUS_VTW _AC(0x00200000, UL)
  112. #define HSTATUS_VTVM _AC(0x00100000, UL)
  113. #define HSTATUS_VGEIN _AC(0x0003f000, UL)
  114. #define HSTATUS_VGEIN_SHIFT 12
  115. #define HSTATUS_HU _AC(0x00000200, UL)
  116. #define HSTATUS_SPVP _AC(0x00000100, UL)
  117. #define HSTATUS_SPV _AC(0x00000080, UL)
  118. #define HSTATUS_GVA _AC(0x00000040, UL)
  119. #define HSTATUS_VSBE _AC(0x00000020, UL)
  120. /* HGATP flags */
  121. #define HGATP_MODE_OFF _AC(0, UL)
  122. #define HGATP_MODE_SV32X4 _AC(1, UL)
  123. #define HGATP_MODE_SV39X4 _AC(8, UL)
  124. #define HGATP_MODE_SV48X4 _AC(9, UL)
  125. #define HGATP_MODE_SV57X4 _AC(10, UL)
  126. #define HGATP32_MODE_SHIFT 31
  127. #define HGATP32_VMID_SHIFT 22
  128. #define HGATP32_VMID GENMASK(28, 22)
  129. #define HGATP32_PPN GENMASK(21, 0)
  130. #define HGATP64_MODE_SHIFT 60
  131. #define HGATP64_VMID_SHIFT 44
  132. #define HGATP64_VMID GENMASK(57, 44)
  133. #define HGATP64_PPN GENMASK(43, 0)
  134. #define HGATP_PAGE_SHIFT 12
  135. #ifdef CONFIG_64BIT
  136. #define HGATP_PPN HGATP64_PPN
  137. #define HGATP_VMID_SHIFT HGATP64_VMID_SHIFT
  138. #define HGATP_VMID HGATP64_VMID
  139. #define HGATP_MODE_SHIFT HGATP64_MODE_SHIFT
  140. #else
  141. #define HGATP_PPN HGATP32_PPN
  142. #define HGATP_VMID_SHIFT HGATP32_VMID_SHIFT
  143. #define HGATP_VMID HGATP32_VMID
  144. #define HGATP_MODE_SHIFT HGATP32_MODE_SHIFT
  145. #endif
  146. /* VSIP & HVIP relation */
  147. #define VSIP_TO_HVIP_SHIFT (IRQ_VS_SOFT - IRQ_S_SOFT)
  148. #define VSIP_VALID_MASK ((_AC(1, UL) << IRQ_S_SOFT) | \
  149. (_AC(1, UL) << IRQ_S_TIMER) | \
  150. (_AC(1, UL) << IRQ_S_EXT))
  151. /* AIA CSR bits */
  152. #define TOPI_IID_SHIFT 16
  153. #define TOPI_IID_MASK GENMASK(11, 0)
  154. #define TOPI_IPRIO_MASK GENMASK(7, 0)
  155. #define TOPI_IPRIO_BITS 8
  156. #define TOPEI_ID_SHIFT 16
  157. #define TOPEI_ID_MASK GENMASK(10, 0)
  158. #define TOPEI_PRIO_MASK GENMASK(10, 0)
  159. #define ISELECT_IPRIO0 0x30
  160. #define ISELECT_IPRIO15 0x3f
  161. #define ISELECT_MASK GENMASK(8, 0)
  162. #define HVICTL_VTI BIT(30)
  163. #define HVICTL_IID GENMASK(27, 16)
  164. #define HVICTL_IID_SHIFT 16
  165. #define HVICTL_DPR BIT(9)
  166. #define HVICTL_IPRIOM BIT(8)
  167. #define HVICTL_IPRIO GENMASK(7, 0)
  168. /* xENVCFG flags */
  169. #define ENVCFG_STCE (_AC(1, ULL) << 63)
  170. #define ENVCFG_PBMTE (_AC(1, ULL) << 62)
  171. #define ENVCFG_CBZE (_AC(1, UL) << 7)
  172. #define ENVCFG_CBCFE (_AC(1, UL) << 6)
  173. #define ENVCFG_CBIE_SHIFT 4
  174. #define ENVCFG_CBIE (_AC(0x3, UL) << ENVCFG_CBIE_SHIFT)
  175. #define ENVCFG_CBIE_ILL _AC(0x0, UL)
  176. #define ENVCFG_CBIE_FLUSH _AC(0x1, UL)
  177. #define ENVCFG_CBIE_INV _AC(0x3, UL)
  178. #define ENVCFG_FIOM _AC(0x1, UL)
  179. /* symbolic CSR names: */
  180. #define CSR_CYCLE 0xc00
  181. #define CSR_TIME 0xc01
  182. #define CSR_INSTRET 0xc02
  183. #define CSR_HPMCOUNTER3 0xc03
  184. #define CSR_HPMCOUNTER4 0xc04
  185. #define CSR_HPMCOUNTER5 0xc05
  186. #define CSR_HPMCOUNTER6 0xc06
  187. #define CSR_HPMCOUNTER7 0xc07
  188. #define CSR_HPMCOUNTER8 0xc08
  189. #define CSR_HPMCOUNTER9 0xc09
  190. #define CSR_HPMCOUNTER10 0xc0a
  191. #define CSR_HPMCOUNTER11 0xc0b
  192. #define CSR_HPMCOUNTER12 0xc0c
  193. #define CSR_HPMCOUNTER13 0xc0d
  194. #define CSR_HPMCOUNTER14 0xc0e
  195. #define CSR_HPMCOUNTER15 0xc0f
  196. #define CSR_HPMCOUNTER16 0xc10
  197. #define CSR_HPMCOUNTER17 0xc11
  198. #define CSR_HPMCOUNTER18 0xc12
  199. #define CSR_HPMCOUNTER19 0xc13
  200. #define CSR_HPMCOUNTER20 0xc14
  201. #define CSR_HPMCOUNTER21 0xc15
  202. #define CSR_HPMCOUNTER22 0xc16
  203. #define CSR_HPMCOUNTER23 0xc17
  204. #define CSR_HPMCOUNTER24 0xc18
  205. #define CSR_HPMCOUNTER25 0xc19
  206. #define CSR_HPMCOUNTER26 0xc1a
  207. #define CSR_HPMCOUNTER27 0xc1b
  208. #define CSR_HPMCOUNTER28 0xc1c
  209. #define CSR_HPMCOUNTER29 0xc1d
  210. #define CSR_HPMCOUNTER30 0xc1e
  211. #define CSR_HPMCOUNTER31 0xc1f
  212. #define CSR_CYCLEH 0xc80
  213. #define CSR_TIMEH 0xc81
  214. #define CSR_INSTRETH 0xc82
  215. #define CSR_HPMCOUNTER3H 0xc83
  216. #define CSR_HPMCOUNTER4H 0xc84
  217. #define CSR_HPMCOUNTER5H 0xc85
  218. #define CSR_HPMCOUNTER6H 0xc86
  219. #define CSR_HPMCOUNTER7H 0xc87
  220. #define CSR_HPMCOUNTER8H 0xc88
  221. #define CSR_HPMCOUNTER9H 0xc89
  222. #define CSR_HPMCOUNTER10H 0xc8a
  223. #define CSR_HPMCOUNTER11H 0xc8b
  224. #define CSR_HPMCOUNTER12H 0xc8c
  225. #define CSR_HPMCOUNTER13H 0xc8d
  226. #define CSR_HPMCOUNTER14H 0xc8e
  227. #define CSR_HPMCOUNTER15H 0xc8f
  228. #define CSR_HPMCOUNTER16H 0xc90
  229. #define CSR_HPMCOUNTER17H 0xc91
  230. #define CSR_HPMCOUNTER18H 0xc92
  231. #define CSR_HPMCOUNTER19H 0xc93
  232. #define CSR_HPMCOUNTER20H 0xc94
  233. #define CSR_HPMCOUNTER21H 0xc95
  234. #define CSR_HPMCOUNTER22H 0xc96
  235. #define CSR_HPMCOUNTER23H 0xc97
  236. #define CSR_HPMCOUNTER24H 0xc98
  237. #define CSR_HPMCOUNTER25H 0xc99
  238. #define CSR_HPMCOUNTER26H 0xc9a
  239. #define CSR_HPMCOUNTER27H 0xc9b
  240. #define CSR_HPMCOUNTER28H 0xc9c
  241. #define CSR_HPMCOUNTER29H 0xc9d
  242. #define CSR_HPMCOUNTER30H 0xc9e
  243. #define CSR_HPMCOUNTER31H 0xc9f
  244. #define CSR_SSCOUNTOVF 0xda0
  245. #define CSR_SSTATUS 0x100
  246. #define CSR_SIE 0x104
  247. #define CSR_STVEC 0x105
  248. #define CSR_SCOUNTEREN 0x106
  249. #define CSR_SSCRATCH 0x140
  250. #define CSR_SEPC 0x141
  251. #define CSR_SCAUSE 0x142
  252. #define CSR_STVAL 0x143
  253. #define CSR_SIP 0x144
  254. #define CSR_SATP 0x180
  255. #define CSR_STIMECMP 0x14D
  256. #define CSR_STIMECMPH 0x15D
  257. /* Supervisor-Level Window to Indirectly Accessed Registers (AIA) */
  258. #define CSR_SISELECT 0x150
  259. #define CSR_SIREG 0x151
  260. /* Supervisor-Level Interrupts (AIA) */
  261. #define CSR_STOPEI 0x15c
  262. #define CSR_STOPI 0xdb0
  263. /* Supervisor-Level High-Half CSRs (AIA) */
  264. #define CSR_SIEH 0x114
  265. #define CSR_SIPH 0x154
  266. #define CSR_VSSTATUS 0x200
  267. #define CSR_VSIE 0x204
  268. #define CSR_VSTVEC 0x205
  269. #define CSR_VSSCRATCH 0x240
  270. #define CSR_VSEPC 0x241
  271. #define CSR_VSCAUSE 0x242
  272. #define CSR_VSTVAL 0x243
  273. #define CSR_VSIP 0x244
  274. #define CSR_VSATP 0x280
  275. #define CSR_VSTIMECMP 0x24D
  276. #define CSR_VSTIMECMPH 0x25D
  277. #define CSR_HSTATUS 0x600
  278. #define CSR_HEDELEG 0x602
  279. #define CSR_HIDELEG 0x603
  280. #define CSR_HIE 0x604
  281. #define CSR_HTIMEDELTA 0x605
  282. #define CSR_HCOUNTEREN 0x606
  283. #define CSR_HGEIE 0x607
  284. #define CSR_HENVCFG 0x60a
  285. #define CSR_HTIMEDELTAH 0x615
  286. #define CSR_HENVCFGH 0x61a
  287. #define CSR_HTVAL 0x643
  288. #define CSR_HIP 0x644
  289. #define CSR_HVIP 0x645
  290. #define CSR_HTINST 0x64a
  291. #define CSR_HGATP 0x680
  292. #define CSR_HGEIP 0xe12
  293. /* Virtual Interrupts and Interrupt Priorities (H-extension with AIA) */
  294. #define CSR_HVIEN 0x608
  295. #define CSR_HVICTL 0x609
  296. #define CSR_HVIPRIO1 0x646
  297. #define CSR_HVIPRIO2 0x647
  298. /* VS-Level Window to Indirectly Accessed Registers (H-extension with AIA) */
  299. #define CSR_VSISELECT 0x250
  300. #define CSR_VSIREG 0x251
  301. /* VS-Level Interrupts (H-extension with AIA) */
  302. #define CSR_VSTOPEI 0x25c
  303. #define CSR_VSTOPI 0xeb0
  304. /* Hypervisor and VS-Level High-Half CSRs (H-extension with AIA) */
  305. #define CSR_HIDELEGH 0x613
  306. #define CSR_HVIENH 0x618
  307. #define CSR_HVIPH 0x655
  308. #define CSR_HVIPRIO1H 0x656
  309. #define CSR_HVIPRIO2H 0x657
  310. #define CSR_VSIEH 0x214
  311. #define CSR_VSIPH 0x254
  312. #define CSR_MSTATUS 0x300
  313. #define CSR_MISA 0x301
  314. #define CSR_MIDELEG 0x303
  315. #define CSR_MIE 0x304
  316. #define CSR_MTVEC 0x305
  317. #define CSR_MENVCFG 0x30a
  318. #define CSR_MENVCFGH 0x31a
  319. #define CSR_MSCRATCH 0x340
  320. #define CSR_MEPC 0x341
  321. #define CSR_MCAUSE 0x342
  322. #define CSR_MTVAL 0x343
  323. #define CSR_MIP 0x344
  324. #define CSR_PMPCFG0 0x3a0
  325. #define CSR_PMPADDR0 0x3b0
  326. #define CSR_MVENDORID 0xf11
  327. #define CSR_MARCHID 0xf12
  328. #define CSR_MIMPID 0xf13
  329. #define CSR_MHARTID 0xf14
  330. /* Machine-Level Window to Indirectly Accessed Registers (AIA) */
  331. #define CSR_MISELECT 0x350
  332. #define CSR_MIREG 0x351
  333. /* Machine-Level Interrupts (AIA) */
  334. #define CSR_MTOPEI 0x35c
  335. #define CSR_MTOPI 0xfb0
  336. /* Virtual Interrupts for Supervisor Level (AIA) */
  337. #define CSR_MVIEN 0x308
  338. #define CSR_MVIP 0x309
  339. /* Machine-Level High-Half CSRs (AIA) */
  340. #define CSR_MIDELEGH 0x313
  341. #define CSR_MIEH 0x314
  342. #define CSR_MVIENH 0x318
  343. #define CSR_MVIPH 0x319
  344. #define CSR_MIPH 0x354
  345. #define CSR_VSTART 0x8
  346. #define CSR_VCSR 0xf
  347. #define CSR_VL 0xc20
  348. #define CSR_VTYPE 0xc21
  349. #define CSR_VLENB 0xc22
  350. #ifdef CONFIG_RISCV_M_MODE
  351. # define CSR_STATUS CSR_MSTATUS
  352. # define CSR_IE CSR_MIE
  353. # define CSR_TVEC CSR_MTVEC
  354. # define CSR_SCRATCH CSR_MSCRATCH
  355. # define CSR_EPC CSR_MEPC
  356. # define CSR_CAUSE CSR_MCAUSE
  357. # define CSR_TVAL CSR_MTVAL
  358. # define CSR_IP CSR_MIP
  359. # define CSR_IEH CSR_MIEH
  360. # define CSR_ISELECT CSR_MISELECT
  361. # define CSR_IREG CSR_MIREG
  362. # define CSR_IPH CSR_MIPH
  363. # define CSR_TOPEI CSR_MTOPEI
  364. # define CSR_TOPI CSR_MTOPI
  365. # define SR_IE SR_MIE
  366. # define SR_PIE SR_MPIE
  367. # define SR_PP SR_MPP
  368. # define RV_IRQ_SOFT IRQ_M_SOFT
  369. # define RV_IRQ_TIMER IRQ_M_TIMER
  370. # define RV_IRQ_EXT IRQ_M_EXT
  371. #else /* CONFIG_RISCV_M_MODE */
  372. # define CSR_STATUS CSR_SSTATUS
  373. # define CSR_IE CSR_SIE
  374. # define CSR_TVEC CSR_STVEC
  375. # define CSR_SCRATCH CSR_SSCRATCH
  376. # define CSR_EPC CSR_SEPC
  377. # define CSR_CAUSE CSR_SCAUSE
  378. # define CSR_TVAL CSR_STVAL
  379. # define CSR_IP CSR_SIP
  380. # define CSR_IEH CSR_SIEH
  381. # define CSR_ISELECT CSR_SISELECT
  382. # define CSR_IREG CSR_SIREG
  383. # define CSR_IPH CSR_SIPH
  384. # define CSR_TOPEI CSR_STOPEI
  385. # define CSR_TOPI CSR_STOPI
  386. # define SR_IE SR_SIE
  387. # define SR_PIE SR_SPIE
  388. # define SR_PP SR_SPP
  389. # define RV_IRQ_SOFT IRQ_S_SOFT
  390. # define RV_IRQ_TIMER IRQ_S_TIMER
  391. # define RV_IRQ_EXT IRQ_S_EXT
  392. # define RV_IRQ_PMU IRQ_PMU_OVF
  393. # define SIP_LCOFIP (_AC(0x1, UL) << IRQ_PMU_OVF)
  394. #endif /* !CONFIG_RISCV_M_MODE */
  395. /* IE/IP (Supervisor/Machine Interrupt Enable/Pending) flags */
  396. #define IE_SIE (_AC(0x1, UL) << RV_IRQ_SOFT)
  397. #define IE_TIE (_AC(0x1, UL) << RV_IRQ_TIMER)
  398. #define IE_EIE (_AC(0x1, UL) << RV_IRQ_EXT)
  399. #ifndef __ASSEMBLY__
  400. #define csr_swap(csr, val) \
  401. ({ \
  402. unsigned long __v = (unsigned long)(val); \
  403. __asm__ __volatile__ ("csrrw %0, " __ASM_STR(csr) ", %1"\
  404. : "=r" (__v) : "rK" (__v) \
  405. : "memory"); \
  406. __v; \
  407. })
  408. #define csr_read(csr) \
  409. ({ \
  410. register unsigned long __v; \
  411. __asm__ __volatile__ ("csrr %0, " __ASM_STR(csr) \
  412. : "=r" (__v) : \
  413. : "memory"); \
  414. __v; \
  415. })
  416. #define csr_write(csr, val) \
  417. ({ \
  418. unsigned long __v = (unsigned long)(val); \
  419. __asm__ __volatile__ ("csrw " __ASM_STR(csr) ", %0" \
  420. : : "rK" (__v) \
  421. : "memory"); \
  422. })
  423. #define csr_read_set(csr, val) \
  424. ({ \
  425. unsigned long __v = (unsigned long)(val); \
  426. __asm__ __volatile__ ("csrrs %0, " __ASM_STR(csr) ", %1"\
  427. : "=r" (__v) : "rK" (__v) \
  428. : "memory"); \
  429. __v; \
  430. })
  431. #define csr_set(csr, val) \
  432. ({ \
  433. unsigned long __v = (unsigned long)(val); \
  434. __asm__ __volatile__ ("csrs " __ASM_STR(csr) ", %0" \
  435. : : "rK" (__v) \
  436. : "memory"); \
  437. })
  438. #define csr_read_clear(csr, val) \
  439. ({ \
  440. unsigned long __v = (unsigned long)(val); \
  441. __asm__ __volatile__ ("csrrc %0, " __ASM_STR(csr) ", %1"\
  442. : "=r" (__v) : "rK" (__v) \
  443. : "memory"); \
  444. __v; \
  445. })
  446. #define csr_clear(csr, val) \
  447. ({ \
  448. unsigned long __v = (unsigned long)(val); \
  449. __asm__ __volatile__ ("csrc " __ASM_STR(csr) ", %0" \
  450. : : "rK" (__v) \
  451. : "memory"); \
  452. })
  453. #endif /* __ASSEMBLY__ */
  454. #endif /* _ASM_RISCV_CSR_H */