-----BEGIN PGP SIGNATURE-----
iQIcBAABAgAGBQJYto49AAoJENro4Ql1lpzljb8P/RutuV92h/e/RvIQ00gIE1Tk Tdma/9HpobMtutScp7xCbSjDCaFBHtk8YFmdbPwcwLpNIg9RGUs5cCTVEPvT8nq3 XRrUFtCzZua4U4CKLOAbo53bDN2x36r6rHSpX7FaYvC51o47MNFS2fpKJ5R8Rg4s v9i9zM6bWGYzNbBnK4XDi251/7r8yK2g3okBEZao5TDwBUCtimbwfXn9E/iB21XD HJJRZGIkgCFXebCbPzLfob8NxQi0whuJW6N9XscJOy1AKDTfGT4QUsUUkPUZNRVe lbGjoGJnq5XYMO+9OWJzaSf6ecFFQT/Seu5P6xLb3SRgdT9IXISouPt9sOsYlM7R U/Sw34gPKb2979gASLs2NPbrTPHBQp0hdL8E01LRFjdGVHuvgZcGr0OdxpbUSkEf nJgtBFpLVQdL+qtdQtxgSBZz0/hWMIRcXB++MCPfpWpP9uBUErr4/XQN2rfqLLUM UgA/doDMX7Hc9m81mZ+h+Pji+9O8zWjt7NKJXgPeZPsUsMbUe05VzAl3Fp4khEWM 05hrFB5biQguXkHXBIKO/fWwaftRaatqy0qAvXaiKidcRzQjF9ohlZgWd/CJyAWz V4GocO2oZL3rxQXwW6kh3HKlMCWUj563FhT4V5eN8VQE5PWLQQ+ObBkRHWfyayRE eEFFYApPQRVibAo9U7mC =09RR -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/elmarco/tags/leak-pull-request' into staging # gpg: Signature made Wed 01 Mar 2017 09:02:53 GMT # gpg: using RSA key 0xDAE8E10975969CE5 # gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>" # gpg: aka "Marc-André Lureau <marcandre.lureau@gmail.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 87A9 BD93 3F87 C606 D276 F62D DAE8 E109 7596 9CE5 * remotes/elmarco/tags/leak-pull-request: (28 commits) tests: fix virtio-blk-test leaks tests: add specialized device_find function tests: fix usb-test leaks tests: allows to run single test in usb-hcd-ehci-test usb: release the created buses bus: do not unref hotplug handler tests: fix virtio-9p-test leaks tests: fix virtio-scsi-test leak tests: fix e1000e leaks tests: fix i440fx-test leaks tests: fix e1000-test leak tests: fix tco-test leaks tests: fix eepro100-test leak pc: pcihp: avoid adding ACPI_PCIHP_PROP_BSEL twice tests: fix ipmi-bt-test leak tests: fix ipmi-kcs-test leak tests: fix bios-tables-test leak tests: fix hd-geo-test leaks tests: fix ide-test leaks tests: fix vhost-user-test leaks ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
c9fc677a35
|
@ -49,7 +49,6 @@
|
||||||
|
|
||||||
#define ACPI_PCIHP_ADDR 0xae00
|
#define ACPI_PCIHP_ADDR 0xae00
|
||||||
#define ACPI_PCIHP_SIZE 0x0014
|
#define ACPI_PCIHP_SIZE 0x0014
|
||||||
#define ACPI_PCIHP_LEGACY_SIZE 0x000f
|
|
||||||
#define PCI_UP_BASE 0x0000
|
#define PCI_UP_BASE 0x0000
|
||||||
#define PCI_DOWN_BASE 0x0004
|
#define PCI_DOWN_BASE 0x0004
|
||||||
#define PCI_EJ_BASE 0x0008
|
#define PCI_EJ_BASE 0x0008
|
||||||
|
@ -302,16 +301,6 @@ void acpi_pcihp_init(Object *owner, AcpiPciHpState *s, PCIBus *root_bus,
|
||||||
s->root= root_bus;
|
s->root= root_bus;
|
||||||
s->legacy_piix = !bridges_enabled;
|
s->legacy_piix = !bridges_enabled;
|
||||||
|
|
||||||
if (s->legacy_piix) {
|
|
||||||
unsigned *bus_bsel = g_malloc(sizeof *bus_bsel);
|
|
||||||
|
|
||||||
s->io_len = ACPI_PCIHP_LEGACY_SIZE;
|
|
||||||
|
|
||||||
*bus_bsel = ACPI_PCIHP_BSEL_DEFAULT;
|
|
||||||
object_property_add_uint32_ptr(OBJECT(root_bus), ACPI_PCIHP_PROP_BSEL,
|
|
||||||
bus_bsel, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
memory_region_init_io(&s->io, owner, &acpi_pcihp_io_ops, s,
|
memory_region_init_io(&s->io, owner, &acpi_pcihp_io_ops, s,
|
||||||
"acpi-pci-hotplug", s->io_len);
|
"acpi-pci-hotplug", s->io_len);
|
||||||
memory_region_add_subregion(address_space_io, s->io_base, &s->io);
|
memory_region_add_subregion(address_space_io, s->io_base, &s->io);
|
||||||
|
|
|
@ -440,6 +440,8 @@ static void piix4_update_bus_hotplug(PCIBus *pci_bus, void *opaque)
|
||||||
{
|
{
|
||||||
PIIX4PMState *s = opaque;
|
PIIX4PMState *s = opaque;
|
||||||
|
|
||||||
|
/* pci_bus cannot outlive PIIX4PMState, because /machine keeps it alive
|
||||||
|
* and it's not hot-unpluggable */
|
||||||
qbus_set_hotplug_handler(BUS(pci_bus), DEVICE(s), &error_abort);
|
qbus_set_hotplug_handler(BUS(pci_bus), DEVICE(s), &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -197,7 +197,7 @@ static void qbus_initfn(Object *obj)
|
||||||
TYPE_HOTPLUG_HANDLER,
|
TYPE_HOTPLUG_HANDLER,
|
||||||
(Object **)&bus->hotplug_handler,
|
(Object **)&bus->hotplug_handler,
|
||||||
object_property_allow_set_link,
|
object_property_allow_set_link,
|
||||||
OBJ_PROP_LINK_UNREF_ON_RELEASE,
|
0,
|
||||||
NULL);
|
NULL);
|
||||||
object_property_add_bool(obj, "realized",
|
object_property_add_bool(obj, "realized",
|
||||||
bus_get_realized, bus_set_realized, NULL);
|
bus_get_realized, bus_set_realized, NULL);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
#include "sysemu/replay.h"
|
#include "sysemu/replay.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
#include "block/aio.h"
|
||||||
|
|
||||||
#define DELTA_ADJUST 1
|
#define DELTA_ADJUST 1
|
||||||
#define DELTA_NO_ADJUST -1
|
#define DELTA_NO_ADJUST -1
|
||||||
|
@ -353,3 +354,10 @@ ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask)
|
||||||
s->policy_mask = policy_mask;
|
s->policy_mask = policy_mask;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ptimer_free(ptimer_state *s)
|
||||||
|
{
|
||||||
|
qemu_bh_delete(s->bh);
|
||||||
|
timer_free(s->timer);
|
||||||
|
g_free(s);
|
||||||
|
}
|
||||||
|
|
|
@ -462,7 +462,7 @@ static void *acpi_set_bsel(PCIBus *bus, void *opaque)
|
||||||
|
|
||||||
*bus_bsel = (*bsel_alloc)++;
|
*bus_bsel = (*bsel_alloc)++;
|
||||||
object_property_add_uint32_ptr(OBJECT(bus), ACPI_PCIHP_PROP_BSEL,
|
object_property_add_uint32_ptr(OBJECT(bus), ACPI_PCIHP_PROP_BSEL,
|
||||||
bus_bsel, NULL);
|
bus_bsel, &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
return bsel_alloc;
|
return bsel_alloc;
|
||||||
|
@ -471,7 +471,7 @@ static void *acpi_set_bsel(PCIBus *bus, void *opaque)
|
||||||
static void acpi_set_pci_info(void)
|
static void acpi_set_pci_info(void)
|
||||||
{
|
{
|
||||||
PCIBus *bus = find_i440fx(); /* TODO: Q35 support */
|
PCIBus *bus = find_i440fx(); /* TODO: Q35 support */
|
||||||
unsigned bsel_alloc = 0;
|
unsigned bsel_alloc = ACPI_PCIHP_BSEL_DEFAULT;
|
||||||
|
|
||||||
if (bus) {
|
if (bus) {
|
||||||
/* Scan all PCI buses. Set property to enable acpi based hotplug. */
|
/* Scan all PCI buses. Set property to enable acpi based hotplug. */
|
||||||
|
|
|
@ -589,6 +589,13 @@ static const struct SCSIBusInfo usb_msd_scsi_info_bot = {
|
||||||
.load_request = usb_msd_load_request,
|
.load_request = usb_msd_load_request,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void usb_msd_unrealize_storage(USBDevice *dev, Error **errp)
|
||||||
|
{
|
||||||
|
MSDState *s = USB_STORAGE_DEV(dev);
|
||||||
|
|
||||||
|
object_unref(OBJECT(&s->bus));
|
||||||
|
}
|
||||||
|
|
||||||
static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
||||||
{
|
{
|
||||||
MSDState *s = USB_STORAGE_DEV(dev);
|
MSDState *s = USB_STORAGE_DEV(dev);
|
||||||
|
@ -639,6 +646,13 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
||||||
s->scsi_dev = scsi_dev;
|
s->scsi_dev = scsi_dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void usb_msd_unrealize_bot(USBDevice *dev, Error **errp)
|
||||||
|
{
|
||||||
|
MSDState *s = USB_STORAGE_DEV(dev);
|
||||||
|
|
||||||
|
object_unref(OBJECT(&s->bus));
|
||||||
|
}
|
||||||
|
|
||||||
static void usb_msd_realize_bot(USBDevice *dev, Error **errp)
|
static void usb_msd_realize_bot(USBDevice *dev, Error **errp)
|
||||||
{
|
{
|
||||||
MSDState *s = USB_STORAGE_DEV(dev);
|
MSDState *s = USB_STORAGE_DEV(dev);
|
||||||
|
@ -759,6 +773,7 @@ static void usb_msd_class_initfn_storage(ObjectClass *klass, void *data)
|
||||||
USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
|
USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
uc->realize = usb_msd_realize_storage;
|
uc->realize = usb_msd_realize_storage;
|
||||||
|
uc->unrealize = usb_msd_unrealize_storage;
|
||||||
dc->props = msd_properties;
|
dc->props = msd_properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,6 +836,7 @@ static void usb_msd_class_initfn_bot(ObjectClass *klass, void *data)
|
||||||
USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
|
USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
uc->realize = usb_msd_realize_bot;
|
uc->realize = usb_msd_realize_bot;
|
||||||
|
uc->unrealize = usb_msd_unrealize_bot;
|
||||||
uc->attached_settable = true;
|
uc->attached_settable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -896,6 +896,8 @@ static void usb_uas_unrealize(USBDevice *dev, Error **errp)
|
||||||
UASDevice *uas = USB_UAS(dev);
|
UASDevice *uas = USB_UAS(dev);
|
||||||
|
|
||||||
qemu_bh_delete(uas->status_bh);
|
qemu_bh_delete(uas->status_bh);
|
||||||
|
|
||||||
|
object_unref(OBJECT(&uas->bus));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_uas_realize(USBDevice *dev, Error **errp)
|
static void usb_uas_realize(USBDevice *dev, Error **errp)
|
||||||
|
|
|
@ -328,4 +328,25 @@ static inline void g_source_set_name_by_id(guint tag, const char *name)
|
||||||
#define g_test_subprocess() (0)
|
#define g_test_subprocess() (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if !GLIB_CHECK_VERSION(2, 34, 0)
|
||||||
|
static inline void
|
||||||
|
g_test_add_data_func_full(const char *path,
|
||||||
|
gpointer data,
|
||||||
|
gpointer fn,
|
||||||
|
gpointer data_free_func)
|
||||||
|
{
|
||||||
|
#if GLIB_CHECK_VERSION(2, 26, 0)
|
||||||
|
/* back-compat casts, remove this once we can require new-enough glib */
|
||||||
|
g_test_add_vtable(path, 0, data, NULL,
|
||||||
|
(GTestFixtureFunc)fn, (GTestFixtureFunc) data_free_func);
|
||||||
|
#else
|
||||||
|
/* back-compat casts, remove this once we can require new-enough glib */
|
||||||
|
g_test_add_vtable(path, 0, data, NULL,
|
||||||
|
(void (*)(void)) fn, (void (*)(void)) data_free_func);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct ptimer_state ptimer_state;
|
||||||
typedef void (*ptimer_cb)(void *opaque);
|
typedef void (*ptimer_cb)(void *opaque);
|
||||||
|
|
||||||
ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask);
|
ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask);
|
||||||
|
void ptimer_free(ptimer_state *s);
|
||||||
void ptimer_set_period(ptimer_state *s, int64_t period);
|
void ptimer_set_period(ptimer_state *s, int64_t period);
|
||||||
void ptimer_set_freq(ptimer_state *s, uint32_t freq);
|
void ptimer_set_freq(ptimer_state *s, uint32_t freq);
|
||||||
uint64_t ptimer_get_limit(ptimer_state *s);
|
uint64_t ptimer_get_limit(ptimer_state *s);
|
||||||
|
|
|
@ -610,7 +610,10 @@ void timer_deinit(QEMUTimer *ts);
|
||||||
*
|
*
|
||||||
* Free a timer (it must not be on the active list)
|
* Free a timer (it must not be on the active list)
|
||||||
*/
|
*/
|
||||||
void timer_free(QEMUTimer *ts);
|
static inline void timer_free(QEMUTimer *ts)
|
||||||
|
{
|
||||||
|
g_free(ts);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* timer_del:
|
* timer_del:
|
||||||
|
|
1
qtest.c
1
qtest.c
|
@ -240,6 +240,7 @@ static void GCC_FMT_ATTR(2, 3) qtest_sendf(CharBackend *chr,
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
buffer = g_strdup_vprintf(fmt, ap);
|
buffer = g_strdup_vprintf(fmt, ap);
|
||||||
qtest_send(chr, buffer);
|
qtest_send(chr, buffer);
|
||||||
|
g_free(buffer);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ static void free_test_data(test_data *data)
|
||||||
g_free(temp->asl_file);
|
g_free(temp->asl_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_array_free(data->tables, false);
|
g_array_free(data->tables, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t acpi_checksum(const uint8_t *data, int len)
|
static uint8_t acpi_checksum(const uint8_t *data, int len)
|
||||||
|
|
|
@ -44,6 +44,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
path = g_strdup_printf("e1000/%s", models[i]);
|
path = g_strdup_printf("e1000/%s", models[i]);
|
||||||
qtest_add_data_func(path, models[i], test_device);
|
qtest_add_data_func(path, models[i], test_device);
|
||||||
|
g_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
|
|
|
@ -99,7 +99,10 @@ static QPCIBus *test_bus;
|
||||||
|
|
||||||
static void e1000e_pci_foreach_callback(QPCIDevice *dev, int devfn, void *data)
|
static void e1000e_pci_foreach_callback(QPCIDevice *dev, int devfn, void *data)
|
||||||
{
|
{
|
||||||
*(QPCIDevice **) data = dev;
|
QPCIDevice **res = data;
|
||||||
|
|
||||||
|
g_assert_null(*res);
|
||||||
|
*res = dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QPCIDevice *e1000e_device_find(QPCIBus *bus)
|
static QPCIDevice *e1000e_device_find(QPCIBus *bus)
|
||||||
|
@ -403,6 +406,7 @@ static void data_test_clear(e1000e_device *d)
|
||||||
e1000e_device_clear(test_bus, d);
|
e1000e_device_clear(test_bus, d);
|
||||||
close(test_sockets[0]);
|
close(test_sockets[0]);
|
||||||
pc_alloc_uninit(test_alloc);
|
pc_alloc_uninit(test_alloc);
|
||||||
|
g_free(d->pci_dev);
|
||||||
qpci_free_pc(test_bus);
|
qpci_free_pc(test_bus);
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
path = g_strdup_printf("eepro100/%s", models[i]);
|
path = g_strdup_printf("eepro100/%s", models[i]);
|
||||||
qtest_add_data_func(path, models[i], test_device);
|
qtest_add_data_func(path, models[i], test_device);
|
||||||
|
g_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
|
|
|
@ -295,14 +295,17 @@ int main(int argc, char **argv)
|
||||||
path = g_strdup_printf("endianness/%s",
|
path = g_strdup_printf("endianness/%s",
|
||||||
test_cases[i].machine);
|
test_cases[i].machine);
|
||||||
qtest_add_data_func(path, &test_cases[i], test_endianness);
|
qtest_add_data_func(path, &test_cases[i], test_endianness);
|
||||||
|
g_free(path);
|
||||||
|
|
||||||
path = g_strdup_printf("endianness/split/%s",
|
path = g_strdup_printf("endianness/split/%s",
|
||||||
test_cases[i].machine);
|
test_cases[i].machine);
|
||||||
qtest_add_data_func(path, &test_cases[i], test_endianness_split);
|
qtest_add_data_func(path, &test_cases[i], test_endianness_split);
|
||||||
|
g_free(path);
|
||||||
|
|
||||||
path = g_strdup_printf("endianness/combine/%s",
|
path = g_strdup_printf("endianness/combine/%s",
|
||||||
test_cases[i].machine);
|
test_cases[i].machine);
|
||||||
qtest_add_data_func(path, &test_cases[i], test_endianness_combine);
|
qtest_add_data_func(path, &test_cases[i], test_endianness_combine);
|
||||||
|
g_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "libqtest.h"
|
#include "libqtest.h"
|
||||||
|
|
||||||
|
#define ARGV_SIZE 256
|
||||||
|
|
||||||
static char *create_test_img(int secs)
|
static char *create_test_img(int secs)
|
||||||
{
|
{
|
||||||
char *template = strdup("/tmp/qtest.XXXXXX");
|
char *template = strdup("/tmp/qtest.XXXXXX");
|
||||||
|
@ -66,7 +68,7 @@ static const CHST hd_chst[backend_last][mbr_last] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *img_file_name[backend_last];
|
static char *img_file_name[backend_last];
|
||||||
|
|
||||||
static const CHST *cur_ide[4];
|
static const CHST *cur_ide[4];
|
||||||
|
|
||||||
|
@ -234,28 +236,36 @@ static int setup_ide(int argc, char *argv[], int argv_sz,
|
||||||
*/
|
*/
|
||||||
static void test_ide_none(void)
|
static void test_ide_none(void)
|
||||||
{
|
{
|
||||||
char *argv[256];
|
char **argv = g_new0(char *, ARGV_SIZE);
|
||||||
|
char *args;
|
||||||
|
|
||||||
setup_common(argv, ARRAY_SIZE(argv));
|
setup_common(argv, ARGV_SIZE);
|
||||||
qtest_start(g_strjoinv(" ", argv));
|
args = g_strjoinv(" ", argv);
|
||||||
|
qtest_start(args);
|
||||||
|
g_strfreev(argv);
|
||||||
|
g_free(args);
|
||||||
test_cmos();
|
test_cmos();
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_ide_mbr(bool use_device, MBRcontents mbr)
|
static void test_ide_mbr(bool use_device, MBRcontents mbr)
|
||||||
{
|
{
|
||||||
char *argv[256];
|
char **argv = g_new0(char *, ARGV_SIZE);
|
||||||
|
char *args;
|
||||||
int argc;
|
int argc;
|
||||||
Backend i;
|
Backend i;
|
||||||
const char *dev;
|
const char *dev;
|
||||||
|
|
||||||
argc = setup_common(argv, ARRAY_SIZE(argv));
|
argc = setup_common(argv, ARGV_SIZE);
|
||||||
for (i = 0; i < backend_last; i++) {
|
for (i = 0; i < backend_last; i++) {
|
||||||
cur_ide[i] = &hd_chst[i][mbr];
|
cur_ide[i] = &hd_chst[i][mbr];
|
||||||
dev = use_device ? (is_hd(cur_ide[i]) ? "ide-hd" : "ide-cd") : NULL;
|
dev = use_device ? (is_hd(cur_ide[i]) ? "ide-hd" : "ide-cd") : NULL;
|
||||||
argc = setup_ide(argc, argv, ARRAY_SIZE(argv), i, dev, i, mbr, "");
|
argc = setup_ide(argc, argv, ARGV_SIZE, i, dev, i, mbr, "");
|
||||||
}
|
}
|
||||||
qtest_start(g_strjoinv(" ", argv));
|
args = g_strjoinv(" ", argv);
|
||||||
|
qtest_start(args);
|
||||||
|
g_strfreev(argv);
|
||||||
|
g_free(args);
|
||||||
test_cmos();
|
test_cmos();
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
@ -310,12 +320,13 @@ static void test_ide_device_mbr_chs(void)
|
||||||
|
|
||||||
static void test_ide_drive_user(const char *dev, bool trans)
|
static void test_ide_drive_user(const char *dev, bool trans)
|
||||||
{
|
{
|
||||||
char *argv[256], *opts;
|
char **argv = g_new0(char *, ARGV_SIZE);
|
||||||
|
char *args, *opts;
|
||||||
int argc;
|
int argc;
|
||||||
int secs = img_secs[backend_small];
|
int secs = img_secs[backend_small];
|
||||||
const CHST expected_chst = { secs / (4 * 32) , 4, 32, trans };
|
const CHST expected_chst = { secs / (4 * 32) , 4, 32, trans };
|
||||||
|
|
||||||
argc = setup_common(argv, ARRAY_SIZE(argv));
|
argc = setup_common(argv, ARGV_SIZE);
|
||||||
opts = g_strdup_printf("%s,%s%scyls=%d,heads=%d,secs=%d",
|
opts = g_strdup_printf("%s,%s%scyls=%d,heads=%d,secs=%d",
|
||||||
dev ?: "",
|
dev ?: "",
|
||||||
trans && dev ? "bios-chs-" : "",
|
trans && dev ? "bios-chs-" : "",
|
||||||
|
@ -323,11 +334,14 @@ static void test_ide_drive_user(const char *dev, bool trans)
|
||||||
expected_chst.cyls, expected_chst.heads,
|
expected_chst.cyls, expected_chst.heads,
|
||||||
expected_chst.secs);
|
expected_chst.secs);
|
||||||
cur_ide[0] = &expected_chst;
|
cur_ide[0] = &expected_chst;
|
||||||
argc = setup_ide(argc, argv, ARRAY_SIZE(argv),
|
argc = setup_ide(argc, argv, ARGV_SIZE,
|
||||||
0, dev ? opts : NULL, backend_small, mbr_chs,
|
0, dev ? opts : NULL, backend_small, mbr_chs,
|
||||||
dev ? "" : opts);
|
dev ? "" : opts);
|
||||||
g_free(opts);
|
g_free(opts);
|
||||||
qtest_start(g_strjoinv(" ", argv));
|
args = g_strjoinv(" ", argv);
|
||||||
|
qtest_start(args);
|
||||||
|
g_strfreev(argv);
|
||||||
|
g_free(args);
|
||||||
test_cmos();
|
test_cmos();
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
@ -369,18 +383,22 @@ static void test_ide_device_user_chst(void)
|
||||||
*/
|
*/
|
||||||
static void test_ide_drive_cd_0(void)
|
static void test_ide_drive_cd_0(void)
|
||||||
{
|
{
|
||||||
char *argv[256];
|
char **argv = g_new0(char *, ARGV_SIZE);
|
||||||
|
char *args;
|
||||||
int argc, ide_idx;
|
int argc, ide_idx;
|
||||||
Backend i;
|
Backend i;
|
||||||
|
|
||||||
argc = setup_common(argv, ARRAY_SIZE(argv));
|
argc = setup_common(argv, ARGV_SIZE);
|
||||||
for (i = 0; i <= backend_empty; i++) {
|
for (i = 0; i <= backend_empty; i++) {
|
||||||
ide_idx = backend_empty - i;
|
ide_idx = backend_empty - i;
|
||||||
cur_ide[ide_idx] = &hd_chst[i][mbr_blank];
|
cur_ide[ide_idx] = &hd_chst[i][mbr_blank];
|
||||||
argc = setup_ide(argc, argv, ARRAY_SIZE(argv),
|
argc = setup_ide(argc, argv, ARGV_SIZE,
|
||||||
ide_idx, NULL, i, mbr_blank, "");
|
ide_idx, NULL, i, mbr_blank, "");
|
||||||
}
|
}
|
||||||
qtest_start(g_strjoinv(" ", argv));
|
args = g_strjoinv(" ", argv);
|
||||||
|
qtest_start(args);
|
||||||
|
g_strfreev(argv);
|
||||||
|
g_free(args);
|
||||||
test_cmos();
|
test_cmos();
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
@ -418,6 +436,7 @@ int main(int argc, char **argv)
|
||||||
for (i = 0; i < backend_last; i++) {
|
for (i = 0; i < backend_last; i++) {
|
||||||
if (img_file_name[i]) {
|
if (img_file_name[i]) {
|
||||||
unlink(img_file_name[i]);
|
unlink(img_file_name[i]);
|
||||||
|
free(img_file_name[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,8 @@ static void test_i440fx_defaults(gconstpointer opaque)
|
||||||
/* 3.2.26 */
|
/* 3.2.26 */
|
||||||
g_assert_cmpint(qpci_config_readb(dev, 0x93), ==, 0x00); /* TRC */
|
g_assert_cmpint(qpci_config_readb(dev, 0x93), ==, 0x00); /* TRC */
|
||||||
|
|
||||||
|
g_free(dev);
|
||||||
|
qpci_free_pc(bus);
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,6 +272,9 @@ static void test_i440fx_pam(gconstpointer opaque)
|
||||||
/* Verify the area is not our new mask */
|
/* Verify the area is not our new mask */
|
||||||
g_assert(!verify_area(pam_area[i].start, pam_area[i].end, 0x82));
|
g_assert(!verify_area(pam_area[i].start, pam_area[i].end, 0x82));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_free(dev);
|
||||||
|
qpci_free_pc(bus);
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -339,6 +339,7 @@ static void test_bmdma_simple_rw(void)
|
||||||
g_assert(memcmp(buf, cmpbuf, len) == 0);
|
g_assert(memcmp(buf, cmpbuf, len) == 0);
|
||||||
|
|
||||||
|
|
||||||
|
free_pci_device(dev);
|
||||||
g_free(buf);
|
g_free(buf);
|
||||||
g_free(cmpbuf);
|
g_free(cmpbuf);
|
||||||
}
|
}
|
||||||
|
@ -369,6 +370,7 @@ static void test_bmdma_short_prdt(void)
|
||||||
prdt, ARRAY_SIZE(prdt), NULL);
|
prdt, ARRAY_SIZE(prdt), NULL);
|
||||||
g_assert_cmphex(status, ==, 0);
|
g_assert_cmphex(status, ==, 0);
|
||||||
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_bmdma_one_sector_short_prdt(void)
|
static void test_bmdma_one_sector_short_prdt(void)
|
||||||
|
@ -398,6 +400,7 @@ static void test_bmdma_one_sector_short_prdt(void)
|
||||||
prdt, ARRAY_SIZE(prdt), NULL);
|
prdt, ARRAY_SIZE(prdt), NULL);
|
||||||
g_assert_cmphex(status, ==, 0);
|
g_assert_cmphex(status, ==, 0);
|
||||||
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_bmdma_long_prdt(void)
|
static void test_bmdma_long_prdt(void)
|
||||||
|
@ -426,6 +429,7 @@ static void test_bmdma_long_prdt(void)
|
||||||
prdt, ARRAY_SIZE(prdt), NULL);
|
prdt, ARRAY_SIZE(prdt), NULL);
|
||||||
g_assert_cmphex(status, ==, BM_STS_INTR);
|
g_assert_cmphex(status, ==, BM_STS_INTR);
|
||||||
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_bmdma_no_busmaster(void)
|
static void test_bmdma_no_busmaster(void)
|
||||||
|
@ -449,6 +453,7 @@ static void test_bmdma_no_busmaster(void)
|
||||||
* in practice. At least we want to be aware of any changes. */
|
* in practice. At least we want to be aware of any changes. */
|
||||||
g_assert_cmphex(status, ==, BM_STS_ACTIVE | BM_STS_INTR);
|
g_assert_cmphex(status, ==, BM_STS_ACTIVE | BM_STS_INTR);
|
||||||
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_bmdma_setup(void)
|
static void test_bmdma_setup(void)
|
||||||
|
@ -525,6 +530,7 @@ static void test_identify(void)
|
||||||
assert_bit_set(buf[85], 0x20);
|
assert_bit_set(buf[85], 0x20);
|
||||||
|
|
||||||
ide_test_quit();
|
ide_test_quit();
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -563,6 +569,7 @@ static void make_dirty(uint8_t device)
|
||||||
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR);
|
||||||
|
|
||||||
g_free(buf);
|
g_free(buf);
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_flush(void)
|
static void test_flush(void)
|
||||||
|
@ -609,6 +616,7 @@ static void test_flush(void)
|
||||||
assert_bit_clear(data, BSY | DF | ERR | DRQ);
|
assert_bit_clear(data, BSY | DF | ERR | DRQ);
|
||||||
|
|
||||||
ide_test_quit();
|
ide_test_quit();
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_retry_flush(const char *machine)
|
static void test_retry_flush(const char *machine)
|
||||||
|
@ -659,6 +667,7 @@ static void test_retry_flush(const char *machine)
|
||||||
assert_bit_clear(data, BSY | DF | ERR | DRQ);
|
assert_bit_clear(data, BSY | DF | ERR | DRQ);
|
||||||
|
|
||||||
ide_test_quit();
|
ide_test_quit();
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_flush_nodev(void)
|
static void test_flush_nodev(void)
|
||||||
|
@ -676,6 +685,7 @@ static void test_flush_nodev(void)
|
||||||
|
|
||||||
/* Just testing that qemu doesn't crash... */
|
/* Just testing that qemu doesn't crash... */
|
||||||
|
|
||||||
|
free_pci_device(dev);
|
||||||
ide_test_quit();
|
ide_test_quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -742,6 +752,7 @@ static uint8_t ide_wait_clear(uint8_t flag)
|
||||||
while (true) {
|
while (true) {
|
||||||
data = qpci_io_readb(dev, ide_bar, reg_status);
|
data = qpci_io_readb(dev, ide_bar, reg_status);
|
||||||
if (!(data & flag)) {
|
if (!(data & flag)) {
|
||||||
|
free_pci_device(dev);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
if (difftime(time(NULL), st) > 5.0) {
|
if (difftime(time(NULL), st) > 5.0) {
|
||||||
|
@ -851,6 +862,7 @@ static void cdrom_pio_impl(int nblocks)
|
||||||
g_free(pattern);
|
g_free(pattern);
|
||||||
g_free(rx);
|
g_free(rx);
|
||||||
test_bmdma_teardown();
|
test_bmdma_teardown();
|
||||||
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_cdrom_pio(void)
|
static void test_cdrom_pio(void)
|
||||||
|
|
|
@ -420,6 +420,7 @@ int main(int argc, char **argv)
|
||||||
" -device ipmi-bmc-extern,chardev=ipmi0,id=bmc0"
|
" -device ipmi-bmc-extern,chardev=ipmi0,id=bmc0"
|
||||||
" -device isa-ipmi-bt,bmc=bmc0", emu_port);
|
" -device isa-ipmi-bt,bmc=bmc0", emu_port);
|
||||||
qtest_start(cmdline);
|
qtest_start(cmdline);
|
||||||
|
g_free(cmdline);
|
||||||
qtest_irq_intercept_in(global_qtest, "ioapic");
|
qtest_irq_intercept_in(global_qtest, "ioapic");
|
||||||
qtest_add_func("/ipmi/extern/connect", test_connect);
|
qtest_add_func("/ipmi/extern/connect", test_connect);
|
||||||
qtest_add_func("/ipmi/extern/bt_base", test_bt_base);
|
qtest_add_func("/ipmi/extern/bt_base", test_bt_base);
|
||||||
|
|
|
@ -279,6 +279,7 @@ int main(int argc, char **argv)
|
||||||
cmdline = g_strdup_printf("-device ipmi-bmc-sim,id=bmc0"
|
cmdline = g_strdup_printf("-device ipmi-bmc-sim,id=bmc0"
|
||||||
" -device isa-ipmi-kcs,bmc=bmc0");
|
" -device isa-ipmi-kcs,bmc=bmc0");
|
||||||
qtest_start(cmdline);
|
qtest_start(cmdline);
|
||||||
|
g_free(cmdline);
|
||||||
qtest_irq_intercept_in(global_qtest, "ioapic");
|
qtest_irq_intercept_in(global_qtest, "ioapic");
|
||||||
qtest_add_func("/ipmi/local/kcs_base", test_kcs_base);
|
qtest_add_func("/ipmi/local/kcs_base", test_kcs_base);
|
||||||
qtest_add_func("/ipmi/local/kcs_abort", test_kcs_abort);
|
qtest_add_func("/ipmi/local/kcs_abort", test_kcs_abort);
|
||||||
|
|
|
@ -24,6 +24,11 @@ void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc, uint32_t devfn, int bar)
|
||||||
hc->bar = qpci_iomap(hc->dev, bar, NULL);
|
hc->bar = qpci_iomap(hc->dev, bar, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uhci_deinit(struct qhc *hc)
|
||||||
|
{
|
||||||
|
g_free(hc->dev);
|
||||||
|
}
|
||||||
|
|
||||||
void uhci_port_test(struct qhc *hc, int port, uint16_t expect)
|
void uhci_port_test(struct qhc *hc, int port, uint16_t expect)
|
||||||
{
|
{
|
||||||
uint16_t value = qpci_io_readw(hc->dev, hc->bar, 0x10 + 2 * port);
|
uint16_t value = qpci_io_readw(hc->dev, hc->bar, 0x10 + 2 * port);
|
||||||
|
@ -64,4 +69,5 @@ void usb_test_hotplug(const char *hcd_id, const int port,
|
||||||
g_assert(response);
|
g_assert(response);
|
||||||
g_assert(qdict_haskey(response, "event"));
|
g_assert(qdict_haskey(response, "event"));
|
||||||
g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
|
g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
|
||||||
|
QDECREF(response);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ struct qhc {
|
||||||
void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc,
|
void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc,
|
||||||
uint32_t devfn, int bar);
|
uint32_t devfn, int bar);
|
||||||
void uhci_port_test(struct qhc *hc, int port, uint16_t expect);
|
void uhci_port_test(struct qhc *hc, int port, uint16_t expect);
|
||||||
|
void uhci_deinit(struct qhc *hc);
|
||||||
|
|
||||||
void usb_test_hotplug(const char *bus_name, const int port,
|
void usb_test_hotplug(const char *bus_name, const int port,
|
||||||
void (*port_check)(void));
|
void (*port_check)(void));
|
||||||
|
|
|
@ -24,9 +24,17 @@
|
||||||
typedef struct QVirtioPCIForeachData {
|
typedef struct QVirtioPCIForeachData {
|
||||||
void (*func)(QVirtioDevice *d, void *data);
|
void (*func)(QVirtioDevice *d, void *data);
|
||||||
uint16_t device_type;
|
uint16_t device_type;
|
||||||
|
bool has_slot;
|
||||||
|
int slot;
|
||||||
void *user_data;
|
void *user_data;
|
||||||
} QVirtioPCIForeachData;
|
} QVirtioPCIForeachData;
|
||||||
|
|
||||||
|
void qvirtio_pci_device_free(QVirtioPCIDevice *dev)
|
||||||
|
{
|
||||||
|
g_free(dev->pdev);
|
||||||
|
g_free(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static QVirtioPCIDevice *qpcidevice_to_qvirtiodevice(QPCIDevice *pdev)
|
static QVirtioPCIDevice *qpcidevice_to_qvirtiodevice(QPCIDevice *pdev)
|
||||||
{
|
{
|
||||||
QVirtioPCIDevice *vpcidev;
|
QVirtioPCIDevice *vpcidev;
|
||||||
|
@ -49,16 +57,18 @@ static void qvirtio_pci_foreach_callback(
|
||||||
QVirtioPCIForeachData *d = data;
|
QVirtioPCIForeachData *d = data;
|
||||||
QVirtioPCIDevice *vpcidev = qpcidevice_to_qvirtiodevice(dev);
|
QVirtioPCIDevice *vpcidev = qpcidevice_to_qvirtiodevice(dev);
|
||||||
|
|
||||||
if (vpcidev->vdev.device_type == d->device_type) {
|
if (vpcidev->vdev.device_type == d->device_type &&
|
||||||
|
(!d->has_slot || vpcidev->pdev->devfn == d->slot << 3)) {
|
||||||
d->func(&vpcidev->vdev, d->user_data);
|
d->func(&vpcidev->vdev, d->user_data);
|
||||||
} else {
|
} else {
|
||||||
g_free(vpcidev);
|
qvirtio_pci_device_free(vpcidev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qvirtio_pci_assign_device(QVirtioDevice *d, void *data)
|
static void qvirtio_pci_assign_device(QVirtioDevice *d, void *data)
|
||||||
{
|
{
|
||||||
QVirtioPCIDevice **vpcidev = data;
|
QVirtioPCIDevice **vpcidev = data;
|
||||||
|
assert(!*vpcidev);
|
||||||
*vpcidev = (QVirtioPCIDevice *)d;
|
*vpcidev = (QVirtioPCIDevice *)d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,21 +294,39 @@ const QVirtioBus qvirtio_pci = {
|
||||||
.virtqueue_kick = qvirtio_pci_virtqueue_kick,
|
.virtqueue_kick = qvirtio_pci_virtqueue_kick,
|
||||||
};
|
};
|
||||||
|
|
||||||
void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type,
|
static void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type,
|
||||||
|
bool has_slot, int slot,
|
||||||
void (*func)(QVirtioDevice *d, void *data), void *data)
|
void (*func)(QVirtioDevice *d, void *data), void *data)
|
||||||
{
|
{
|
||||||
QVirtioPCIForeachData d = { .func = func,
|
QVirtioPCIForeachData d = { .func = func,
|
||||||
.device_type = device_type,
|
.device_type = device_type,
|
||||||
|
.has_slot = has_slot,
|
||||||
|
.slot = slot,
|
||||||
.user_data = data };
|
.user_data = data };
|
||||||
|
|
||||||
qpci_device_foreach(bus, PCI_VENDOR_ID_REDHAT_QUMRANET, -1,
|
qpci_device_foreach(bus, PCI_VENDOR_ID_REDHAT_QUMRANET, -1,
|
||||||
qvirtio_pci_foreach_callback, &d);
|
qvirtio_pci_foreach_callback, &d);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type)
|
QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type)
|
||||||
{
|
{
|
||||||
QVirtioPCIDevice *dev = NULL;
|
QVirtioPCIDevice *dev = NULL;
|
||||||
qvirtio_pci_foreach(bus, device_type, qvirtio_pci_assign_device, &dev);
|
|
||||||
|
qvirtio_pci_foreach(bus, device_type, false, 0,
|
||||||
|
qvirtio_pci_assign_device, &dev);
|
||||||
|
|
||||||
|
dev->vdev.bus = &qvirtio_pci;
|
||||||
|
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVirtioPCIDevice *qvirtio_pci_device_find_slot(QPCIBus *bus,
|
||||||
|
uint16_t device_type, int slot)
|
||||||
|
{
|
||||||
|
QVirtioPCIDevice *dev = NULL;
|
||||||
|
|
||||||
|
qvirtio_pci_foreach(bus, device_type, true, slot,
|
||||||
|
qvirtio_pci_assign_device, &dev);
|
||||||
|
|
||||||
dev->vdev.bus = &qvirtio_pci;
|
dev->vdev.bus = &qvirtio_pci;
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,11 @@ typedef struct QVirtQueuePCI {
|
||||||
|
|
||||||
extern const QVirtioBus qvirtio_pci;
|
extern const QVirtioBus qvirtio_pci;
|
||||||
|
|
||||||
void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type,
|
|
||||||
void (*func)(QVirtioDevice *d, void *data), void *data);
|
|
||||||
QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type);
|
QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type);
|
||||||
|
QVirtioPCIDevice *qvirtio_pci_device_find_slot(QPCIBus *bus,
|
||||||
|
uint16_t device_type, int slot);
|
||||||
|
void qvirtio_pci_device_free(QVirtioPCIDevice *dev);
|
||||||
|
|
||||||
void qvirtio_pci_device_enable(QVirtioPCIDevice *d);
|
void qvirtio_pci_device_enable(QVirtioPCIDevice *d);
|
||||||
void qvirtio_pci_device_disable(QVirtioPCIDevice *d);
|
void qvirtio_pci_device_disable(QVirtioPCIDevice *d);
|
||||||
|
|
||||||
|
|
|
@ -805,17 +805,7 @@ void qtest_add_data_func_full(const char *str, void *data,
|
||||||
GDestroyNotify data_free_func)
|
GDestroyNotify data_free_func)
|
||||||
{
|
{
|
||||||
gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
|
gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
|
||||||
#if GLIB_CHECK_VERSION(2, 34, 0)
|
|
||||||
g_test_add_data_func_full(path, data, fn, data_free_func);
|
g_test_add_data_func_full(path, data, fn, data_free_func);
|
||||||
#elif GLIB_CHECK_VERSION(2, 26, 0)
|
|
||||||
/* back-compat casts, remove this once we can require new-enough glib */
|
|
||||||
g_test_add_vtable(path, 0, data, NULL,
|
|
||||||
(GTestFixtureFunc)fn, (GTestFixtureFunc) data_free_func);
|
|
||||||
#else
|
|
||||||
/* back-compat casts, remove this once we can require new-enough glib */
|
|
||||||
g_test_add_vtable(path, 0, data, NULL,
|
|
||||||
(void (*)(void)) fn, (void (*)(void)) data_free_func);
|
|
||||||
#endif
|
|
||||||
g_free(path);
|
g_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -482,7 +482,7 @@ static void test_migrate(void)
|
||||||
usleep(10 * 1000);
|
usleep(10 * 1000);
|
||||||
} while (dest_byte_a == dest_byte_b);
|
} while (dest_byte_a == dest_byte_b);
|
||||||
|
|
||||||
qmp("{ 'execute' : 'stop'}");
|
qmp_discard_response("{ 'execute' : 'stop'}");
|
||||||
/* With it stopped, check nothing changes */
|
/* With it stopped, check nothing changes */
|
||||||
qtest_memread(to, start_address, &dest_byte_c, 1);
|
qtest_memread(to, start_address, &dest_byte_c, 1);
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
|
@ -108,6 +108,11 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
|
||||||
return bh;
|
return bh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_bh_delete(QEMUBH *bh)
|
||||||
|
{
|
||||||
|
g_free(bh);
|
||||||
|
}
|
||||||
|
|
||||||
void replay_bh_schedule_event(QEMUBH *bh)
|
void replay_bh_schedule_event(QEMUBH *bh)
|
||||||
{
|
{
|
||||||
bh->cb(bh->opaque);
|
bh->cb(bh->opaque);
|
||||||
|
|
|
@ -73,6 +73,7 @@ static void check_set_count(gconstpointer arg)
|
||||||
ptimer_set_count(ptimer, 1000);
|
ptimer_set_count(ptimer, 1000);
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_set_limit(gconstpointer arg)
|
static void check_set_limit(gconstpointer arg)
|
||||||
|
@ -92,6 +93,7 @@ static void check_set_limit(gconstpointer arg)
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
|
||||||
g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
|
g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_oneshot(gconstpointer arg)
|
static void check_oneshot(gconstpointer arg)
|
||||||
|
@ -194,6 +196,7 @@ static void check_oneshot(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_periodic(gconstpointer arg)
|
static void check_periodic(gconstpointer arg)
|
||||||
|
@ -360,6 +363,7 @@ static void check_periodic(gconstpointer arg)
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==,
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==,
|
||||||
(no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0));
|
(no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0));
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_on_the_fly_mode_change(gconstpointer arg)
|
static void check_on_the_fly_mode_change(gconstpointer arg)
|
||||||
|
@ -406,6 +410,7 @@ static void check_on_the_fly_mode_change(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_on_the_fly_period_change(gconstpointer arg)
|
static void check_on_the_fly_period_change(gconstpointer arg)
|
||||||
|
@ -438,6 +443,7 @@ static void check_on_the_fly_period_change(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_on_the_fly_freq_change(gconstpointer arg)
|
static void check_on_the_fly_freq_change(gconstpointer arg)
|
||||||
|
@ -470,6 +476,7 @@ static void check_on_the_fly_freq_change(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_run_with_period_0(gconstpointer arg)
|
static void check_run_with_period_0(gconstpointer arg)
|
||||||
|
@ -487,6 +494,7 @@ static void check_run_with_period_0(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_run_with_delta_0(gconstpointer arg)
|
static void check_run_with_delta_0(gconstpointer arg)
|
||||||
|
@ -591,6 +599,7 @@ static void check_run_with_delta_0(gconstpointer arg)
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
|
||||||
ptimer_stop(ptimer);
|
ptimer_stop(ptimer);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_periodic_with_load_0(gconstpointer arg)
|
static void check_periodic_with_load_0(gconstpointer arg)
|
||||||
|
@ -649,6 +658,7 @@ static void check_periodic_with_load_0(gconstpointer arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
ptimer_stop(ptimer);
|
ptimer_stop(ptimer);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_oneshot_with_load_0(gconstpointer arg)
|
static void check_oneshot_with_load_0(gconstpointer arg)
|
||||||
|
@ -682,14 +692,14 @@ static void check_oneshot_with_load_0(gconstpointer arg)
|
||||||
} else {
|
} else {
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_ptimer_tests(uint8_t policy)
|
static void add_ptimer_tests(uint8_t policy)
|
||||||
{
|
{
|
||||||
uint8_t *ppolicy = g_malloc(1);
|
char policy_name[256] = "";
|
||||||
char *policy_name = g_malloc0(256);
|
char *tmp;
|
||||||
|
|
||||||
*ppolicy = policy;
|
|
||||||
|
|
||||||
if (policy == PTIMER_POLICY_DEFAULT) {
|
if (policy == PTIMER_POLICY_DEFAULT) {
|
||||||
g_sprintf(policy_name, "default");
|
g_sprintf(policy_name, "default");
|
||||||
|
@ -715,49 +725,67 @@ static void add_ptimer_tests(uint8_t policy)
|
||||||
g_strlcat(policy_name, "no_counter_rounddown,", 256);
|
g_strlcat(policy_name, "no_counter_rounddown,", 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
|
||||||
ppolicy, check_set_count);
|
g_memdup(&policy, 1), check_set_count, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
|
||||||
ppolicy, check_set_limit);
|
g_memdup(&policy, 1), check_set_limit, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
|
||||||
ppolicy, check_oneshot);
|
g_memdup(&policy, 1), check_oneshot, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
|
||||||
ppolicy, check_periodic);
|
g_memdup(&policy, 1), check_periodic, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s",
|
||||||
ppolicy, check_on_the_fly_mode_change);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_on_the_fly_mode_change, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s",
|
||||||
ppolicy, check_on_the_fly_period_change);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_on_the_fly_period_change, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s",
|
||||||
ppolicy, check_on_the_fly_freq_change);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_on_the_fly_freq_change, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/run_with_period_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/run_with_period_0 policy=%s",
|
||||||
ppolicy, check_run_with_period_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_run_with_period_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/run_with_delta_0 policy=%s",
|
||||||
ppolicy, check_run_with_delta_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_run_with_delta_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s",
|
||||||
ppolicy, check_periodic_with_load_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_periodic_with_load_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s",
|
||||||
ppolicy, check_oneshot_with_load_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_oneshot_with_load_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_all_ptimer_policies_comb_tests(void)
|
static void add_all_ptimer_policies_comb_tests(void)
|
||||||
|
|
|
@ -27,6 +27,7 @@ static void test_panic(void)
|
||||||
data = qdict_get_qdict(response, "data");
|
data = qdict_get_qdict(response, "data");
|
||||||
g_assert(qdict_haskey(data, "action"));
|
g_assert(qdict_haskey(data, "action"));
|
||||||
g_assert_cmpstr(qdict_get_str(data, "action"), ==, "pause");
|
g_assert_cmpstr(qdict_get_str(data, "action"), ==, "pause");
|
||||||
|
QDECREF(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
|
|
@ -71,6 +71,9 @@ static void test_smram_lock(void)
|
||||||
g_assert(smram_test_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN) == false);
|
g_assert(smram_test_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN) == false);
|
||||||
smram_set_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN, true);
|
smram_set_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN, true);
|
||||||
g_assert(smram_test_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN) == true);
|
g_assert(smram_test_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN) == true);
|
||||||
|
|
||||||
|
g_free(pcidev);
|
||||||
|
qpci_free_pc(pcibus);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
|
|
@ -42,11 +42,18 @@ typedef struct {
|
||||||
bool noreboot;
|
bool noreboot;
|
||||||
QPCIDevice *dev;
|
QPCIDevice *dev;
|
||||||
QPCIBar tco_io_bar;
|
QPCIBar tco_io_bar;
|
||||||
|
QPCIBus *bus;
|
||||||
} TestData;
|
} TestData;
|
||||||
|
|
||||||
|
static void test_end(TestData *d)
|
||||||
|
{
|
||||||
|
g_free(d->dev);
|
||||||
|
qpci_free_pc(d->bus);
|
||||||
|
qtest_end();
|
||||||
|
}
|
||||||
|
|
||||||
static void test_init(TestData *d)
|
static void test_init(TestData *d)
|
||||||
{
|
{
|
||||||
QPCIBus *bus;
|
|
||||||
QTestState *qs;
|
QTestState *qs;
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
|
@ -57,8 +64,8 @@ static void test_init(TestData *d)
|
||||||
qtest_irq_intercept_in(qs, "ioapic");
|
qtest_irq_intercept_in(qs, "ioapic");
|
||||||
g_free(s);
|
g_free(s);
|
||||||
|
|
||||||
bus = qpci_init_pc(NULL);
|
d->bus = qpci_init_pc(NULL);
|
||||||
d->dev = qpci_device_find(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);
|
||||||
|
|
||||||
qpci_device_enable(d->dev);
|
qpci_device_enable(d->dev);
|
||||||
|
@ -148,7 +155,7 @@ static void test_tco_defaults(void)
|
||||||
SW_IRQ_GEN_DEFAULT);
|
SW_IRQ_GEN_DEFAULT);
|
||||||
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO_TMR), ==,
|
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO_TMR), ==,
|
||||||
TCO_TMR_DEFAULT);
|
TCO_TMR_DEFAULT);
|
||||||
qtest_end();
|
test_end(&d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco_timeout(void)
|
static void test_tco_timeout(void)
|
||||||
|
@ -192,7 +199,7 @@ static void test_tco_timeout(void)
|
||||||
g_assert(ret == 1);
|
g_assert(ret == 1);
|
||||||
|
|
||||||
stop_tco(&d);
|
stop_tco(&d);
|
||||||
qtest_end();
|
test_end(&d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco_max_timeout(void)
|
static void test_tco_max_timeout(void)
|
||||||
|
@ -225,7 +232,7 @@ static void test_tco_max_timeout(void)
|
||||||
g_assert(ret == 1);
|
g_assert(ret == 1);
|
||||||
|
|
||||||
stop_tco(&d);
|
stop_tco(&d);
|
||||||
qtest_end();
|
test_end(&d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QDict *get_watchdog_action(void)
|
static QDict *get_watchdog_action(void)
|
||||||
|
@ -262,7 +269,7 @@ static void test_tco_second_timeout_pause(void)
|
||||||
QDECREF(ad);
|
QDECREF(ad);
|
||||||
|
|
||||||
stop_tco(&td);
|
stop_tco(&td);
|
||||||
qtest_end();
|
test_end(&td);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco_second_timeout_reset(void)
|
static void test_tco_second_timeout_reset(void)
|
||||||
|
@ -287,7 +294,7 @@ static void test_tco_second_timeout_reset(void)
|
||||||
QDECREF(ad);
|
QDECREF(ad);
|
||||||
|
|
||||||
stop_tco(&td);
|
stop_tco(&td);
|
||||||
qtest_end();
|
test_end(&td);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco_second_timeout_shutdown(void)
|
static void test_tco_second_timeout_shutdown(void)
|
||||||
|
@ -312,7 +319,7 @@ static void test_tco_second_timeout_shutdown(void)
|
||||||
QDECREF(ad);
|
QDECREF(ad);
|
||||||
|
|
||||||
stop_tco(&td);
|
stop_tco(&td);
|
||||||
qtest_end();
|
test_end(&td);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco_second_timeout_none(void)
|
static void test_tco_second_timeout_none(void)
|
||||||
|
@ -337,7 +344,7 @@ static void test_tco_second_timeout_none(void)
|
||||||
QDECREF(ad);
|
QDECREF(ad);
|
||||||
|
|
||||||
stop_tco(&td);
|
stop_tco(&td);
|
||||||
qtest_end();
|
test_end(&td);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco_ticks_counter(void)
|
static void test_tco_ticks_counter(void)
|
||||||
|
@ -365,7 +372,7 @@ static void test_tco_ticks_counter(void)
|
||||||
} while (!(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS) & TCO_TIMEOUT));
|
} while (!(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS) & TCO_TIMEOUT));
|
||||||
|
|
||||||
stop_tco(&d);
|
stop_tco(&d);
|
||||||
qtest_end();
|
test_end(&d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco1_control_bits(void)
|
static void test_tco1_control_bits(void)
|
||||||
|
@ -383,7 +390,7 @@ static void test_tco1_control_bits(void)
|
||||||
qpci_io_writew(d.dev, d.tco_io_bar, TCO1_CNT, val);
|
qpci_io_writew(d.dev, d.tco_io_bar, TCO1_CNT, val);
|
||||||
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_CNT), ==,
|
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_CNT), ==,
|
||||||
TCO_LOCK);
|
TCO_LOCK);
|
||||||
qtest_end();
|
test_end(&d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco1_status_bits(void)
|
static void test_tco1_status_bits(void)
|
||||||
|
@ -412,7 +419,7 @@ static void test_tco1_status_bits(void)
|
||||||
g_assert(ret == 1);
|
g_assert(ret == 1);
|
||||||
qpci_io_writew(d.dev, d.tco_io_bar, TCO1_STS, val);
|
qpci_io_writew(d.dev, d.tco_io_bar, TCO1_STS, val);
|
||||||
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS), ==, 0);
|
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS), ==, 0);
|
||||||
qtest_end();
|
test_end(&d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_tco2_status_bits(void)
|
static void test_tco2_status_bits(void)
|
||||||
|
@ -439,7 +446,7 @@ static void test_tco2_status_bits(void)
|
||||||
g_assert(ret == 1);
|
g_assert(ret == 1);
|
||||||
qpci_io_writew(d.dev, d.tco_io_bar, TCO2_STS, val);
|
qpci_io_writew(d.dev, d.tco_io_bar, TCO2_STS, val);
|
||||||
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO2_STS), ==, 0);
|
g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO2_STS), ==, 0);
|
||||||
qtest_end();
|
test_end(&d);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
|
|
@ -57,7 +57,7 @@ static void test_mirror(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
/* send a qmp command to guarantee that 'connected' is setting to true. */
|
/* send a qmp command to guarantee that 'connected' is setting to true. */
|
||||||
qmp("{ 'execute' : 'query-status'}");
|
qmp_discard_response("{ 'execute' : 'query-status'}");
|
||||||
ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
|
ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
|
||||||
g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
|
g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
|
||||||
close(send_sock[0]);
|
close(send_sock[0]);
|
||||||
|
|
|
@ -99,7 +99,7 @@ static void test_redirector_tx(void)
|
||||||
g_assert_cmpint(recv_sock, !=, -1);
|
g_assert_cmpint(recv_sock, !=, -1);
|
||||||
|
|
||||||
/* send a qmp command to guarantee that 'connected' is setting to true. */
|
/* send a qmp command to guarantee that 'connected' is setting to true. */
|
||||||
qmp("{ 'execute' : 'query-status'}");
|
qmp_discard_response("{ 'execute' : 'query-status'}");
|
||||||
|
|
||||||
struct iovec iov[] = {
|
struct iovec iov[] = {
|
||||||
{
|
{
|
||||||
|
@ -184,7 +184,7 @@ static void test_redirector_rx(void)
|
||||||
send_sock = unix_connect(sock_path1, NULL);
|
send_sock = unix_connect(sock_path1, NULL);
|
||||||
g_assert_cmpint(send_sock, !=, -1);
|
g_assert_cmpint(send_sock, !=, -1);
|
||||||
/* send a qmp command to guarantee that 'connected' is setting to true. */
|
/* send a qmp command to guarantee that 'connected' is setting to true. */
|
||||||
qmp("{ 'execute' : 'query-status'}");
|
qmp_discard_response("{ 'execute' : 'query-status'}");
|
||||||
|
|
||||||
ret = iov_send(send_sock, iov, 2, 0, sizeof(size) + sizeof(send_buf));
|
ret = iov_send(send_sock, iov, 2, 0, sizeof(size) + sizeof(send_buf));
|
||||||
g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
|
g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
|
||||||
|
|
|
@ -29,8 +29,8 @@ static void test_io_channel_command_fifo(bool async)
|
||||||
#define TEST_FIFO "tests/test-io-channel-command.fifo"
|
#define TEST_FIFO "tests/test-io-channel-command.fifo"
|
||||||
QIOChannel *src, *dst;
|
QIOChannel *src, *dst;
|
||||||
QIOChannelTest *test;
|
QIOChannelTest *test;
|
||||||
char *srcfifo = g_strdup_printf("PIPE:%s,wronly", TEST_FIFO);
|
const char *srcfifo = "PIPE:" TEST_FIFO ",wronly";
|
||||||
char *dstfifo = g_strdup_printf("PIPE:%s,rdonly", TEST_FIFO);
|
const char *dstfifo = "PIPE:" TEST_FIFO ",rdonly";
|
||||||
const char *srcargv[] = {
|
const char *srcargv[] = {
|
||||||
"/bin/socat", "-", srcfifo, NULL,
|
"/bin/socat", "-", srcfifo, NULL,
|
||||||
};
|
};
|
||||||
|
@ -59,8 +59,6 @@ static void test_io_channel_command_fifo(bool async)
|
||||||
object_unref(OBJECT(src));
|
object_unref(OBJECT(src));
|
||||||
object_unref(OBJECT(dst));
|
object_unref(OBJECT(dst));
|
||||||
|
|
||||||
g_free(srcfifo);
|
|
||||||
g_free(dstfifo);
|
|
||||||
unlink(TEST_FIFO);
|
unlink(TEST_FIFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,11 +50,8 @@ static void ehci_port_test(struct qhc *hc, int port, uint32_t expect)
|
||||||
|
|
||||||
/* tests */
|
/* tests */
|
||||||
|
|
||||||
static void pci_init(void)
|
static void test_init(void)
|
||||||
{
|
{
|
||||||
if (pcibus) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pcibus = qpci_init_pc(NULL);
|
pcibus = qpci_init_pc(NULL);
|
||||||
g_assert(pcibus != NULL);
|
g_assert(pcibus != NULL);
|
||||||
|
|
||||||
|
@ -64,6 +61,15 @@ static void pci_init(void)
|
||||||
qusb_pci_init_one(pcibus, &ehci1, QPCI_DEVFN(0x1d, 7), 0);
|
qusb_pci_init_one(pcibus, &ehci1, QPCI_DEVFN(0x1d, 7), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_deinit(void)
|
||||||
|
{
|
||||||
|
uhci_deinit(&uhci1);
|
||||||
|
uhci_deinit(&uhci2);
|
||||||
|
uhci_deinit(&uhci3);
|
||||||
|
uhci_deinit(&ehci1);
|
||||||
|
qpci_free_pc(pcibus);
|
||||||
|
}
|
||||||
|
|
||||||
static void pci_uhci_port_1(void)
|
static void pci_uhci_port_1(void)
|
||||||
{
|
{
|
||||||
g_assert(pcibus != NULL);
|
g_assert(pcibus != NULL);
|
||||||
|
@ -142,7 +148,7 @@ 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("/ehci/pci/init", pci_init);
|
|
||||||
qtest_add_func("/ehci/pci/uhci-port-1", pci_uhci_port_1);
|
qtest_add_func("/ehci/pci/uhci-port-1", pci_uhci_port_1);
|
||||||
qtest_add_func("/ehci/pci/ehci-port-1", pci_ehci_port_1);
|
qtest_add_func("/ehci/pci/ehci-port-1", pci_ehci_port_1);
|
||||||
qtest_add_func("/ehci/pci/ehci-config", pci_ehci_config);
|
qtest_add_func("/ehci/pci/ehci-config", pci_ehci_config);
|
||||||
|
@ -161,7 +167,10 @@ int main(int argc, char **argv)
|
||||||
"-drive if=none,id=usbcdrom,media=cdrom "
|
"-drive if=none,id=usbcdrom,media=cdrom "
|
||||||
"-device usb-tablet,bus=ich9-ehci-1.0,port=1,usb_version=1 "
|
"-device usb-tablet,bus=ich9-ehci-1.0,port=1,usb_version=1 "
|
||||||
"-device usb-storage,bus=ich9-ehci-1.0,port=2,drive=usbcdrom ");
|
"-device usb-storage,bus=ich9-ehci-1.0,port=2,drive=usbcdrom ");
|
||||||
|
|
||||||
|
test_init();
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
test_deinit();
|
||||||
|
|
||||||
qtest_end();
|
qtest_end();
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ static void test_port(int port)
|
||||||
g_assert(port > 0);
|
g_assert(port > 0);
|
||||||
qusb_pci_init_one(qs->pcibus, &uhci, QPCI_DEVFN(0x1d, 0), 4);
|
qusb_pci_init_one(qs->pcibus, &uhci, QPCI_DEVFN(0x1d, 0), 4);
|
||||||
uhci_port_test(&uhci, port - 1, UHCI_PORT_CCS);
|
uhci_port_test(&uhci, port - 1, UHCI_PORT_CCS);
|
||||||
|
uhci_deinit(&uhci);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_port_1(void)
|
static void test_port_1(void)
|
||||||
|
|
|
@ -139,6 +139,7 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct TestServer {
|
typedef struct TestServer {
|
||||||
|
QPCIBus *bus;
|
||||||
gchar *socket_path;
|
gchar *socket_path;
|
||||||
gchar *mig_path;
|
gchar *mig_path;
|
||||||
gchar *chr_name;
|
gchar *chr_name;
|
||||||
|
@ -160,14 +161,13 @@ static const char *root;
|
||||||
|
|
||||||
static void init_virtio_dev(TestServer *s)
|
static void init_virtio_dev(TestServer *s)
|
||||||
{
|
{
|
||||||
QPCIBus *bus;
|
|
||||||
QVirtioPCIDevice *dev;
|
QVirtioPCIDevice *dev;
|
||||||
uint32_t features;
|
uint32_t features;
|
||||||
|
|
||||||
bus = qpci_init_pc(NULL);
|
s->bus = qpci_init_pc(NULL);
|
||||||
g_assert_nonnull(bus);
|
g_assert_nonnull(s->bus);
|
||||||
|
|
||||||
dev = qvirtio_pci_device_find(bus, VIRTIO_ID_NET);
|
dev = qvirtio_pci_device_find(s->bus, VIRTIO_ID_NET);
|
||||||
g_assert_nonnull(dev);
|
g_assert_nonnull(dev);
|
||||||
|
|
||||||
qvirtio_pci_device_enable(dev);
|
qvirtio_pci_device_enable(dev);
|
||||||
|
@ -180,6 +180,7 @@ static void init_virtio_dev(TestServer *s)
|
||||||
qvirtio_set_features(&dev->vdev, features);
|
qvirtio_set_features(&dev->vdev, features);
|
||||||
|
|
||||||
qvirtio_set_driver_ok(&dev->vdev);
|
qvirtio_set_driver_ok(&dev->vdev);
|
||||||
|
qvirtio_pci_device_free(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wait_for_fds(TestServer *s)
|
static void wait_for_fds(TestServer *s)
|
||||||
|
@ -507,6 +508,8 @@ static gboolean _test_server_free(TestServer *server)
|
||||||
g_free(server->mig_path);
|
g_free(server->mig_path);
|
||||||
|
|
||||||
g_free(server->chr_name);
|
g_free(server->chr_name);
|
||||||
|
qpci_free_pc(server->bus);
|
||||||
|
|
||||||
g_free(server);
|
g_free(server);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -80,7 +80,7 @@ static void qvirtio_9p_pci_stop(QVirtIO9P *v9p)
|
||||||
{
|
{
|
||||||
qvirtqueue_cleanup(v9p->dev->bus, v9p->vq, v9p->qs->alloc);
|
qvirtqueue_cleanup(v9p->dev->bus, v9p->vq, v9p->qs->alloc);
|
||||||
qvirtio_pci_device_disable(container_of(v9p->dev, QVirtioPCIDevice, vdev));
|
qvirtio_pci_device_disable(container_of(v9p->dev, QVirtioPCIDevice, vdev));
|
||||||
g_free(v9p->dev);
|
qvirtio_pci_device_free((QVirtioPCIDevice *)v9p->dev);
|
||||||
qvirtio_9p_stop(v9p);
|
qvirtio_9p_stop(v9p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ static QVirtioPCIDevice *virtio_blk_pci_init(QPCIBus *bus, int slot)
|
||||||
{
|
{
|
||||||
QVirtioPCIDevice *dev;
|
QVirtioPCIDevice *dev;
|
||||||
|
|
||||||
dev = qvirtio_pci_device_find(bus, VIRTIO_ID_BLOCK);
|
dev = qvirtio_pci_device_find_slot(bus, VIRTIO_ID_BLOCK, slot);
|
||||||
g_assert(dev != NULL);
|
g_assert(dev != NULL);
|
||||||
g_assert_cmphex(dev->vdev.device_type, ==, VIRTIO_ID_BLOCK);
|
g_assert_cmphex(dev->vdev.device_type, ==, VIRTIO_ID_BLOCK);
|
||||||
g_assert_cmphex(dev->pdev->devfn, ==, ((slot << 3) | PCI_FN));
|
g_assert_cmphex(dev->pdev->devfn, ==, ((slot << 3) | PCI_FN));
|
||||||
|
@ -296,7 +296,7 @@ static void pci_basic(void)
|
||||||
/* End test */
|
/* End test */
|
||||||
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
||||||
qvirtio_pci_device_disable(dev);
|
qvirtio_pci_device_disable(dev);
|
||||||
g_free(dev);
|
qvirtio_pci_device_free(dev);
|
||||||
qtest_shutdown(qs);
|
qtest_shutdown(qs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,7 +389,7 @@ static void pci_indirect(void)
|
||||||
/* End test */
|
/* End test */
|
||||||
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
||||||
qvirtio_pci_device_disable(dev);
|
qvirtio_pci_device_disable(dev);
|
||||||
g_free(dev);
|
qvirtio_pci_device_free(dev);
|
||||||
qtest_shutdown(qs);
|
qtest_shutdown(qs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -409,15 +409,16 @@ static void pci_config(void)
|
||||||
|
|
||||||
qvirtio_set_driver_ok(&dev->vdev);
|
qvirtio_set_driver_ok(&dev->vdev);
|
||||||
|
|
||||||
qmp("{ 'execute': 'block_resize', 'arguments': { 'device': 'drive0', "
|
qmp_discard_response("{ 'execute': 'block_resize', "
|
||||||
" 'size': %d } }", n_size);
|
" 'arguments': { 'device': 'drive0', "
|
||||||
|
" 'size': %d } }", n_size);
|
||||||
qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);
|
qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);
|
||||||
|
|
||||||
capacity = qvirtio_config_readq(&dev->vdev, 0);
|
capacity = qvirtio_config_readq(&dev->vdev, 0);
|
||||||
g_assert_cmpint(capacity, ==, n_size / 512);
|
g_assert_cmpint(capacity, ==, n_size / 512);
|
||||||
|
|
||||||
qvirtio_pci_device_disable(dev);
|
qvirtio_pci_device_disable(dev);
|
||||||
g_free(dev);
|
qvirtio_pci_device_free(dev);
|
||||||
|
|
||||||
qtest_shutdown(qs);
|
qtest_shutdown(qs);
|
||||||
}
|
}
|
||||||
|
@ -458,8 +459,9 @@ static void pci_msix(void)
|
||||||
|
|
||||||
qvirtio_set_driver_ok(&dev->vdev);
|
qvirtio_set_driver_ok(&dev->vdev);
|
||||||
|
|
||||||
qmp("{ 'execute': 'block_resize', 'arguments': { 'device': 'drive0', "
|
qmp_discard_response("{ 'execute': 'block_resize', "
|
||||||
" 'size': %d } }", n_size);
|
" 'arguments': { 'device': 'drive0', "
|
||||||
|
" 'size': %d } }", n_size);
|
||||||
|
|
||||||
qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);
|
qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);
|
||||||
|
|
||||||
|
@ -524,7 +526,7 @@ static void pci_msix(void)
|
||||||
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
||||||
qpci_msix_disable(dev->pdev);
|
qpci_msix_disable(dev->pdev);
|
||||||
qvirtio_pci_device_disable(dev);
|
qvirtio_pci_device_disable(dev);
|
||||||
g_free(dev);
|
qvirtio_pci_device_free(dev);
|
||||||
qtest_shutdown(qs);
|
qtest_shutdown(qs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -640,7 +642,7 @@ static void pci_idx(void)
|
||||||
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc);
|
||||||
qpci_msix_disable(dev->pdev);
|
qpci_msix_disable(dev->pdev);
|
||||||
qvirtio_pci_device_disable(dev);
|
qvirtio_pci_device_disable(dev);
|
||||||
g_free(dev);
|
qvirtio_pci_device_free(dev);
|
||||||
qtest_shutdown(qs);
|
qtest_shutdown(qs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -659,7 +661,7 @@ static void pci_hotplug(void)
|
||||||
dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT_HP);
|
dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT_HP);
|
||||||
g_assert(dev);
|
g_assert(dev);
|
||||||
qvirtio_pci_device_disable(dev);
|
qvirtio_pci_device_disable(dev);
|
||||||
g_free(dev);
|
qvirtio_pci_device_free(dev);
|
||||||
|
|
||||||
/* unplug secondary disk */
|
/* unplug secondary disk */
|
||||||
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
@ -691,8 +693,9 @@ static void mmio_basic(void)
|
||||||
|
|
||||||
test_basic(&dev->vdev, alloc, vq);
|
test_basic(&dev->vdev, alloc, vq);
|
||||||
|
|
||||||
qmp("{ 'execute': 'block_resize', 'arguments': { 'device': 'drive0', "
|
qmp_discard_response("{ 'execute': 'block_resize', "
|
||||||
" 'size': %d } }", n_size);
|
" 'arguments': { 'device': 'drive0', "
|
||||||
|
" 'size': %d } }", n_size);
|
||||||
|
|
||||||
qvirtio_wait_queue_isr(&dev->vdev, vq, QVIRTIO_BLK_TIMEOUT_US);
|
qvirtio_wait_queue_isr(&dev->vdev, vq, QVIRTIO_BLK_TIMEOUT_US);
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ static void qvirtio_scsi_pci_free(QVirtIOSCSI *vs)
|
||||||
qvirtqueue_cleanup(vs->dev->bus, vs->vq[i], vs->qs->alloc);
|
qvirtqueue_cleanup(vs->dev->bus, vs->vq[i], vs->qs->alloc);
|
||||||
}
|
}
|
||||||
qvirtio_pci_device_disable(container_of(vs->dev, QVirtioPCIDevice, vdev));
|
qvirtio_pci_device_disable(container_of(vs->dev, QVirtioPCIDevice, vdev));
|
||||||
g_free(vs->dev);
|
qvirtio_pci_device_free((QVirtioPCIDevice *)vs->dev);
|
||||||
qvirtio_scsi_stop(vs->qs);
|
qvirtio_scsi_stop(vs->qs);
|
||||||
g_free(vs);
|
g_free(vs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -355,11 +355,6 @@ void timer_deinit(QEMUTimer *ts)
|
||||||
ts->timer_list = NULL;
|
ts->timer_list = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_free(QEMUTimer *ts)
|
|
||||||
{
|
|
||||||
g_free(ts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void timer_del_locked(QEMUTimerList *timer_list, QEMUTimer *ts)
|
static void timer_del_locked(QEMUTimerList *timer_list, QEMUTimer *ts)
|
||||||
{
|
{
|
||||||
QEMUTimer **pt, *t;
|
QEMUTimer **pt, *t;
|
||||||
|
|
Loading…
Reference in a new issue