libqos: add pc specific interface

Create an operations structure so that the libqos interface can be
architecture agnostic, and create a pc-specific interface to functions
like qtest_boot.

Move the libqos object in the Makefile from being ahci-test only to
being linked with all tests that utilize the libqos features.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 1421698563-6977-8-git-send-email-jsnow@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
John Snow 2015-01-19 15:15:55 -05:00 committed by Stefan Hajnoczi
parent f6f363c1f4
commit 90e5add6f2
6 changed files with 55 additions and 14 deletions

View File

@ -307,9 +307,9 @@ tests/test-mul64$(EXESUF): tests/test-mul64.o libqemuutil.a
tests/test-bitops$(EXESUF): tests/test-bitops.o libqemuutil.a tests/test-bitops$(EXESUF): tests/test-bitops.o libqemuutil.a
libqos-obj-y = tests/libqos/pci.o tests/libqos/fw_cfg.o tests/libqos/malloc.o libqos-obj-y = tests/libqos/pci.o tests/libqos/fw_cfg.o tests/libqos/malloc.o
libqos-obj-y += tests/libqos/i2c.o libqos-obj-y += tests/libqos/i2c.o tests/libqos/libqos.o
libqos-pc-obj-y = $(libqos-obj-y) tests/libqos/pci-pc.o libqos-pc-obj-y = $(libqos-obj-y) tests/libqos/pci-pc.o
libqos-pc-obj-y += tests/libqos/malloc-pc.o libqos-pc-obj-y += tests/libqos/malloc-pc.o tests/libqos/libqos-pc.o
libqos-omap-obj-y = $(libqos-obj-y) tests/libqos/i2c-omap.o libqos-omap-obj-y = $(libqos-obj-y) tests/libqos/i2c-omap.o
libqos-virtio-obj-y = $(libqos-obj-y) $(libqos-pc-obj-y) tests/libqos/virtio.o tests/libqos/virtio-pci.o libqos-virtio-obj-y = $(libqos-obj-y) $(libqos-pc-obj-y) tests/libqos/virtio.o tests/libqos/virtio-pci.o
libqos-usb-obj-y = $(libqos-pc-obj-y) tests/libqos/usb.o libqos-usb-obj-y = $(libqos-pc-obj-y) tests/libqos/usb.o
@ -320,7 +320,7 @@ tests/endianness-test$(EXESUF): tests/endianness-test.o
tests/spapr-phb-test$(EXESUF): tests/spapr-phb-test.o $(libqos-obj-y) tests/spapr-phb-test$(EXESUF): tests/spapr-phb-test.o $(libqos-obj-y)
tests/fdc-test$(EXESUF): tests/fdc-test.o tests/fdc-test$(EXESUF): tests/fdc-test.o
tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y) tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y)
tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y) tests/libqos/libqos.o tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y)
tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o
tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y) tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o $(libqos-obj-y) tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o $(libqos-obj-y)

View File

@ -29,7 +29,7 @@
#include <glib.h> #include <glib.h>
#include "libqtest.h" #include "libqtest.h"
#include "libqos/libqos.h" #include "libqos/libqos-pc.h"
#include "libqos/ahci.h" #include "libqos/ahci.h"
#include "libqos/pci-pc.h" #include "libqos/pci-pc.h"
#include "libqos/malloc-pc.h" #include "libqos/malloc-pc.h"
@ -151,7 +151,7 @@ static AHCIQState *ahci_boot(void)
" -M q35 " " -M q35 "
"-device ide-hd,drive=drive0 " "-device ide-hd,drive=drive0 "
"-global ide-hd.ver=%s"; "-global ide-hd.ver=%s";
s->parent = qtest_boot(cli, tmp_path, "testdisk", "version"); s->parent = qtest_pc_boot(cli, tmp_path, "testdisk", "version");
/* Verify that we have an AHCI device present. */ /* Verify that we have an AHCI device present. */
s->dev = get_ahci_device(); s->dev = get_ahci_device();

24
tests/libqos/libqos-pc.c Normal file
View File

@ -0,0 +1,24 @@
#include "libqos/libqos-pc.h"
#include "libqos/malloc-pc.h"
static QOSOps qos_ops = {
.init_allocator = pc_alloc_init_flags,
.uninit_allocator = pc_alloc_uninit
};
QOSState *qtest_pc_boot(const char *cmdline_fmt, ...)
{
QOSState *qs;
va_list ap;
va_start(ap, cmdline_fmt);
qs = qtest_vboot(&qos_ops, cmdline_fmt, ap);
va_end(ap);
return qs;
}
void qtest_pc_shutdown(QOSState *qs)
{
return qtest_shutdown(qs);
}

9
tests/libqos/libqos-pc.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef __libqos_pc_h
#define __libqos_pc_h
#include "libqos/libqos.h"
QOSState *qtest_pc_boot(const char *cmdline_fmt, ...);
void qtest_pc_shutdown(QOSState *qs);
#endif

View File

@ -8,7 +8,6 @@
#include "libqtest.h" #include "libqtest.h"
#include "libqos/libqos.h" #include "libqos/libqos.h"
#include "libqos/pci.h" #include "libqos/pci.h"
#include "libqos/malloc-pc.h"
/*** Test Setup & Teardown ***/ /*** Test Setup & Teardown ***/
@ -16,7 +15,7 @@
* Launch QEMU with the given command line, * Launch QEMU with the given command line,
* and then set up interrupts and our guest malloc interface. * and then set up interrupts and our guest malloc interface.
*/ */
QOSState *qtest_vboot(const char *cmdline_fmt, va_list ap) QOSState *qtest_vboot(QOSOps *ops, const char *cmdline_fmt, va_list ap)
{ {
char *cmdline; char *cmdline;
@ -24,8 +23,11 @@ QOSState *qtest_vboot(const char *cmdline_fmt, va_list ap)
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;
qtest_irq_intercept_in(global_qtest, "ioapic"); qtest_irq_intercept_in(global_qtest, "ioapic");
qs->alloc = pc_alloc_init(); if (ops && ops->init_allocator) {
qs->alloc = ops->init_allocator(ALLOC_NO_FLAGS);
}
g_free(cmdline); g_free(cmdline);
return qs; return qs;
@ -35,13 +37,13 @@ QOSState *qtest_vboot(const char *cmdline_fmt, va_list ap)
* Launch QEMU with the given command line, * Launch QEMU with the given command line,
* and then set up interrupts and our guest malloc interface. * and then set up interrupts and our guest malloc interface.
*/ */
QOSState *qtest_boot(const char *cmdline_fmt, ...) QOSState *qtest_boot(QOSOps *ops, const char *cmdline_fmt, ...)
{ {
QOSState *qs; QOSState *qs;
va_list ap; va_list ap;
va_start(ap, cmdline_fmt); va_start(ap, cmdline_fmt);
qs = qtest_vboot(cmdline_fmt, ap); qs = qtest_vboot(ops, cmdline_fmt, ap);
va_end(ap); va_end(ap);
return qs; return qs;
@ -52,8 +54,8 @@ QOSState *qtest_boot(const char *cmdline_fmt, ...)
*/ */
void qtest_shutdown(QOSState *qs) void qtest_shutdown(QOSState *qs)
{ {
if (qs->alloc) { if (qs->alloc && qs->ops && qs->ops->uninit_allocator) {
pc_alloc_uninit(qs->alloc); qs->ops->uninit_allocator(qs->alloc);
qs->alloc = NULL; qs->alloc = NULL;
} }
qtest_quit(qs->qts); qtest_quit(qs->qts);

View File

@ -5,13 +5,19 @@
#include "libqos/pci.h" #include "libqos/pci.h"
#include "libqos/malloc-pc.h" #include "libqos/malloc-pc.h"
typedef struct QOSOps {
QGuestAllocator *(*init_allocator)(QAllocOpts);
void (*uninit_allocator)(QGuestAllocator *);
} QOSOps;
typedef struct QOSState { typedef struct QOSState {
QTestState *qts; QTestState *qts;
QGuestAllocator *alloc; QGuestAllocator *alloc;
QOSOps *ops;
} QOSState; } QOSState;
QOSState *qtest_vboot(const char *cmdline_fmt, va_list ap); QOSState *qtest_vboot(QOSOps *ops, const char *cmdline_fmt, va_list ap);
QOSState *qtest_boot(const char *cmdline_fmt, ...); QOSState *qtest_boot(QOSOps *ops, const char *cmdline_fmt, ...);
void qtest_shutdown(QOSState *qs); void qtest_shutdown(QOSState *qs);
static inline uint64_t qmalloc(QOSState *q, size_t bytes) static inline uint64_t qmalloc(QOSState *q, size_t bytes)