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>
This commit is contained in:
Bibo Mao
2026-06-05 16:39:38 +08:00
committed by Song Gao
parent 4a5d2c649d
commit b653a954d4
4 changed files with 85 additions and 80 deletions

View File

@@ -282,7 +282,7 @@ static void loongarch_la464_initfn(Object *obj)
uint32_t data = 0, field;
int i;
set_sys_state(env, env);
set_sys_state(env, &env->sys_states[0]);
for (i = 0; i < 21; i++) {
env->cpucfg[i] = 0x0;
}
@@ -412,7 +412,7 @@ static void loongarch_la132_initfn(Object *obj)
uint32_t data = 0;
int i;
set_sys_state(env, env);
set_sys_state(env, &env->sys_states[0]);
for (i = 0; i < 21; i++) {
env->cpucfg[i] = 0x0;
}

View File

@@ -317,23 +317,7 @@ typedef struct LoongArchBT {
#define CPU_VENDOR_LOONGSON "Loongson"
#define CPU_MODEL_3A5000 "3A5000"
#define CPU_MODEL_1C101 "1C101"
struct CPUArchState;
typedef struct CPUArchState CPUSysState;
typedef struct CPUArchState {
uint64_t gpr[32];
uint64_t pc;
fpr_t fpr[32];
bool cf[8];
uint32_t fcsr0;
lbt_t lbt;
uint32_t cpucfg[21];
uint32_t pv_features;
uint64_t vendor_id;
uint64_t cpu_id;
typedef struct CPUSysState {
/* LoongArch CSRs */
uint64_t CSR_CRMD;
uint64_t CSR_PRMD;
@@ -395,6 +379,23 @@ typedef struct CPUArchState {
uint64_t CSR_MSGIS[N_MSGIS];
uint64_t CSR_MSGIR;
uint64_t CSR_MSGIE;
} CPUSysState;
typedef struct CPUArchState {
uint64_t gpr[32];
uint64_t pc;
fpr_t fpr[32];
bool cf[8];
uint32_t fcsr0;
lbt_t lbt;
uint32_t cpucfg[21];
uint32_t pv_features;
uint64_t vendor_id;
uint64_t cpu_id;
CPUSysState sys_states[1];
struct {
uint64_t guest_addr;
} stealtime;

View File

@@ -8,8 +8,10 @@
#include "cpu-csr.h"
#define CSR_OFFSET(id) offsetof(CPULoongArchState, id)
#define CPU_CSR_OFFSET(id, vm_level) CSR_OFFSET(id)
#define CSR_OFFSET(id) offsetof(CPUSysState, id)
#define CPU_CSR_OFFSET(id, vm_level) \
(offsetof(CPULoongArchState, sys_states[vm_level]) \
+ CSR_OFFSET(id))
typedef void (*GenCSRFunc)(void);
enum {
@@ -32,6 +34,6 @@ CSRInfo *get_csr(unsigned int csr_num);
bool set_csr_flag(unsigned int csr_num, int flag);
static inline unsigned int get_csr_offset(const CSRInfo *csr, int vm_level)
{
return csr->offset;
return csr->offset + offsetof(CPULoongArchState, sys_states[vm_level]);
}
#endif /* TARGET_LOONGARCH_CSR_H */

View File

@@ -58,9 +58,9 @@ static const VMStateDescription vmstate_msgint = {
.minimum_version_id = 1,
.needed = msgint_needed,
.fields = (const VMStateField[]) {
VMSTATE_UINT64_ARRAY(env.CSR_MSGIS, LoongArchCPU, N_MSGIS),
VMSTATE_UINT64(env.CSR_MSGIR, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MSGIE, LoongArchCPU),
VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_MSGIS, LoongArchCPU, N_MSGIS),
VMSTATE_UINT64(env.sys_states[0].CSR_MSGIR, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MSGIE, LoongArchCPU),
VMSTATE_END_OF_LIST()
},
};
@@ -167,8 +167,10 @@ static const VMStateDescription vmstate_pmu = {
.needed = pmu_needed,
.fields = (const VMStateField[]) {
VMSTATE_UINT32(env.perf_event_num, LoongArchCPU),
VMSTATE_UINT64_ARRAY(env.CSR_PERFCTRL, LoongArchCPU, MAX_PERF_EVENTS),
VMSTATE_UINT64_ARRAY(env.CSR_PERFCNTR, LoongArchCPU, MAX_PERF_EVENTS),
VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_PERFCTRL, LoongArchCPU,\
MAX_PERF_EVENTS),
VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_PERFCNTR, LoongArchCPU, \
MAX_PERF_EVENTS),
VMSTATE_END_OF_LIST()
},
};
@@ -215,61 +217,61 @@ const VMStateDescription vmstate_loongarch_cpu = {
VMSTATE_UINT64(env.pc, LoongArchCPU),
/* Remaining CSRs */
VMSTATE_UINT64(env.CSR_CRMD, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PRMD, LoongArchCPU),
VMSTATE_UINT64(env.CSR_EUEN, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MISC, LoongArchCPU),
VMSTATE_UINT64(env.CSR_ECFG, LoongArchCPU),
VMSTATE_UINT64(env.CSR_ESTAT, LoongArchCPU),
VMSTATE_UINT64(env.CSR_ERA, LoongArchCPU),
VMSTATE_UINT64(env.CSR_BADV, LoongArchCPU),
VMSTATE_UINT64(env.CSR_BADI, LoongArchCPU),
VMSTATE_UINT64(env.CSR_EENTRY, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBIDX, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBEHI, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBELO0, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBELO1, LoongArchCPU),
VMSTATE_UINT64(env.CSR_ASID, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PGDL, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PGDH, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PGD, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PWCL, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PWCH, LoongArchCPU),
VMSTATE_UINT64(env.CSR_STLBPS, LoongArchCPU),
VMSTATE_UINT64(env.CSR_RVACFG, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PRCFG1, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PRCFG2, LoongArchCPU),
VMSTATE_UINT64(env.CSR_PRCFG3, LoongArchCPU),
VMSTATE_UINT64_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
VMSTATE_UINT64(env.CSR_TID, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TCFG, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TVAL, LoongArchCPU),
VMSTATE_UINT64(env.CSR_CNTC, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TICLR, LoongArchCPU),
VMSTATE_UINT64(env.CSR_LLBCTL, LoongArchCPU),
VMSTATE_UINT64(env.CSR_IMPCTL1, LoongArchCPU),
VMSTATE_UINT64(env.CSR_IMPCTL2, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBRENTRY, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBRBADV, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBRERA, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBRSAVE, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBRELO0, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBRELO1, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBREHI, LoongArchCPU),
VMSTATE_UINT64(env.CSR_TLBRPRMD, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MERRCTL, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MERRINFO1, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MERRINFO2, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MERRENTRY, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MERRERA, LoongArchCPU),
VMSTATE_UINT64(env.CSR_MERRSAVE, LoongArchCPU),
VMSTATE_UINT64(env.CSR_CTAG, LoongArchCPU),
VMSTATE_UINT64_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
VMSTATE_UINT64(env.sys_states[0].CSR_CRMD, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PRMD, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_EUEN, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MISC, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_ECFG, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_ESTAT, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_ERA, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_BADV, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_BADI, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_EENTRY, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBIDX, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBEHI, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBELO0, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBELO1, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_ASID, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PGDL, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PGDH, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PGD, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PWCL, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PWCH, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_STLBPS, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_RVACFG, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PRCFG1, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PRCFG2, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_PRCFG3, LoongArchCPU),
VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_SAVE, LoongArchCPU, 16),
VMSTATE_UINT64(env.sys_states[0].CSR_TID, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TCFG, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TVAL, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_CNTC, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TICLR, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_LLBCTL, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_IMPCTL1, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_IMPCTL2, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBRENTRY, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBRBADV, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBRERA, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBRSAVE, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBRELO0, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBRELO1, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBREHI, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_TLBRPRMD, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MERRCTL, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MERRINFO1, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MERRINFO2, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MERRENTRY, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MERRERA, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_MERRSAVE, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_CTAG, LoongArchCPU),
VMSTATE_UINT64_ARRAY(env.sys_states[0].CSR_DMW, LoongArchCPU, 4),
/* Debug CSRs */
VMSTATE_UINT64(env.CSR_DBG, LoongArchCPU),
VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_DBG, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_DERA, LoongArchCPU),
VMSTATE_UINT64(env.sys_states[0].CSR_DSAVE, LoongArchCPU),
VMSTATE_UINT64(kvm_state_counter, LoongArchCPU),
/* PV steal time */