Re: [PATCH v1 12/12] target/riscv: Support virtual time context synchronization
On 11/20/21 23:34, Richard Henderson wrote: On 11/20/21 8:46 AM, Yifei Jiang wrote: const VMStateDescription vmstate_riscv_cpu = { .name = "cpu", .version_id = 3, .minimum_version_id = 3, + .post_load = cpu_post_load, .fields = (VMStateField[]) { VMSTATE_UINTTL_ARRAY(env.gpr, RISCVCPU, 32), VMSTATE_UINT64_ARRAY(env.fpr, RISCVCPU, 32), @@ -211,6 +221,10 @@ const VMStateDescription vmstate_riscv_cpu = { VMSTATE_UINT64(env.mtohost, RISCVCPU), VMSTATE_UINT64(env.timecmp, RISCVCPU), + VMSTATE_UINT64(env.kvm_timer_time, RISCVCPU), + VMSTATE_UINT64(env.kvm_timer_compare, RISCVCPU), + VMSTATE_UINT64(env.kvm_timer_state, RISCVCPU), + VMSTATE_END_OF_LIST() }, Can't alter VMStateDescription.fields without bumping version. If this is really kvm-only state, consider placing it into a subsection. But I worry about kvm-only state because ideally we'd be able to migrate between tcg and kvm (if only for debugging). Where is this state stored for TCG? Paolo
Re: [PATCH v1 12/12] target/riscv: Support virtual time context synchronization
On 11/20/21 8:46 AM, Yifei Jiang wrote: const VMStateDescription vmstate_riscv_cpu = { .name = "cpu", .version_id = 3, .minimum_version_id = 3, +.post_load = cpu_post_load, .fields = (VMStateField[]) { VMSTATE_UINTTL_ARRAY(env.gpr, RISCVCPU, 32), VMSTATE_UINT64_ARRAY(env.fpr, RISCVCPU, 32), @@ -211,6 +221,10 @@ const VMStateDescription vmstate_riscv_cpu = { VMSTATE_UINT64(env.mtohost, RISCVCPU), VMSTATE_UINT64(env.timecmp, RISCVCPU), +VMSTATE_UINT64(env.kvm_timer_time, RISCVCPU), +VMSTATE_UINT64(env.kvm_timer_compare, RISCVCPU), +VMSTATE_UINT64(env.kvm_timer_state, RISCVCPU), + VMSTATE_END_OF_LIST() }, Can't alter VMStateDescription.fields without bumping version. If this is really kvm-only state, consider placing it into a subsection. But I worry about kvm-only state because ideally we'd be able to migrate between tcg and kvm (if only for debugging). r~
[PATCH v1 12/12] target/riscv: Support virtual time context synchronization
Add virtual time context description to vmstate_riscv_cpu. After cpu being loaded, virtual time context is updated to KVM. Signed-off-by: Yifei Jiang Signed-off-by: Mingwang Li --- target/riscv/machine.c | 14 ++ 1 file changed, 14 insertions(+) diff --git a/target/riscv/machine.c b/target/riscv/machine.c index ad8248ebfd..153215549b 100644 --- a/target/riscv/machine.c +++ b/target/riscv/machine.c @@ -164,10 +164,20 @@ static const VMStateDescription vmstate_pointermasking = { } }; +static int cpu_post_load(void *opaque, int version_id) +{ +RISCVCPU *cpu = opaque; +CPURISCVState *env = >env; + +env->kvm_timer_dirty = true; +return 0; +} + const VMStateDescription vmstate_riscv_cpu = { .name = "cpu", .version_id = 3, .minimum_version_id = 3, +.post_load = cpu_post_load, .fields = (VMStateField[]) { VMSTATE_UINTTL_ARRAY(env.gpr, RISCVCPU, 32), VMSTATE_UINT64_ARRAY(env.fpr, RISCVCPU, 32), @@ -211,6 +221,10 @@ const VMStateDescription vmstate_riscv_cpu = { VMSTATE_UINT64(env.mtohost, RISCVCPU), VMSTATE_UINT64(env.timecmp, RISCVCPU), +VMSTATE_UINT64(env.kvm_timer_time, RISCVCPU), +VMSTATE_UINT64(env.kvm_timer_compare, RISCVCPU), +VMSTATE_UINT64(env.kvm_timer_state, RISCVCPU), + VMSTATE_END_OF_LIST() }, .subsections = (const VMStateDescription * []) { -- 2.19.1