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


Reply via email to