On Mon, Sep 28, 2020 at 7:05 PM Yifei Jiang <jiangyi...@huawei.com> wrote: > > In the case of supporting PMP feature, add PMP state description > to vmstate_riscv_cpu. > > Signed-off-by: Yifei Jiang <jiangyi...@huawei.com> > Signed-off-by: Yipeng Yin <yinyipe...@huawei.com> > --- > target/riscv/machine.c | 49 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/target/riscv/machine.c b/target/riscv/machine.c > index 3451b888b1..b1fc839b43 100644 > --- a/target/riscv/machine.c > +++ b/target/riscv/machine.c > @@ -4,6 +4,51 @@ > #include "sysemu/kvm.h" > #include "migration/cpu.h" > > +static bool pmp_needed(void *opaque) > +{ > + RISCVCPU *cpu = opaque; > + CPURISCVState *env = &cpu->env; > + > + return riscv_feature(env, RISCV_FEATURE_PMP); > +} > + > +static const VMStateDescription vmstate_pmp_entry = { > + .name = "cpu/pmp/entry", > + .version_id = 1, > + .minimum_version_id = 1, > + .fields = (VMStateField[]) { > + VMSTATE_UINTTL(addr_reg, pmp_entry_t), > + VMSTATE_UINT8(cfg_reg, pmp_entry_t), > + VMSTATE_END_OF_LIST() > + } > +}; > + > +static const VMStateDescription vmstate_pmp_addr = { > + .name = "cpu/pmp/addr", > + .version_id = 1, > + .minimum_version_id = 1, > + .fields = (VMStateField[]) { > + VMSTATE_UINTTL(sa, pmp_addr_t), > + VMSTATE_UINTTL(ea, pmp_addr_t), > + VMSTATE_END_OF_LIST() > + } > +}; > + > +static const VMStateDescription vmstate_pmp = { > + .name = "cpu/pmp", > + .version_id = 1, > + .minimum_version_id = 1, > + .needed = pmp_needed, > + .fields = (VMStateField[]) { > + VMSTATE_STRUCT_ARRAY(env.pmp_state.pmp, RISCVCPU, MAX_RISCV_PMPS, > + 0, vmstate_pmp_entry, pmp_entry_t), > + VMSTATE_STRUCT_ARRAY(env.pmp_state.addr, RISCVCPU, MAX_RISCV_PMPS, > + 0, vmstate_pmp_addr, pmp_addr_t), > + VMSTATE_UINT32(env.pmp_state.num_rules, RISCVCPU),
I would prefer to re-generate these from the PMP CSRs post load. Alistair > + VMSTATE_END_OF_LIST() > + } > +}; > + > const VMStateDescription vmstate_riscv_cpu = { > .name = "cpu", > .version_id = 1, > @@ -55,5 +100,9 @@ const VMStateDescription vmstate_riscv_cpu = { > VMSTATE_UINTTL(env.mstatush, RISCVCPU), > #endif > VMSTATE_END_OF_LIST() > + }, > + .subsections = (const VMStateDescription * []) { > + &vmstate_pmp, > + NULL > } > }; > -- > 2.19.1 > >