libqos: Track QTestState with QPCIBus

When initializing a QPCIBus, track which QTestState the bus is
associated with (so that a later patch can then explicitly use
that test state for all communication on the bus, rather than
blindly relying on global_qtest).  Update the initialization
functions to take another parameter, and update all callers to
pass in state (for now, most callers get away with passing the
current global_qtest as the current state, although this required
fixing the order of initialization to ensure qtest_start() is
called before qpci_init*() in rtl8139-test, and provided an
opportunity to pass in the allocator in e1000e-test).

Touch up some allocations to use g_new0() rather than g_malloc()
while in the area, and simplify some code (all implementations
of QOSOps provide a .init_allocator() that never fails).

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
[thuth: Removed hunk from vhost-user-test.c that is not required anymore,
 fixed conflict in qtest_vboot() and adjusted qpci_init_pc() in sdhci-test]
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Eric Blake 2017-09-11 12:19:52 -05:00 committed by Thomas Huth
parent 50990b162c
commit e5d1730d1e
19 changed files with 33 additions and 33 deletions

View file

@ -161,7 +161,7 @@ static AHCIQState *ahci_vboot(const char *cli, va_list ap)
alloc_set_flags(s->parent->alloc, ALLOC_LEAK_ASSERT); alloc_set_flags(s->parent->alloc, ALLOC_LEAK_ASSERT);
/* Verify that we have an AHCI device present. */ /* Verify that we have an AHCI device present. */
s->dev = get_ahci_device(&s->fingerprint); s->dev = get_ahci_device(s->parent->qts, &s->fingerprint);
return s; return s;
} }

View file

@ -392,12 +392,12 @@ static void data_test_init(e1000e_device *d)
qtest_start(cmdline); qtest_start(cmdline);
g_free(cmdline); g_free(cmdline);
test_bus = qpci_init_pc(NULL);
g_assert_nonnull(test_bus);
test_alloc = pc_alloc_init(); test_alloc = pc_alloc_init();
g_assert_nonnull(test_alloc); g_assert_nonnull(test_alloc);
test_bus = qpci_init_pc(global_qtest, test_alloc);
g_assert_nonnull(test_bus);
e1000e_device_init(test_bus, d); e1000e_device_init(test_bus, d);
} }

View file

@ -38,7 +38,7 @@ static QPCIBus *test_start_get_bus(const TestData *s)
cmdline = g_strdup_printf("-smp %d", s->num_cpus); cmdline = g_strdup_printf("-smp %d", s->num_cpus);
qtest_start(cmdline); qtest_start(cmdline);
g_free(cmdline); g_free(cmdline);
return qpci_init_pc(NULL); return qpci_init_pc(global_qtest, NULL);
} }
static void test_i440fx_defaults(gconstpointer opaque) static void test_i440fx_defaults(gconstpointer opaque)

View file

@ -150,7 +150,7 @@ static QPCIDevice *get_pci_device(QPCIBar *bmdma_bar, QPCIBar *ide_bar)
uint16_t vendor_id, device_id; uint16_t vendor_id, device_id;
if (!pcibus) { if (!pcibus) {
pcibus = qpci_init_pc(NULL); pcibus = qpci_init_pc(global_qtest, NULL);
} }
/* Find PCI device and verify it's the right one */ /* Find PCI device and verify it's the right one */

View file

@ -123,13 +123,13 @@ bool is_atapi(AHCIQState *ahci, uint8_t port)
/** /**
* Locate, verify, and return a handle to the AHCI device. * Locate, verify, and return a handle to the AHCI device.
*/ */
QPCIDevice *get_ahci_device(uint32_t *fingerprint) QPCIDevice *get_ahci_device(QTestState *qts, uint32_t *fingerprint)
{ {
QPCIDevice *ahci; QPCIDevice *ahci;
uint32_t ahci_fingerprint; uint32_t ahci_fingerprint;
QPCIBus *pcibus; QPCIBus *pcibus;
pcibus = qpci_init_pc(NULL); pcibus = qpci_init_pc(qts, NULL);
/* Find the AHCI PCI device and verify it's the right one. */ /* Find the AHCI PCI device and verify it's the right one. */
ahci = qpci_device_find(pcibus, QPCI_DEVFN(0x1F, 0x02)); ahci = qpci_device_find(pcibus, QPCI_DEVFN(0x1F, 0x02));

View file

@ -571,7 +571,7 @@ void ahci_free(AHCIQState *ahci, uint64_t addr);
void ahci_clean_mem(AHCIQState *ahci); void ahci_clean_mem(AHCIQState *ahci);
/* Device management */ /* Device management */
QPCIDevice *get_ahci_device(uint32_t *fingerprint); QPCIDevice *get_ahci_device(QTestState *qts, uint32_t *fingerprint);
void free_ahci_device(QPCIDevice *dev); void free_ahci_device(QPCIDevice *dev);
void ahci_pci_enable(AHCIQState *ahci); void ahci_pci_enable(AHCIQState *ahci);
void start_ahci_device(AHCIQState *ahci); void start_ahci_device(AHCIQState *ahci);

View file

@ -18,18 +18,14 @@ QOSState *qtest_vboot(QOSOps *ops, const char *cmdline_fmt, va_list ap)
{ {
char *cmdline; char *cmdline;
struct QOSState *qs = g_new(QOSState, 1); QOSState *qs = g_new0(QOSState, 1);
cmdline = g_strdup_vprintf(cmdline_fmt, ap); cmdline = g_strdup_vprintf(cmdline_fmt, ap);
qs->qts = qtest_start(cmdline); qs->qts = qtest_start(cmdline);
qs->ops = ops; qs->ops = ops;
if (ops) { if (ops) {
if (ops->init_allocator) { qs->alloc = ops->init_allocator(ALLOC_NO_FLAGS);
qs->alloc = ops->init_allocator(ALLOC_NO_FLAGS); qs->pcibus = ops->qpci_init(qs->qts, qs->alloc);
}
if (ops->qpci_init && qs->alloc) {
qs->pcibus = ops->qpci_init(qs->alloc);
}
} }
g_free(cmdline); g_free(cmdline);

View file

@ -10,7 +10,7 @@ typedef struct QOSState QOSState;
typedef struct QOSOps { typedef struct QOSOps {
QGuestAllocator *(*init_allocator)(QAllocOpts); QGuestAllocator *(*init_allocator)(QAllocOpts);
void (*uninit_allocator)(QGuestAllocator *); void (*uninit_allocator)(QGuestAllocator *);
QPCIBus *(*qpci_init)(QGuestAllocator *alloc); QPCIBus *(*qpci_init)(QTestState *qts, QGuestAllocator *alloc);
void (*qpci_free)(QPCIBus *bus); void (*qpci_free)(QPCIBus *bus);
void (*shutdown)(QOSState *); void (*shutdown)(QOSState *);
} QOSOps; } QOSOps;

View file

@ -115,11 +115,11 @@ static void qpci_pc_config_writel(QPCIBus *bus, int devfn, uint8_t offset, uint3
outl(0xcfc, value); outl(0xcfc, value);
} }
QPCIBus *qpci_init_pc(QGuestAllocator *alloc) QPCIBus *qpci_init_pc(QTestState *qts, QGuestAllocator *alloc)
{ {
QPCIBusPC *ret; QPCIBusPC *ret = g_new0(QPCIBusPC, 1);
ret = g_malloc(sizeof(*ret)); assert(qts);
ret->bus.pio_readb = qpci_pc_pio_readb; ret->bus.pio_readb = qpci_pc_pio_readb;
ret->bus.pio_readw = qpci_pc_pio_readw; ret->bus.pio_readw = qpci_pc_pio_readw;
@ -142,6 +142,7 @@ QPCIBus *qpci_init_pc(QGuestAllocator *alloc)
ret->bus.config_writew = qpci_pc_config_writew; ret->bus.config_writew = qpci_pc_config_writew;
ret->bus.config_writel = qpci_pc_config_writel; ret->bus.config_writel = qpci_pc_config_writel;
ret->bus.qts = qts;
ret->bus.pio_alloc_ptr = 0xc000; ret->bus.pio_alloc_ptr = 0xc000;
ret->bus.mmio_alloc_ptr = 0xE0000000; ret->bus.mmio_alloc_ptr = 0xE0000000;
ret->bus.mmio_limit = 0x100000000ULL; ret->bus.mmio_limit = 0x100000000ULL;

View file

@ -16,7 +16,7 @@
#include "libqos/pci.h" #include "libqos/pci.h"
#include "libqos/malloc.h" #include "libqos/malloc.h"
QPCIBus *qpci_init_pc(QGuestAllocator *alloc); QPCIBus *qpci_init_pc(QTestState *qts, QGuestAllocator *alloc);
void qpci_free_pc(QPCIBus *bus); void qpci_free_pc(QPCIBus *bus);
#endif #endif

View file

@ -154,11 +154,11 @@ static void qpci_spapr_config_writel(QPCIBus *bus, int devfn, uint8_t offset,
#define SPAPR_PCI_MMIO32_WIN_SIZE 0x80000000 /* 2 GiB */ #define SPAPR_PCI_MMIO32_WIN_SIZE 0x80000000 /* 2 GiB */
#define SPAPR_PCI_IO_WIN_SIZE 0x10000 #define SPAPR_PCI_IO_WIN_SIZE 0x10000
QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) QPCIBus *qpci_init_spapr(QTestState *qts, QGuestAllocator *alloc)
{ {
QPCIBusSPAPR *ret; QPCIBusSPAPR *ret = g_new0(QPCIBusSPAPR, 1);
ret = g_malloc(sizeof(*ret)); assert(qts);
ret->alloc = alloc; ret->alloc = alloc;
@ -197,6 +197,7 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc)
ret->mmio32.pci_base = SPAPR_PCI_MMIO32_WIN_SIZE; ret->mmio32.pci_base = SPAPR_PCI_MMIO32_WIN_SIZE;
ret->mmio32.size = SPAPR_PCI_MMIO32_WIN_SIZE; ret->mmio32.size = SPAPR_PCI_MMIO32_WIN_SIZE;
ret->bus.qts = qts;
ret->bus.pio_alloc_ptr = 0xc000; ret->bus.pio_alloc_ptr = 0xc000;
ret->bus.mmio_alloc_ptr = ret->mmio32.pci_base; ret->bus.mmio_alloc_ptr = ret->mmio32.pci_base;
ret->bus.mmio_limit = ret->mmio32.pci_base + ret->mmio32.size; ret->bus.mmio_limit = ret->mmio32.pci_base + ret->mmio32.size;

View file

@ -11,7 +11,7 @@
#include "libqos/malloc.h" #include "libqos/malloc.h"
#include "libqos/pci.h" #include "libqos/pci.h"
QPCIBus *qpci_init_spapr(QGuestAllocator *alloc); QPCIBus *qpci_init_spapr(QTestState *qts, QGuestAllocator *alloc);
void qpci_free_spapr(QPCIBus *bus); void qpci_free_spapr(QPCIBus *bus);
#endif #endif

View file

@ -48,6 +48,7 @@ struct QPCIBus {
void (*config_writel)(QPCIBus *bus, int devfn, void (*config_writel)(QPCIBus *bus, int devfn,
uint8_t offset, uint32_t value); uint8_t offset, uint32_t value);
QTestState *qts;
uint16_t pio_alloc_ptr; uint16_t pio_alloc_ptr;
uint64_t mmio_alloc_ptr, mmio_limit; uint64_t mmio_alloc_ptr, mmio_limit;
}; };

View file

@ -87,7 +87,7 @@ static void test_smram_lock(void)
qtest_start("-M q35"); qtest_start("-M q35");
pcibus = qpci_init_pc(NULL); pcibus = qpci_init_pc(global_qtest, NULL);
g_assert(pcibus != NULL); g_assert(pcibus != NULL);
pcidev = qpci_device_find(pcibus, 0); pcidev = qpci_device_find(pcibus, 0);
@ -146,7 +146,7 @@ static void test_tseg_size(const void *data)
g_free(cmdline); g_free(cmdline);
/* locate the DRAM controller */ /* locate the DRAM controller */
pcibus = qpci_init_pc(NULL); pcibus = qpci_init_pc(global_qtest, NULL);
g_assert(pcibus != NULL); g_assert(pcibus != NULL);
pcidev = qpci_device_find(pcibus, 0); pcidev = qpci_device_find(pcibus, 0);
g_assert(pcidev != NULL); g_assert(pcidev != NULL);

View file

@ -35,7 +35,7 @@ static QPCIDevice *get_device(void)
{ {
QPCIDevice *dev; QPCIDevice *dev;
pcibus = qpci_init_pc(NULL); pcibus = qpci_init_pc(global_qtest, NULL);
qpci_device_foreach(pcibus, 0x10ec, 0x8139, save_fn, &dev); qpci_device_foreach(pcibus, 0x10ec, 0x8139, save_fn, &dev);
g_assert(dev != NULL); g_assert(dev != NULL);
@ -197,11 +197,12 @@ int main(int argc, char **argv)
{ {
int ret; int ret;
qtest_start("-device rtl8139");
g_test_init(&argc, &argv, NULL); g_test_init(&argc, &argv, NULL);
qtest_add_func("/rtl8139/nop", nop); qtest_add_func("/rtl8139/nop", nop);
qtest_add_func("/rtl8139/timer", test_init); qtest_add_func("/rtl8139/timer", test_init);
qtest_start("-device rtl8139");
ret = g_test_run(); ret = g_test_run();
qtest_end(); qtest_end();

View file

@ -187,7 +187,7 @@ static QSDHCI *machine_start(const struct sdhci_t *test)
global_qtest = qtest_startf("-machine %s -device sdhci-pci", global_qtest = qtest_startf("-machine %s -device sdhci-pci",
test->machine); test->machine);
s->pci.bus = qpci_init_pc(NULL); s->pci.bus = qpci_init_pc(global_qtest, NULL);
/* Find PCI device and verify it's the right one */ /* Find PCI device and verify it's the right one */
s->pci.dev = qpci_device_find(s->pci.bus, QPCI_DEVFN(4, 0)); s->pci.dev = qpci_device_find(s->pci.bus, QPCI_DEVFN(4, 0));

View file

@ -64,7 +64,7 @@ static void test_init(TestData *d)
global_qtest = qs; global_qtest = qs;
qtest_irq_intercept_in(qs, "ioapic"); qtest_irq_intercept_in(qs, "ioapic");
d->bus = qpci_init_pc(NULL); d->bus = qpci_init_pc(qs, NULL);
d->dev = qpci_device_find(d->bus, QPCI_DEVFN(0x1f, 0x00)); d->dev = qpci_device_find(d->bus, QPCI_DEVFN(0x1f, 0x00));
g_assert(d->dev != NULL); g_assert(d->dev != NULL);

View file

@ -52,7 +52,7 @@ static void ehci_port_test(struct qhc *hc, int port, uint32_t expect)
static void test_init(void) static void test_init(void)
{ {
pcibus = qpci_init_pc(NULL); pcibus = qpci_init_pc(global_qtest, NULL);
g_assert(pcibus != NULL); g_assert(pcibus != NULL);
qusb_pci_init_one(pcibus, &uhci1, QPCI_DEVFN(0x1d, 0), 4); qusb_pci_init_one(pcibus, &uhci1, QPCI_DEVFN(0x1d, 0), 4);

View file

@ -180,7 +180,7 @@ static void init_virtio_dev(TestServer *s, uint32_t features_mask)
uint32_t features; uint32_t features;
int i; int i;
s->bus = qpci_init_pc(NULL); s->bus = qpci_init_pc(global_qtest, NULL);
g_assert_nonnull(s->bus); g_assert_nonnull(s->bus);
s->dev = qvirtio_pci_device_find(s->bus, VIRTIO_ID_NET); s->dev = qvirtio_pci_device_find(s->bus, VIRTIO_ID_NET);