1f7697f0eSYifei Jiang /* 2f7697f0eSYifei Jiang * RISC-V VMState Description 3f7697f0eSYifei Jiang * 4f7697f0eSYifei Jiang * Copyright (c) 2020 Huawei Technologies Co., Ltd 5f7697f0eSYifei Jiang * 6f7697f0eSYifei Jiang * This program is free software; you can redistribute it and/or modify it 7f7697f0eSYifei Jiang * under the terms and conditions of the GNU General Public License, 8f7697f0eSYifei Jiang * version 2 or later, as published by the Free Software Foundation. 9f7697f0eSYifei Jiang * 10f7697f0eSYifei Jiang * This program is distributed in the hope it will be useful, but WITHOUT 11f7697f0eSYifei Jiang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12f7697f0eSYifei Jiang * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13f7697f0eSYifei Jiang * more details. 14f7697f0eSYifei Jiang * 15f7697f0eSYifei Jiang * You should have received a copy of the GNU General Public License along with 16f7697f0eSYifei Jiang * this program. If not, see <http://www.gnu.org/licenses/>. 17f7697f0eSYifei Jiang */ 18f7697f0eSYifei Jiang 19f7697f0eSYifei Jiang #include "qemu/osdep.h" 20f7697f0eSYifei Jiang #include "cpu.h" 21f7697f0eSYifei Jiang #include "qemu/error-report.h" 2232cad1ffSPhilippe Mathieu-Daudé #include "system/kvm.h" 23f7697f0eSYifei Jiang #include "migration/cpu.h" 24161f5bc8SRichard Henderson #include "exec/icount.h" 25577f0286SLIU Zhiwei #include "debug.h" 26f7697f0eSYifei Jiang 2724beb03eSYifei Jiang static bool pmp_needed(void *opaque) 2824beb03eSYifei Jiang { 2924beb03eSYifei Jiang RISCVCPU *cpu = opaque; 3024beb03eSYifei Jiang 313fe40ef5SDaniel Henrique Barboza return cpu->cfg.pmp; 3224beb03eSYifei Jiang } 3324beb03eSYifei Jiang 3424beb03eSYifei Jiang static int pmp_post_load(void *opaque, int version_id) 3524beb03eSYifei Jiang { 3624beb03eSYifei Jiang RISCVCPU *cpu = opaque; 3724beb03eSYifei Jiang CPURISCVState *env = &cpu->env; 3824beb03eSYifei Jiang int i; 3924beb03eSYifei Jiang 4024beb03eSYifei Jiang for (i = 0; i < MAX_RISCV_PMPS; i++) { 4124beb03eSYifei Jiang pmp_update_rule_addr(env, i); 4224beb03eSYifei Jiang } 4324beb03eSYifei Jiang pmp_update_rule_nums(env); 4424beb03eSYifei Jiang 4524beb03eSYifei Jiang return 0; 4624beb03eSYifei Jiang } 4724beb03eSYifei Jiang 4824beb03eSYifei Jiang static const VMStateDescription vmstate_pmp_entry = { 4924beb03eSYifei Jiang .name = "cpu/pmp/entry", 5024beb03eSYifei Jiang .version_id = 1, 5124beb03eSYifei Jiang .minimum_version_id = 1, 5285b57d3dSRichard Henderson .fields = (const VMStateField[]) { 5324beb03eSYifei Jiang VMSTATE_UINTTL(addr_reg, pmp_entry_t), 5424beb03eSYifei Jiang VMSTATE_UINT8(cfg_reg, pmp_entry_t), 5524beb03eSYifei Jiang VMSTATE_END_OF_LIST() 5624beb03eSYifei Jiang } 5724beb03eSYifei Jiang }; 5824beb03eSYifei Jiang 5924beb03eSYifei Jiang static const VMStateDescription vmstate_pmp = { 6024beb03eSYifei Jiang .name = "cpu/pmp", 6124beb03eSYifei Jiang .version_id = 1, 6224beb03eSYifei Jiang .minimum_version_id = 1, 6324beb03eSYifei Jiang .needed = pmp_needed, 6424beb03eSYifei Jiang .post_load = pmp_post_load, 6585b57d3dSRichard Henderson .fields = (const VMStateField[]) { 6624beb03eSYifei Jiang VMSTATE_STRUCT_ARRAY(env.pmp_state.pmp, RISCVCPU, MAX_RISCV_PMPS, 6724beb03eSYifei Jiang 0, vmstate_pmp_entry, pmp_entry_t), 6824beb03eSYifei Jiang VMSTATE_END_OF_LIST() 6924beb03eSYifei Jiang } 7024beb03eSYifei Jiang }; 7124beb03eSYifei Jiang 7235e07821SYifei Jiang static bool hyper_needed(void *opaque) 7335e07821SYifei Jiang { 7435e07821SYifei Jiang RISCVCPU *cpu = opaque; 7535e07821SYifei Jiang CPURISCVState *env = &cpu->env; 7635e07821SYifei Jiang 7735e07821SYifei Jiang return riscv_has_ext(env, RVH); 7835e07821SYifei Jiang } 7935e07821SYifei Jiang 8035e07821SYifei Jiang static const VMStateDescription vmstate_hyper = { 8135e07821SYifei Jiang .name = "cpu/hyper", 82e231ec8fSVadim Shakirov .version_id = 4, 83e231ec8fSVadim Shakirov .minimum_version_id = 4, 8435e07821SYifei Jiang .needed = hyper_needed, 8585b57d3dSRichard Henderson .fields = (const VMStateField[]) { 8635e07821SYifei Jiang VMSTATE_UINTTL(env.hstatus, RISCVCPU), 8735e07821SYifei Jiang VMSTATE_UINTTL(env.hedeleg, RISCVCPU), 88d028ac75SAnup Patel VMSTATE_UINT64(env.hideleg, RISCVCPU), 89e231ec8fSVadim Shakirov VMSTATE_UINT32(env.hcounteren, RISCVCPU), 9035e07821SYifei Jiang VMSTATE_UINTTL(env.htval, RISCVCPU), 9135e07821SYifei Jiang VMSTATE_UINTTL(env.htinst, RISCVCPU), 9235e07821SYifei Jiang VMSTATE_UINTTL(env.hgatp, RISCVCPU), 93cd032fe7SAnup Patel VMSTATE_UINTTL(env.hgeie, RISCVCPU), 94cd032fe7SAnup Patel VMSTATE_UINTTL(env.hgeip, RISCVCPU), 9540336d5bSRajnesh Kanwal VMSTATE_UINT64(env.hvien, RISCVCPU), 9640336d5bSRajnesh Kanwal VMSTATE_UINT64(env.hvip, RISCVCPU), 9735e07821SYifei Jiang VMSTATE_UINT64(env.htimedelta, RISCVCPU), 983ec0fe18SAtish Patra VMSTATE_UINT64(env.vstimecmp, RISCVCPU), 992b602398SAnup Patel 1002b602398SAnup Patel VMSTATE_UINTTL(env.hvictl, RISCVCPU), 10143dc93afSAnup Patel VMSTATE_UINT8_ARRAY(env.hviprio, RISCVCPU, 64), 10235e07821SYifei Jiang 10335e07821SYifei Jiang VMSTATE_UINT64(env.vsstatus, RISCVCPU), 10435e07821SYifei Jiang VMSTATE_UINTTL(env.vstvec, RISCVCPU), 10535e07821SYifei Jiang VMSTATE_UINTTL(env.vsscratch, RISCVCPU), 10635e07821SYifei Jiang VMSTATE_UINTTL(env.vsepc, RISCVCPU), 10735e07821SYifei Jiang VMSTATE_UINTTL(env.vscause, RISCVCPU), 10835e07821SYifei Jiang VMSTATE_UINTTL(env.vstval, RISCVCPU), 10935e07821SYifei Jiang VMSTATE_UINTTL(env.vsatp, RISCVCPU), 110d1ceff40SAnup Patel VMSTATE_UINTTL(env.vsiselect, RISCVCPU), 11140336d5bSRajnesh Kanwal VMSTATE_UINT64(env.vsie, RISCVCPU), 11235e07821SYifei Jiang 11335e07821SYifei Jiang VMSTATE_UINTTL(env.mtval2, RISCVCPU), 11435e07821SYifei Jiang VMSTATE_UINTTL(env.mtinst, RISCVCPU), 11535e07821SYifei Jiang 11635e07821SYifei Jiang VMSTATE_UINTTL(env.stvec_hs, RISCVCPU), 11735e07821SYifei Jiang VMSTATE_UINTTL(env.sscratch_hs, RISCVCPU), 11835e07821SYifei Jiang VMSTATE_UINTTL(env.sepc_hs, RISCVCPU), 11935e07821SYifei Jiang VMSTATE_UINTTL(env.scause_hs, RISCVCPU), 12035e07821SYifei Jiang VMSTATE_UINTTL(env.stval_hs, RISCVCPU), 12135e07821SYifei Jiang VMSTATE_UINTTL(env.satp_hs, RISCVCPU), 12235e07821SYifei Jiang VMSTATE_UINT64(env.mstatus_hs, RISCVCPU), 12335e07821SYifei Jiang 12435e07821SYifei Jiang VMSTATE_END_OF_LIST() 12535e07821SYifei Jiang } 12635e07821SYifei Jiang }; 12735e07821SYifei Jiang 128edcc4e40SBin Meng static bool vector_needed(void *opaque) 129edcc4e40SBin Meng { 130edcc4e40SBin Meng RISCVCPU *cpu = opaque; 131edcc4e40SBin Meng CPURISCVState *env = &cpu->env; 132edcc4e40SBin Meng 133edcc4e40SBin Meng return riscv_has_ext(env, RVV); 134edcc4e40SBin Meng } 135edcc4e40SBin Meng 136edcc4e40SBin Meng static const VMStateDescription vmstate_vector = { 137edcc4e40SBin Meng .name = "cpu/vector", 138d96a271aSLIU Zhiwei .version_id = 2, 139d96a271aSLIU Zhiwei .minimum_version_id = 2, 140edcc4e40SBin Meng .needed = vector_needed, 14185b57d3dSRichard Henderson .fields = (const VMStateField[]) { 142edcc4e40SBin Meng VMSTATE_UINT64_ARRAY(env.vreg, RISCVCPU, 32 * RV_VLEN_MAX / 64), 143edcc4e40SBin Meng VMSTATE_UINTTL(env.vxrm, RISCVCPU), 144edcc4e40SBin Meng VMSTATE_UINTTL(env.vxsat, RISCVCPU), 145edcc4e40SBin Meng VMSTATE_UINTTL(env.vl, RISCVCPU), 146edcc4e40SBin Meng VMSTATE_UINTTL(env.vstart, RISCVCPU), 147edcc4e40SBin Meng VMSTATE_UINTTL(env.vtype, RISCVCPU), 148d96a271aSLIU Zhiwei VMSTATE_BOOL(env.vill, RISCVCPU), 149edcc4e40SBin Meng VMSTATE_END_OF_LIST() 150edcc4e40SBin Meng } 151edcc4e40SBin Meng }; 152edcc4e40SBin Meng 153edcc4e40SBin Meng static bool pointermasking_needed(void *opaque) 154edcc4e40SBin Meng { 15537089cb8SAlexey Baturo return false; 156edcc4e40SBin Meng } 157edcc4e40SBin Meng 158edcc4e40SBin Meng static const VMStateDescription vmstate_pointermasking = { 159edcc4e40SBin Meng .name = "cpu/pointer_masking", 16037089cb8SAlexey Baturo .version_id = 2, 16137089cb8SAlexey Baturo .minimum_version_id = 2, 162edcc4e40SBin Meng .needed = pointermasking_needed, 16385b57d3dSRichard Henderson .fields = (const VMStateField[]) { 164edcc4e40SBin Meng 165edcc4e40SBin Meng VMSTATE_END_OF_LIST() 166edcc4e40SBin Meng } 167edcc4e40SBin Meng }; 168edcc4e40SBin Meng 1692b547084SFrédéric Pétrot static bool rv128_needed(void *opaque) 1702b547084SFrédéric Pétrot { 171742cc269SAkihiko Odaki RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(opaque); 1722b547084SFrédéric Pétrot 173*5fd23f20SPaolo Bonzini return mcc->def->misa_mxl_max == MXL_RV128; 1742b547084SFrédéric Pétrot } 1752b547084SFrédéric Pétrot 1762b547084SFrédéric Pétrot static const VMStateDescription vmstate_rv128 = { 1772b547084SFrédéric Pétrot .name = "cpu/rv128", 1782b547084SFrédéric Pétrot .version_id = 1, 1792b547084SFrédéric Pétrot .minimum_version_id = 1, 1802b547084SFrédéric Pétrot .needed = rv128_needed, 18185b57d3dSRichard Henderson .fields = (const VMStateField[]) { 1822b547084SFrédéric Pétrot VMSTATE_UINTTL_ARRAY(env.gprh, RISCVCPU, 32), 1832c64ab66SFrédéric Pétrot VMSTATE_UINT64(env.mscratchh, RISCVCPU), 1842c64ab66SFrédéric Pétrot VMSTATE_UINT64(env.sscratchh, RISCVCPU), 1852b547084SFrédéric Pétrot VMSTATE_END_OF_LIST() 1862b547084SFrédéric Pétrot } 1872b547084SFrédéric Pétrot }; 1882b547084SFrédéric Pétrot 1899638cbdeSPhilippe Mathieu-Daudé #ifdef CONFIG_KVM 1901eb9a5daSYifei Jiang static bool kvmtimer_needed(void *opaque) 1911eb9a5daSYifei Jiang { 1921eb9a5daSYifei Jiang return kvm_enabled(); 1931eb9a5daSYifei Jiang } 1941eb9a5daSYifei Jiang 1959638cbdeSPhilippe Mathieu-Daudé static int cpu_kvmtimer_post_load(void *opaque, int version_id) 1961eb9a5daSYifei Jiang { 1971eb9a5daSYifei Jiang RISCVCPU *cpu = opaque; 1981eb9a5daSYifei Jiang CPURISCVState *env = &cpu->env; 1991eb9a5daSYifei Jiang 2001eb9a5daSYifei Jiang env->kvm_timer_dirty = true; 2011eb9a5daSYifei Jiang return 0; 2021eb9a5daSYifei Jiang } 2031eb9a5daSYifei Jiang 2041eb9a5daSYifei Jiang static const VMStateDescription vmstate_kvmtimer = { 2051eb9a5daSYifei Jiang .name = "cpu/kvmtimer", 2061eb9a5daSYifei Jiang .version_id = 1, 2071eb9a5daSYifei Jiang .minimum_version_id = 1, 2081eb9a5daSYifei Jiang .needed = kvmtimer_needed, 2099638cbdeSPhilippe Mathieu-Daudé .post_load = cpu_kvmtimer_post_load, 21085b57d3dSRichard Henderson .fields = (const VMStateField[]) { 2111eb9a5daSYifei Jiang VMSTATE_UINT64(env.kvm_timer_time, RISCVCPU), 2121eb9a5daSYifei Jiang VMSTATE_UINT64(env.kvm_timer_compare, RISCVCPU), 2131eb9a5daSYifei Jiang VMSTATE_UINT64(env.kvm_timer_state, RISCVCPU), 21438b4e781SBin Meng VMSTATE_END_OF_LIST() 21538b4e781SBin Meng } 21638b4e781SBin Meng }; 2179638cbdeSPhilippe Mathieu-Daudé #endif 2181eb9a5daSYifei Jiang 21938b4e781SBin Meng static bool debug_needed(void *opaque) 22038b4e781SBin Meng { 22138b4e781SBin Meng RISCVCPU *cpu = opaque; 22238b4e781SBin Meng 223cdfb2905SDaniel Henrique Barboza return cpu->cfg.debug; 22438b4e781SBin Meng } 22538b4e781SBin Meng 226577f0286SLIU Zhiwei static int debug_post_load(void *opaque, int version_id) 227577f0286SLIU Zhiwei { 228577f0286SLIU Zhiwei RISCVCPU *cpu = opaque; 229577f0286SLIU Zhiwei CPURISCVState *env = &cpu->env; 230577f0286SLIU Zhiwei 231577f0286SLIU Zhiwei if (icount_enabled()) { 232577f0286SLIU Zhiwei env->itrigger_enabled = riscv_itrigger_enabled(env); 233577f0286SLIU Zhiwei } 234577f0286SLIU Zhiwei 235577f0286SLIU Zhiwei return 0; 236577f0286SLIU Zhiwei } 237577f0286SLIU Zhiwei 23838b4e781SBin Meng static const VMStateDescription vmstate_debug = { 23938b4e781SBin Meng .name = "cpu/debug", 2409495c488SFrank Chang .version_id = 2, 2419495c488SFrank Chang .minimum_version_id = 2, 24238b4e781SBin Meng .needed = debug_needed, 243577f0286SLIU Zhiwei .post_load = debug_post_load, 24485b57d3dSRichard Henderson .fields = (const VMStateField[]) { 24538b4e781SBin Meng VMSTATE_UINTTL(env.trigger_cur, RISCVCPU), 2469495c488SFrank Chang VMSTATE_UINTTL_ARRAY(env.tdata1, RISCVCPU, RV_MAX_TRIGGERS), 2479495c488SFrank Chang VMSTATE_UINTTL_ARRAY(env.tdata2, RISCVCPU, RV_MAX_TRIGGERS), 2489495c488SFrank Chang VMSTATE_UINTTL_ARRAY(env.tdata3, RISCVCPU, RV_MAX_TRIGGERS), 2491eb9a5daSYifei Jiang VMSTATE_END_OF_LIST() 2501eb9a5daSYifei Jiang } 2511eb9a5daSYifei Jiang }; 2521eb9a5daSYifei Jiang 253440544e1SLIU Zhiwei static int riscv_cpu_post_load(void *opaque, int version_id) 254440544e1SLIU Zhiwei { 255440544e1SLIU Zhiwei RISCVCPU *cpu = opaque; 256440544e1SLIU Zhiwei CPURISCVState *env = &cpu->env; 257440544e1SLIU Zhiwei 258440544e1SLIU Zhiwei env->xl = cpu_recompute_xl(env); 259440544e1SLIU Zhiwei return 0; 260440544e1SLIU Zhiwei } 261440544e1SLIU Zhiwei 2623bee0e40SMayuresh Chitale static bool smstateen_needed(void *opaque) 2633bee0e40SMayuresh Chitale { 2643bee0e40SMayuresh Chitale RISCVCPU *cpu = opaque; 2653bee0e40SMayuresh Chitale 2663bee0e40SMayuresh Chitale return cpu->cfg.ext_smstateen; 2673bee0e40SMayuresh Chitale } 2683bee0e40SMayuresh Chitale 2693bee0e40SMayuresh Chitale static const VMStateDescription vmstate_smstateen = { 2703bee0e40SMayuresh Chitale .name = "cpu/smtateen", 2713bee0e40SMayuresh Chitale .version_id = 1, 2723bee0e40SMayuresh Chitale .minimum_version_id = 1, 2733bee0e40SMayuresh Chitale .needed = smstateen_needed, 27485b57d3dSRichard Henderson .fields = (const VMStateField[]) { 2753bee0e40SMayuresh Chitale VMSTATE_UINT64_ARRAY(env.mstateen, RISCVCPU, 4), 2763bee0e40SMayuresh Chitale VMSTATE_UINT64_ARRAY(env.hstateen, RISCVCPU, 4), 2773bee0e40SMayuresh Chitale VMSTATE_UINT64_ARRAY(env.sstateen, RISCVCPU, 4), 2783bee0e40SMayuresh Chitale VMSTATE_END_OF_LIST() 2793bee0e40SMayuresh Chitale } 2803bee0e40SMayuresh Chitale }; 2813bee0e40SMayuresh Chitale 28229a9ec9bSAtish Patra static bool envcfg_needed(void *opaque) 28329a9ec9bSAtish Patra { 28429a9ec9bSAtish Patra RISCVCPU *cpu = opaque; 28529a9ec9bSAtish Patra CPURISCVState *env = &cpu->env; 28629a9ec9bSAtish Patra 28729a9ec9bSAtish Patra return (env->priv_ver >= PRIV_VERSION_1_12_0 ? 1 : 0); 28829a9ec9bSAtish Patra } 28929a9ec9bSAtish Patra 29029a9ec9bSAtish Patra static const VMStateDescription vmstate_envcfg = { 29129a9ec9bSAtish Patra .name = "cpu/envcfg", 29229a9ec9bSAtish Patra .version_id = 1, 29329a9ec9bSAtish Patra .minimum_version_id = 1, 29429a9ec9bSAtish Patra .needed = envcfg_needed, 29585b57d3dSRichard Henderson .fields = (const VMStateField[]) { 29629a9ec9bSAtish Patra VMSTATE_UINT64(env.menvcfg, RISCVCPU), 29729a9ec9bSAtish Patra VMSTATE_UINTTL(env.senvcfg, RISCVCPU), 29829a9ec9bSAtish Patra VMSTATE_UINT64(env.henvcfg, RISCVCPU), 2993780e337SAtish Patra VMSTATE_END_OF_LIST() 3003780e337SAtish Patra } 3013780e337SAtish Patra }; 30229a9ec9bSAtish Patra 303bda6522eSRajnesh Kanwal static bool ctr_needed(void *opaque) 304bda6522eSRajnesh Kanwal { 305bda6522eSRajnesh Kanwal RISCVCPU *cpu = opaque; 306bda6522eSRajnesh Kanwal 307bda6522eSRajnesh Kanwal return cpu->cfg.ext_smctr || cpu->cfg.ext_ssctr; 308bda6522eSRajnesh Kanwal } 309bda6522eSRajnesh Kanwal 310bda6522eSRajnesh Kanwal static const VMStateDescription vmstate_ctr = { 311bda6522eSRajnesh Kanwal .name = "cpu/ctr", 312bda6522eSRajnesh Kanwal .version_id = 1, 313bda6522eSRajnesh Kanwal .minimum_version_id = 1, 314bda6522eSRajnesh Kanwal .needed = ctr_needed, 315bda6522eSRajnesh Kanwal .fields = (const VMStateField[]) { 316bda6522eSRajnesh Kanwal VMSTATE_UINT64(env.mctrctl, RISCVCPU), 317bda6522eSRajnesh Kanwal VMSTATE_UINT32(env.sctrdepth, RISCVCPU), 318bda6522eSRajnesh Kanwal VMSTATE_UINT32(env.sctrstatus, RISCVCPU), 319bda6522eSRajnesh Kanwal VMSTATE_UINT64(env.vsctrctl, RISCVCPU), 320bda6522eSRajnesh Kanwal VMSTATE_UINT64_ARRAY(env.ctr_src, RISCVCPU, 16 << SCTRDEPTH_MAX), 321bda6522eSRajnesh Kanwal VMSTATE_UINT64_ARRAY(env.ctr_dst, RISCVCPU, 16 << SCTRDEPTH_MAX), 322bda6522eSRajnesh Kanwal VMSTATE_UINT64_ARRAY(env.ctr_data, RISCVCPU, 16 << SCTRDEPTH_MAX), 323bda6522eSRajnesh Kanwal VMSTATE_END_OF_LIST() 324bda6522eSRajnesh Kanwal } 325bda6522eSRajnesh Kanwal }; 326bda6522eSRajnesh Kanwal 3273780e337SAtish Patra static bool pmu_needed(void *opaque) 3283780e337SAtish Patra { 3293780e337SAtish Patra RISCVCPU *cpu = opaque; 3303780e337SAtish Patra 33169b3849bSRob Bradford return (cpu->cfg.pmu_mask > 0); 3323780e337SAtish Patra } 3333780e337SAtish Patra 3343780e337SAtish Patra static const VMStateDescription vmstate_pmu_ctr_state = { 3353780e337SAtish Patra .name = "cpu/pmu", 33646023470SAtish Patra .version_id = 2, 33746023470SAtish Patra .minimum_version_id = 2, 3383780e337SAtish Patra .needed = pmu_needed, 33985b57d3dSRichard Henderson .fields = (const VMStateField[]) { 3403780e337SAtish Patra VMSTATE_UINTTL(mhpmcounter_val, PMUCTRState), 3413780e337SAtish Patra VMSTATE_UINTTL(mhpmcounterh_val, PMUCTRState), 3423780e337SAtish Patra VMSTATE_UINTTL(mhpmcounter_prev, PMUCTRState), 3433780e337SAtish Patra VMSTATE_UINTTL(mhpmcounterh_prev, PMUCTRState), 34429a9ec9bSAtish Patra VMSTATE_END_OF_LIST() 34529a9ec9bSAtish Patra } 34629a9ec9bSAtish Patra }; 34729a9ec9bSAtish Patra 348ce3af0bbSWeiwei Li static bool jvt_needed(void *opaque) 349ce3af0bbSWeiwei Li { 350ce3af0bbSWeiwei Li RISCVCPU *cpu = opaque; 351ce3af0bbSWeiwei Li 352ce3af0bbSWeiwei Li return cpu->cfg.ext_zcmt; 353ce3af0bbSWeiwei Li } 354ce3af0bbSWeiwei Li 355ce3af0bbSWeiwei Li static const VMStateDescription vmstate_jvt = { 356ce3af0bbSWeiwei Li .name = "cpu/jvt", 357ce3af0bbSWeiwei Li .version_id = 1, 358ce3af0bbSWeiwei Li .minimum_version_id = 1, 359ce3af0bbSWeiwei Li .needed = jvt_needed, 36085b57d3dSRichard Henderson .fields = (const VMStateField[]) { 361ce3af0bbSWeiwei Li VMSTATE_UINTTL(env.jvt, RISCVCPU), 362ce3af0bbSWeiwei Li VMSTATE_END_OF_LIST() 363ce3af0bbSWeiwei Li } 364ce3af0bbSWeiwei Li }; 365ce3af0bbSWeiwei Li 3664923f672SDeepak Gupta static bool elp_needed(void *opaque) 3674923f672SDeepak Gupta { 3684923f672SDeepak Gupta RISCVCPU *cpu = opaque; 3694923f672SDeepak Gupta 3704923f672SDeepak Gupta return cpu->cfg.ext_zicfilp; 3714923f672SDeepak Gupta } 3724923f672SDeepak Gupta 3734923f672SDeepak Gupta static const VMStateDescription vmstate_elp = { 3744923f672SDeepak Gupta .name = "cpu/elp", 3754923f672SDeepak Gupta .version_id = 1, 3764923f672SDeepak Gupta .minimum_version_id = 1, 3774923f672SDeepak Gupta .needed = elp_needed, 3784923f672SDeepak Gupta .fields = (const VMStateField[]) { 3794923f672SDeepak Gupta VMSTATE_BOOL(env.elp, RISCVCPU), 3804923f672SDeepak Gupta VMSTATE_END_OF_LIST() 3814923f672SDeepak Gupta } 3824923f672SDeepak Gupta }; 3834923f672SDeepak Gupta 3848205bc12SDeepak Gupta static bool ssp_needed(void *opaque) 3858205bc12SDeepak Gupta { 3868205bc12SDeepak Gupta RISCVCPU *cpu = opaque; 3878205bc12SDeepak Gupta 3888205bc12SDeepak Gupta return cpu->cfg.ext_zicfiss; 3898205bc12SDeepak Gupta } 3908205bc12SDeepak Gupta 3918205bc12SDeepak Gupta static const VMStateDescription vmstate_ssp = { 3928205bc12SDeepak Gupta .name = "cpu/ssp", 3938205bc12SDeepak Gupta .version_id = 1, 3948205bc12SDeepak Gupta .minimum_version_id = 1, 3958205bc12SDeepak Gupta .needed = ssp_needed, 3968205bc12SDeepak Gupta .fields = (const VMStateField[]) { 3978205bc12SDeepak Gupta VMSTATE_UINTTL(env.ssp, RISCVCPU), 3988205bc12SDeepak Gupta VMSTATE_END_OF_LIST() 3998205bc12SDeepak Gupta } 4008205bc12SDeepak Gupta }; 4018205bc12SDeepak Gupta 402f7697f0eSYifei Jiang const VMStateDescription vmstate_riscv_cpu = { 403f7697f0eSYifei Jiang .name = "cpu", 404e231ec8fSVadim Shakirov .version_id = 10, 405e231ec8fSVadim Shakirov .minimum_version_id = 10, 406440544e1SLIU Zhiwei .post_load = riscv_cpu_post_load, 40785b57d3dSRichard Henderson .fields = (const VMStateField[]) { 408f7697f0eSYifei Jiang VMSTATE_UINTTL_ARRAY(env.gpr, RISCVCPU, 32), 409f7697f0eSYifei Jiang VMSTATE_UINT64_ARRAY(env.fpr, RISCVCPU, 32), 41043dc93afSAnup Patel VMSTATE_UINT8_ARRAY(env.miprio, RISCVCPU, 64), 41143dc93afSAnup Patel VMSTATE_UINT8_ARRAY(env.siprio, RISCVCPU, 64), 412f7697f0eSYifei Jiang VMSTATE_UINTTL(env.pc, RISCVCPU), 413f7697f0eSYifei Jiang VMSTATE_UINTTL(env.load_res, RISCVCPU), 414f7697f0eSYifei Jiang VMSTATE_UINTTL(env.load_val, RISCVCPU), 415f7697f0eSYifei Jiang VMSTATE_UINTTL(env.frm, RISCVCPU), 416f7697f0eSYifei Jiang VMSTATE_UINTTL(env.badaddr, RISCVCPU), 417f7697f0eSYifei Jiang VMSTATE_UINTTL(env.guest_phys_fault_addr, RISCVCPU), 418f7697f0eSYifei Jiang VMSTATE_UINTTL(env.priv_ver, RISCVCPU), 419f7697f0eSYifei Jiang VMSTATE_UINTTL(env.vext_ver, RISCVCPU), 420e91a7227SRichard Henderson VMSTATE_UINT32(env.misa_mxl, RISCVCPU), 421e91a7227SRichard Henderson VMSTATE_UINT32(env.misa_ext, RISCVCPU), 422742cc269SAkihiko Odaki VMSTATE_UNUSED(4), 423e91a7227SRichard Henderson VMSTATE_UINT32(env.misa_ext_mask, RISCVCPU), 424f7697f0eSYifei Jiang VMSTATE_UINTTL(env.priv, RISCVCPU), 425b3c5077bSLIU Zhiwei VMSTATE_BOOL(env.virt_enabled, RISCVCPU), 426277b210dSAlistair Francis VMSTATE_UINT64(env.resetvec, RISCVCPU), 427f7697f0eSYifei Jiang VMSTATE_UINTTL(env.mhartid, RISCVCPU), 428f7697f0eSYifei Jiang VMSTATE_UINT64(env.mstatus, RISCVCPU), 429d028ac75SAnup Patel VMSTATE_UINT64(env.mip, RISCVCPU), 430d028ac75SAnup Patel VMSTATE_UINT64(env.miclaim, RISCVCPU), 431d028ac75SAnup Patel VMSTATE_UINT64(env.mie, RISCVCPU), 4321697837eSRajnesh Kanwal VMSTATE_UINT64(env.mvien, RISCVCPU), 4331697837eSRajnesh Kanwal VMSTATE_UINT64(env.mvip, RISCVCPU), 4341697837eSRajnesh Kanwal VMSTATE_UINT64(env.sie, RISCVCPU), 435d028ac75SAnup Patel VMSTATE_UINT64(env.mideleg, RISCVCPU), 436f7697f0eSYifei Jiang VMSTATE_UINTTL(env.satp, RISCVCPU), 437ac12b601SAtish Patra VMSTATE_UINTTL(env.stval, RISCVCPU), 438f7697f0eSYifei Jiang VMSTATE_UINTTL(env.medeleg, RISCVCPU), 439f7697f0eSYifei Jiang VMSTATE_UINTTL(env.stvec, RISCVCPU), 440f7697f0eSYifei Jiang VMSTATE_UINTTL(env.sepc, RISCVCPU), 441f7697f0eSYifei Jiang VMSTATE_UINTTL(env.scause, RISCVCPU), 442f7697f0eSYifei Jiang VMSTATE_UINTTL(env.mtvec, RISCVCPU), 443f7697f0eSYifei Jiang VMSTATE_UINTTL(env.mepc, RISCVCPU), 444f7697f0eSYifei Jiang VMSTATE_UINTTL(env.mcause, RISCVCPU), 445f7697f0eSYifei Jiang VMSTATE_UINTTL(env.mtval, RISCVCPU), 446d1ceff40SAnup Patel VMSTATE_UINTTL(env.miselect, RISCVCPU), 447d1ceff40SAnup Patel VMSTATE_UINTTL(env.siselect, RISCVCPU), 448e231ec8fSVadim Shakirov VMSTATE_UINT32(env.scounteren, RISCVCPU), 449e231ec8fSVadim Shakirov VMSTATE_UINT32(env.mcounteren, RISCVCPU), 450e84af935SKaiwen Xue VMSTATE_UINT32(env.scountinhibit, RISCVCPU), 451e231ec8fSVadim Shakirov VMSTATE_UINT32(env.mcountinhibit, RISCVCPU), 4523780e337SAtish Patra VMSTATE_STRUCT_ARRAY(env.pmu_ctrs, RISCVCPU, RV_MAX_MHPMCOUNTERS, 0, 4533780e337SAtish Patra vmstate_pmu_ctr_state, PMUCTRState), 454621f35bbSAtish Patra VMSTATE_UINTTL_ARRAY(env.mhpmevent_val, RISCVCPU, RV_MAX_MHPMEVENTS), 45514664483SAtish Patra VMSTATE_UINTTL_ARRAY(env.mhpmeventh_val, RISCVCPU, RV_MAX_MHPMEVENTS), 456f7697f0eSYifei Jiang VMSTATE_UINTTL(env.sscratch, RISCVCPU), 457f7697f0eSYifei Jiang VMSTATE_UINTTL(env.mscratch, RISCVCPU), 45843888c2fSAtish Patra VMSTATE_UINT64(env.stimecmp, RISCVCPU), 459f7697f0eSYifei Jiang 460f7697f0eSYifei Jiang VMSTATE_END_OF_LIST() 46124beb03eSYifei Jiang }, 46285b57d3dSRichard Henderson .subsections = (const VMStateDescription * const []) { 46324beb03eSYifei Jiang &vmstate_pmp, 46435e07821SYifei Jiang &vmstate_hyper, 465bb02edcdSYifei Jiang &vmstate_vector, 466b1c279e1SAlexey Baturo &vmstate_pointermasking, 4672b547084SFrédéric Pétrot &vmstate_rv128, 4689638cbdeSPhilippe Mathieu-Daudé #ifdef CONFIG_KVM 4691eb9a5daSYifei Jiang &vmstate_kvmtimer, 4709638cbdeSPhilippe Mathieu-Daudé #endif 47129a9ec9bSAtish Patra &vmstate_envcfg, 47238b4e781SBin Meng &vmstate_debug, 4733bee0e40SMayuresh Chitale &vmstate_smstateen, 474ce3af0bbSWeiwei Li &vmstate_jvt, 4754923f672SDeepak Gupta &vmstate_elp, 4768205bc12SDeepak Gupta &vmstate_ssp, 477bda6522eSRajnesh Kanwal &vmstate_ctr, 47824beb03eSYifei Jiang NULL 479f7697f0eSYifei Jiang } 480f7697f0eSYifei Jiang }; 481