Skip to content

Commit cb6fa41

Browse files
committed
target/loongarch: Add common source file for CSR register
Common source file csr.c is added here, it can be used by both TCG mode and kvm mode. The common code is removed from file tcg/insn_trans/trans_privileged.c.inc to csrc.c Signed-off-by: Bibo Mao <maobibo@loongson.cn>
1 parent d03114e commit cb6fa41

File tree

4 files changed

+116
-107
lines changed

4 files changed

+116
-107
lines changed

target/loongarch/csr.c

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/* SPDX-License-Identifier: GPL-2.0-or-later */
2+
/*
3+
* Copyright (c) 2025 Loongson Technology Corporation Limited
4+
*/
5+
#include <stddef.h>
6+
#include "qemu/osdep.h"
7+
#include "cpu.h"
8+
#include "csr.h"
9+
10+
#define CSR_OFF_FUNCS(NAME, FL, RD, WR) \
11+
[LOONGARCH_CSR_##NAME] = { \
12+
.offset = offsetof(CPULoongArchState, CSR_##NAME), \
13+
.flags = FL, .readfn = RD, .writefn = WR \
14+
}
15+
16+
#define CSR_OFF_ARRAY(NAME, N) \
17+
[LOONGARCH_CSR_##NAME(N)] = { \
18+
.offset = offsetof(CPULoongArchState, CSR_##NAME[N]), \
19+
.flags = 0, .readfn = NULL, .writefn = NULL \
20+
}
21+
22+
#define CSR_OFF_FLAGS(NAME, FL) CSR_OFF_FUNCS(NAME, FL, NULL, NULL)
23+
#define CSR_OFF(NAME) CSR_OFF_FLAGS(NAME, 0)
24+
25+
static CSRInfo csr_info[] = {
26+
CSR_OFF_FLAGS(CRMD, CSRFL_EXITTB),
27+
CSR_OFF(PRMD),
28+
CSR_OFF_FLAGS(EUEN, CSRFL_EXITTB),
29+
CSR_OFF_FLAGS(MISC, CSRFL_READONLY),
30+
CSR_OFF(ECFG),
31+
CSR_OFF_FLAGS(ESTAT, CSRFL_EXITTB),
32+
CSR_OFF(ERA),
33+
CSR_OFF(BADV),
34+
CSR_OFF_FLAGS(BADI, CSRFL_READONLY),
35+
CSR_OFF(EENTRY),
36+
CSR_OFF(TLBIDX),
37+
CSR_OFF(TLBEHI),
38+
CSR_OFF(TLBELO0),
39+
CSR_OFF(TLBELO1),
40+
CSR_OFF_FLAGS(ASID, CSRFL_EXITTB),
41+
CSR_OFF(PGDL),
42+
CSR_OFF(PGDH),
43+
CSR_OFF_FLAGS(PGD, CSRFL_READONLY),
44+
CSR_OFF(PWCL),
45+
CSR_OFF(PWCH),
46+
CSR_OFF(STLBPS),
47+
CSR_OFF(RVACFG),
48+
CSR_OFF_FLAGS(CPUID, CSRFL_READONLY),
49+
CSR_OFF_FLAGS(PRCFG1, CSRFL_READONLY),
50+
CSR_OFF_FLAGS(PRCFG2, CSRFL_READONLY),
51+
CSR_OFF_FLAGS(PRCFG3, CSRFL_READONLY),
52+
CSR_OFF_ARRAY(SAVE, 0),
53+
CSR_OFF_ARRAY(SAVE, 1),
54+
CSR_OFF_ARRAY(SAVE, 2),
55+
CSR_OFF_ARRAY(SAVE, 3),
56+
CSR_OFF_ARRAY(SAVE, 4),
57+
CSR_OFF_ARRAY(SAVE, 5),
58+
CSR_OFF_ARRAY(SAVE, 6),
59+
CSR_OFF_ARRAY(SAVE, 7),
60+
CSR_OFF_ARRAY(SAVE, 8),
61+
CSR_OFF_ARRAY(SAVE, 9),
62+
CSR_OFF_ARRAY(SAVE, 10),
63+
CSR_OFF_ARRAY(SAVE, 11),
64+
CSR_OFF_ARRAY(SAVE, 12),
65+
CSR_OFF_ARRAY(SAVE, 13),
66+
CSR_OFF_ARRAY(SAVE, 14),
67+
CSR_OFF_ARRAY(SAVE, 15),
68+
CSR_OFF(TID),
69+
CSR_OFF_FLAGS(TCFG, CSRFL_IO),
70+
CSR_OFF_FLAGS(TVAL, CSRFL_READONLY | CSRFL_IO),
71+
CSR_OFF(CNTC),
72+
CSR_OFF_FLAGS(TICLR, CSRFL_IO),
73+
CSR_OFF(LLBCTL),
74+
CSR_OFF(IMPCTL1),
75+
CSR_OFF(IMPCTL2),
76+
CSR_OFF(TLBRENTRY),
77+
CSR_OFF(TLBRBADV),
78+
CSR_OFF(TLBRERA),
79+
CSR_OFF(TLBRSAVE),
80+
CSR_OFF(TLBRELO0),
81+
CSR_OFF(TLBRELO1),
82+
CSR_OFF(TLBREHI),
83+
CSR_OFF(TLBRPRMD),
84+
CSR_OFF(MERRCTL),
85+
CSR_OFF(MERRINFO1),
86+
CSR_OFF(MERRINFO2),
87+
CSR_OFF(MERRENTRY),
88+
CSR_OFF(MERRERA),
89+
CSR_OFF(MERRSAVE),
90+
CSR_OFF(CTAG),
91+
CSR_OFF_ARRAY(DMW, 0),
92+
CSR_OFF_ARRAY(DMW, 1),
93+
CSR_OFF_ARRAY(DMW, 2),
94+
CSR_OFF_ARRAY(DMW, 3),
95+
CSR_OFF(DBG),
96+
CSR_OFF(DERA),
97+
CSR_OFF(DSAVE),
98+
};
99+
100+
CSRInfo *get_csr(unsigned int csr_num)
101+
{
102+
CSRInfo *csr;
103+
104+
if (csr_num >= ARRAY_SIZE(csr_info)) {
105+
return NULL;
106+
}
107+
108+
csr = &csr_info[csr_num];
109+
if (csr->offset == 0) {
110+
return NULL;
111+
}
112+
113+
return csr;
114+
}

target/loongarch/csr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ typedef struct {
2222
GenCSRFunc writefn;
2323
} CSRInfo;
2424

25+
CSRInfo *get_csr(unsigned int csr_num);
2526
#endif /* TARGET_LOONGARCH_CSR_H */

target/loongarch/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ loongarch_system_ss = ss.source_set()
1010
loongarch_system_ss.add(files(
1111
'arch_dump.c',
1212
'cpu_helper.c',
13+
'csr.c',
1314
'loongarch-qmp-cmds.c',
1415
'machine.c',
1516
))

target/loongarch/tcg/insn_trans/trans_privileged.c.inc

Lines changed: 0 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -45,99 +45,6 @@ GEN_FALSE_TRANS(idle)
4545
typedef void (*GenCSRRead)(TCGv dest, TCGv_ptr env);
4646
typedef void (*GenCSRWrite)(TCGv dest, TCGv_ptr env, TCGv src);
4747

48-
#define CSR_OFF_FUNCS(NAME, FL, RD, WR) \
49-
[LOONGARCH_CSR_##NAME] = { \
50-
.offset = offsetof(CPULoongArchState, CSR_##NAME), \
51-
.flags = FL, .readfn = RD, .writefn = WR \
52-
}
53-
54-
#define CSR_OFF_ARRAY(NAME, N) \
55-
[LOONGARCH_CSR_##NAME(N)] = { \
56-
.offset = offsetof(CPULoongArchState, CSR_##NAME[N]), \
57-
.flags = 0, .readfn = NULL, .writefn = NULL \
58-
}
59-
60-
#define CSR_OFF_FLAGS(NAME, FL) \
61-
CSR_OFF_FUNCS(NAME, FL, NULL, NULL)
62-
63-
#define CSR_OFF(NAME) \
64-
CSR_OFF_FLAGS(NAME, 0)
65-
66-
static CSRInfo csr_info[] = {
67-
CSR_OFF_FLAGS(CRMD, CSRFL_EXITTB),
68-
CSR_OFF(PRMD),
69-
CSR_OFF_FLAGS(EUEN, CSRFL_EXITTB),
70-
CSR_OFF_FLAGS(MISC, CSRFL_READONLY),
71-
CSR_OFF(ECFG),
72-
CSR_OFF_FLAGS(ESTAT, CSRFL_EXITTB),
73-
CSR_OFF(ERA),
74-
CSR_OFF(BADV),
75-
CSR_OFF_FLAGS(BADI, CSRFL_READONLY),
76-
CSR_OFF(EENTRY),
77-
CSR_OFF(TLBIDX),
78-
CSR_OFF(TLBEHI),
79-
CSR_OFF(TLBELO0),
80-
CSR_OFF(TLBELO1),
81-
CSR_OFF_FLAGS(ASID, CSRFL_EXITTB),
82-
CSR_OFF(PGDL),
83-
CSR_OFF(PGDH),
84-
CSR_OFF_FLAGS(PGD, CSRFL_READONLY),
85-
CSR_OFF(PWCL),
86-
CSR_OFF(PWCH),
87-
CSR_OFF(STLBPS),
88-
CSR_OFF(RVACFG),
89-
CSR_OFF_FLAGS(CPUID, CSRFL_READONLY),
90-
CSR_OFF_FLAGS(PRCFG1, CSRFL_READONLY),
91-
CSR_OFF_FLAGS(PRCFG2, CSRFL_READONLY),
92-
CSR_OFF_FLAGS(PRCFG3, CSRFL_READONLY),
93-
CSR_OFF_ARRAY(SAVE, 0),
94-
CSR_OFF_ARRAY(SAVE, 1),
95-
CSR_OFF_ARRAY(SAVE, 2),
96-
CSR_OFF_ARRAY(SAVE, 3),
97-
CSR_OFF_ARRAY(SAVE, 4),
98-
CSR_OFF_ARRAY(SAVE, 5),
99-
CSR_OFF_ARRAY(SAVE, 6),
100-
CSR_OFF_ARRAY(SAVE, 7),
101-
CSR_OFF_ARRAY(SAVE, 8),
102-
CSR_OFF_ARRAY(SAVE, 9),
103-
CSR_OFF_ARRAY(SAVE, 10),
104-
CSR_OFF_ARRAY(SAVE, 11),
105-
CSR_OFF_ARRAY(SAVE, 12),
106-
CSR_OFF_ARRAY(SAVE, 13),
107-
CSR_OFF_ARRAY(SAVE, 14),
108-
CSR_OFF_ARRAY(SAVE, 15),
109-
CSR_OFF(TID),
110-
CSR_OFF_FLAGS(TCFG, CSRFL_IO),
111-
CSR_OFF_FLAGS(TVAL, CSRFL_READONLY | CSRFL_IO),
112-
CSR_OFF(CNTC),
113-
CSR_OFF_FLAGS(TICLR, CSRFL_IO),
114-
CSR_OFF(LLBCTL),
115-
CSR_OFF(IMPCTL1),
116-
CSR_OFF(IMPCTL2),
117-
CSR_OFF(TLBRENTRY),
118-
CSR_OFF(TLBRBADV),
119-
CSR_OFF(TLBRERA),
120-
CSR_OFF(TLBRSAVE),
121-
CSR_OFF(TLBRELO0),
122-
CSR_OFF(TLBRELO1),
123-
CSR_OFF(TLBREHI),
124-
CSR_OFF(TLBRPRMD),
125-
CSR_OFF(MERRCTL),
126-
CSR_OFF(MERRINFO1),
127-
CSR_OFF(MERRINFO2),
128-
CSR_OFF(MERRENTRY),
129-
CSR_OFF(MERRERA),
130-
CSR_OFF(MERRSAVE),
131-
CSR_OFF(CTAG),
132-
CSR_OFF_ARRAY(DMW, 0),
133-
CSR_OFF_ARRAY(DMW, 1),
134-
CSR_OFF_ARRAY(DMW, 2),
135-
CSR_OFF_ARRAY(DMW, 3),
136-
CSR_OFF(DBG),
137-
CSR_OFF(DERA),
138-
CSR_OFF(DSAVE),
139-
};
140-
14148
static bool check_plv(DisasContext *ctx)
14249
{
14350
if (ctx->plv == MMU_PLV_USER) {
@@ -147,20 +54,6 @@ static bool check_plv(DisasContext *ctx)
14754
return false;
14855
}
14956

150-
static CSRInfo *get_csr(unsigned csr_num)
151-
{
152-
CSRInfo *csr;
153-
154-
if (csr_num >= ARRAY_SIZE(csr_info)) {
155-
return NULL;
156-
}
157-
csr = &csr_info[csr_num];
158-
if (csr->offset == 0) {
159-
return NULL;
160-
}
161-
return csr;
162-
}
163-
16457
static bool set_csr_trans_func(unsigned int csr_num, GenCSRRead readfn,
16558
GenCSRWrite writefn)
16659
{

0 commit comments

Comments
 (0)