@samitouri / QOSamiQemu / commits / b653a954d4

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 */