xref: /qemu/target/loongarch/machine.c (revision 2d23bb1a3805f2a3440d66ac8b7fe3f4a39e58b4)
167ebd42aSXiaojuan Yang /* SPDX-License-Identifier: GPL-2.0-or-later */
267ebd42aSXiaojuan Yang /*
367ebd42aSXiaojuan Yang  * QEMU LoongArch Machine State
467ebd42aSXiaojuan Yang  *
567ebd42aSXiaojuan Yang  * Copyright (c) 2021 Loongson Technology Corporation Limited
667ebd42aSXiaojuan Yang  */
767ebd42aSXiaojuan Yang 
867ebd42aSXiaojuan Yang #include "qemu/osdep.h"
967ebd42aSXiaojuan Yang #include "cpu.h"
1067ebd42aSXiaojuan Yang #include "migration/cpu.h"
11008a3b16SSong Gao #include "vec.h"
127e1c521eSXiaojuan Yang 
1316f5396cSSong Gao static const VMStateDescription vmstate_fpu_reg = {
1416f5396cSSong Gao     .name = "fpu_reg",
1516f5396cSSong Gao     .version_id = 1,
1616f5396cSSong Gao     .minimum_version_id = 1,
17*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
1816f5396cSSong Gao         VMSTATE_UINT64(UD(0), VReg),
1916f5396cSSong Gao         VMSTATE_END_OF_LIST()
2016f5396cSSong Gao     }
2116f5396cSSong Gao };
2216f5396cSSong Gao 
2316f5396cSSong Gao #define VMSTATE_FPU_REGS(_field, _state, _start)            \
2416f5396cSSong Gao     VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, 32, 0, \
2516f5396cSSong Gao                              vmstate_fpu_reg, fpr_t)
2616f5396cSSong Gao 
2716f5396cSSong Gao static bool fpu_needed(void *opaque)
2816f5396cSSong Gao {
2916f5396cSSong Gao     LoongArchCPU *cpu = opaque;
3016f5396cSSong Gao 
3116f5396cSSong Gao     return FIELD_EX64(cpu->env.cpucfg[2], CPUCFG2, FP);
3216f5396cSSong Gao }
3316f5396cSSong Gao 
3416f5396cSSong Gao static const VMStateDescription vmstate_fpu = {
3516f5396cSSong Gao     .name = "cpu/fpu",
3616f5396cSSong Gao     .version_id = 1,
3716f5396cSSong Gao     .minimum_version_id = 1,
3816f5396cSSong Gao     .needed = fpu_needed,
39*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
4016f5396cSSong Gao         VMSTATE_FPU_REGS(env.fpr, LoongArchCPU, 0),
4116f5396cSSong Gao         VMSTATE_UINT32(env.fcsr0, LoongArchCPU),
4216f5396cSSong Gao         VMSTATE_BOOL_ARRAY(env.cf, LoongArchCPU, 8),
4316f5396cSSong Gao         VMSTATE_END_OF_LIST()
4416f5396cSSong Gao     },
4516f5396cSSong Gao };
4616f5396cSSong Gao 
4716f5396cSSong Gao static const VMStateDescription vmstate_lsxh_reg = {
4816f5396cSSong Gao     .name = "lsxh_reg",
4916f5396cSSong Gao     .version_id = 1,
5016f5396cSSong Gao     .minimum_version_id = 1,
51*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
5216f5396cSSong Gao         VMSTATE_UINT64(UD(1), VReg),
5316f5396cSSong Gao         VMSTATE_END_OF_LIST()
5416f5396cSSong Gao     }
5516f5396cSSong Gao };
5616f5396cSSong Gao 
5716f5396cSSong Gao #define VMSTATE_LSXH_REGS(_field, _state, _start)           \
5816f5396cSSong Gao     VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, 32, 0, \
5916f5396cSSong Gao                              vmstate_lsxh_reg, fpr_t)
6016f5396cSSong Gao 
6116f5396cSSong Gao static bool lsx_needed(void *opaque)
6216f5396cSSong Gao {
6316f5396cSSong Gao     LoongArchCPU *cpu = opaque;
6416f5396cSSong Gao 
6516f5396cSSong Gao     return FIELD_EX64(cpu->env.cpucfg[2], CPUCFG2, LSX);
6616f5396cSSong Gao }
6716f5396cSSong Gao 
6816f5396cSSong Gao static const VMStateDescription vmstate_lsx = {
6916f5396cSSong Gao     .name = "cpu/lsx",
7016f5396cSSong Gao     .version_id = 1,
7116f5396cSSong Gao     .minimum_version_id = 1,
7216f5396cSSong Gao     .needed = lsx_needed,
73*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
7416f5396cSSong Gao         VMSTATE_LSXH_REGS(env.fpr, LoongArchCPU, 0),
7516f5396cSSong Gao         VMSTATE_END_OF_LIST()
7616f5396cSSong Gao     },
7716f5396cSSong Gao };
7816f5396cSSong Gao 
79008a3b16SSong Gao static const VMStateDescription vmstate_lasxh_reg = {
80008a3b16SSong Gao     .name = "lasxh_reg",
81008a3b16SSong Gao     .version_id = 1,
82008a3b16SSong Gao     .minimum_version_id = 1,
83*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
84008a3b16SSong Gao         VMSTATE_UINT64(UD(2), VReg),
85008a3b16SSong Gao         VMSTATE_UINT64(UD(3), VReg),
86008a3b16SSong Gao         VMSTATE_END_OF_LIST()
87008a3b16SSong Gao     }
88008a3b16SSong Gao };
89008a3b16SSong Gao 
90008a3b16SSong Gao #define VMSTATE_LASXH_REGS(_field, _state, _start)          \
91008a3b16SSong Gao     VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, 32, 0, \
92008a3b16SSong Gao                              vmstate_lasxh_reg, fpr_t)
93008a3b16SSong Gao 
94008a3b16SSong Gao static bool lasx_needed(void *opaque)
95008a3b16SSong Gao {
96008a3b16SSong Gao     LoongArchCPU *cpu = opaque;
97008a3b16SSong Gao 
98008a3b16SSong Gao     return FIELD_EX64(cpu->env.cpucfg[2], CPUCFG2, LASX);
99008a3b16SSong Gao }
100008a3b16SSong Gao 
101008a3b16SSong Gao static const VMStateDescription vmstate_lasx = {
102008a3b16SSong Gao     .name = "cpu/lasx",
103008a3b16SSong Gao     .version_id = 1,
104008a3b16SSong Gao     .minimum_version_id = 1,
105008a3b16SSong Gao     .needed = lasx_needed,
106*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
107008a3b16SSong Gao         VMSTATE_LASXH_REGS(env.fpr, LoongArchCPU, 0),
108008a3b16SSong Gao         VMSTATE_END_OF_LIST()
109008a3b16SSong Gao     },
110008a3b16SSong Gao };
111008a3b16SSong Gao 
1127e1c521eSXiaojuan Yang /* TLB state */
1137e1c521eSXiaojuan Yang const VMStateDescription vmstate_tlb = {
1147e1c521eSXiaojuan Yang     .name = "cpu/tlb",
1157e1c521eSXiaojuan Yang     .version_id = 0,
1167e1c521eSXiaojuan Yang     .minimum_version_id = 0,
117*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
1187e1c521eSXiaojuan Yang         VMSTATE_UINT64(tlb_misc, LoongArchTLB),
1197e1c521eSXiaojuan Yang         VMSTATE_UINT64(tlb_entry0, LoongArchTLB),
1207e1c521eSXiaojuan Yang         VMSTATE_UINT64(tlb_entry1, LoongArchTLB),
1217e1c521eSXiaojuan Yang         VMSTATE_END_OF_LIST()
1227e1c521eSXiaojuan Yang     }
1237e1c521eSXiaojuan Yang };
12467ebd42aSXiaojuan Yang 
12567ebd42aSXiaojuan Yang /* LoongArch CPU state */
12667ebd42aSXiaojuan Yang const VMStateDescription vmstate_loongarch_cpu = {
12767ebd42aSXiaojuan Yang     .name = "cpu",
12816f5396cSSong Gao     .version_id = 1,
12916f5396cSSong Gao     .minimum_version_id = 1,
130*2d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
13167ebd42aSXiaojuan Yang         VMSTATE_UINTTL_ARRAY(env.gpr, LoongArchCPU, 32),
13267ebd42aSXiaojuan Yang         VMSTATE_UINTTL(env.pc, LoongArchCPU),
13367ebd42aSXiaojuan Yang 
13467ebd42aSXiaojuan Yang         /* Remaining CSRs */
13567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_CRMD, LoongArchCPU),
13667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRMD, LoongArchCPU),
13767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_EUEN, LoongArchCPU),
13867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MISC, LoongArchCPU),
13967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ECFG, LoongArchCPU),
14067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ESTAT, LoongArchCPU),
14167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ERA, LoongArchCPU),
14267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_BADV, LoongArchCPU),
14367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_BADI, LoongArchCPU),
14467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_EENTRY, LoongArchCPU),
14567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBIDX, LoongArchCPU),
14667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBEHI, LoongArchCPU),
14767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBELO0, LoongArchCPU),
14867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBELO1, LoongArchCPU),
14967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ASID, LoongArchCPU),
15067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PGDL, LoongArchCPU),
15167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PGDH, LoongArchCPU),
15267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PGD, LoongArchCPU),
15367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PWCL, LoongArchCPU),
15467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PWCH, LoongArchCPU),
15567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_STLBPS, LoongArchCPU),
15667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_RVACFG, LoongArchCPU),
15767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRCFG1, LoongArchCPU),
15867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRCFG2, LoongArchCPU),
15967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRCFG3, LoongArchCPU),
16067ebd42aSXiaojuan Yang         VMSTATE_UINT64_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
16167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TID, LoongArchCPU),
16267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TCFG, LoongArchCPU),
16367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TVAL, LoongArchCPU),
16467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_CNTC, LoongArchCPU),
16567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TICLR, LoongArchCPU),
16667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_LLBCTL, LoongArchCPU),
16767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_IMPCTL1, LoongArchCPU),
16867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_IMPCTL2, LoongArchCPU),
16967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRENTRY, LoongArchCPU),
17067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRBADV, LoongArchCPU),
17167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRERA, LoongArchCPU),
17267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRSAVE, LoongArchCPU),
17367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRELO0, LoongArchCPU),
17467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRELO1, LoongArchCPU),
17567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBREHI, LoongArchCPU),
17667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRPRMD, LoongArchCPU),
17767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRCTL, LoongArchCPU),
17867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRINFO1, LoongArchCPU),
17967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRINFO2, LoongArchCPU),
18067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRENTRY, LoongArchCPU),
18167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRERA, LoongArchCPU),
18267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRSAVE, LoongArchCPU),
18367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_CTAG, LoongArchCPU),
18467ebd42aSXiaojuan Yang         VMSTATE_UINT64_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
18567ebd42aSXiaojuan Yang 
18667ebd42aSXiaojuan Yang         /* Debug CSRs */
18767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_DBG, LoongArchCPU),
18867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
18967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
1907e1c521eSXiaojuan Yang         /* TLB */
1917e1c521eSXiaojuan Yang         VMSTATE_STRUCT_ARRAY(env.tlb, LoongArchCPU, LOONGARCH_TLB_MAX,
1927e1c521eSXiaojuan Yang                              0, vmstate_tlb, LoongArchTLB),
19367ebd42aSXiaojuan Yang 
19467ebd42aSXiaojuan Yang         VMSTATE_END_OF_LIST()
19567ebd42aSXiaojuan Yang     },
196*2d23bb1aSRichard Henderson     .subsections = (const VMStateDescription * const []) {
19716f5396cSSong Gao         &vmstate_fpu,
19816f5396cSSong Gao         &vmstate_lsx,
199008a3b16SSong Gao         &vmstate_lasx,
2007534695bSRichard Henderson         NULL
20116f5396cSSong Gao     }
20267ebd42aSXiaojuan Yang };
203