@@ -118,6 +118,14 @@ static void serial_pci_exit(PCIDevice *dev)
SerialState *s = &pci->state;
serial_exit_core(s);
+}
+
+static void serial_pci_instance_finalize(Object *obj)
+{
+ PCIDevice *dev = PCI_DEVICE(obj);
+ PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
+ SerialState *s = &pci->state;
+
memory_region_destroy(&s->io);
}
@@ -130,9 +138,22 @@ static void multi_serial_pci_exit(PCIDevice *dev)
for (i = 0; i < pci->ports; i++) {
s = pci->state + i;
serial_exit_core(s);
+ }
+}
+
+static void multi_serial_pci_instance_finalize(Object *obj)
+{
+ PCIDevice *dev = PCI_DEVICE(obj);
+ PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
+ SerialState *s;
+ int i;
+
+ for (i = 0; i < pci->ports; i++) {
+ s = pci->state + i;
memory_region_destroy(&s->io);
g_free(pci->name[i]);
}
+
memory_region_destroy(&pci->iobar);
qemu_free_irqs(pci->irqs);
}
@@ -227,6 +248,7 @@ static const TypeInfo serial_pci_info = {
.parent = TYPE_PCI_DEVICE,
.instance_size = sizeof(PCISerialState),
.class_init = serial_pci_class_initfn,
+ .instance_finalize = serial_pci_instance_finalize,
};
static const TypeInfo multi_2x_serial_pci_info = {
@@ -234,6 +256,7 @@ static const TypeInfo multi_2x_serial_pci_info = {
.parent = TYPE_PCI_DEVICE,
.instance_size = sizeof(PCIMultiSerialState),
.class_init = multi_2x_serial_pci_class_initfn,
+ .instance_finalize = multi_serial_pci_instance_finalize,
};
static const TypeInfo multi_4x_serial_pci_info = {
@@ -241,6 +264,7 @@ static const TypeInfo multi_4x_serial_pci_info = {
.parent = TYPE_PCI_DEVICE,
.instance_size = sizeof(PCIMultiSerialState),
.class_init = multi_4x_serial_pci_class_initfn,
+ .instance_finalize = multi_serial_pci_instance_finalize,
};
static void serial_pci_register_types(void)
Character devices are still detached at "unrealize" time. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- hw/char/serial-pci.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)