From: Xuemei Liu <liu.xuem...@zte.com.cn>

Address an error in migration by discarding 'riscv_aplic' and 'riscv_imsic'
in vmstate_register_with_alias_id() when aia is configured as
'aplic-imsic' in riscv kvm vm.

Previously, the fields in the vmsds of 'riscv_aplic' and 'riscv_imsic' can
only be initialized under certain special conditions in commit 95a97b3fd2.
However, the corresponding ses of these vmsds are inserted into the
savevm_state.handlers unconditionally. This led to migration failure
characterized by uninitialized fields when save vm state:
qemu-system-riscv64: ../migration/vmstate.c:433: vmstate_save_state_v:
Assertion 'first_elem || !n_elems || !size' failed.

Fixes: 95a97b3fd2 ("target/riscv: update APLIC and IMSIC to support KVM AIA")
Signed-off-by: Xuemei Liu <liu.xuem...@zte.com.cn>
---
migration/savevm.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)

diff --git a/migration/savevm.c b/migration/savevm.c
index 0c12e373b4..db53ce6d55 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -71,6 +71,8 @@
#include "yank_functions.h"
#include "system/qtest.h"
#include "options.h"
+#include "hw/intc/riscv_aplic.h"
+#include "system/kvm.h"

const unsigned int postcopy_ram_discard_version;

@@ -902,6 +904,21 @@ int vmstate_register_with_alias_id(VMStateIf *obj, 
uint32_t instance_id,
{
SaveStateEntry *se;

+    /* Drop "riscv_aplic" if emulated aplic is used*/
+    if (!g_strcmp0(vmsd->name, "riscv_aplic")) {
+        RISCVAPLICState *aplic = opaque;
+        if (!riscv_use_emulated_aplic(aplic->msimode)) {
+            return 0;
+        }
+    }
+
+    /* Drop "riscv_imsic" if kvm_kernel_irqchip is true */
+    if (!g_strcmp0(vmsd->name, "riscv_imsic")) {
+        if (kvm_irqchip_in_kernel()) {
+            return 0;
+        }
+    }
+
/* If this triggers, alias support can be dropped for the vmsd. */
assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);

--
2.27.0

Reply via email to