mirror of https://gitee.com/openkylin/qemu.git
hw/intc/arm_gicv3_its: Allow save/restore
We change the restoration priority of both the GICv3 and ITS. The GICv3 must be restored before the ITS and the ITS needs to be restored before PCIe devices since it translates their MSI transactions. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Message-id: 1497023553-18411-5-git-send-email-eric.auger@redhat.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
d5aa0c229a
commit
252a7a6a96
|
@ -145,6 +145,7 @@ static const VMStateDescription vmstate_gicv3 = {
|
|||
.minimum_version_id = 1,
|
||||
.pre_save = gicv3_pre_save,
|
||||
.post_load = gicv3_post_load,
|
||||
.priority = MIG_PRI_GICV3,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_UINT32(gicd_ctlr, GICv3State),
|
||||
VMSTATE_UINT32_ARRAY(gicd_statusr, GICv3State, 2),
|
||||
|
|
|
@ -48,7 +48,7 @@ static const VMStateDescription vmstate_its = {
|
|||
.name = "arm_gicv3_its",
|
||||
.pre_save = gicv3_its_pre_save,
|
||||
.post_load = gicv3_its_post_load,
|
||||
.unmigratable = true,
|
||||
.priority = MIG_PRI_GICV3_ITS,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_UINT32(ctlr, GICv3ITSState),
|
||||
VMSTATE_UINT32(iidr, GICv3ITSState),
|
||||
|
|
|
@ -85,18 +85,6 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
|
|||
GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
|
||||
Error *local_err = NULL;
|
||||
|
||||
/*
|
||||
* Block migration of a KVM GICv3 ITS device: the API for saving and
|
||||
* restoring the state in the kernel is not yet available
|
||||
*/
|
||||
error_setg(&s->migration_blocker, "vITS migration is not implemented");
|
||||
migrate_add_blocker(s->migration_blocker, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
error_free(s->migration_blocker);
|
||||
return;
|
||||
}
|
||||
|
||||
s->dev_fd = kvm_create_device(kvm_state, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
|
||||
if (s->dev_fd < 0) {
|
||||
error_setg_errno(errp, -s->dev_fd, "error creating in-kernel ITS");
|
||||
|
@ -113,6 +101,18 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
|
|||
|
||||
gicv3_its_init_mmio(s, NULL);
|
||||
|
||||
if (!kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_ITS_REGS,
|
||||
GITS_CTLR)) {
|
||||
error_setg(&s->migration_blocker, "This operating system kernel "
|
||||
"does not support vITS migration");
|
||||
migrate_add_blocker(s->migration_blocker, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
error_free(s->migration_blocker);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
kvm_msi_use_devid = true;
|
||||
kvm_gsi_direct_mapping = false;
|
||||
kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled();
|
||||
|
|
|
@ -149,6 +149,8 @@ enum VMStateFlags {
|
|||
typedef enum {
|
||||
MIG_PRI_DEFAULT = 0,
|
||||
MIG_PRI_IOMMU, /* Must happen before PCI devices */
|
||||
MIG_PRI_GICV3_ITS, /* Must happen before PCI devices */
|
||||
MIG_PRI_GICV3, /* Must happen before the ITS */
|
||||
MIG_PRI_MAX,
|
||||
} MigrationPriority;
|
||||
|
||||
|
|
Loading…
Reference in New Issue