qemu-e2k/tests/qtest/Makefile.include
Li Qiang 1153cf9f5b qtest: add tulip test case
The tulip networking card emulation has an OOB issue in
'tulip_copy_tx_buffers' when the guest provide malformed descriptor.
This test will trigger a ASAN heap overflow crash. To trigger this
issue we can construct the data as following:

1. construct a 'tulip_descriptor'. Its control is set to
'0x7ff | 0x7ff << 11', this will make the 'tulip_copy_tx_buffers's
'len1' and 'len2' to 0x7ff(2047). So 'len1+len2' will overflow
'TULIPState's 'tx_frame' field. This descriptor's 'buf_addr1' and
'buf_addr2' should set to a guest address.

2. write this descriptor to tulip device's CSR4 register. This will
set the 'TULIPState's 'current_tx_desc' field.

3. write 'CSR6_ST' to tulip device's CSR6 register. This will trigger
'tulip_xmit_list_update' and finally calls 'tulip_copy_tx_buffers'.

Following shows the backtrack of crash:

==31781==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x628000007cd0 at pc 0x7fe03c5a077a bp 0x7fff05b46770 sp 0x7fff05b45f18
WRITE of size 2047 at 0x628000007cd0 thread T0
    #0 0x7fe03c5a0779  (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x79779)
    #1 0x5575fb6daa6a in flatview_read_continue /home/test/qemu/exec.c:3194
    #2 0x5575fb6daccb in flatview_read /home/test/qemu/exec.c:3227
    #3 0x5575fb6dae66 in address_space_read_full /home/test/qemu/exec.c:3240
    #4 0x5575fb6db0cb in address_space_rw /home/test/qemu/exec.c:3268
    #5 0x5575fbdfd460 in dma_memory_rw_relaxed /home/test/qemu/include/sysemu/dma.h:87
    #6 0x5575fbdfd4b5 in dma_memory_rw /home/test/qemu/include/sysemu/dma.h:110
    #7 0x5575fbdfd866 in pci_dma_rw /home/test/qemu/include/hw/pci/pci.h:787
    #8 0x5575fbdfd8a3 in pci_dma_read /home/test/qemu/include/hw/pci/pci.h:794
    #9 0x5575fbe02761 in tulip_copy_tx_buffers hw/net/tulip.c:585
    #10 0x5575fbe0366b in tulip_xmit_list_update hw/net/tulip.c:678
    #11 0x5575fbe04073 in tulip_write hw/net/tulip.c:783

Signed-off-by: Li Qiang <liq3ea@163.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
2020-03-31 21:14:35 +08:00

326 lines
15 KiB
Makefile

# All QTests for now are POSIX-only, but the dependencies are
# really in libqtest, not in the testcases themselves.
check-qtest-generic-y += cdrom-test
check-qtest-generic-y += device-introspect-test
check-qtest-generic-y += machine-none-test
check-qtest-generic-y += qmp-test
check-qtest-generic-y += qmp-cmd-test
check-qtest-generic-y += qom-test
check-qtest-generic-$(CONFIG_MODULES) += modules-test
check-qtest-generic-y += test-hmp
check-qtest-pci-$(CONFIG_RTL8139_PCI) += rtl8139-test
check-qtest-pci-$(CONFIG_VGA) += display-vga-test
check-qtest-pci-$(CONFIG_HDA) += intel-hda-test
check-qtest-pci-$(CONFIG_IVSHMEM_DEVICE) += ivshmem-test
DBUS_DAEMON := $(shell which dbus-daemon 2>/dev/null)
ifneq ($(GDBUS_CODEGEN),)
ifneq ($(DBUS_DAEMON),)
# Temporarily disabled due to Patchew failures:
#check-qtest-pci-$(CONFIG_GIO) += dbus-vmstate-test
endif
endif
check-qtest-i386-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-i386-y += fdc-test
check-qtest-i386-y += ide-test
check-qtest-i386-$(CONFIG_TOOLS) += ahci-test
check-qtest-i386-y += hd-geo-test
check-qtest-i386-y += boot-order-test
check-qtest-i386-y += bios-tables-test
check-qtest-i386-$(CONFIG_SGA) += boot-serial-test
check-qtest-i386-$(CONFIG_SLIRP) += pxe-test
check-qtest-i386-y += rtc-test
check-qtest-i386-$(CONFIG_ISA_IPMI_KCS) += ipmi-kcs-test
ifdef CONFIG_LINUX
check-qtest-i386-$(CONFIG_ISA_IPMI_BT) += ipmi-bt-test
endif
check-qtest-i386-y += i440fx-test
check-qtest-i386-y += fw_cfg-test
check-qtest-i386-y += device-plug-test
check-qtest-i386-y += drive_del-test
check-qtest-i386-$(CONFIG_WDT_IB700) += wdt_ib700-test
check-qtest-i386-y += tco-test
check-qtest-i386-y += $(check-qtest-pci-y)
check-qtest-i386-$(CONFIG_PVPANIC) += pvpanic-test
check-qtest-i386-$(CONFIG_I82801B11) += i82801b11-test
check-qtest-i386-$(CONFIG_IOH3420) += ioh3420-test
check-qtest-i386-$(CONFIG_USB_UHCI) += usb-hcd-uhci-test
check-qtest-i386-$(call land,$(CONFIG_USB_EHCI),$(CONFIG_USB_UHCI)) += usb-hcd-ehci-test
check-qtest-i386-$(CONFIG_USB_XHCI_NEC) += usb-hcd-xhci-test
check-qtest-i386-y += cpu-plug-test
check-qtest-i386-y += q35-test
check-qtest-i386-y += vmgenid-test
check-qtest-i386-$(CONFIG_TPM_CRB) += tpm-crb-swtpm-test
check-qtest-i386-$(CONFIG_TPM_CRB) += tpm-crb-test
check-qtest-i386-$(CONFIG_TPM_TIS_ISA) += tpm-tis-swtpm-test
check-qtest-i386-$(CONFIG_TPM_TIS_ISA) += tpm-tis-test
check-qtest-i386-$(CONFIG_SLIRP) += test-netfilter
check-qtest-i386-$(CONFIG_POSIX) += test-filter-mirror
check-qtest-i386-$(CONFIG_RTL8139_PCI) += test-filter-redirector
check-qtest-i386-y += migration-test
check-qtest-i386-y += test-x86-cpuid-compat
check-qtest-i386-y += numa-test
check-qtest-x86_64-y += $(check-qtest-i386-y)
check-qtest-alpha-y += boot-serial-test
check-qtest-alpha-$(CONFIG_VGA) += display-vga-test
check-qtest-hppa-y += boot-serial-test
check-qtest-hppa-$(CONFIG_VGA) += display-vga-test
check-qtest-m68k-y = boot-serial-test
check-qtest-microblaze-y += boot-serial-test
check-qtest-mips-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-mips-$(CONFIG_VGA) += display-vga-test
check-qtest-mips64-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-mips64-$(CONFIG_VGA) += display-vga-test
check-qtest-mips64el-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-mips64el-$(CONFIG_VGA) += display-vga-test
check-qtest-moxie-y += boot-serial-test
check-qtest-ppc-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-ppc-y += boot-order-test
check-qtest-ppc-y += prom-env-test
check-qtest-ppc-y += drive_del-test
check-qtest-ppc-y += boot-serial-test
check-qtest-ppc-$(CONFIG_M48T59) += m48t59-test
check-qtest-ppc64-y += $(check-qtest-ppc-y)
check-qtest-ppc64-$(CONFIG_PSERIES) += device-plug-test
check-qtest-ppc64-$(CONFIG_POWERNV) += pnv-xscom-test
check-qtest-ppc64-y += migration-test
check-qtest-ppc64-$(CONFIG_PSERIES) += rtas-test
check-qtest-ppc64-$(CONFIG_SLIRP) += pxe-test
check-qtest-ppc64-$(CONFIG_USB_UHCI) += usb-hcd-uhci-test
check-qtest-ppc64-$(CONFIG_USB_XHCI_NEC) += usb-hcd-xhci-test
check-qtest-ppc64-$(CONFIG_SLIRP) += test-netfilter
check-qtest-ppc64-$(CONFIG_POSIX) += test-filter-mirror
check-qtest-ppc64-$(CONFIG_RTL8139_PCI) += test-filter-redirector
check-qtest-ppc64-$(CONFIG_VGA) += display-vga-test
check-qtest-ppc64-y += numa-test
check-qtest-ppc64-$(CONFIG_IVSHMEM_DEVICE) += ivshmem-test
check-qtest-ppc64-y += cpu-plug-test
check-qtest-sh4-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-sh4eb-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-sparc-y += prom-env-test
check-qtest-sparc-y += m48t59-test
check-qtest-sparc-y += boot-serial-test
check-qtest-sparc64-$(CONFIG_ISA_TESTDEV) = endianness-test
check-qtest-sparc64-y += prom-env-test
check-qtest-sparc64-y += boot-serial-test
check-qtest-arm-y += arm-cpu-features
check-qtest-arm-y += microbit-test
check-qtest-arm-y += m25p80-test
check-qtest-arm-y += test-arm-mptimer
check-qtest-arm-y += boot-serial-test
check-qtest-arm-y += hexloader-test
check-qtest-arm-$(CONFIG_PFLASH_CFI02) += pflash-cfi02-test
check-qtest-aarch64-y += arm-cpu-features
check-qtest-aarch64-$(CONFIG_TPM_TIS_SYSBUS) += tpm-tis-device-test
check-qtest-aarch64-$(CONFIG_TPM_TIS_SYSBUS) += tpm-tis-device-swtpm-test
check-qtest-aarch64-y += numa-test
check-qtest-aarch64-y += boot-serial-test
check-qtest-aarch64-y += migration-test
# TODO: once aarch64 TCG is fixed on ARM 32 bit host, make test unconditional
ifneq ($(ARCH),arm)
check-qtest-aarch64-y += bios-tables-test
endif
check-qtest-microblazeel-y += $(check-qtest-microblaze-y)
check-qtest-xtensaeb-y += $(check-qtest-xtensa-y)
check-qtest-s390x-y = boot-serial-test
check-qtest-s390x-$(CONFIG_SLIRP) += pxe-test
check-qtest-s390x-$(CONFIG_SLIRP) += test-netfilter
check-qtest-s390x-$(CONFIG_POSIX) += test-filter-mirror
check-qtest-s390x-$(CONFIG_POSIX) += test-filter-redirector
check-qtest-s390x-y += drive_del-test
check-qtest-s390x-y += device-plug-test
check-qtest-s390x-y += virtio-ccw-test
check-qtest-s390x-y += cpu-plug-test
check-qtest-s390x-y += migration-test
# libqos / qgraph :
libqgraph-obj-y = tests/qtest/libqos/qgraph.o
libqos-core-obj-y = $(libqgraph-obj-y) tests/qtest/libqos/pci.o tests/qtest/libqos/fw_cfg.o
libqos-core-obj-y += tests/qtest/libqos/malloc.o
libqos-core-obj-y += tests/qtest/libqos/libqos.o
libqos-spapr-obj-y = $(libqos-core-obj-y) tests/qtest/libqos/malloc-spapr.o
libqos-spapr-obj-y += tests/qtest/libqos/libqos-spapr.o
libqos-spapr-obj-y += tests/qtest/libqos/rtas.o
libqos-spapr-obj-y += tests/qtest/libqos/pci-spapr.o
libqos-pc-obj-y = $(libqos-core-obj-y) tests/qtest/libqos/pci-pc.o
libqos-pc-obj-y += tests/qtest/libqos/malloc-pc.o tests/qtest/libqos/libqos-pc.o
libqos-pc-obj-y += tests/qtest/libqos/ahci.o
libqos-usb-obj-y = $(libqos-spapr-obj-y) $(libqos-pc-obj-y) tests/qtest/libqos/usb.o
# qos devices:
libqos-obj-y = $(libqgraph-obj-y)
libqos-obj-y += $(libqos-pc-obj-y) $(libqos-spapr-obj-y)
libqos-obj-y += tests/qtest/libqos/qos_external.o
libqos-obj-y += tests/qtest/libqos/e1000e.o
libqos-obj-y += tests/qtest/libqos/i2c.o
libqos-obj-y += tests/qtest/libqos/i2c-imx.o
libqos-obj-y += tests/qtest/libqos/i2c-omap.o
libqos-obj-y += tests/qtest/libqos/sdhci.o
libqos-obj-y += tests/qtest/libqos/tpci200.o
libqos-obj-y += tests/qtest/libqos/virtio.o
libqos-obj-$(CONFIG_VIRTFS) += tests/qtest/libqos/virtio-9p.o
libqos-obj-y += tests/qtest/libqos/virtio-balloon.o
libqos-obj-y += tests/qtest/libqos/virtio-blk.o
libqos-obj-y += tests/qtest/libqos/virtio-mmio.o
libqos-obj-y += tests/qtest/libqos/virtio-net.o
libqos-obj-y += tests/qtest/libqos/virtio-pci.o
libqos-obj-y += tests/qtest/libqos/virtio-pci-modern.o
libqos-obj-y += tests/qtest/libqos/virtio-rng.o
libqos-obj-y += tests/qtest/libqos/virtio-scsi.o
libqos-obj-y += tests/qtest/libqos/virtio-serial.o
# qos machines:
libqos-obj-y += tests/qtest/libqos/aarch64-xlnx-zcu102-machine.o
libqos-obj-y += tests/qtest/libqos/arm-imx25-pdk-machine.o
libqos-obj-y += tests/qtest/libqos/arm-n800-machine.o
libqos-obj-y += tests/qtest/libqos/arm-raspi2-machine.o
libqos-obj-y += tests/qtest/libqos/arm-sabrelite-machine.o
libqos-obj-y += tests/qtest/libqos/arm-smdkc210-machine.o
libqos-obj-y += tests/qtest/libqos/arm-virt-machine.o
libqos-obj-y += tests/qtest/libqos/arm-xilinx-zynq-a9-machine.o
libqos-obj-y += tests/qtest/libqos/ppc64_pseries-machine.o
libqos-obj-y += tests/qtest/libqos/x86_64_pc-machine.o
# qos tests:
qos-test-obj-y += tests/qtest/qos-test.o
qos-test-obj-y += tests/qtest/ac97-test.o
qos-test-obj-y += tests/qtest/ds1338-test.o
qos-test-obj-y += tests/qtest/e1000-test.o
qos-test-obj-y += tests/qtest/e1000e-test.o
qos-test-obj-y += tests/qtest/eepro100-test.o
qos-test-obj-y += tests/qtest/es1370-test.o
qos-test-obj-y += tests/qtest/ipoctal232-test.o
qos-test-obj-y += tests/qtest/megasas-test.o
qos-test-obj-y += tests/qtest/ne2000-test.o
qos-test-obj-y += tests/qtest/tulip-test.o
qos-test-obj-y += tests/qtest/nvme-test.o
qos-test-obj-y += tests/qtest/pca9552-test.o
qos-test-obj-y += tests/qtest/pci-test.o
qos-test-obj-y += tests/qtest/pcnet-test.o
qos-test-obj-y += tests/qtest/sdhci-test.o
qos-test-obj-y += tests/qtest/spapr-phb-test.o
qos-test-obj-y += tests/qtest/tmp105-test.o
qos-test-obj-y += tests/qtest/usb-hcd-ohci-test.o $(libqos-usb-obj-y)
qos-test-obj-$(CONFIG_VHOST_NET_USER) += tests/qtest/vhost-user-test.o $(chardev-obj-y) $(test-io-obj-y)
qos-test-obj-y += tests/qtest/virtio-test.o
qos-test-obj-$(CONFIG_VIRTFS) += tests/qtest/virtio-9p-test.o
qos-test-obj-y += tests/qtest/virtio-blk-test.o
qos-test-obj-y += tests/qtest/virtio-net-test.o
qos-test-obj-y += tests/qtest/virtio-rng-test.o
qos-test-obj-y += tests/qtest/virtio-scsi-test.o
qos-test-obj-y += tests/qtest/virtio-serial-test.o
qos-test-obj-y += tests/qtest/vmxnet3-test.o
check-unit-y += tests/test-qgraph$(EXESUF)
tests/test-qgraph$(EXESUF): tests/test-qgraph.o $(libqgraph-obj-y)
check-qtest-generic-y += qos-test
tests/qtest/qos-test$(EXESUF): $(qos-test-obj-y) $(libqos-obj-y)
# QTest dependencies:
tests/qtest/qmp-test$(EXESUF): tests/qtest/qmp-test.o
tests/qtest/qmp-cmd-test$(EXESUF): tests/qtest/qmp-cmd-test.o
tests/qtest/device-introspect-test$(EXESUF): tests/qtest/device-introspect-test.o
tests/qtest/rtc-test$(EXESUF): tests/qtest/rtc-test.o
tests/qtest/m48t59-test$(EXESUF): tests/qtest/m48t59-test.o
tests/qtest/hexloader-test$(EXESUF): tests/qtest/hexloader-test.o
tests/qtest/pflash-cfi02$(EXESUF): tests/qtest/pflash-cfi02-test.o
tests/qtest/endianness-test$(EXESUF): tests/qtest/endianness-test.o
tests/qtest/prom-env-test$(EXESUF): tests/qtest/prom-env-test.o $(libqos-obj-y)
tests/qtest/rtas-test$(EXESUF): tests/qtest/rtas-test.o $(libqos-spapr-obj-y)
tests/qtest/fdc-test$(EXESUF): tests/qtest/fdc-test.o
tests/qtest/ide-test$(EXESUF): tests/qtest/ide-test.o $(libqos-pc-obj-y)
tests/qtest/ahci-test$(EXESUF): tests/qtest/ahci-test.o $(libqos-pc-obj-y) qemu-img$(EXESUF)
tests/qtest/ipmi-kcs-test$(EXESUF): tests/qtest/ipmi-kcs-test.o
tests/qtest/ipmi-bt-test$(EXESUF): tests/qtest/ipmi-bt-test.o
tests/qtest/hd-geo-test$(EXESUF): tests/qtest/hd-geo-test.o $(libqos-obj-y)
tests/qtest/boot-order-test$(EXESUF): tests/qtest/boot-order-test.o $(libqos-obj-y)
tests/qtest/boot-serial-test$(EXESUF): tests/qtest/boot-serial-test.o $(libqos-obj-y)
tests/qtest/bios-tables-test$(EXESUF): tests/qtest/bios-tables-test.o \
tests/qtest/boot-sector.o tests/qtest/acpi-utils.o $(libqos-obj-y)
tests/qtest/pxe-test$(EXESUF): tests/qtest/pxe-test.o tests/qtest/boot-sector.o $(libqos-obj-y)
tests/qtest/microbit-test$(EXESUF): tests/qtest/microbit-test.o
tests/qtest/m25p80-test$(EXESUF): tests/qtest/m25p80-test.o
tests/qtest/i440fx-test$(EXESUF): tests/qtest/i440fx-test.o $(libqos-pc-obj-y)
tests/qtest/q35-test$(EXESUF): tests/qtest/q35-test.o $(libqos-pc-obj-y)
tests/qtest/fw_cfg-test$(EXESUF): tests/qtest/fw_cfg-test.o $(libqos-pc-obj-y)
tests/qtest/rtl8139-test$(EXESUF): tests/qtest/rtl8139-test.o $(libqos-pc-obj-y)
tests/qtest/pnv-xscom-test$(EXESUF): tests/qtest/pnv-xscom-test.o
tests/qtest/wdt_ib700-test$(EXESUF): tests/qtest/wdt_ib700-test.o
tests/qtest/tco-test$(EXESUF): tests/qtest/tco-test.o $(libqos-pc-obj-y)
tests/qtest/virtio-ccw-test$(EXESUF): tests/qtest/virtio-ccw-test.o
tests/qtest/display-vga-test$(EXESUF): tests/qtest/display-vga-test.o
tests/qtest/qom-test$(EXESUF): tests/qtest/qom-test.o
tests/qtest/test-hmp$(EXESUF): tests/qtest/test-hmp.o
tests/qtest/machine-none-test$(EXESUF): tests/qtest/machine-none-test.o
tests/qtest/device-plug-test$(EXESUF): tests/qtest/device-plug-test.o
tests/qtest/drive_del-test$(EXESUF): tests/qtest/drive_del-test.o
tests/qtest/pvpanic-test$(EXESUF): tests/qtest/pvpanic-test.o
tests/qtest/i82801b11-test$(EXESUF): tests/qtest/i82801b11-test.o
tests/qtest/intel-hda-test$(EXESUF): tests/qtest/intel-hda-test.o
tests/qtest/ioh3420-test$(EXESUF): tests/qtest/ioh3420-test.o
tests/qtest/usb-hcd-uhci-test$(EXESUF): tests/qtest/usb-hcd-uhci-test.o $(libqos-usb-obj-y)
tests/qtest/usb-hcd-ehci-test$(EXESUF): tests/qtest/usb-hcd-ehci-test.o $(libqos-usb-obj-y)
tests/qtest/usb-hcd-xhci-test$(EXESUF): tests/qtest/usb-hcd-xhci-test.o $(libqos-usb-obj-y)
tests/qtest/cpu-plug-test$(EXESUF): tests/qtest/cpu-plug-test.o
tests/qtest/migration-test$(EXESUF): tests/qtest/migration-test.o tests/qtest/migration-helpers.o
tests/qtest/test-netfilter$(EXESUF): tests/qtest/test-netfilter.o $(qtest-obj-y)
tests/qtest/test-filter-mirror$(EXESUF): tests/qtest/test-filter-mirror.o $(qtest-obj-y)
tests/qtest/test-filter-redirector$(EXESUF): tests/qtest/test-filter-redirector.o $(qtest-obj-y)
tests/qtest/test-x86-cpuid-compat$(EXESUF): tests/qtest/test-x86-cpuid-compat.o $(qtest-obj-y)
tests/qtest/ivshmem-test$(EXESUF): tests/qtest/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y)
tests/qtest/dbus-vmstate-test$(EXESUF): tests/qtest/dbus-vmstate-test.o tests/qtest/migration-helpers.o tests/qtest/dbus-vmstate1.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y)
tests/qtest/test-arm-mptimer$(EXESUF): tests/qtest/test-arm-mptimer.o
tests/qtest/numa-test$(EXESUF): tests/qtest/numa-test.o
tests/qtest/vmgenid-test$(EXESUF): tests/qtest/vmgenid-test.o tests/qtest/boot-sector.o tests/qtest/acpi-utils.o
tests/qtest/cdrom-test$(EXESUF): tests/qtest/cdrom-test.o tests/qtest/boot-sector.o $(libqos-obj-y)
tests/qtest/arm-cpu-features$(EXESUF): tests/qtest/arm-cpu-features.o
tests/qtest/tpm-crb-swtpm-test$(EXESUF): tests/qtest/tpm-crb-swtpm-test.o tests/qtest/tpm-emu.o \
tests/qtest/tpm-util.o tests/qtest/tpm-tests.o $(test-io-obj-y)
tests/qtest/tpm-crb-test$(EXESUF): tests/qtest/tpm-crb-test.o tests/qtest/tpm-emu.o $(test-io-obj-y)
tests/qtest/tpm-tis-swtpm-test$(EXESUF): tests/qtest/tpm-tis-swtpm-test.o tests/qtest/tpm-emu.o \
tests/qtest/tpm-util.o tests/qtest/tpm-tests.o $(test-io-obj-y)
tests/qtest/tpm-tis-device-swtpm-test$(EXESUF): tests/qtest/tpm-tis-device-swtpm-test.o tests/qtest/tpm-emu.o \
tests/qtest/tpm-util.o tests/qtest/tpm-tests.o $(test-io-obj-y)
tests/qtest/tpm-tis-test$(EXESUF): tests/qtest/tpm-tis-test.o tests/qtest/tpm-tis-util.o tests/qtest/tpm-emu.o $(test-io-obj-y)
tests/qtest/tpm-tis-device-test$(EXESUF): tests/qtest/tpm-tis-device-test.o tests/qtest/tpm-tis-util.o tests/qtest/tpm-emu.o $(test-io-obj-y)
# QTest rules
TARGETS=$(patsubst %-softmmu,%, $(filter %-softmmu,$(TARGET_DIRS)))
ifeq ($(CONFIG_POSIX),y)
QTEST_TARGETS = $(TARGETS)
check-qtest-y=$(foreach TARGET,$(TARGETS), $(check-qtest-$(TARGET)-y:%=tests/qtest/%$(EXESUF)))
check-qtest-y += $(check-qtest-generic-y:%=tests/qtest/%$(EXESUF))
else
QTEST_TARGETS =
endif
qtest-obj-y = tests/qtest/libqtest.o $(test-util-obj-y)
$(check-qtest-y): $(qtest-obj-y)