-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcsr_func.c
175 lines (146 loc) · 3.29 KB
/
csr_func.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include "csr_func.h"
#include "csr.h"
#include "string.h"
void csr_write_stvec(uint64_t value)
{
__asm__ volatile("csrw stvec, %0" ::"r"(value));
}
void csr_write_sie(uint64_t value)
{
__asm__ volatile("csrw sie, %0" ::"r"(value));
}
void csr_write_sscratch(uint64_t value)
{
__asm__ volatile("csrw sscratch, %0" ::"r"(value));
}
void csr_write_satp(uint64_t satp)
{
__asm__ volatile("csrw satp, %0" ::"r"(satp));
}
void csr_write_sepc(uint64_t sepc)
{
__asm__ volatile("csrw sepc, %0" ::"r"(sepc));
}
uint64_t csr_read_scause(void)
{
uint64_t value;
__asm__ volatile("csrr %0, scause" : "=r"(value));
return value;
}
uint64_t csr_read_stval(void)
{
uint64_t value;
__asm__ volatile("csrr %0, stval" : "=r"(value));
return value;
}
uint64_t csr_read_sepc(void)
{
uint64_t value;
__asm__ volatile("csrr %0, sepc" : "=r"(value));
return value;
}
uint64_t csr_read_vsstatus(void)
{
uint64_t vsstatus;
// vsstatus : 0x200
__asm__ volatile("csrr %0, 0x200" : "=r"(vsstatus));
return vsstatus;
}
uint64_t csr_read_vsip(void)
{
uint64_t vsip;
__asm__ volatile("csrr %0, 0x244" : "=r"(vsip));
return vsip;
}
uint64_t csr_read_vsie(void)
{
uint64_t vsie;
__asm__ volatile("csrr %0, 0x204" : "=r"(vsie));
return vsie;
}
uint64_t csr_read_vstvec(void)
{
uint64_t vstvec;
__asm__ volatile("csrr %0, 0x205" : "=r"(vstvec));
return vstvec;
}
uint64_t csr_read_vsscratch(void)
{
uint64_t vsscratch;
__asm__ volatile("csrr %0, 0x240" : "=r"(vsscratch));
return vsscratch;
}
uint64_t csr_read_vsepc(void)
{
uint64_t vsepc;
__asm__ volatile("csrr %0, 0x241" : "=r"(vsepc));
return vsepc;
}
uint64_t csr_read_vscause(void)
{
uint64_t vscause;
__asm__ volatile("csrr %0, 0x242" : "=r"(vscause));
return vscause;
// 0x242
}
uint64_t csr_read_vstval(void)
{
uint64_t vstval;
__asm__ volatile("csrr %0, 0x243" : "=r"(vstval));
return vstval;
}
uint64_t csr_read_vsatp(void)
{
uint64_t vscause;
__asm__ volatile("csrr %0, 0x280" : "=r"(vscause));
return vscause;
}
// for write
void csr_write_vsstatus(uint64_t value)
{
__asm__ volatile("csrw 0x200, %0" : : "r"(value));
}
void csr_write_vsip(uint64_t value)
{
__asm__ volatile("csrw 0x244, %0" : : "r"(value));
}
void csr_write_vsie(uint64_t value)
{
__asm__ volatile("csrw 0x204, %0" : : "r"(value));
}
void csr_write_vstvec(uint64_t value)
{
__asm__ volatile("csrw 0x205, %0" : : "r"(value));
}
void csr_write_vsscratch(uint64_t value)
{
__asm__ volatile("csrw 0x240, %0" : : "r"(value));
}
void csr_write_vsepc(uint64_t value)
{
__asm__ volatile("csrw 0x241, %0" : : "r"(value));
}
void csr_write_vscause(uint64_t value)
{
__asm__ volatile("csrw 0x280, %0" : : "r"(value));
}
void csr_write_vstval(uint64_t value)
{
__asm__ volatile("csrw 0x243, %0" : : "r"(value));
}
void csr_write_vsatp(uint64_t value)
{
__asm__ volatile("csrw 0x280, %0" : : "r"(value));
}
void csr_write_hedeleg(uint64_t value)
{
__asm__ volatile("csrw " TO_STR(CSR_HEDELEG) ", %0" ::"r"(value));
}
void csr_write_hideleg(uint64_t value)
{
__asm__ volatile("csrw " TO_STR(CSR_HIDELEG) ", %0" ::"r"(value));
}
void csr_write_hgatp(uint64_t value)
{
__asm__ volatile("csrw " TO_STR(CSR_HGATP) ", %0" ::"r"(value));
}