[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 2/6] qdev: reset qdev along with qdev tree
From: |
Isaku Yamahata |
Subject: |
[Qemu-devel] [PATCH v2 2/6] qdev: reset qdev along with qdev tree |
Date: |
Fri, 19 Nov 2010 18:55:59 +0900 |
From: Anthony Liguori <address@hidden>
This patch changes the reset handling so that qdev has no knowledge of the
global system reset. Instead, a new bus/device level function is introduced
that allows all devices/buses on the bus/device to be reset using a depth
first transversal.
N.B. we have to expose the implicit system bus because we have various hacks
that result in an implicit system bus existing. Instead, we ought to have an
explicitly created system bus that we can trigger reset from. That's a topic
for a future patch though.
Signed-off-by: Anthony Liguori <address@hidden>
Signed-off-by: Isaku Yamahata <address@hidden>
---
hw/qdev.c | 28 +++++++++++++++++++---------
hw/qdev.h | 4 ++++
vl.c | 1 +
3 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c
index 11d845a..92ccc8d 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -257,13 +257,6 @@ DeviceState *qdev_device_add(QemuOpts *opts)
return qdev;
}
-static void qdev_reset(void *opaque)
-{
- DeviceState *dev = opaque;
- if (dev->info->reset)
- dev->info->reset(dev);
-}
-
/* Initialize a device. Device properties should be set before calling
this function. IRQs and MMIO regions should be connected/mapped after
calling this function.
@@ -279,7 +272,6 @@ int qdev_init(DeviceState *dev)
qdev_free(dev);
return rc;
}
- qemu_register_reset(qdev_reset, dev);
if (dev->info->vmsd) {
vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev,
dev->instance_id_alias,
@@ -308,6 +300,25 @@ int qdev_unplug(DeviceState *dev)
return dev->info->unplug(dev);
}
+static int qdev_reset_one(DeviceState *dev, void *opaque)
+{
+ if (dev->info->reset) {
+ dev->info->reset(dev);
+ }
+
+ return 0;
+}
+
+BusState *sysbus_get_default(void)
+{
+ return main_system_bus;
+}
+
+void qbus_reset_all(BusState *bus)
+{
+ qbus_walk_children(bus, qdev_reset_one, NULL, NULL);
+}
+
/* can be used as ->unplug() callback for the simple cases */
int qdev_simple_unplug_cb(DeviceState *dev)
{
@@ -351,7 +362,6 @@ void qdev_free(DeviceState *dev)
if (dev->opts)
qemu_opts_del(dev->opts);
}
- qemu_unregister_reset(qdev_reset, dev);
QLIST_REMOVE(dev, sibling);
for (prop = dev->info->props; prop && prop->name; prop++) {
if (prop->info->free) {
diff --git a/hw/qdev.h b/hw/qdev.h
index 550fd9b..e5ed333 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -187,10 +187,14 @@ int qbus_walk_children(BusState *bus, qdev_walkerfn
*devfn,
qbus_walkerfn *busfn, void *opaque);
int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
qbus_walkerfn *busfn, void *opaque);
+void qbus_reset_all(BusState *bus);
void qbus_free(BusState *bus);
#define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev)
+/* This should go away once we get rid of the NULL bus hack */
+BusState *sysbus_get_default(void);
+
/*** monitor commands ***/
void do_info_qtree(Monitor *mon);
diff --git a/vl.c b/vl.c
index c58583d..135fdeb 100644
--- a/vl.c
+++ b/vl.c
@@ -2976,6 +2976,7 @@ int main(int argc, char **argv, char **envp)
exit(1);
}
+ qemu_register_reset((void *)qbus_reset_all, sysbus_get_default());
qemu_system_reset();
if (loadvm) {
if (load_vmstate(loadvm) < 0) {
--
1.7.1.1
- [Qemu-devel] [PATCH v2 0/6] qdev reset refactoring and pci bus reset, Isaku Yamahata, 2010/11/19
- [Qemu-devel] [PATCH v2 4/6] qdev: introduce a helper function which triggers reset from a given device, Isaku Yamahata, 2010/11/19
- [Qemu-devel] [PATCH v2 2/6] qdev: reset qdev along with qdev tree,
Isaku Yamahata <=
- [Qemu-devel] [PATCH v2 6/6] pci bridge: implement secondary bus reset, Isaku Yamahata, 2010/11/19
- [Qemu-devel] [PATCH v2 5/6] pci: make use of qdev reset frame work to pci bus reset., Isaku Yamahata, 2010/11/19
- [Qemu-devel] [PATCH v2 1/6] qbus: add functions to walk both devices and busses, Isaku Yamahata, 2010/11/19
- [Qemu-devel] [PATCH v2 3/6] qdev: introduce reset call back for qbus level, Isaku Yamahata, 2010/11/19
- [Qemu-devel] Re: [PATCH v2 0/6] qdev reset refactoring and pci bus reset, Michael S. Tsirkin, 2010/11/22