[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 13/16] hw/arm_gic: Make gic_reset a sysbus reset fun
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH 13/16] hw/arm_gic: Make gic_reset a sysbus reset function |
Date: |
Fri, 13 Apr 2012 14:04:58 +0100 |
Make gic_reset a sysbus reset function, so we actually
reset the GIC on system reset rather than only at init.
For the NVIC this requires us also to implement reset
of the SysTick.
Signed-off-by: Peter Maydell <address@hidden>
---
hw/arm_gic.c | 5 +++--
hw/armv7m_nvic.c | 16 ++++++++++++++++
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/hw/arm_gic.c b/hw/arm_gic.c
index b543570..81858c3 100644
--- a/hw/arm_gic.c
+++ b/hw/arm_gic.c
@@ -741,8 +741,9 @@ static const MemoryRegionOps gic_cpu_ops = {
};
#endif
-static void gic_reset(gic_state *s)
+static void gic_reset(DeviceState *dev)
{
+ gic_state *s = FROM_SYSBUS(gic_state, sysbus_from_qdev(dev));
int i;
memset(s->irq_state, 0, GIC_MAXIRQ * sizeof(gic_irq_state));
for (i = 0 ; i < NUM_CPU(s); i++) {
@@ -905,7 +906,6 @@ static void gic_init(gic_state *s, int num_irq)
}
#endif
- gic_reset(s);
register_savevm(NULL, "arm_gic", -1, 2, gic_save, gic_load, s);
}
@@ -938,6 +938,7 @@ static void arm_gic_class_init(ObjectClass *klass, void
*data)
SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
sbc->init = arm_gic_init;
dc->props = arm_gic_properties;
+ dc->reset = gic_reset;
dc->no_user = 1;
}
diff --git a/hw/armv7m_nvic.c b/hw/armv7m_nvic.c
index 79cf448..5cfa971 100644
--- a/hw/armv7m_nvic.c
+++ b/hw/armv7m_nvic.c
@@ -76,6 +76,14 @@ static void systick_timer_tick(void * opaque)
}
}
+static void systick_reset(nvic_state *s)
+{
+ s->systick.control = 0;
+ s->systick.reload = 0;
+ s->systick.tick = 0;
+ qemu_del_timer(s->systick.timer);
+}
+
/* The external routines use the hardware vector numbering, ie. the first
IRQ is #16. The internal GIC routines use #32 as the first IRQ. */
void armv7m_nvic_set_pending(void *opaque, int irq)
@@ -371,6 +379,13 @@ static const VMStateDescription vmstate_nvic = {
}
};
+static void armv7m_nvic_reset(DeviceState *dev)
+{
+ nvic_state *s = FROM_SYSBUSGIC(nvic_state, sysbus_from_qdev(dev));
+ gic_reset(&s->gic.busdev.qdev);
+ systick_reset(s);
+}
+
static int armv7m_nvic_init(SysBusDevice *dev)
{
nvic_state *s= FROM_SYSBUSGIC(nvic_state, dev);
@@ -400,6 +415,7 @@ static void armv7m_nvic_class_init(ObjectClass *klass, void
*data)
sdc->init = armv7m_nvic_init;
dc->vmsd = &vmstate_nvic;
+ dc->reset = armv7m_nvic_reset;
dc->props = armv7m_nvic_properties;
}
--
1.7.1
- [Qemu-devel] [PULL 00/16] arm-devs queue, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 15/16] hw/arm_gic: gic_set_pending_private() is NVIC only, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 13/16] hw/arm_gic: Make gic_reset a sysbus reset function,
Peter Maydell <=
- [Qemu-devel] [PATCH 01/16] Fix bit test in Exynos4210 UART emulation to use & instead of &&, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 08/16] hw/a15mpcore: switch to using sysbus GIC, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 12/16] hw/arm11mpcore: Convert to using sysbus GIC device, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 11/16] hw/exynos4210_gic: Convert to using sysbus GIC, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 04/16] hw/arm_gic: Move NCPU definition to arm_gic.c, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 10/16] hw/realview_gic: switch to sysbus GIC, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 09/16] hw/a9mpcore: Switch to using sysbus GIC, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 03/16] hw/exynos4210_combiner.c: Drop excessive read/write access check., Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 06/16] hw/arm_gic: Expose PPI inputs as gpio inputs, Peter Maydell, 2012/04/13
- [Qemu-devel] [PATCH 02/16] ARM: Exynos4210: Drop gic_cpu_write() after initialization., Peter Maydell, 2012/04/13