SyterKit 0.4.0.x
SyterKit is a bare-metal framework
Loading...
Searching...
No Matches
csr.h
Go to the documentation of this file.
1#ifndef __RISCV_H__
2#define __RISCV_H__
3
4#ifdef __cplusplus
5extern "C" {
6#endif
7
9#define MSTATUS_UIE (1 << 0)
10#define MSTATUS_SIE (1 << 1)
11#define MSTATUS_MIE (1 << 3)
12#define MSTATUS_UPIE (1 << 4)
13#define MSTATUS_SPIE (1 << 5)
14#define MSTATUS_MPIE (1 << 7)
15#define MSTATUS_SPP (1 << 8)
16#define MSTATUS_MPP (3 << 11)
17#define MSTATUS_FS (3 << 13)
18#define MSTATUS_XS (3 << 15)
19#define MSTATUS_MPRV (1 << 17)
20#define MSTATUS_SUM (1 << 18)
21#define MSTATUS_MXR (1 << 19)
22#define MSTATUS_TVM (1 << 20)
23#define MSTATUS_TW (1 << 21)
24#define MSTATUS32_SD (1 << 31)
25#define MSTATUS_UXL (3ULL << 32)
26#define MSTATUS_SXL (3ULL << 34)
27#define MSTATUS64_SD (1ULL << 63)
28
30#define MXSTATUS_MM (1 << 15)
31#define MXSTATUS_THEADISAEE (1 << 22)
32
34#define MHCR_IE (1 << 0)
35#define MHCR_DE (1 << 1)
36#define MHCR_WB (1 << 2)
37#define MHCR_WA (1 << 3)
38#define MHCR_RS (1 << 4)
39#define MHCR_BPE (1 << 5)
40#define MHCR_BTE (1 << 12)
41
43#define MHINT_D_PLD (1 << 2)
44#define MHINT_AMR_0 (0b00 << 3)
45#define MHINT_AMR_1 (0b01 << 3)
46#define MHINT_AMR_2 (0b10 << 3)
47#define MHINT_AMR_3 (0b11 << 3)
48#define MHINT_IWPE (1 << 10)
49#define MHINT_PREF_N_2 (0b00 << 13)
50#define MHINT_PREF_N_4 (0b01 << 13)
51#define MHINT_PREF_N_8 (0b10 << 13)
52#define MHINT_PREF_N_16 (0b11 << 13)
53#define MHINT_AEE (1 << 20)
54#define MHINT_PCFIFO_FREEZE (1 << 24)
55
57#define MIP_USIP (1 << 0)
58#define MIP_SSIP (1 << 1)
59#define MIP_MSIP (1 << 3)
60#define MIP_UTIP (1 << 4)
61#define MIP_STIP (1 << 5)
62#define MIP_MTIP (1 << 7)
63#define MIP_UEIP (1 << 8)
64#define MIP_SEIP (1 << 9)
65#define MIP_MEIP (1 << 11)
68#define MIE_USIE (1 << 0)
69#define MIE_SSIE (1 << 1)
70#define MIE_MSIE (1 << 3)
71#define MIE_UTIE (1 << 4)
72#define MIE_STIE (1 << 5)
73#define MIE_MTIE (1 << 7)
74#define MIE_UEIE (1 << 8)
75#define MIE_SEIE (1 << 9)
76#define MIE_MEIE (1 << 11)
78/* RISC-V Privilege */
79#define PRV_U (0)
80#define PRV_S (1)
81#define PRV_H (2)
82#define PRV_M (3)
83
93#define csr_swap(csr, val) \
94 ({ \
95 unsigned long __v = (unsigned long) (val); \
96 __asm__ __volatile__("csrrw %0, " #csr ", %1" \
97 : "=r"(__v) \
98 : "rK"(__v) \
99 : "memory"); \
100 __v; \
101 })
102
111#define csr_read(csr) \
112 ({ \
113 register unsigned long __v; \
114 __asm__ __volatile__("csrr %0, " #csr \
115 : "=r"(__v) \
116 : \
117 : "memory"); \
118 __v; \
119 })
120
129#define csr_write(csr, val) \
130 ({ \
131 unsigned long __v = (unsigned long) (val); \
132 __asm__ __volatile__("csrw " #csr ", %0" \
133 : \
134 : "rK"(__v) \
135 : "memory"); \
136 })
137
147#define csr_read_set(csr, val) \
148 ({ \
149 unsigned long __v = (unsigned long) (val); \
150 __asm__ __volatile__("csrrs %0, " #csr ", %1" \
151 : "=r"(__v) \
152 : "rK"(__v) \
153 : "memory"); \
154 __v; \
155 })
156
165#define csr_set(csr, val) \
166 ({ \
167 unsigned long __v = (unsigned long) (val); \
168 __asm__ __volatile__("csrs " #csr ", %0" \
169 : \
170 : "rK"(__v) \
171 : "memory"); \
172 })
173
183#define csr_read_clear(csr, val) \
184 ({ \
185 unsigned long __v = (unsigned long) (val); \
186 __asm__ __volatile__("csrrc %0, " #csr ", %1" \
187 : "=r"(__v) \
188 : "rK"(__v) \
189 : "memory"); \
190 __v; \
191 })
192
201#define csr_clear(csr, val) \
202 ({ \
203 unsigned long __v = (unsigned long) (val); \
204 __asm__ __volatile__("csrc " #csr ", %0" \
205 : \
206 : "rK"(__v) \
207 : "memory"); \
208 })
209
210#ifdef __cplusplus
211}
212#endif
213
214#endif /* __RISCV_H__ */