diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index ffd29a80bc..6c8be0fe26 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -15,9 +15,9 @@ #include "trace.h" #include "hw/virtio/virtio-serial.h" -#define TYPE_VIRTIO_CONSOLE "virtconsole" +#define TYPE_VIRTIO_CONSOLE_SERIAL_PORT "virtserialport" #define VIRTIO_CONSOLE(obj) \ - OBJECT_CHECK(VirtConsole, (obj), TYPE_VIRTIO_CONSOLE) + OBJECT_CHECK(VirtConsole, (obj), TYPE_VIRTIO_CONSOLE_SERIAL_PORT) typedef struct VirtConsole { VirtIOSerialPort parent_obj; @@ -154,28 +154,16 @@ static void virtconsole_unrealize(DeviceState *dev, Error **errp) } } -static Property virtconsole_properties[] = { - DEFINE_PROP_CHR("chardev", VirtConsole, chr), - DEFINE_PROP_END_OF_LIST(), -}; - static void virtconsole_class_init(ObjectClass *klass, void *data) { - DeviceClass *dc = DEVICE_CLASS(klass); VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_CLASS(klass); k->is_console = true; - k->realize = virtconsole_realize; - k->unrealize = virtconsole_unrealize; - k->have_data = flush_buf; - k->set_guest_connected = set_guest_connected; - dc->props = virtconsole_properties; } static const TypeInfo virtconsole_info = { - .name = TYPE_VIRTIO_CONSOLE, - .parent = TYPE_VIRTIO_SERIAL_PORT, - .instance_size = sizeof(VirtConsole), + .name = "virtconsole", + .parent = TYPE_VIRTIO_CONSOLE_SERIAL_PORT, .class_init = virtconsole_class_init, }; @@ -197,7 +185,7 @@ static void virtserialport_class_init(ObjectClass *klass, void *data) } static const TypeInfo virtserialport_info = { - .name = "virtserialport", + .name = TYPE_VIRTIO_CONSOLE_SERIAL_PORT, .parent = TYPE_VIRTIO_SERIAL_PORT, .instance_size = sizeof(VirtConsole), .class_init = virtserialport_class_init, @@ -205,8 +193,8 @@ static const TypeInfo virtserialport_info = { static void virtconsole_register_types(void) { - type_register_static(&virtconsole_info); type_register_static(&virtserialport_info); + type_register_static(&virtconsole_info); } type_init(virtconsole_register_types) diff --git a/main-loop.c b/main-loop.c index c3c9c28fba..8a854938e7 100644 --- a/main-loop.c +++ b/main-loop.c @@ -25,6 +25,7 @@ #include "qemu-common.h" #include "qemu/timer.h" #include "qemu/sockets.h" // struct in_addr needed for libslirp.h +#include "sysemu/qtest.h" #include "slirp/libslirp.h" #include "qemu/main-loop.h" #include "block/aio.h" @@ -208,7 +209,7 @@ static int os_host_main_loop_wait(int64_t timeout) if (!timeout && (spin_counter > MAX_MAIN_LOOP_SPIN)) { static bool notified; - if (!notified) { + if (!notified && !qtest_enabled()) { fprintf(stderr, "main-loop: WARNING: I/O thread spun for %d iterations\n", MAX_MAIN_LOOP_SPIN); diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs index df3aa7a64e..59c5a54239 100644 --- a/stubs/Makefile.objs +++ b/stubs/Makefile.objs @@ -18,6 +18,7 @@ stub-obj-y += mon-print-filename.o stub-obj-y += mon-protocol-event.o stub-obj-y += mon-set-error.o stub-obj-y += pci-drive-hot-add.o +stub-obj-y += qtest.o stub-obj-y += reset.o stub-obj-y += set-fd-handler.o stub-obj-y += slirp.o diff --git a/stubs/qtest.c b/stubs/qtest.c new file mode 100644 index 0000000000..e671ed8e8e --- /dev/null +++ b/stubs/qtest.c @@ -0,0 +1,14 @@ +/* + * qtest stubs + * + * Copyright (c) 2014 Linaro Limited + * Written by Peter Maydell + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu-common.h" + +/* Needed for qtest_allowed() */ +bool qtest_allowed; diff --git a/tests/libqtest.c b/tests/libqtest.c index 2b90e4a76e..b03b57a3db 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -120,7 +120,7 @@ QTestState *qtest_init(const char *extra_args) qemu_binary = getenv("QTEST_QEMU_BINARY"); g_assert(qemu_binary != NULL); - s = g_malloc(sizeof(*s)); + global_qtest = s = g_malloc(sizeof(*s)); socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid()); qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid()); @@ -181,6 +181,7 @@ QTestState *qtest_init(const char *extra_args) void qtest_quit(QTestState *s) { sigaction(SIGABRT, &s->sigact_old, NULL); + global_qtest = NULL; kill_qemu(s); close(s->fd); diff --git a/tests/libqtest.h b/tests/libqtest.h index 8268c098bf..27a58fdb1c 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -335,8 +335,7 @@ void qtest_add_func(const char *str, void (*fn)); */ static inline QTestState *qtest_start(const char *args) { - global_qtest = qtest_init(args); - return global_qtest; + return qtest_init(args); } /** @@ -347,7 +346,6 @@ static inline QTestState *qtest_start(const char *args) static inline void qtest_end(void) { qtest_quit(global_qtest); - global_qtest = NULL; } /** diff --git a/tests/virtio-console-test.c b/tests/virtio-console-test.c index f98f5af252..6be96e8c64 100644 --- a/tests/virtio-console-test.c +++ b/tests/virtio-console-test.c @@ -13,8 +13,18 @@ #include "qemu/osdep.h" /* Tests only initialization so far. TODO: Replace with functional tests */ -static void pci_nop(void) +static void console_pci_nop(void) { + qtest_start("-device virtio-serial-pci,id=vser0 " + "-device virtconsole,bus=vser0.0"); + qtest_end(); +} + +static void serialport_pci_nop(void) +{ + qtest_start("-device virtio-serial-pci,id=vser0 " + "-device virtserialport,bus=vser0.0"); + qtest_end(); } int main(int argc, char **argv) @@ -22,13 +32,10 @@ int main(int argc, char **argv) int ret; g_test_init(&argc, &argv, NULL); - qtest_add_func("/virtio/console/pci/nop", pci_nop); + qtest_add_func("/virtio/console/pci/nop", console_pci_nop); + qtest_add_func("/virtio/serialport/pci/nop", serialport_pci_nop); - qtest_start("-device virtio-serial-pci,id=vser0 " - "-device virtconsole,bus=vser0.0"); ret = g_test_run(); - qtest_end(); - return ret; }