diff --git a/hw/qdev.c b/hw/qdev.c index 7b204f9517..064389dcd0 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -245,6 +245,8 @@ void qdev_free(DeviceState *dev) #endif if (dev->info->reset) qemu_unregister_reset(dev->info->reset, dev); + if (dev->info->exit) + dev->info->exit(dev); } QLIST_REMOVE(dev, sibling); qemu_free(dev); diff --git a/hw/qdev.h b/hw/qdev.h index cd58fa8cf4..6c2c4013d2 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -108,6 +108,7 @@ BusState *qdev_get_child_bus(DeviceState *dev, const char *name); /*** Device API. ***/ typedef int (*qdev_initfn)(DeviceState *dev, DeviceInfo *info); +typedef int (*qdev_exitfn)(DeviceState *dev); struct DeviceInfo { const char *name; @@ -125,6 +126,7 @@ struct DeviceInfo { /* Private to qdev / bus. */ qdev_initfn init; + qdev_exitfn exit; BusInfo *bus_info; struct DeviceInfo *next; };