Revision c021f8e6 hw/pci.c

b/hw/pci.c
1299 1299
        "'io_range': { 'base': %" PRId64 ", 'limit': %" PRId64 "}, "
1300 1300
        "'memory_range': { 'base': %" PRId64 ", 'limit': %" PRId64 "}, "
1301 1301
        "'prefetchable_range': { 'base': %" PRId64 ", 'limit': %" PRId64 "} }",
1302
        dev->config[0x19], dev->config[PCI_SECONDARY_BUS],
1302
        dev->config[PCI_PRIMARY_BUS], dev->config[PCI_SECONDARY_BUS],
1303 1303
        dev->config[PCI_SUBORDINATE_BUS],
1304 1304
        pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO),
1305 1305
        pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO),
......
1310 1310
        pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
1311 1311
                                PCI_BASE_ADDRESS_MEM_PREFETCH));
1312 1312

  
1313
        if (dev->config[0x19] != 0) {
1314
            qdict = qobject_to_qdict(pci_bridge);
1315
            qdict_put_obj(qdict, "devices",
1316
                          pci_get_devices_list(bus, dev->config[0x19]));
1317
        }
1313
        if (dev->config[PCI_SECONDARY_BUS] != 0) {
1314
            PCIBus *child_bus = pci_find_bus(bus, dev->config[PCI_SECONDARY_BUS]);
1318 1315

  
1316
            if (child_bus) {
1317
                qdict = qobject_to_qdict(pci_bridge);
1318
                qdict_put_obj(qdict, "devices",
1319
                              pci_get_devices_list(child_bus,
1320
                                                   dev->config[PCI_SECONDARY_BUS]));
1321
            }
1322
        }
1319 1323
        qdict = qobject_to_qdict(obj);
1320 1324
        qdict_put_obj(qdict, "pci_bridge", pci_bridge);
1321 1325
    }
......
1542 1546

  
1543 1547
PCIBus *pci_find_bus(PCIBus *bus, int bus_num)
1544 1548
{
1545
    PCIBus *sec;
1549
    PCIBus *sec, *ret;
1546 1550

  
1547 1551
    if (!bus)
1548 1552
        return NULL;
......
1553 1557

  
1554 1558
    /* try child bus */
1555 1559
    QLIST_FOREACH(sec, &bus->child, sibling) {
1556

  
1557 1560
        if (!bus->parent_dev /* pci host bridge */
1558
            || (pci_bus_num(sec) <= bus_num &&
1559
                bus->parent_dev->config[PCI_SUBORDINATE_BUS])) {
1560
            return pci_find_bus(sec, bus_num);
1561
            || (pci_bus_num(sec) >= bus_num &&
1562
                bus_num <= bus->parent_dev->config[PCI_SUBORDINATE_BUS]) ) {
1563
            ret = pci_find_bus(sec, bus_num);
1564
            if (ret) {
1565
                return ret;
1566
            }
1561 1567
        }
1562 1568
    }
1563 1569

  

Also available in: Unified diff