target/loongarch: Add new structure CPUSysState
New structure CPUSysState is added here, now it only contains CSR registers, in future TLB and timer can be moved to this structure also. It is only code movement, no function change. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Tested-by: Song Gao <gaosong@loongson.cn> Message-ID: <20260605083938.175658-1-maobibo@loongson.cn> Signed-off-by: Song Gao <gaosong@loongson.cn>
Bibo Mao committed
Jun 5, 2026 at 16:39 UTC
b653a954d427561fc563238af6b2feb8da209e41
4 files changed
+85
-80
target/loongarch/cpu.c
+2
-2
@@ -282,7 +282,7 @@ static void loongarch_la464_initfn(Object *obj)
282
uint32_t data = 0, field;
283
int i;
284
285
- set_sys_state(env, env);
285
+ set_sys_state(env, &env->sys_states[0]);
286
for (i = 0; i < 21; i++) {
287
env->cpucfg[i] = 0x0;
288
}
@@ -412,7 +412,7 @@ static void loongarch_la132_initfn(Object *obj)
412
uint32_t data = 0;
413
int i;
414
415
- set_sys_state(env, env);
415
+ set_sys_state(env, &env->sys_states[0]);
416
for (i = 0; i < 21; i++) {
417
env->cpucfg[i] = 0x0;
418
}
target/loongarch/cpu.h
+18
-17
@@ -317,23 +317,7 @@ typedef struct LoongArchBT {
317
#define CPU_VENDOR_LOONGSON "Loongson"
318
#define CPU_MODEL_3A5000 "3A5000"
319
#define CPU_MODEL_1C101 "1C101"
320
-struct CPUArchState;
321
-typedef struct CPUArchState CPUSysState;
322
-
323
-typedef struct CPUArchState {
324
- uint64_t gpr[32];
325
- uint64_t pc;
326
-
327
- fpr_t fpr[32];
328
- bool cf[8];
329
- uint32_t fcsr0;
330
- lbt_t lbt;
331
-
332
- uint32_t cpucfg[21];
333
- uint32_t pv_features;
334
- uint64_t vendor_id;
335
- uint64_t cpu_id;
336
-
320
+typedef struct CPUSysState {
321
/* LoongArch CSRs */
322
uint64_t CSR_CRMD;
323
uint64_t CSR_PRMD;
@@ -395,6 +379,23 @@ typedef struct CPUArchState {
379
uint64_t CSR_MSGIS[N_MSGIS];
380
uint64_t CSR_MSGIR;
381
uint64_t CSR_MSGIE;
382
+} CPUSysState;
383
+
384
+typedef struct CPUArchState {
385
+ uint64_t gpr[32];
386
+ uint64_t pc;
387
+
388
+ fpr_t fpr[32];
389
+ bool cf[8];
390
+ uint32_t fcsr0;
391
+ lbt_t lbt;
392
+
393
+ uint32_t cpucfg[21];
394
+ uint32_t pv_features;
395
+ uint64_t vendor_id;
396
+ uint64_t cpu_id;
397
+ CPUSysState sys_states[1];
398
+
399
struct {
400
uint64_t guest_addr;
401
} stealtime;
target/loongarch/csr.h
+5
-3
@@ -8,8 +8,10 @@
8
9
#include "cpu-csr.h"
10
11
-#define CSR_OFFSET(id) offsetof(CPULoongArchState, id)
12
-#define CPU_CSR_OFFSET(id, vm_level) CSR_OFFSET(id)
11
+#define CSR_OFFSET(id) offsetof(CPUSysState, id)
12
+#define CPU_CSR_OFFSET(id, vm_level) \
13
+ (offsetof(CPULoongArchState, sys_states[vm_level]) \
14
+ + CSR_OFFSET(id))
15
16
typedef void (*GenCSRFunc)(void);
17
enum {
@@ -32,6 +34,6 @@ CSRInfo *get_csr(unsigned int csr_num);
34
bool set_csr_flag(unsigned int csr_num, int flag);
35
static inline unsigned int get_csr_offset(const CSRInfo *csr, int vm_level)
36
{
35
- return csr->offset;
37
+ return csr->offset + offsetof(CPULoongArchState, sys_states[vm_level]);
38
}
39
#endif /* TARGET_LOONGARCH_CSR_H */
target/loongarch/machine.c
+60
-58
@@ -58,9 +58,9 @@ static const VMStateDescription vmstate_msgint = {
58
.minimum_version_id = 1,
59
.needed = msgint_needed,
60
.fields = (const VMStateField[]) {
61
- VMSTATE_UINT64_ARRAY(env.CSR_MSGIS, LoongArchCPU, N_MSGIS),
62
- VMSTATE_UINT64(env.CSR_MSGIR, LoongArchCPU),
63
- VMSTATE_UINT64(env.CSR_MSGIE, LoongArchCPU),
61
+ VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_MSGIS, LoongArchCPU, N_MSGIS),
62
+ VMSTATE_UINT64(env.sys_states[0].CSR_MSGIR, LoongArchCPU),
63
+ VMSTATE_UINT64(env.sys_states[0].CSR_MSGIE, LoongArchCPU),
64
VMSTATE_END_OF_LIST()
65
},
66
};
@@ -167,8 +167,10 @@ static const VMStateDescription vmstate_pmu = {
167
.needed = pmu_needed,
168
.fields = (const VMStateField[]) {
169
VMSTATE_UINT32(env.perf_event_num, LoongArchCPU),
170
- VMSTATE_UINT64_ARRAY(env.CSR_PERFCTRL, LoongArchCPU, MAX_PERF_EVENTS),
171
- VMSTATE_UINT64_ARRAY(env.CSR_PERFCNTR, LoongArchCPU, MAX_PERF_EVENTS),
170
+ VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_PERFCTRL, LoongArchCPU,\
171
+ MAX_PERF_EVENTS),
172
+ VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_PERFCNTR, LoongArchCPU, \
173
+ MAX_PERF_EVENTS),
174
VMSTATE_END_OF_LIST()
175
},
176
};
@@ -215,61 +217,61 @@ const VMStateDescription vmstate_loongarch_cpu = {
217
VMSTATE_UINT64(env.pc, LoongArchCPU),
218
219
/* Remaining CSRs */
218
- VMSTATE_UINT64(env.CSR_CRMD, LoongArchCPU),
219
- VMSTATE_UINT64(env.CSR_PRMD, LoongArchCPU),
220
- VMSTATE_UINT64(env.CSR_EUEN, LoongArchCPU),
221
- VMSTATE_UINT64(env.CSR_MISC, LoongArchCPU),
222
- VMSTATE_UINT64(env.CSR_ECFG, LoongArchCPU),
223
- VMSTATE_UINT64(env.CSR_ESTAT, LoongArchCPU),
224
- VMSTATE_UINT64(env.CSR_ERA, LoongArchCPU),
225
- VMSTATE_UINT64(env.CSR_BADV, LoongArchCPU),
226
- VMSTATE_UINT64(env.CSR_BADI, LoongArchCPU),
227
- VMSTATE_UINT64(env.CSR_EENTRY, LoongArchCPU),
228
- VMSTATE_UINT64(env.CSR_TLBIDX, LoongArchCPU),
229
- VMSTATE_UINT64(env.CSR_TLBEHI, LoongArchCPU),
230
- VMSTATE_UINT64(env.CSR_TLBELO0, LoongArchCPU),
231
- VMSTATE_UINT64(env.CSR_TLBELO1, LoongArchCPU),
232
- VMSTATE_UINT64(env.CSR_ASID, LoongArchCPU),
233
- VMSTATE_UINT64(env.CSR_PGDL, LoongArchCPU),
234
- VMSTATE_UINT64(env.CSR_PGDH, LoongArchCPU),
235
- VMSTATE_UINT64(env.CSR_PGD, LoongArchCPU),
236
- VMSTATE_UINT64(env.CSR_PWCL, LoongArchCPU),
237
- VMSTATE_UINT64(env.CSR_PWCH, LoongArchCPU),
238
- VMSTATE_UINT64(env.CSR_STLBPS, LoongArchCPU),
239
- VMSTATE_UINT64(env.CSR_RVACFG, LoongArchCPU),
240
- VMSTATE_UINT64(env.CSR_PRCFG1, LoongArchCPU),
241
- VMSTATE_UINT64(env.CSR_PRCFG2, LoongArchCPU),
242
- VMSTATE_UINT64(env.CSR_PRCFG3, LoongArchCPU),
243
- VMSTATE_UINT64_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
244
- VMSTATE_UINT64(env.CSR_TID, LoongArchCPU),
245
- VMSTATE_UINT64(env.CSR_TCFG, LoongArchCPU),
246
- VMSTATE_UINT64(env.CSR_TVAL, LoongArchCPU),
247
- VMSTATE_UINT64(env.CSR_CNTC, LoongArchCPU),
248
- VMSTATE_UINT64(env.CSR_TICLR, LoongArchCPU),
249
- VMSTATE_UINT64(env.CSR_LLBCTL, LoongArchCPU),
250
- VMSTATE_UINT64(env.CSR_IMPCTL1, LoongArchCPU),
251
- VMSTATE_UINT64(env.CSR_IMPCTL2, LoongArchCPU),
252
- VMSTATE_UINT64(env.CSR_TLBRENTRY, LoongArchCPU),
253
- VMSTATE_UINT64(env.CSR_TLBRBADV, LoongArchCPU),
254
- VMSTATE_UINT64(env.CSR_TLBRERA, LoongArchCPU),
255
- VMSTATE_UINT64(env.CSR_TLBRSAVE, LoongArchCPU),
256
- VMSTATE_UINT64(env.CSR_TLBRELO0, LoongArchCPU),
257
- VMSTATE_UINT64(env.CSR_TLBRELO1, LoongArchCPU),
258
- VMSTATE_UINT64(env.CSR_TLBREHI, LoongArchCPU),
259
- VMSTATE_UINT64(env.CSR_TLBRPRMD, LoongArchCPU),
260
- VMSTATE_UINT64(env.CSR_MERRCTL, LoongArchCPU),
261
- VMSTATE_UINT64(env.CSR_MERRINFO1, LoongArchCPU),
262
- VMSTATE_UINT64(env.CSR_MERRINFO2, LoongArchCPU),
263
- VMSTATE_UINT64(env.CSR_MERRENTRY, LoongArchCPU),
264
- VMSTATE_UINT64(env.CSR_MERRERA, LoongArchCPU),
265
- VMSTATE_UINT64(env.CSR_MERRSAVE, LoongArchCPU),
266
- VMSTATE_UINT64(env.CSR_CTAG, LoongArchCPU),
267
- VMSTATE_UINT64_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
220
+ VMSTATE_UINT64(env.sys_states[0].CSR_CRMD, LoongArchCPU),
221
+ VMSTATE_UINT64(env.sys_states[0].CSR_PRMD, LoongArchCPU),
222
+ VMSTATE_UINT64(env.sys_states[0].CSR_EUEN, LoongArchCPU),
223
+ VMSTATE_UINT64(env.sys_states[0].CSR_MISC, LoongArchCPU),
224
+ VMSTATE_UINT64(env.sys_states[0].CSR_ECFG, LoongArchCPU),
225
+ VMSTATE_UINT64(env.sys_states[0].CSR_ESTAT, LoongArchCPU),
226
+ VMSTATE_UINT64(env.sys_states[0].CSR_ERA, LoongArchCPU),
227
+ VMSTATE_UINT64(env.sys_states[0].CSR_BADV, LoongArchCPU),
228
+ VMSTATE_UINT64(env.sys_states[0].CSR_BADI, LoongArchCPU),
229
+ VMSTATE_UINT64(env.sys_states[0].CSR_EENTRY, LoongArchCPU),
230
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBIDX, LoongArchCPU),
231
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBEHI, LoongArchCPU),
232
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBELO0, LoongArchCPU),
233
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBELO1, LoongArchCPU),
234
+ VMSTATE_UINT64(env.sys_states[0].CSR_ASID, LoongArchCPU),
235
+ VMSTATE_UINT64(env.sys_states[0].CSR_PGDL, LoongArchCPU),
236
+ VMSTATE_UINT64(env.sys_states[0].CSR_PGDH, LoongArchCPU),
237
+ VMSTATE_UINT64(env.sys_states[0].CSR_PGD, LoongArchCPU),
238
+ VMSTATE_UINT64(env.sys_states[0].CSR_PWCL, LoongArchCPU),
239
+ VMSTATE_UINT64(env.sys_states[0].CSR_PWCH, LoongArchCPU),
240
+ VMSTATE_UINT64(env.sys_states[0].CSR_STLBPS, LoongArchCPU),
241
+ VMSTATE_UINT64(env.sys_states[0].CSR_RVACFG, LoongArchCPU),
242
+ VMSTATE_UINT64(env.sys_states[0].CSR_PRCFG1, LoongArchCPU),
243
+ VMSTATE_UINT64(env.sys_states[0].CSR_PRCFG2, LoongArchCPU),
244
+ VMSTATE_UINT64(env.sys_states[0].CSR_PRCFG3, LoongArchCPU),
245
+ VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_SAVE, LoongArchCPU, 16),
246
+ VMSTATE_UINT64(env.sys_states[0].CSR_TID, LoongArchCPU),
247
+ VMSTATE_UINT64(env.sys_states[0].CSR_TCFG, LoongArchCPU),
248
+ VMSTATE_UINT64(env.sys_states[0].CSR_TVAL, LoongArchCPU),
249
+ VMSTATE_UINT64(env.sys_states[0].CSR_CNTC, LoongArchCPU),
250
+ VMSTATE_UINT64(env.sys_states[0].CSR_TICLR, LoongArchCPU),
251
+ VMSTATE_UINT64(env.sys_states[0].CSR_LLBCTL, LoongArchCPU),
252
+ VMSTATE_UINT64(env.sys_states[0].CSR_IMPCTL1, LoongArchCPU),
253
+ VMSTATE_UINT64(env.sys_states[0].CSR_IMPCTL2, LoongArchCPU),
254
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBRENTRY, LoongArchCPU),
255
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBRBADV, LoongArchCPU),
256
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBRERA, LoongArchCPU),
257
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBRSAVE, LoongArchCPU),
258
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBRELO0, LoongArchCPU),
259
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBRELO1, LoongArchCPU),
260
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBREHI, LoongArchCPU),
261
+ VMSTATE_UINT64(env.sys_states[0].CSR_TLBRPRMD, LoongArchCPU),
262
+ VMSTATE_UINT64(env.sys_states[0].CSR_MERRCTL, LoongArchCPU),
263
+ VMSTATE_UINT64(env.sys_states[0].CSR_MERRINFO1, LoongArchCPU),
264
+ VMSTATE_UINT64(env.sys_states[0].CSR_MERRINFO2, LoongArchCPU),
265
+ VMSTATE_UINT64(env.sys_states[0].CSR_MERRENTRY, LoongArchCPU),
266
+ VMSTATE_UINT64(env.sys_states[0].CSR_MERRERA, LoongArchCPU),
267
+ VMSTATE_UINT64(env.sys_states[0].CSR_MERRSAVE, LoongArchCPU),
268
+ VMSTATE_UINT64(env.sys_states[0].CSR_CTAG, LoongArchCPU),
269
+ VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_DMW, LoongArchCPU, 4),
270
271
/* Debug CSRs */
270
- VMSTATE_UINT64(env.CSR_DBG, LoongArchCPU),
271
- VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
272
- VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
272
+ VMSTATE_UINT64(env.sys_states[0].CSR_DBG, LoongArchCPU),
273
+ VMSTATE_UINT64(env.sys_states[0].CSR_DERA, LoongArchCPU),
274
+ VMSTATE_UINT64(env.sys_states[0].CSR_DSAVE, LoongArchCPU),
275
276
VMSTATE_UINT64(kvm_state_counter, LoongArchCPU),
277
/* PV steal time */