pci_qdev_init() checks whether return value is 0 or not to figure out pci device is initialized successfully. Otherwise, device_realize() in qdev checks that return value is negative value to figure out the device is realized successfully. When pci device returns positive number, pci_qdev_init() thinks that error is occured and makes the device unregistered. Nevertheless, qdev thinks that device is realized. Finally, crash is occured by commands like 'qtree' that traverse qdev list.
So, pci_qdev_init() returns -1 when init function returns not 0. Signed-off-by: SeokYeon Hwang <syeon.hw...@samsung.com> --- hw/pci/pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 371699c..c149fdf 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -1766,7 +1766,7 @@ static int pci_qdev_init(DeviceState *qdev) rc = pc->init(pci_dev); if (rc != 0) { do_pci_unregister_device(pci_dev); - return rc; + return -1; } } -- 2.1.0