mirror of https://gitee.com/openkylin/qemu.git
QOM/QTest infrastructure fixes
* QOM cast fix for virtserialport and regression test * QTest error handling fix * QTest output cleanup -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJTIhh2AAoJEPou0S0+fgE/6jAP/362k1KrTFe5edcdBEJE6IgI FssJBenl/A8eKbfhbeLWK4I3q1RZJb8oDfSVDFpwmgSIknmYFAldDS+Ju/UePX/9 PikS9CYjBnDMmWBnmFAhgRtCrDq3gazu2c7hicBdnLemFD/1CaBkL65VNIwvXEvY KUYtleABUr6YbmjgMYtf8gCUZjYBcI5tw2ZgG6T0jgZRqPPGsEozKxBTctM9PIuW LtQdLDvhD2rfJAeDTG4jrTCeDBrgJCs8UGXDaNctMBwsESMQBuCjW0TeVsmdI0Qp P/y30N3HDfQfhuMkJk8Udm8iiOs1LX0YNRi08aeHOYxoWb3dc9C3mtLMFU8UYTLP ddpJZ5WEOVt42rsZvtmnwdv6kGBkbphcIzCP56eJN0w+HallKQf6qusRH04nO3GM ISr+1xIfchl1CzXdP41AiHrodfCDozROhItz+SgIynJGs1kFOETsjJQhHCUutDx+ u4Y8+NGDVRxd2a0h0eLYwqqt8ObpBs8a0+Xnsr7HEES6zPg0eN7VPe9x3jR3TFZN trvKCDiV9zycrC82wlwx6z+KFrFPJE+9yvzGlELyDhw0McBtCpt9VaEk94jEWkK5 tSs1AsIehAom8oMTZweU28TZwiS4p2bLuJfLlw99E0cnGqOvMr8dmvbcVLOmIPZl oFy0sTD3JECuYa1wR8dI =WXjm -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-2.0' into staging QOM/QTest infrastructure fixes * QOM cast fix for virtserialport and regression test * QTest error handling fix * QTest output cleanup # gpg: Signature made Thu 13 Mar 2014 20:43:34 GMT using RSA key ID 3E7E013F # gpg: Good signature from "Andreas Färber <afaerber@suse.de>" # gpg: aka "Andreas Färber <afaerber@suse.com>" * remotes/afaerber/tags/qom-devices-for-2.0: main-loop: Suppress "I/O thread spun" warnings for qtest qtest: Fix crash if SIGABRT during qtest_init() virtio-console-test: Test virtserialport as well virtio-console: Fix VIRTIO_CONSOLE() cast macro Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
b19fc63cad
|
@ -15,9 +15,9 @@
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "hw/virtio/virtio-serial.h"
|
#include "hw/virtio/virtio-serial.h"
|
||||||
|
|
||||||
#define TYPE_VIRTIO_CONSOLE "virtconsole"
|
#define TYPE_VIRTIO_CONSOLE_SERIAL_PORT "virtserialport"
|
||||||
#define VIRTIO_CONSOLE(obj) \
|
#define VIRTIO_CONSOLE(obj) \
|
||||||
OBJECT_CHECK(VirtConsole, (obj), TYPE_VIRTIO_CONSOLE)
|
OBJECT_CHECK(VirtConsole, (obj), TYPE_VIRTIO_CONSOLE_SERIAL_PORT)
|
||||||
|
|
||||||
typedef struct VirtConsole {
|
typedef struct VirtConsole {
|
||||||
VirtIOSerialPort parent_obj;
|
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)
|
static void virtconsole_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_CLASS(klass);
|
VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_CLASS(klass);
|
||||||
|
|
||||||
k->is_console = true;
|
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 = {
|
static const TypeInfo virtconsole_info = {
|
||||||
.name = TYPE_VIRTIO_CONSOLE,
|
.name = "virtconsole",
|
||||||
.parent = TYPE_VIRTIO_SERIAL_PORT,
|
.parent = TYPE_VIRTIO_CONSOLE_SERIAL_PORT,
|
||||||
.instance_size = sizeof(VirtConsole),
|
|
||||||
.class_init = virtconsole_class_init,
|
.class_init = virtconsole_class_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -197,7 +185,7 @@ static void virtserialport_class_init(ObjectClass *klass, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo virtserialport_info = {
|
static const TypeInfo virtserialport_info = {
|
||||||
.name = "virtserialport",
|
.name = TYPE_VIRTIO_CONSOLE_SERIAL_PORT,
|
||||||
.parent = TYPE_VIRTIO_SERIAL_PORT,
|
.parent = TYPE_VIRTIO_SERIAL_PORT,
|
||||||
.instance_size = sizeof(VirtConsole),
|
.instance_size = sizeof(VirtConsole),
|
||||||
.class_init = virtserialport_class_init,
|
.class_init = virtserialport_class_init,
|
||||||
|
@ -205,8 +193,8 @@ static const TypeInfo virtserialport_info = {
|
||||||
|
|
||||||
static void virtconsole_register_types(void)
|
static void virtconsole_register_types(void)
|
||||||
{
|
{
|
||||||
type_register_static(&virtconsole_info);
|
|
||||||
type_register_static(&virtserialport_info);
|
type_register_static(&virtserialport_info);
|
||||||
|
type_register_static(&virtconsole_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(virtconsole_register_types)
|
type_init(virtconsole_register_types)
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
#include "qemu/sockets.h" // struct in_addr needed for libslirp.h
|
#include "qemu/sockets.h" // struct in_addr needed for libslirp.h
|
||||||
|
#include "sysemu/qtest.h"
|
||||||
#include "slirp/libslirp.h"
|
#include "slirp/libslirp.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "block/aio.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)) {
|
if (!timeout && (spin_counter > MAX_MAIN_LOOP_SPIN)) {
|
||||||
static bool notified;
|
static bool notified;
|
||||||
|
|
||||||
if (!notified) {
|
if (!notified && !qtest_enabled()) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"main-loop: WARNING: I/O thread spun for %d iterations\n",
|
"main-loop: WARNING: I/O thread spun for %d iterations\n",
|
||||||
MAX_MAIN_LOOP_SPIN);
|
MAX_MAIN_LOOP_SPIN);
|
||||||
|
|
|
@ -18,6 +18,7 @@ stub-obj-y += mon-print-filename.o
|
||||||
stub-obj-y += mon-protocol-event.o
|
stub-obj-y += mon-protocol-event.o
|
||||||
stub-obj-y += mon-set-error.o
|
stub-obj-y += mon-set-error.o
|
||||||
stub-obj-y += pci-drive-hot-add.o
|
stub-obj-y += pci-drive-hot-add.o
|
||||||
|
stub-obj-y += qtest.o
|
||||||
stub-obj-y += reset.o
|
stub-obj-y += reset.o
|
||||||
stub-obj-y += set-fd-handler.o
|
stub-obj-y += set-fd-handler.o
|
||||||
stub-obj-y += slirp.o
|
stub-obj-y += slirp.o
|
||||||
|
|
|
@ -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;
|
|
@ -120,7 +120,7 @@ QTestState *qtest_init(const char *extra_args)
|
||||||
qemu_binary = getenv("QTEST_QEMU_BINARY");
|
qemu_binary = getenv("QTEST_QEMU_BINARY");
|
||||||
g_assert(qemu_binary != NULL);
|
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());
|
socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
|
||||||
qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", 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)
|
void qtest_quit(QTestState *s)
|
||||||
{
|
{
|
||||||
sigaction(SIGABRT, &s->sigact_old, NULL);
|
sigaction(SIGABRT, &s->sigact_old, NULL);
|
||||||
|
global_qtest = NULL;
|
||||||
|
|
||||||
kill_qemu(s);
|
kill_qemu(s);
|
||||||
close(s->fd);
|
close(s->fd);
|
||||||
|
|
|
@ -335,8 +335,7 @@ void qtest_add_func(const char *str, void (*fn));
|
||||||
*/
|
*/
|
||||||
static inline QTestState *qtest_start(const char *args)
|
static inline QTestState *qtest_start(const char *args)
|
||||||
{
|
{
|
||||||
global_qtest = qtest_init(args);
|
return qtest_init(args);
|
||||||
return global_qtest;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -347,7 +346,6 @@ static inline QTestState *qtest_start(const char *args)
|
||||||
static inline void qtest_end(void)
|
static inline void qtest_end(void)
|
||||||
{
|
{
|
||||||
qtest_quit(global_qtest);
|
qtest_quit(global_qtest);
|
||||||
global_qtest = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,8 +13,18 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
|
||||||
/* Tests only initialization so far. TODO: Replace with functional tests */
|
/* 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)
|
int main(int argc, char **argv)
|
||||||
|
@ -22,13 +32,10 @@ int main(int argc, char **argv)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
g_test_init(&argc, &argv, NULL);
|
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();
|
ret = g_test_run();
|
||||||
|
|
||||||
qtest_end();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue