[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 16/17] hw/intc/arm_gicv3_kvm: Implement pending table
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 16/17] hw/intc/arm_gicv3_kvm: Implement pending table save |
Date: |
Tue, 13 Jun 2017 15:07:05 +0100 |
From: Eric Auger <address@hidden>
This patch adds the flush of the LPI pending bits into the
redistributor pending tables. This happens on VM stop.
There is no explicit restore as the tables are implicitly sync'ed
on ITS table restore and on LPI enable at redistributor level.
Signed-off-by: Eric Auger <address@hidden>
Message-id: address@hidden
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
---
hw/intc/arm_gicv3_kvm.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
index b70ee27..6051c77 100644
--- a/hw/intc/arm_gicv3_kvm.c
+++ b/hw/intc/arm_gicv3_kvm.c
@@ -25,6 +25,7 @@
#include "hw/sysbus.h"
#include "qemu/error-report.h"
#include "sysemu/kvm.h"
+#include "sysemu/sysemu.h"
#include "kvm_arm.h"
#include "gicv3_internal.h"
#include "vgic_common.h"
@@ -680,6 +681,35 @@ static const ARMCPRegInfo gicv3_cpuif_reginfo[] = {
REGINFO_SENTINEL
};
+/**
+ * vm_change_state_handler - VM change state callback aiming at flushing
+ * RDIST pending tables into guest RAM
+ *
+ * The tables get flushed to guest RAM whenever the VM gets stopped.
+ */
+static void vm_change_state_handler(void *opaque, int running,
+ RunState state)
+{
+ GICv3State *s = (GICv3State *)opaque;
+ Error *err = NULL;
+ int ret;
+
+ if (running) {
+ return;
+ }
+
+ ret = kvm_device_access(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES,
+ NULL, true, &err);
+ if (err) {
+ error_report_err(err);
+ }
+ if (ret < 0 && ret != -EFAULT) {
+ abort();
+ }
+}
+
+
static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
{
GICv3State *s = KVM_ARM_GICV3(dev);
@@ -751,6 +781,10 @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error
**errp)
return;
}
}
+ if (kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES)) {
+ qemu_add_vm_change_state_handler(vm_change_state_handler, s);
+ }
}
static void kvm_arm_gicv3_class_init(ObjectClass *klass, void *data)
--
2.7.4
- [Qemu-devel] [PULL 00/17] target-arm queue, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 15/17] hw/intc/arm_gicv3_its: Implement state save/restore, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 16/17] hw/intc/arm_gicv3_kvm: Implement pending table save,
Peter Maydell <=
- [Qemu-devel] [PULL 14/17] kvm-all: Pass an error object to kvm_device_access, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 09/17] hw/misc/exynos4210_pmu: Add support for system poweroff, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 12/17] aspeed: add a temp sensor device on I2C bus 3, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 05/17] hw/arm/exynos: Move DRAM initialization next boards, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 13/17] timer/aspeed: fix timer enablement when a reload is not set, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 10/17] timer.h: Provide better monotonic time, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 01/17] hw/intc/exynos4210_gic: Use more meaningful name for local variable, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 17/17] hw/intc/arm_gicv3_its: Allow save/restore, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 02/17] hw/timer/exynos4210_mct: Fix checkpatch style errors, Peter Maydell, 2017/06/13
- [Qemu-devel] [PULL 03/17] hw/timer/exynos4210_mct: Cleanup indentation and empty new lines, Peter Maydell, 2017/06/13