aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/data/acpi/q35/APIC.xapicbin0 -> 2686 bytes
-rw-r--r--tests/data/acpi/q35/DMAR.dmarbin0 -> 120 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.ivrsbin0 -> 8306 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.multi-bridgebin0 -> 8583 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.xapicbin0 -> 35652 bytes
-rw-r--r--tests/data/acpi/q35/FACP.xapicbin0 -> 244 bytes
-rw-r--r--tests/data/acpi/q35/IVRS.ivrsbin0 -> 104 bytes
-rw-r--r--tests/data/acpi/q35/SRAT.xapicbin0 -> 5080 bytes
-rwxr-xr-xtests/data/acpi/rebuild-expected-aml.sh22
-rw-r--r--tests/qtest/acpi-utils.c14
-rw-r--r--tests/qtest/arm-cpu-features.c29
-rw-r--r--tests/qtest/bios-tables-test.c122
-rw-r--r--tests/qtest/libqos/libqtest.h8
-rw-r--r--tests/qtest/libqtest.c27
-rw-r--r--tests/qtest/migration-test.c15
-rw-r--r--tests/qtest/vhost-user-blk-test.c4
16 files changed, 179 insertions, 62 deletions
diff --git a/tests/data/acpi/q35/APIC.xapic b/tests/data/acpi/q35/APIC.xapic
new file mode 100644
index 0000000000..c1969c35aa
--- /dev/null
+++ b/tests/data/acpi/q35/APIC.xapic
Binary files differ
diff --git a/tests/data/acpi/q35/DMAR.dmar b/tests/data/acpi/q35/DMAR.dmar
new file mode 100644
index 0000000000..0dca6e68ad
--- /dev/null
+++ b/tests/data/acpi/q35/DMAR.dmar
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.ivrs b/tests/data/acpi/q35/DSDT.ivrs
new file mode 100644
index 0000000000..b0eafe90e5
--- /dev/null
+++ b/tests/data/acpi/q35/DSDT.ivrs
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.multi-bridge b/tests/data/acpi/q35/DSDT.multi-bridge
new file mode 100644
index 0000000000..a24c713d22
--- /dev/null
+++ b/tests/data/acpi/q35/DSDT.multi-bridge
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.xapic b/tests/data/acpi/q35/DSDT.xapic
new file mode 100644
index 0000000000..119fc90f1f
--- /dev/null
+++ b/tests/data/acpi/q35/DSDT.xapic
Binary files differ
diff --git a/tests/data/acpi/q35/FACP.xapic b/tests/data/acpi/q35/FACP.xapic
new file mode 100644
index 0000000000..2d3659c9c6
--- /dev/null
+++ b/tests/data/acpi/q35/FACP.xapic
Binary files differ
diff --git a/tests/data/acpi/q35/IVRS.ivrs b/tests/data/acpi/q35/IVRS.ivrs
new file mode 100644
index 0000000000..17611202e5
--- /dev/null
+++ b/tests/data/acpi/q35/IVRS.ivrs
Binary files differ
diff --git a/tests/data/acpi/q35/SRAT.xapic b/tests/data/acpi/q35/SRAT.xapic
new file mode 100644
index 0000000000..1a91cfa65f
--- /dev/null
+++ b/tests/data/acpi/q35/SRAT.xapic
Binary files differ
diff --git a/tests/data/acpi/rebuild-expected-aml.sh b/tests/data/acpi/rebuild-expected-aml.sh
index fc78770544..dcf2e2f221 100755
--- a/tests/data/acpi/rebuild-expected-aml.sh
+++ b/tests/data/acpi/rebuild-expected-aml.sh
@@ -12,7 +12,7 @@
# This work is licensed under the terms of the GNU GPLv2.
# See the COPYING.LIB file in the top-level directory.
-qemu_bins="./qemu-system-x86_64 ./qemu-system-aarch64"
+qemu_arches="x86_64 aarch64"
if [ ! -e "tests/qtest/bios-tables-test" ]; then
echo "Test: bios-tables-test is required! Run make check before this script."
@@ -20,6 +20,26 @@ if [ ! -e "tests/qtest/bios-tables-test" ]; then
exit 1;
fi
+if grep TARGET_DIRS= config-host.mak; then
+ for arch in $qemu_arches; do
+ if grep TARGET_DIRS= config-host.mak | grep "$arch"-softmmu;
+ then
+ qemu_bins="$qemu_bins ./qemu-system-$arch"
+ fi
+ done
+else
+ echo "config-host.mak missing!"
+ echo "Run this script from the build directory."
+ exit 1;
+fi
+
+if [ -z "$qemu_bins" ]; then
+ echo "Only the following architectures are currently supported: $qemu_arches"
+ echo "None of these configured!"
+ echo "To fix, run configure --target-list=x86_64-softmmu,aarch64-softmmu"
+ exit 1;
+fi
+
for qemu in $qemu_bins; do
if [ ! -e $qemu ]; then
echo "Run 'make' to build the following QEMU executables: $qemu_bins"
diff --git a/tests/qtest/acpi-utils.c b/tests/qtest/acpi-utils.c
index d2a202efca..766c48e3a6 100644
--- a/tests/qtest/acpi-utils.c
+++ b/tests/qtest/acpi-utils.c
@@ -98,6 +98,20 @@ void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len,
ACPI_ASSERT_CMP(**aml, sig);
}
if (verify_checksum) {
+ if (acpi_calc_checksum(*aml, *aml_len)) {
+ gint fd, ret;
+ char *fname = NULL;
+ GError *error = NULL;
+
+ fprintf(stderr, "Invalid '%.4s'(%d)\n", *aml, *aml_len);
+ fd = g_file_open_tmp("malformed-XXXXXX.dat", &fname, &error);
+ g_assert_no_error(error);
+ fprintf(stderr, "Dumping invalid table into '%s'\n", fname);
+ ret = qemu_write_full(fd, *aml, *aml_len);
+ g_assert(ret == *aml_len);
+ close(fd);
+ g_free(fname);
+ }
g_assert(!acpi_calc_checksum(*aml, *aml_len));
}
}
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
index 90a87f0ea9..f76652143a 100644
--- a/tests/qtest/arm-cpu-features.c
+++ b/tests/qtest/arm-cpu-features.c
@@ -26,21 +26,6 @@
" 'arguments': { 'type': 'full', "
#define QUERY_TAIL "}}"
-static bool kvm_enabled(QTestState *qts)
-{
- QDict *resp, *qdict;
- bool enabled;
-
- resp = qtest_qmp(qts, "{ 'execute': 'query-kvm' }");
- g_assert(qdict_haskey(resp, "return"));
- qdict = qdict_get_qdict(resp, "return");
- g_assert(qdict_haskey(qdict, "enabled"));
- enabled = qdict_get_bool(qdict, "enabled");
- qobject_unref(resp);
-
- return enabled;
-}
-
static QDict *do_query_no_props(QTestState *qts, const char *cpu_type)
{
return qtest_qmp(qts, QUERY_HEAD "'model': { 'name': %s }"
@@ -506,14 +491,6 @@ static void test_query_cpu_model_expansion_kvm(const void *data)
qts = qtest_init(MACHINE_KVM "-cpu max");
- /*
- * These tests target the 'host' CPU type, so KVM must be enabled.
- */
- if (!kvm_enabled(qts)) {
- qtest_quit(qts);
- return;
- }
-
/* Enabling and disabling kvm-no-adjvtime should always work. */
assert_has_feature_disabled(qts, "host", "kvm-no-adjvtime");
assert_set_feature(qts, "host", "kvm-no-adjvtime", true);
@@ -637,7 +614,11 @@ int main(int argc, char **argv)
* order avoid attempting to run an AArch32 QEMU with KVM on
* AArch64 hosts. That won't work and isn't easy to detect.
*/
- if (g_str_equal(qtest_get_arch(), "aarch64")) {
+ if (g_str_equal(qtest_get_arch(), "aarch64") && qtest_has_accel("kvm")) {
+ /*
+ * This tests target the 'host' CPU type, so register it only if
+ * KVM is available.
+ */
qtest_add_data_func("/arm/kvm/query-cpu-model-expansion",
NULL, test_query_cpu_model_expansion_kvm);
}
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 4f11d03055..258874167e 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -271,19 +271,28 @@ static void dump_aml_files(test_data *data, bool rebuild)
}
}
+static bool create_tmp_asl(AcpiSdtTable *sdt)
+{
+ GError *error = NULL;
+ gint fd;
+
+ fd = g_file_open_tmp("asl-XXXXXX.dsl", &sdt->asl_file, &error);
+ g_assert_no_error(error);
+ close(fd);
+
+ return false;
+}
+
static bool load_asl(GArray *sdts, AcpiSdtTable *sdt)
{
AcpiSdtTable *temp;
GError *error = NULL;
GString *command_line = g_string_new(iasl);
- gint fd;
gchar *out, *out_err;
gboolean ret;
int i;
- fd = g_file_open_tmp("asl-XXXXXX.dsl", &sdt->asl_file, &error);
- g_assert_no_error(error);
- close(fd);
+ create_tmp_asl(sdt);
/* build command line */
g_string_append_printf(command_line, " -p %s ", sdt->asl_file);
@@ -463,11 +472,20 @@ static void test_acpi_asl(test_data *data)
err = load_asl(data->tables, sdt);
asl = normalize_asl(sdt->asl);
- exp_err = load_asl(exp_data.tables, exp_sdt);
- exp_asl = normalize_asl(exp_sdt->asl);
+ /*
+ * If expected file is empty - it's likely that it was a stub just
+ * created for step 1 above: we do want to decompile the actual one.
+ */
+ if (exp_sdt->aml_len) {
+ exp_err = load_asl(exp_data.tables, exp_sdt);
+ exp_asl = normalize_asl(exp_sdt->asl);
+ } else {
+ exp_err = create_tmp_asl(exp_sdt);
+ exp_asl = g_string_new("");
+ }
/* TODO: check for warnings */
- g_assert(!err || exp_err);
+ g_assert(!err || exp_err || !exp_sdt->aml_len);
if (g_strcmp0(asl->str, exp_asl->str)) {
sdt->tmp_files_retain = true;
@@ -722,13 +740,6 @@ static void test_acpi_one(const char *params, test_data *data)
char *args;
bool use_uefi = data->uefi_fl1 && data->uefi_fl2;
-#ifndef CONFIG_TCG
- if (data->tcg_only) {
- g_test_skip("TCG disabled, skipping ACPI tcg_only test");
- return;
- }
-#endif /* CONFIG_TCG */
-
args = test_acpi_create_args(data, params, use_uefi);
data->qts = qtest_init(args);
test_acpi_load_tables(data, use_uefi);
@@ -859,6 +870,23 @@ static void test_acpi_q35_tcg_bridge(void)
free_test_data(&data);
}
+static void test_acpi_q35_multif_bridge(void)
+{
+ test_data data = {
+ .machine = MACHINE_Q35,
+ .variant = ".multi-bridge",
+ };
+ test_acpi_one("-device pcie-root-port,id=pcie-root-port-0,"
+ "multifunction=on,"
+ "port=0x0,chassis=1,addr=0x2,bus=pcie.0 "
+ "-device pcie-root-port,id=pcie-root-port-1,"
+ "port=0x1,chassis=2,addr=0x3.0x1,bus=pcie.0 "
+ "-device virtio-balloon,id=balloon0,"
+ "bus=pcie.0,addr=0x4.0x2",
+ &data);
+ free_test_data(&data);
+}
+
static void test_acpi_q35_tcg_mmio64(void)
{
test_data data = {
@@ -1033,6 +1061,19 @@ static void test_acpi_q35_tcg_numamem(void)
free_test_data(&data);
}
+static void test_acpi_q35_kvm_xapic(void)
+{
+ test_data data;
+
+ memset(&data, 0, sizeof(data));
+ data.machine = MACHINE_Q35;
+ data.variant = ".xapic";
+ test_acpi_one(" -object memory-backend-ram,id=ram0,size=128M"
+ " -numa node -numa node,memdev=ram0"
+ " -machine kernel-irqchip=on -smp 1,maxcpus=288", &data);
+ free_test_data(&data);
+}
+
static void test_acpi_q35_tcg_nosmm(void)
{
test_data data;
@@ -1077,6 +1118,30 @@ static void test_acpi_q35_tcg_nohpet(void)
free_test_data(&data);
}
+static void test_acpi_q35_kvm_dmar(void)
+{
+ test_data data;
+
+ memset(&data, 0, sizeof(data));
+ data.machine = MACHINE_Q35;
+ data.variant = ".dmar";
+ test_acpi_one("-machine kernel-irqchip=split -accel kvm"
+ " -device intel-iommu,intremap=on,device-iotlb=on", &data);
+ free_test_data(&data);
+}
+
+static void test_acpi_q35_tcg_ivrs(void)
+{
+ test_data data;
+
+ memset(&data, 0, sizeof(data));
+ data.machine = MACHINE_Q35;
+ data.variant = ".ivrs";
+ data.tcg_only = true,
+ test_acpi_one(" -device amd-iommu", &data);
+ free_test_data(&data);
+}
+
static void test_acpi_piix4_tcg_numamem(void)
{
test_data data;
@@ -1393,9 +1458,6 @@ static void test_acpi_virt_tcg(void)
.scan_len = 128ULL * 1024 * 1024,
};
- test_acpi_one("-cpu cortex-a57", &data);
- free_test_data(&data);
-
data.smbios_cpu_max_speed = 2900;
data.smbios_cpu_curr_speed = 2700;
test_acpi_one("-cpu cortex-a57 "
@@ -1509,6 +1571,8 @@ static void test_acpi_oem_fields_virt(void)
int main(int argc, char *argv[])
{
const char *arch = qtest_get_arch();
+ const bool has_kvm = qtest_has_accel("kvm");
+ const bool has_tcg = qtest_has_accel("tcg");
int ret;
g_test_init(&argc, &argv, NULL);
@@ -1534,6 +1598,7 @@ int main(int argc, char *argv[])
test_acpi_piix4_no_acpi_pci_hotplug);
qtest_add_func("acpi/q35", test_acpi_q35_tcg);
qtest_add_func("acpi/q35/bridge", test_acpi_q35_tcg_bridge);
+ qtest_add_func("acpi/q35/multif-bridge", test_acpi_q35_multif_bridge);
qtest_add_func("acpi/q35/mmio64", test_acpi_q35_tcg_mmio64);
qtest_add_func("acpi/piix4/ipmi", test_acpi_piix4_tcg_ipmi);
qtest_add_func("acpi/q35/ipmi", test_acpi_q35_tcg_ipmi);
@@ -1564,15 +1629,24 @@ int main(int argc, char *argv[])
qtest_add_func("acpi/microvm/rtc", test_acpi_microvm_rtc_tcg);
qtest_add_func("acpi/microvm/ioapic2", test_acpi_microvm_ioapic2_tcg);
qtest_add_func("acpi/microvm/oem-fields", test_acpi_oem_fields_microvm);
- if (strcmp(arch, "x86_64") == 0) {
- qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
+ if (has_tcg) {
+ qtest_add_func("acpi/q35/ivrs", test_acpi_q35_tcg_ivrs);
+ if (strcmp(arch, "x86_64") == 0) {
+ qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
+ }
+ }
+ if (has_kvm) {
+ qtest_add_func("acpi/q35/kvm/xapic", test_acpi_q35_kvm_xapic);
+ qtest_add_func("acpi/q35/kvm/dmar", test_acpi_q35_kvm_dmar);
}
} else if (strcmp(arch, "aarch64") == 0) {
- qtest_add_func("acpi/virt", test_acpi_virt_tcg);
- qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
- qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
- qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
- qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
+ if (has_tcg) {
+ qtest_add_func("acpi/virt", test_acpi_virt_tcg);
+ qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
+ qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
+ qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
+ qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
+ }
}
ret = g_test_run();
boot_sector_cleanup(disk);
diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
index a68dcd79d4..59e9271195 100644
--- a/tests/qtest/libqos/libqtest.h
+++ b/tests/qtest/libqos/libqtest.h
@@ -589,6 +589,14 @@ bool qtest_big_endian(QTestState *s);
const char *qtest_get_arch(void);
/**
+ * qtest_has_accel:
+ * @accel_name: Accelerator name to check for.
+ *
+ * Returns: true if the accelerator is built in.
+ */
+bool qtest_has_accel(const char *accel_name);
+
+/**
* qtest_add_func:
* @str: Test case path.
* @fn: Test case function
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 73f6b977a6..25aeea385b 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -922,6 +922,33 @@ const char *qtest_get_arch(void)
return end + 1;
}
+bool qtest_has_accel(const char *accel_name)
+{
+ if (g_str_equal(accel_name, "tcg")) {
+#if defined(CONFIG_TCG)
+ return true;
+#else
+ return false;
+#endif
+ } else if (g_str_equal(accel_name, "kvm")) {
+ int i;
+ const char *arch = qtest_get_arch();
+ const char *targets[] = { CONFIG_KVM_TARGETS };
+
+ for (i = 0; i < ARRAY_SIZE(targets); i++) {
+ if (!strncmp(targets[i], arch, strlen(arch))) {
+ if (!access("/dev/kvm", R_OK | W_OK)) {
+ return true;
+ }
+ }
+ }
+ } else {
+ /* not implemented */
+ g_assert_not_reached();
+ }
+ return false;
+}
+
bool qtest_get_irq(QTestState *s, int num)
{
/* dummy operation in order to make sure irq is up to date */
diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index cc5e83d98a..7b42f6fd90 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -1420,6 +1420,7 @@ static bool kvm_dirty_ring_supported(void)
int main(int argc, char **argv)
{
char template[] = "/tmp/migration-test-XXXXXX";
+ const bool has_kvm = qtest_has_accel("kvm");
int ret;
g_test_init(&argc, &argv, NULL);
@@ -1434,8 +1435,7 @@ int main(int argc, char **argv)
* some reason)
*/
if (g_str_equal(qtest_get_arch(), "ppc64") &&
- (access("/sys/module/kvm_hv", F_OK) ||
- access("/dev/kvm", R_OK | W_OK))) {
+ (!has_kvm || access("/sys/module/kvm_hv", F_OK))) {
g_test_message("Skipping test: kvm_hv not available");
return g_test_run();
}
@@ -1444,16 +1444,9 @@ int main(int argc, char **argv)
* Similar to ppc64, s390x seems to be touchy with TCG, so disable it
* there until the problems are resolved
*/
- if (g_str_equal(qtest_get_arch(), "s390x")) {
-#if defined(HOST_S390X)
- if (access("/dev/kvm", R_OK | W_OK)) {
- g_test_message("Skipping test: kvm not available");
- return g_test_run();
- }
-#else
- g_test_message("Skipping test: Need s390x host to work properly");
+ if (g_str_equal(qtest_get_arch(), "s390x") && !has_kvm) {
+ g_test_message("Skipping test: s390x host with KVM is required");
return g_test_run();
-#endif
}
tmpfs = mkdtemp(template);
diff --git a/tests/qtest/vhost-user-blk-test.c b/tests/qtest/vhost-user-blk-test.c
index 6f108a1b62..62e670f39b 100644
--- a/tests/qtest/vhost-user-blk-test.c
+++ b/tests/qtest/vhost-user-blk-test.c
@@ -906,9 +906,9 @@ static void start_vhost_user_blk(GString *cmd_line, int vus_instances,
img_path = drive_create();
g_string_append_printf(storage_daemon_command,
"--blockdev driver=file,node-name=disk%d,filename=%s "
- "--export type=vhost-user-blk,id=disk%d,addr.type=unix,addr.path=%s,"
+ "--export type=vhost-user-blk,id=disk%d,addr.type=fd,addr.str=%d,"
"node-name=disk%i,writable=on,num-queues=%d ",
- i, img_path, i, sock_path, i, num_queues);
+ i, img_path, i, fd, i, num_queues);
g_string_append_printf(cmd_line, "-chardev socket,id=char%d,path=%s ",
i + 1, sock_path);