Save and restore the KVM SBI state as a vmstate subsection, so that a guest using SBI STA keeps working after live migration. Only the STA shmem address (shmem_lo and shmem_hi) is saved for now; other SBI state can be appended to kvm_sbi_state as it is added.
Signed-off-by: Wang Yechao <[email protected]> --- target/riscv/kvm/kvm-cpu.c | 5 +++++ target/riscv/kvm/kvm_riscv.h | 1 + target/riscv/machine.c | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c index ba5ba63854..0586e290dd 100644 --- a/target/riscv/kvm/kvm-cpu.c +++ b/target/riscv/kvm/kvm-cpu.c @@ -1015,6 +1015,11 @@ static int kvm_riscv_put_regs_vector(CPUState *cs) return ret; } +bool kvm_riscv_has_sbi_sta_state(void) +{ + return kvm_sbi_sta.supported; +} + static int kvm_riscv_get_regs_sbi_sta(CPUState *cs) { RISCVCPU *cpu = RISCV_CPU(cs); diff --git a/target/riscv/kvm/kvm_riscv.h b/target/riscv/kvm/kvm_riscv.h index aef681f0a2..5e17bacad1 100644 --- a/target/riscv/kvm/kvm_riscv.h +++ b/target/riscv/kvm/kvm_riscv.h @@ -35,6 +35,7 @@ void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift, uint64_t guest_num); void riscv_kvm_aplic_request(void *opaque, int irq, int level); bool kvm_riscv_has_mp_state(void); +bool kvm_riscv_has_sbi_sta_state(void); int kvm_riscv_check_timer_frequency(RISCVCPU *cpu); void riscv_kvm_cpu_finalize_features(RISCVCPU *cpu, Error **errp); uint64_t kvm_riscv_get_timebase_frequency(RISCVCPU *cpu); diff --git a/target/riscv/machine.c b/target/riscv/machine.c index 0de06e9588..9fc699a482 100644 --- a/target/riscv/machine.c +++ b/target/riscv/machine.c @@ -318,6 +318,23 @@ static const VMStateDescription vmstate_kvm_mp_state = { VMSTATE_END_OF_LIST() } }; + +static bool kvm_sbi_state_needed(void *opaque) +{ + return kvm_enabled() && kvm_riscv_has_sbi_sta_state(); +} + +static const VMStateDescription vmstate_kvm_sbi_state = { + .name = "cpu/kvm-sbi-state", + .version_id = 1, + .minimum_version_id = 1, + .needed = kvm_sbi_state_needed, + .fields = (const VMStateField[]) { + VMSTATE_UINT64(env.kvm_sbi_sta.shmem_lo, RISCVCPU), + VMSTATE_UINT64(env.kvm_sbi_sta.shmem_hi, RISCVCPU), + VMSTATE_END_OF_LIST() + } +}; #endif static bool debug_needed(void *opaque) @@ -645,6 +662,7 @@ const VMStateDescription vmstate_riscv_cpu = { &vmstate_kvm_timer_frequency, &vmstate_kvmtimer, &vmstate_kvm_mp_state, + &vmstate_kvm_sbi_state, #endif &vmstate_envcfg, &vmstate_debug, -- 2.27.0
