xref: /qemu/target/loongarch/machine.c (revision 0eb285c3627b5406dd91bfa3b47402e5de92123f)
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"
116f703a48SBibo Mao #include "sysemu/tcg.h"
12008a3b16SSong Gao #include "vec.h"
137e1c521eSXiaojuan Yang 
1416f5396cSSong Gao static const VMStateDescription vmstate_fpu_reg = {
1516f5396cSSong Gao     .name = "fpu_reg",
1616f5396cSSong Gao     .version_id = 1,
1716f5396cSSong Gao     .minimum_version_id = 1,
182d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
1916f5396cSSong Gao         VMSTATE_UINT64(UD(0), VReg),
2016f5396cSSong Gao         VMSTATE_END_OF_LIST()
2116f5396cSSong Gao     }
2216f5396cSSong Gao };
2316f5396cSSong Gao 
2416f5396cSSong Gao #define VMSTATE_FPU_REGS(_field, _state, _start)            \
2516f5396cSSong Gao     VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, 32, 0, \
2616f5396cSSong Gao                              vmstate_fpu_reg, fpr_t)
2716f5396cSSong Gao 
2816f5396cSSong Gao static bool fpu_needed(void *opaque)
2916f5396cSSong Gao {
3016f5396cSSong Gao     LoongArchCPU *cpu = opaque;
3116f5396cSSong Gao 
3216f5396cSSong Gao     return FIELD_EX64(cpu->env.cpucfg[2], CPUCFG2, FP);
3316f5396cSSong Gao }
3416f5396cSSong Gao 
3516f5396cSSong Gao static const VMStateDescription vmstate_fpu = {
3616f5396cSSong Gao     .name = "cpu/fpu",
3716f5396cSSong Gao     .version_id = 1,
3816f5396cSSong Gao     .minimum_version_id = 1,
3916f5396cSSong Gao     .needed = fpu_needed,
402d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
4116f5396cSSong Gao         VMSTATE_FPU_REGS(env.fpr, LoongArchCPU, 0),
4216f5396cSSong Gao         VMSTATE_UINT32(env.fcsr0, LoongArchCPU),
4316f5396cSSong Gao         VMSTATE_BOOL_ARRAY(env.cf, LoongArchCPU, 8),
4416f5396cSSong Gao         VMSTATE_END_OF_LIST()
4516f5396cSSong Gao     },
4616f5396cSSong Gao };
4716f5396cSSong Gao 
4816f5396cSSong Gao static const VMStateDescription vmstate_lsxh_reg = {
4916f5396cSSong Gao     .name = "lsxh_reg",
5016f5396cSSong Gao     .version_id = 1,
5116f5396cSSong Gao     .minimum_version_id = 1,
522d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
5316f5396cSSong Gao         VMSTATE_UINT64(UD(1), VReg),
5416f5396cSSong Gao         VMSTATE_END_OF_LIST()
5516f5396cSSong Gao     }
5616f5396cSSong Gao };
5716f5396cSSong Gao 
5816f5396cSSong Gao #define VMSTATE_LSXH_REGS(_field, _state, _start)           \
5916f5396cSSong Gao     VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, 32, 0, \
6016f5396cSSong Gao                              vmstate_lsxh_reg, fpr_t)
6116f5396cSSong Gao 
6216f5396cSSong Gao static bool lsx_needed(void *opaque)
6316f5396cSSong Gao {
6416f5396cSSong Gao     LoongArchCPU *cpu = opaque;
6516f5396cSSong Gao 
6616f5396cSSong Gao     return FIELD_EX64(cpu->env.cpucfg[2], CPUCFG2, LSX);
6716f5396cSSong Gao }
6816f5396cSSong Gao 
6916f5396cSSong Gao static const VMStateDescription vmstate_lsx = {
7016f5396cSSong Gao     .name = "cpu/lsx",
7116f5396cSSong Gao     .version_id = 1,
7216f5396cSSong Gao     .minimum_version_id = 1,
7316f5396cSSong Gao     .needed = lsx_needed,
742d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
7516f5396cSSong Gao         VMSTATE_LSXH_REGS(env.fpr, LoongArchCPU, 0),
7616f5396cSSong Gao         VMSTATE_END_OF_LIST()
7716f5396cSSong Gao     },
7816f5396cSSong Gao };
7916f5396cSSong Gao 
80008a3b16SSong Gao static const VMStateDescription vmstate_lasxh_reg = {
81008a3b16SSong Gao     .name = "lasxh_reg",
82008a3b16SSong Gao     .version_id = 1,
83008a3b16SSong Gao     .minimum_version_id = 1,
842d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
85008a3b16SSong Gao         VMSTATE_UINT64(UD(2), VReg),
86008a3b16SSong Gao         VMSTATE_UINT64(UD(3), VReg),
87008a3b16SSong Gao         VMSTATE_END_OF_LIST()
88008a3b16SSong Gao     }
89008a3b16SSong Gao };
90008a3b16SSong Gao 
91008a3b16SSong Gao #define VMSTATE_LASXH_REGS(_field, _state, _start)          \
92008a3b16SSong Gao     VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, 32, 0, \
93008a3b16SSong Gao                              vmstate_lasxh_reg, fpr_t)
94008a3b16SSong Gao 
95008a3b16SSong Gao static bool lasx_needed(void *opaque)
96008a3b16SSong Gao {
97008a3b16SSong Gao     LoongArchCPU *cpu = opaque;
98008a3b16SSong Gao 
99008a3b16SSong Gao     return FIELD_EX64(cpu->env.cpucfg[2], CPUCFG2, LASX);
100008a3b16SSong Gao }
101008a3b16SSong Gao 
102008a3b16SSong Gao static const VMStateDescription vmstate_lasx = {
103008a3b16SSong Gao     .name = "cpu/lasx",
104008a3b16SSong Gao     .version_id = 1,
105008a3b16SSong Gao     .minimum_version_id = 1,
106008a3b16SSong Gao     .needed = lasx_needed,
1072d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
108008a3b16SSong Gao         VMSTATE_LASXH_REGS(env.fpr, LoongArchCPU, 0),
109008a3b16SSong Gao         VMSTATE_END_OF_LIST()
110008a3b16SSong Gao     },
111008a3b16SSong Gao };
112008a3b16SSong Gao 
1136f703a48SBibo Mao #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
1146f703a48SBibo Mao static bool tlb_needed(void *opaque)
1156f703a48SBibo Mao {
1166f703a48SBibo Mao     return tcg_enabled();
1176f703a48SBibo Mao }
1186f703a48SBibo Mao 
1197e1c521eSXiaojuan Yang /* TLB state */
1206f703a48SBibo Mao static const VMStateDescription vmstate_tlb_entry = {
1216f703a48SBibo Mao     .name = "cpu/tlb_entry",
1227e1c521eSXiaojuan Yang     .version_id = 0,
1237e1c521eSXiaojuan Yang     .minimum_version_id = 0,
1242d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
1257e1c521eSXiaojuan Yang         VMSTATE_UINT64(tlb_misc, LoongArchTLB),
1267e1c521eSXiaojuan Yang         VMSTATE_UINT64(tlb_entry0, LoongArchTLB),
1277e1c521eSXiaojuan Yang         VMSTATE_UINT64(tlb_entry1, LoongArchTLB),
1287e1c521eSXiaojuan Yang         VMSTATE_END_OF_LIST()
1297e1c521eSXiaojuan Yang     }
1307e1c521eSXiaojuan Yang };
13167ebd42aSXiaojuan Yang 
1326f703a48SBibo Mao static const VMStateDescription vmstate_tlb = {
1336f703a48SBibo Mao     .name = "cpu/tlb",
1346f703a48SBibo Mao     .version_id = 0,
1356f703a48SBibo Mao     .minimum_version_id = 0,
1366f703a48SBibo Mao     .needed = tlb_needed,
1376f703a48SBibo Mao     .fields = (const VMStateField[]) {
1386f703a48SBibo Mao         VMSTATE_STRUCT_ARRAY(env.tlb, LoongArchCPU, LOONGARCH_TLB_MAX,
1396f703a48SBibo Mao                              0, vmstate_tlb_entry, LoongArchTLB),
1406f703a48SBibo Mao         VMSTATE_END_OF_LIST()
1416f703a48SBibo Mao     }
1426f703a48SBibo Mao };
1436f703a48SBibo Mao #endif
1446f703a48SBibo Mao 
14567ebd42aSXiaojuan Yang /* LoongArch CPU state */
14667ebd42aSXiaojuan Yang const VMStateDescription vmstate_loongarch_cpu = {
14767ebd42aSXiaojuan Yang     .name = "cpu",
148*0eb285c3SSong Gao     .version_id = 2,
149*0eb285c3SSong Gao     .minimum_version_id = 2,
1502d23bb1aSRichard Henderson     .fields = (const VMStateField[]) {
15167ebd42aSXiaojuan Yang         VMSTATE_UINTTL_ARRAY(env.gpr, LoongArchCPU, 32),
15267ebd42aSXiaojuan Yang         VMSTATE_UINTTL(env.pc, LoongArchCPU),
15367ebd42aSXiaojuan Yang 
15467ebd42aSXiaojuan Yang         /* Remaining CSRs */
15567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_CRMD, LoongArchCPU),
15667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRMD, LoongArchCPU),
15767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_EUEN, LoongArchCPU),
15867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MISC, LoongArchCPU),
15967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ECFG, LoongArchCPU),
16067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ESTAT, LoongArchCPU),
16167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ERA, LoongArchCPU),
16267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_BADV, LoongArchCPU),
16367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_BADI, LoongArchCPU),
16467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_EENTRY, LoongArchCPU),
16567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBIDX, LoongArchCPU),
16667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBEHI, LoongArchCPU),
16767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBELO0, LoongArchCPU),
16867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBELO1, LoongArchCPU),
16967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_ASID, LoongArchCPU),
17067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PGDL, LoongArchCPU),
17167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PGDH, LoongArchCPU),
17267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PGD, LoongArchCPU),
17367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PWCL, LoongArchCPU),
17467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PWCH, LoongArchCPU),
17567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_STLBPS, LoongArchCPU),
17667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_RVACFG, LoongArchCPU),
17767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRCFG1, LoongArchCPU),
17867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRCFG2, LoongArchCPU),
17967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_PRCFG3, LoongArchCPU),
18067ebd42aSXiaojuan Yang         VMSTATE_UINT64_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
18167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TID, LoongArchCPU),
18267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TCFG, LoongArchCPU),
18367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TVAL, LoongArchCPU),
18467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_CNTC, LoongArchCPU),
18567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TICLR, LoongArchCPU),
18667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_LLBCTL, LoongArchCPU),
18767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_IMPCTL1, LoongArchCPU),
18867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_IMPCTL2, LoongArchCPU),
18967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRENTRY, LoongArchCPU),
19067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRBADV, LoongArchCPU),
19167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRERA, LoongArchCPU),
19267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRSAVE, LoongArchCPU),
19367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRELO0, LoongArchCPU),
19467ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRELO1, LoongArchCPU),
19567ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBREHI, LoongArchCPU),
19667ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_TLBRPRMD, LoongArchCPU),
19767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRCTL, LoongArchCPU),
19867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRINFO1, LoongArchCPU),
19967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRINFO2, LoongArchCPU),
20067ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRENTRY, LoongArchCPU),
20167ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRERA, LoongArchCPU),
20267ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_MERRSAVE, LoongArchCPU),
20367ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_CTAG, LoongArchCPU),
20467ebd42aSXiaojuan Yang         VMSTATE_UINT64_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
20567ebd42aSXiaojuan Yang 
20667ebd42aSXiaojuan Yang         /* Debug CSRs */
20767ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_DBG, LoongArchCPU),
20867ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
20967ebd42aSXiaojuan Yang         VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
21067ebd42aSXiaojuan Yang 
211*0eb285c3SSong Gao         VMSTATE_UINT64(kvm_state_counter, LoongArchCPU),
212*0eb285c3SSong Gao 
21367ebd42aSXiaojuan Yang         VMSTATE_END_OF_LIST()
21467ebd42aSXiaojuan Yang     },
2152d23bb1aSRichard Henderson     .subsections = (const VMStateDescription * const []) {
21616f5396cSSong Gao         &vmstate_fpu,
21716f5396cSSong Gao         &vmstate_lsx,
218008a3b16SSong Gao         &vmstate_lasx,
2196f703a48SBibo Mao #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
2206f703a48SBibo Mao         &vmstate_tlb,
2216f703a48SBibo Mao #endif
2227534695bSRichard Henderson         NULL
22316f5396cSSong Gao     }
22467ebd42aSXiaojuan Yang };
225