master
c 165 lines 4.42 KB
Raw
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * Copyright (c) 2025 Loongson Technology Corporation Limited
4 */
5 #include "qemu/osdep.h"
6 #include "cpu.h"
7 #include "csr.h"
8
9 #define CSR_OFF_FUNCS(NAME, FL, RD, WR) \
10 [LOONGARCH_CSR_##NAME] = { \
11 .name = (stringify(NAME)), \
12 .offset = CSR_OFFSET(CSR_##NAME), \
13 .flags = FL, .readfn = RD, .writefn = WR \
14 }
15
16 #define CSR_OFF_ARRAY(NAME, N) \
17 [LOONGARCH_CSR_##NAME(N)] = { \
18 .name = (stringify(NAME##N)), \
19 .offset = CSR_OFFSET(CSR_##NAME[N]), \
20 .flags = CSRFL_BASIC, .readfn = NULL, .writefn = NULL \
21 }
22
23 #define CSR_OFF_FLAGS(NAME, FL) CSR_OFF_FUNCS(NAME, FL, NULL, NULL)
24 #define CSR_OFF(NAME) CSR_OFF_FLAGS(NAME, CSRFL_BASIC)
25
26 static CSRInfo csr_info[] = {
27 CSR_OFF_FLAGS(CRMD, CSRFL_EXITTB),
28 CSR_OFF(PRMD),
29 CSR_OFF_FLAGS(EUEN, CSRFL_EXITTB),
30 CSR_OFF_FLAGS(MISC, CSRFL_READONLY),
31 CSR_OFF(ECFG),
32 CSR_OFF_FLAGS(ESTAT, CSRFL_EXITTB),
33 CSR_OFF(ERA),
34 CSR_OFF(BADV),
35 CSR_OFF_FLAGS(BADI, CSRFL_READONLY),
36 CSR_OFF(EENTRY),
37 CSR_OFF(TLBIDX),
38 CSR_OFF(TLBEHI),
39 CSR_OFF(TLBELO0),
40 CSR_OFF(TLBELO1),
41 CSR_OFF_FLAGS(ASID, CSRFL_EXITTB),
42 CSR_OFF(PGDL),
43 CSR_OFF(PGDH),
44 CSR_OFF_FLAGS(PGD, CSRFL_READONLY),
45 CSR_OFF(PWCL),
46 CSR_OFF(PWCH),
47 CSR_OFF(STLBPS),
48 CSR_OFF(RVACFG),
49 CSR_OFF_FLAGS(CPUID, CSRFL_READONLY),
50 CSR_OFF_FLAGS(PRCFG1, CSRFL_READONLY),
51 CSR_OFF_FLAGS(PRCFG2, CSRFL_READONLY),
52 CSR_OFF_FLAGS(PRCFG3, CSRFL_READONLY),
53 CSR_OFF_ARRAY(SAVE, 0),
54 CSR_OFF_ARRAY(SAVE, 1),
55 CSR_OFF_ARRAY(SAVE, 2),
56 CSR_OFF_ARRAY(SAVE, 3),
57 CSR_OFF_ARRAY(SAVE, 4),
58 CSR_OFF_ARRAY(SAVE, 5),
59 CSR_OFF_ARRAY(SAVE, 6),
60 CSR_OFF_ARRAY(SAVE, 7),
61 CSR_OFF_ARRAY(SAVE, 8),
62 CSR_OFF_ARRAY(SAVE, 9),
63 CSR_OFF_ARRAY(SAVE, 10),
64 CSR_OFF_ARRAY(SAVE, 11),
65 CSR_OFF_ARRAY(SAVE, 12),
66 CSR_OFF_ARRAY(SAVE, 13),
67 CSR_OFF_ARRAY(SAVE, 14),
68 CSR_OFF_ARRAY(SAVE, 15),
69 CSR_OFF(TID),
70 CSR_OFF_FLAGS(TCFG, CSRFL_IO),
71 CSR_OFF_FLAGS(TVAL, CSRFL_READONLY | CSRFL_IO),
72 CSR_OFF(CNTC),
73 CSR_OFF_FLAGS(TICLR, CSRFL_IO),
74 CSR_OFF(LLBCTL),
75 CSR_OFF(IMPCTL1),
76 CSR_OFF(IMPCTL2),
77 CSR_OFF(TLBRENTRY),
78 CSR_OFF(TLBRBADV),
79 CSR_OFF(TLBRERA),
80 CSR_OFF(TLBRSAVE),
81 CSR_OFF(TLBRELO0),
82 CSR_OFF(TLBRELO1),
83 CSR_OFF(TLBREHI),
84 CSR_OFF(TLBRPRMD),
85 CSR_OFF(MERRCTL),
86 CSR_OFF(MERRINFO1),
87 CSR_OFF(MERRINFO2),
88 CSR_OFF(MERRENTRY),
89 CSR_OFF(MERRERA),
90 CSR_OFF(MERRSAVE),
91 CSR_OFF(CTAG),
92 CSR_OFF_ARRAY(DMW, 0),
93 CSR_OFF_ARRAY(DMW, 1),
94 CSR_OFF_ARRAY(DMW, 2),
95 CSR_OFF_ARRAY(DMW, 3),
96 CSR_OFF_ARRAY(PERFCTRL, 0),
97 CSR_OFF_ARRAY(PERFCNTR, 0),
98 CSR_OFF_ARRAY(PERFCTRL, 1),
99 CSR_OFF_ARRAY(PERFCNTR, 1),
100 CSR_OFF_ARRAY(PERFCTRL, 2),
101 CSR_OFF_ARRAY(PERFCNTR, 2),
102 CSR_OFF_ARRAY(PERFCTRL, 3),
103 CSR_OFF_ARRAY(PERFCNTR, 3),
104 CSR_OFF_ARRAY(PERFCTRL, 4),
105 CSR_OFF_ARRAY(PERFCNTR, 4),
106 CSR_OFF_ARRAY(PERFCTRL, 5),
107 CSR_OFF_ARRAY(PERFCNTR, 5),
108 CSR_OFF_ARRAY(PERFCTRL, 6),
109 CSR_OFF_ARRAY(PERFCNTR, 6),
110 CSR_OFF_ARRAY(PERFCTRL, 7),
111 CSR_OFF_ARRAY(PERFCNTR, 7),
112 CSR_OFF_ARRAY(PERFCTRL, 8),
113 CSR_OFF_ARRAY(PERFCNTR, 8),
114 CSR_OFF_ARRAY(PERFCTRL, 9),
115 CSR_OFF_ARRAY(PERFCNTR, 9),
116 CSR_OFF_ARRAY(PERFCTRL, 10),
117 CSR_OFF_ARRAY(PERFCNTR, 10),
118 CSR_OFF_ARRAY(PERFCTRL, 11),
119 CSR_OFF_ARRAY(PERFCNTR, 11),
120 CSR_OFF_ARRAY(PERFCTRL, 12),
121 CSR_OFF_ARRAY(PERFCNTR, 12),
122 CSR_OFF_ARRAY(PERFCTRL, 13),
123 CSR_OFF_ARRAY(PERFCNTR, 13),
124 CSR_OFF_ARRAY(PERFCTRL, 14),
125 CSR_OFF_ARRAY(PERFCNTR, 14),
126 CSR_OFF_ARRAY(PERFCTRL, 15),
127 CSR_OFF_ARRAY(PERFCNTR, 15),
128 CSR_OFF(DBG),
129 CSR_OFF(DERA),
130 CSR_OFF(DSAVE),
131 CSR_OFF_ARRAY(MSGIS, 0),
132 CSR_OFF_ARRAY(MSGIS, 1),
133 CSR_OFF_ARRAY(MSGIS, 2),
134 CSR_OFF_ARRAY(MSGIS, 3),
135 CSR_OFF(MSGIR),
136 };
137
138 CSRInfo *get_csr(unsigned int csr_num)
139 {
140 CSRInfo *csr;
141
142 if (csr_num >= ARRAY_SIZE(csr_info)) {
143 return NULL;
144 }
145
146 csr = &csr_info[csr_num];
147 if (csr->flags == 0) {
148 return NULL;
149 }
150
151 return csr;
152 }
153
154 bool set_csr_flag(unsigned int csr_num, int flag)
155 {
156 CSRInfo *csr;
157
158 csr = get_csr(csr_num);
159 if (!csr) {
160 return false;
161 }
162
163 csr->flags |= flag;
164 return true;
165 }