mirror of https://github.com/xqemu/xqemu.git
* Kconfig improvements (msi_nonbroken, imply for default PCI devices)
* intel-iommu: sharing passthrough FlatViews (Peter) * Fix for SEV with VFIO (Brijesh) * Allow compilation without CONFIG_PARALLEL (Thomas) -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAlyTvvAUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroNNwwf/RrtjBoqu8Ulu6k+HJczdpkhO44c5 R7sidGaOBHVjT+EsaYZxanXQlsbpDPiXCRoMRMln+O3Kgso/UlVTLBfctIjuf5kp P8Amp8rw843yl3TQ+Xaqat1qtfVVN2xjRDoyRwWrTU5w52MVVsan2j1/XzGX/7Bb Y3gXRxsN7MyjDCXxhxVwQCxKU2ue3ytvnfdCnu1SNZxZEaFAyGprTNCCTXYugehl bVauAs/0qOZWEyvElinNEz+zbqMTm07ULAWBRXgCDcOudsidZFtu0Xl62dXlp1Ou 0zkaoGiOdMM6OXZkLd6vOK8mY9XDuqaUZE3zAeFMJsK1wSnZdGUVCJO1Hw== =Pkcj -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging * Kconfig improvements (msi_nonbroken, imply for default PCI devices) * intel-iommu: sharing passthrough FlatViews (Peter) * Fix for SEV with VFIO (Brijesh) * Allow compilation without CONFIG_PARALLEL (Thomas) # gpg: Signature made Thu 21 Mar 2019 16:42:24 GMT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * remotes/bonzini/tags/for-upstream: (23 commits) virtio-vga: only enable for specific boards config-all-devices.mak: rebuild on reconfigure minikconf: fix parser typo intel-iommu: optimize nodmar memory regions test-announce-self: convert to qgraph hw/alpha/Kconfig: DP264 hardware requires e1000 network card hw/hppa/Kconfig: Dino board requires e1000 network card hw/sh4/Kconfig: r2d machine requires the rtl8139 network card hw/ppc/Kconfig: e500 based machines require virtio-net-pci device hw/ppc/Kconfig: Bamboo machine requires e1000 network card hw/mips/Kconfig: Fulong 2e board requires ati-vga/rtl8139 PCI devices hw/mips/Kconfig: Malta machine requires the pcnet network card hw/i386/Kconfig: enable devices that can be created by default hw/isa/Kconfig: PIIX4 southbridge requires USB UHCI hw/isa/Kconfig: i82378 SuperIO requires PC speaker device prep: do not select I82374 hw/i386/Kconfig: PC uses I8257, not I82374 hw/char/parallel: Make it possible to compile also without CONFIG_PARALLEL target/i386: sev: Do not pin the ram device memory region memory: Fix the memory region type assignment order ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org> # Conflicts: # hw/rdma/Makefile.objs # hw/riscv/sifive_plic.c
This commit is contained in:
commit
84bdc58c06
|
@ -31,3 +31,6 @@ config XEN
|
||||||
|
|
||||||
config VIRTFS
|
config VIRTFS
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config PVRDMA
|
||||||
|
bool
|
||||||
|
|
7
Makefile
7
Makefile
|
@ -331,10 +331,10 @@ SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(filter %-softmmu, $(TAR
|
||||||
SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %.d, $(SUBDIR_DEVICES_MAK))
|
SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %.d, $(SUBDIR_DEVICES_MAK))
|
||||||
|
|
||||||
ifeq ($(SUBDIR_DEVICES_MAK),)
|
ifeq ($(SUBDIR_DEVICES_MAK),)
|
||||||
config-all-devices.mak:
|
config-all-devices.mak: config-host.mak
|
||||||
$(call quiet-command,echo '# no devices' > $@,"GEN","$@")
|
$(call quiet-command,echo '# no devices' > $@,"GEN","$@")
|
||||||
else
|
else
|
||||||
config-all-devices.mak: $(SUBDIR_DEVICES_MAK)
|
config-all-devices.mak: $(SUBDIR_DEVICES_MAK) config-host.mak
|
||||||
$(call quiet-command, sed -n \
|
$(call quiet-command, sed -n \
|
||||||
's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \
|
's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \
|
||||||
$(SUBDIR_DEVICES_MAK) | sort -u > $@, \
|
$(SUBDIR_DEVICES_MAK) | sort -u > $@, \
|
||||||
|
@ -356,7 +356,8 @@ MINIKCONF_ARGS = \
|
||||||
CONFIG_X11=$(CONFIG_X11) \
|
CONFIG_X11=$(CONFIG_X11) \
|
||||||
CONFIG_VHOST_USER=$(CONFIG_VHOST_USER) \
|
CONFIG_VHOST_USER=$(CONFIG_VHOST_USER) \
|
||||||
CONFIG_VIRTFS=$(CONFIG_VIRTFS) \
|
CONFIG_VIRTFS=$(CONFIG_VIRTFS) \
|
||||||
CONFIG_LINUX=$(CONFIG_LINUX)
|
CONFIG_LINUX=$(CONFIG_LINUX) \
|
||||||
|
CONFIG_PVRDMA=$(CONFIG_PVRDMA)
|
||||||
|
|
||||||
MINIKCONF_INPUTS = $(SRC_PATH)/Kconfig.host $(SRC_PATH)/hw/Kconfig
|
MINIKCONF_INPUTS = $(SRC_PATH)/Kconfig.host $(SRC_PATH)/hw/Kconfig
|
||||||
MINIKCONF = $(PYTHON) $(SRC_PATH)/scripts/minikconf.py \
|
MINIKCONF = $(PYTHON) $(SRC_PATH)/scripts/minikconf.py \
|
||||||
|
|
|
@ -35,6 +35,7 @@ CONFIG_MIPS_CPS=y
|
||||||
CONFIG_MIPS_ITU=y
|
CONFIG_MIPS_ITU=y
|
||||||
CONFIG_R4K=y
|
CONFIG_R4K=y
|
||||||
CONFIG_MALTA=y
|
CONFIG_MALTA=y
|
||||||
|
CONFIG_PCNET_PCI=y
|
||||||
CONFIG_MIPSSIM=y
|
CONFIG_MIPSSIM=y
|
||||||
CONFIG_ACPI_SMBUS=y
|
CONFIG_ACPI_SMBUS=y
|
||||||
CONFIG_SMBUS_EEPROM=y
|
CONFIG_SMBUS_EEPROM=y
|
||||||
|
|
|
@ -6,6 +6,8 @@ CONFIG_RC4030=y
|
||||||
CONFIG_DP8393X=y
|
CONFIG_DP8393X=y
|
||||||
CONFIG_DS1225Y=y
|
CONFIG_DS1225Y=y
|
||||||
CONFIG_FULONG=y
|
CONFIG_FULONG=y
|
||||||
|
CONFIG_ATI_VGA=y
|
||||||
|
CONFIG_RTL8139_PCI=y
|
||||||
CONFIG_JAZZ=y
|
CONFIG_JAZZ=y
|
||||||
CONFIG_G364FB=y
|
CONFIG_G364FB=y
|
||||||
CONFIG_JAZZ_LED=y
|
CONFIG_JAZZ_LED=y
|
||||||
|
|
|
@ -26,6 +26,7 @@ source pci-bridge/Kconfig
|
||||||
source pci-host/Kconfig
|
source pci-host/Kconfig
|
||||||
source pcmcia/Kconfig
|
source pcmcia/Kconfig
|
||||||
source pci/Kconfig
|
source pci/Kconfig
|
||||||
|
source rdma/Kconfig
|
||||||
source scsi/Kconfig
|
source scsi/Kconfig
|
||||||
source sd/Kconfig
|
source sd/Kconfig
|
||||||
source smbios/Kconfig
|
source smbios/Kconfig
|
||||||
|
|
|
@ -2,6 +2,7 @@ config DP264
|
||||||
bool
|
bool
|
||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
|
imply E1000_PCI
|
||||||
select I82374
|
select I82374
|
||||||
select I8254
|
select I8254
|
||||||
select I8259
|
select I8259
|
||||||
|
|
|
@ -2,7 +2,7 @@ common-obj-$(CONFIG_IPACK) += ipoctal232.o
|
||||||
common-obj-$(CONFIG_ESCC) += escc.o
|
common-obj-$(CONFIG_ESCC) += escc.o
|
||||||
common-obj-$(CONFIG_NRF51_SOC) += nrf51_uart.o
|
common-obj-$(CONFIG_NRF51_SOC) += nrf51_uart.o
|
||||||
common-obj-$(CONFIG_PARALLEL) += parallel.o
|
common-obj-$(CONFIG_PARALLEL) += parallel.o
|
||||||
common-obj-$(CONFIG_PARALLEL) += parallel-isa.o
|
common-obj-$(CONFIG_ISA_BUS) += parallel-isa.o
|
||||||
common-obj-$(CONFIG_PL011) += pl011.o
|
common-obj-$(CONFIG_PL011) += pl011.o
|
||||||
common-obj-$(CONFIG_SERIAL) += serial.o
|
common-obj-$(CONFIG_SERIAL) += serial.o
|
||||||
common-obj-$(CONFIG_SERIAL_ISA) += serial-isa.o
|
common-obj-$(CONFIG_SERIAL_ISA) += serial-isa.o
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* QEMU Parallel PORT (ISA bus helpers)
|
* QEMU Parallel PORT (ISA bus helpers)
|
||||||
*
|
*
|
||||||
|
* These functions reside in a separate file since they also might be
|
||||||
|
* required for linking when compiling QEMU without CONFIG_PARALLEL.
|
||||||
|
*
|
||||||
* Copyright (c) 2003 Fabrice Bellard
|
* Copyright (c) 2003 Fabrice Bellard
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
|
|
|
@ -100,7 +100,7 @@ config VIRTIO_GPU
|
||||||
|
|
||||||
config VIRTIO_VGA
|
config VIRTIO_VGA
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
# defaults to "N", enabled by specific boards
|
||||||
depends on VIRTIO_PCI
|
depends on VIRTIO_PCI
|
||||||
select VGA
|
select VGA
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
config DINO
|
config DINO
|
||||||
bool
|
bool
|
||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
|
imply E1000_PCI
|
||||||
|
imply VIRTIO_VGA
|
||||||
select PCI
|
select PCI
|
||||||
select SERIAL
|
select SERIAL
|
||||||
select ISA_BUS
|
select ISA_BUS
|
||||||
|
|
|
@ -9,6 +9,7 @@ config PC
|
||||||
imply ISA_IPMI_KCS
|
imply ISA_IPMI_KCS
|
||||||
imply ISA_IPMI_BT
|
imply ISA_IPMI_BT
|
||||||
imply ISA_DEBUG
|
imply ISA_DEBUG
|
||||||
|
imply PARALLEL
|
||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
imply PVPANIC
|
imply PVPANIC
|
||||||
imply QXL
|
imply QXL
|
||||||
|
@ -17,16 +18,15 @@ config PC
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
imply TPM_CRB
|
imply TPM_CRB
|
||||||
imply TPM_TIS
|
imply TPM_TIS
|
||||||
|
imply VGA_PCI
|
||||||
|
imply VIRTIO_VGA
|
||||||
select FDC
|
select FDC
|
||||||
select I8259
|
select I8259
|
||||||
select I8254
|
select I8254
|
||||||
select PCKBD
|
select PCKBD
|
||||||
select PCSPK
|
select PCSPK
|
||||||
select I82374
|
|
||||||
select I8257
|
select I8257
|
||||||
select MC146818RTC
|
select MC146818RTC
|
||||||
# Needed by the board code:
|
|
||||||
select PARALLEL
|
|
||||||
# For ACPI builder:
|
# For ACPI builder:
|
||||||
select SERIAL_ISA
|
select SERIAL_ISA
|
||||||
select ACPI_VMGENID
|
select ACPI_VMGENID
|
||||||
|
@ -49,6 +49,7 @@ config PC_ACPI
|
||||||
|
|
||||||
config I440FX
|
config I440FX
|
||||||
bool
|
bool
|
||||||
|
imply E1000_PCI
|
||||||
select PC_PCI
|
select PC_PCI
|
||||||
select PC_ACPI
|
select PC_ACPI
|
||||||
select ACPI_SMBUS
|
select ACPI_SMBUS
|
||||||
|
@ -74,6 +75,7 @@ config Q35
|
||||||
bool
|
bool
|
||||||
imply VTD
|
imply VTD
|
||||||
imply AMD_IOMMU
|
imply AMD_IOMMU
|
||||||
|
imply E1000E_PCI_EXPRESS
|
||||||
select PC_PCI
|
select PC_PCI
|
||||||
select PC_ACPI
|
select PC_ACPI
|
||||||
select PCI_EXPRESS_Q35
|
select PCI_EXPRESS_Q35
|
||||||
|
|
|
@ -1485,11 +1485,11 @@ static bool vtd_switch_address_space(VTDAddressSpace *as)
|
||||||
|
|
||||||
/* Turn off first then on the other */
|
/* Turn off first then on the other */
|
||||||
if (use_iommu) {
|
if (use_iommu) {
|
||||||
memory_region_set_enabled(&as->sys_alias, false);
|
memory_region_set_enabled(&as->nodmar, false);
|
||||||
memory_region_set_enabled(MEMORY_REGION(&as->iommu), true);
|
memory_region_set_enabled(MEMORY_REGION(&as->iommu), true);
|
||||||
} else {
|
} else {
|
||||||
memory_region_set_enabled(MEMORY_REGION(&as->iommu), false);
|
memory_region_set_enabled(MEMORY_REGION(&as->iommu), false);
|
||||||
memory_region_set_enabled(&as->sys_alias, true);
|
memory_region_set_enabled(&as->nodmar, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (take_bql) {
|
if (take_bql) {
|
||||||
|
@ -3286,7 +3286,8 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus, int devfn)
|
||||||
vtd_dev_as = vtd_bus->dev_as[devfn];
|
vtd_dev_as = vtd_bus->dev_as[devfn];
|
||||||
|
|
||||||
if (!vtd_dev_as) {
|
if (!vtd_dev_as) {
|
||||||
snprintf(name, sizeof(name), "intel_iommu_devfn_%d", devfn);
|
snprintf(name, sizeof(name), "vtd-%02x.%x", PCI_SLOT(devfn),
|
||||||
|
PCI_FUNC(devfn));
|
||||||
vtd_bus->dev_as[devfn] = vtd_dev_as = g_malloc0(sizeof(VTDAddressSpace));
|
vtd_bus->dev_as[devfn] = vtd_dev_as = g_malloc0(sizeof(VTDAddressSpace));
|
||||||
|
|
||||||
vtd_dev_as->bus = bus;
|
vtd_dev_as->bus = bus;
|
||||||
|
@ -3295,44 +3296,53 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus, int devfn)
|
||||||
vtd_dev_as->context_cache_entry.context_cache_gen = 0;
|
vtd_dev_as->context_cache_entry.context_cache_gen = 0;
|
||||||
vtd_dev_as->iova_tree = iova_tree_new();
|
vtd_dev_as->iova_tree = iova_tree_new();
|
||||||
|
|
||||||
|
memory_region_init(&vtd_dev_as->root, OBJECT(s), name, UINT64_MAX);
|
||||||
|
address_space_init(&vtd_dev_as->as, &vtd_dev_as->root, "vtd-root");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory region relationships looks like (Address range shows
|
* Build the DMAR-disabled container with aliases to the
|
||||||
* only lower 32 bits to make it short in length...):
|
* shared MRs. Note that aliasing to a shared memory region
|
||||||
*
|
* could help the memory API to detect same FlatViews so we
|
||||||
* |-----------------+-------------------+----------|
|
* can have devices to share the same FlatView when DMAR is
|
||||||
* | Name | Address range | Priority |
|
* disabled (either by not providing "intel_iommu=on" or with
|
||||||
* |-----------------+-------------------+----------+
|
* "iommu=pt"). It will greatly reduce the total number of
|
||||||
* | vtd_root | 00000000-ffffffff | 0 |
|
* FlatViews of the system hence VM runs faster.
|
||||||
* | intel_iommu | 00000000-ffffffff | 1 |
|
|
||||||
* | vtd_sys_alias | 00000000-ffffffff | 1 |
|
|
||||||
* | intel_iommu_ir | fee00000-feefffff | 64 |
|
|
||||||
* |-----------------+-------------------+----------|
|
|
||||||
*
|
|
||||||
* We enable/disable DMAR by switching enablement for
|
|
||||||
* vtd_sys_alias and intel_iommu regions. IR region is always
|
|
||||||
* enabled.
|
|
||||||
*/
|
*/
|
||||||
|
memory_region_init_alias(&vtd_dev_as->nodmar, OBJECT(s),
|
||||||
|
"vtd-nodmar", &s->mr_nodmar, 0,
|
||||||
|
memory_region_size(&s->mr_nodmar));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build the per-device DMAR-enabled container.
|
||||||
|
*
|
||||||
|
* TODO: currently we have per-device IOMMU memory region only
|
||||||
|
* because we have per-device IOMMU notifiers for devices. If
|
||||||
|
* one day we can abstract the IOMMU notifiers out of the
|
||||||
|
* memory regions then we can also share the same memory
|
||||||
|
* region here just like what we've done above with the nodmar
|
||||||
|
* region.
|
||||||
|
*/
|
||||||
|
strcat(name, "-dmar");
|
||||||
memory_region_init_iommu(&vtd_dev_as->iommu, sizeof(vtd_dev_as->iommu),
|
memory_region_init_iommu(&vtd_dev_as->iommu, sizeof(vtd_dev_as->iommu),
|
||||||
TYPE_INTEL_IOMMU_MEMORY_REGION, OBJECT(s),
|
TYPE_INTEL_IOMMU_MEMORY_REGION, OBJECT(s),
|
||||||
"intel_iommu_dmar",
|
name, UINT64_MAX);
|
||||||
UINT64_MAX);
|
memory_region_init_alias(&vtd_dev_as->iommu_ir, OBJECT(s), "vtd-ir",
|
||||||
memory_region_init_alias(&vtd_dev_as->sys_alias, OBJECT(s),
|
&s->mr_ir, 0, memory_region_size(&s->mr_ir));
|
||||||
"vtd_sys_alias", get_system_memory(),
|
memory_region_add_subregion_overlap(MEMORY_REGION(&vtd_dev_as->iommu),
|
||||||
0, memory_region_size(get_system_memory()));
|
|
||||||
memory_region_init_io(&vtd_dev_as->iommu_ir, OBJECT(s),
|
|
||||||
&vtd_mem_ir_ops, s, "intel_iommu_ir",
|
|
||||||
VTD_INTERRUPT_ADDR_SIZE);
|
|
||||||
memory_region_init(&vtd_dev_as->root, OBJECT(s),
|
|
||||||
"vtd_root", UINT64_MAX);
|
|
||||||
memory_region_add_subregion_overlap(&vtd_dev_as->root,
|
|
||||||
VTD_INTERRUPT_ADDR_FIRST,
|
VTD_INTERRUPT_ADDR_FIRST,
|
||||||
&vtd_dev_as->iommu_ir, 64);
|
&vtd_dev_as->iommu_ir, 1);
|
||||||
address_space_init(&vtd_dev_as->as, &vtd_dev_as->root, name);
|
|
||||||
memory_region_add_subregion_overlap(&vtd_dev_as->root, 0,
|
/*
|
||||||
&vtd_dev_as->sys_alias, 1);
|
* Hook both the containers under the root container, we
|
||||||
|
* switch between DMAR & noDMAR by enable/disable
|
||||||
|
* corresponding sub-containers
|
||||||
|
*/
|
||||||
memory_region_add_subregion_overlap(&vtd_dev_as->root, 0,
|
memory_region_add_subregion_overlap(&vtd_dev_as->root, 0,
|
||||||
MEMORY_REGION(&vtd_dev_as->iommu),
|
MEMORY_REGION(&vtd_dev_as->iommu),
|
||||||
1);
|
0);
|
||||||
|
memory_region_add_subregion_overlap(&vtd_dev_as->root, 0,
|
||||||
|
&vtd_dev_as->nodmar, 0);
|
||||||
|
|
||||||
vtd_switch_address_space(vtd_dev_as);
|
vtd_switch_address_space(vtd_dev_as);
|
||||||
}
|
}
|
||||||
return vtd_dev_as;
|
return vtd_dev_as;
|
||||||
|
@ -3676,6 +3686,21 @@ static void vtd_realize(DeviceState *dev, Error **errp)
|
||||||
memset(s->vtd_as_by_bus_num, 0, sizeof(s->vtd_as_by_bus_num));
|
memset(s->vtd_as_by_bus_num, 0, sizeof(s->vtd_as_by_bus_num));
|
||||||
memory_region_init_io(&s->csrmem, OBJECT(s), &vtd_mem_ops, s,
|
memory_region_init_io(&s->csrmem, OBJECT(s), &vtd_mem_ops, s,
|
||||||
"intel_iommu", DMAR_REG_SIZE);
|
"intel_iommu", DMAR_REG_SIZE);
|
||||||
|
|
||||||
|
/* Create the shared memory regions by all devices */
|
||||||
|
memory_region_init(&s->mr_nodmar, OBJECT(s), "vtd-nodmar",
|
||||||
|
UINT64_MAX);
|
||||||
|
memory_region_init_io(&s->mr_ir, OBJECT(s), &vtd_mem_ir_ops,
|
||||||
|
s, "vtd-ir", VTD_INTERRUPT_ADDR_SIZE);
|
||||||
|
memory_region_init_alias(&s->mr_sys_alias, OBJECT(s),
|
||||||
|
"vtd-sys-alias", get_system_memory(), 0,
|
||||||
|
memory_region_size(get_system_memory()));
|
||||||
|
memory_region_add_subregion_overlap(&s->mr_nodmar, 0,
|
||||||
|
&s->mr_sys_alias, 0);
|
||||||
|
memory_region_add_subregion_overlap(&s->mr_nodmar,
|
||||||
|
VTD_INTERRUPT_ADDR_FIRST,
|
||||||
|
&s->mr_ir, 1);
|
||||||
|
|
||||||
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->csrmem);
|
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->csrmem);
|
||||||
/* No corresponding destroy */
|
/* No corresponding destroy */
|
||||||
s->iotlb = g_hash_table_new_full(vtd_uint64_hash, vtd_uint64_equal,
|
s->iotlb = g_hash_table_new_full(vtd_uint64_hash, vtd_uint64_equal,
|
||||||
|
|
|
@ -12,12 +12,15 @@ config IOAPIC
|
||||||
|
|
||||||
config ARM_GIC
|
config ARM_GIC
|
||||||
bool
|
bool
|
||||||
|
select MSI_NONBROKEN
|
||||||
|
|
||||||
config OPENPIC
|
config OPENPIC
|
||||||
bool
|
bool
|
||||||
|
select MSI_NONBROKEN
|
||||||
|
|
||||||
config APIC
|
config APIC
|
||||||
bool
|
bool
|
||||||
|
select MSI_NONBROKEN
|
||||||
|
|
||||||
config ARM_GIC_KVM
|
config ARM_GIC_KVM
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -11,6 +11,7 @@ config I82378
|
||||||
select I8254
|
select I8254
|
||||||
select I82374
|
select I82374
|
||||||
select MC146818RTC
|
select MC146818RTC
|
||||||
|
select PCSPK
|
||||||
|
|
||||||
config PC87312
|
config PC87312
|
||||||
bool
|
bool
|
||||||
|
@ -29,6 +30,7 @@ config PIIX4
|
||||||
# For historical reasons, SuperIO devices are created in the board
|
# For historical reasons, SuperIO devices are created in the board
|
||||||
# for PIIX4.
|
# for PIIX4.
|
||||||
select ISA_BUS
|
select ISA_BUS
|
||||||
|
select USB_UHCI
|
||||||
|
|
||||||
config VT82C686
|
config VT82C686
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -34,7 +34,7 @@ config PCI_TESTDEV
|
||||||
config EDU
|
config EDU
|
||||||
bool
|
bool
|
||||||
default y if TEST_DEVICES
|
default y if TEST_DEVICES
|
||||||
depends on PCI
|
depends on PCI && MSI_NONBROKEN
|
||||||
|
|
||||||
config PCA9552
|
config PCA9552
|
||||||
bool
|
bool
|
||||||
|
@ -67,7 +67,7 @@ config MACIO
|
||||||
config IVSHMEM_DEVICE
|
config IVSHMEM_DEVICE
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES
|
||||||
depends on PCI && LINUX && IVSHMEM
|
depends on PCI && LINUX && IVSHMEM && MSI_NONBROKEN
|
||||||
|
|
||||||
config ECCMEMCTL
|
config ECCMEMCTL
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -28,7 +28,7 @@ config E1000_PCI
|
||||||
config E1000E_PCI_EXPRESS
|
config E1000E_PCI_EXPRESS
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES
|
||||||
depends on PCI_EXPRESS
|
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||||
|
|
||||||
config RTL8139_PCI
|
config RTL8139_PCI
|
||||||
bool
|
bool
|
||||||
|
@ -107,7 +107,7 @@ config ETSEC
|
||||||
config ROCKER
|
config ROCKER
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES
|
||||||
depends on PCI
|
depends on PCI && MSI_NONBROKEN
|
||||||
|
|
||||||
config CAN_BUS
|
config CAN_BUS
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
config PCIE_PORT
|
config PCIE_PORT
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES
|
||||||
depends on PCI_EXPRESS
|
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||||
|
|
||||||
config PXB
|
config PXB
|
||||||
bool
|
bool
|
||||||
|
@ -10,12 +10,12 @@ config PXB
|
||||||
config XIO3130
|
config XIO3130
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES
|
||||||
depends on PCI_EXPRESS
|
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||||
|
|
||||||
config IOH3420
|
config IOH3420
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES
|
||||||
depends on PCI_EXPRESS
|
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||||
|
|
||||||
config I82801B11
|
config I82801B11
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -49,3 +49,4 @@ config PCI_EXPRESS_XILINX
|
||||||
config PCI_EXPRESS_DESIGNWARE
|
config PCI_EXPRESS_DESIGNWARE
|
||||||
bool
|
bool
|
||||||
select PCI_EXPRESS
|
select PCI_EXPRESS
|
||||||
|
select MSI_NONBROKEN
|
||||||
|
|
|
@ -7,3 +7,9 @@ config PCI_EXPRESS
|
||||||
|
|
||||||
config PCI_DEVICES
|
config PCI_DEVICES
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config MSI_NONBROKEN
|
||||||
|
# selected by interrupt controllers that do not support MSI,
|
||||||
|
# or support it and have a good implementation. See commit
|
||||||
|
# 47d2b0f33c664533b8dbd5cb17faa8e6a01afe1f.
|
||||||
|
bool
|
||||||
|
|
|
@ -2,12 +2,14 @@ config PSERIES
|
||||||
bool
|
bool
|
||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
|
imply VIRTIO_VGA
|
||||||
select DIMM
|
select DIMM
|
||||||
select PCI
|
select PCI
|
||||||
select SPAPR_VSCSI
|
select SPAPR_VSCSI
|
||||||
select VFIO if LINUX # needed by spapr_pci_vfio.c
|
select VFIO if LINUX # needed by spapr_pci_vfio.c
|
||||||
select XICS_SPAPR
|
select XICS_SPAPR
|
||||||
select XIVE_SPAPR
|
select XIVE_SPAPR
|
||||||
|
select MSI_NONBROKEN
|
||||||
|
|
||||||
config SPAPR_RNG
|
config SPAPR_RNG
|
||||||
bool
|
bool
|
||||||
|
@ -36,6 +38,7 @@ config PPC440
|
||||||
bool
|
bool
|
||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
|
imply E1000_PCI
|
||||||
select PCI_EXPRESS
|
select PCI_EXPRESS
|
||||||
select PPC4XX
|
select PPC4XX
|
||||||
select SERIAL
|
select SERIAL
|
||||||
|
@ -63,7 +66,6 @@ config PREP
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
select CS4231A
|
select CS4231A
|
||||||
select PREP_PCI
|
select PREP_PCI
|
||||||
select I82374
|
|
||||||
select I82378
|
select I82378
|
||||||
select LSI_SCSI_PCI
|
select LSI_SCSI_PCI
|
||||||
select M48T59
|
select M48T59
|
||||||
|
@ -97,6 +99,7 @@ config MAC_NEWWORLD
|
||||||
config E500
|
config E500
|
||||||
bool
|
bool
|
||||||
imply AT24C
|
imply AT24C
|
||||||
|
imply VIRTIO_PCI
|
||||||
select ETSEC
|
select ETSEC
|
||||||
select OPENPIC
|
select OPENPIC
|
||||||
select PLATFORM_BUS
|
select PLATFORM_BUS
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
config VMW_PVRDMA
|
||||||
|
default y if PCI_DEVICES
|
||||||
|
depends on PVRDMA && PCI && MSI_NONBROKEN
|
|
@ -1,5 +1,3 @@
|
||||||
ifeq ($(CONFIG_PVRDMA),y)
|
obj-$(CONFIG_VMW_PVRDMA) += rdma_utils.o rdma_backend.o rdma_rm.o rdma.o
|
||||||
obj-$(CONFIG_PCI) += rdma_utils.o rdma_backend.o rdma_rm.o rdma.o
|
obj-$(CONFIG_VMW_PVRDMA) += vmw/pvrdma_dev_ring.o vmw/pvrdma_cmd.o \
|
||||||
obj-$(CONFIG_PCI) += vmw/pvrdma_dev_ring.o vmw/pvrdma_cmd.o \
|
|
||||||
vmw/pvrdma_qp_ops.o vmw/pvrdma_main.o
|
vmw/pvrdma_qp_ops.o vmw/pvrdma_main.o
|
||||||
endif
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ config HART
|
||||||
|
|
||||||
config SIFIVE
|
config SIFIVE
|
||||||
bool
|
bool
|
||||||
|
select MSI_NONBROKEN
|
||||||
|
|
||||||
config SIFIVE_E
|
config SIFIVE_E
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
|
#include "hw/pci/msi.h"
|
||||||
#include "target/riscv/cpu.h"
|
#include "target/riscv/cpu.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "hw/riscv/sifive_plic.h"
|
#include "hw/riscv/sifive_plic.h"
|
||||||
|
@ -458,6 +459,8 @@ static void sifive_plic_realize(DeviceState *dev, Error **errp)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msi_nonbroken = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sifive_plic_class_init(ObjectClass *klass, void *data)
|
static void sifive_plic_class_init(ObjectClass *klass, void *data)
|
||||||
|
|
|
@ -9,3 +9,4 @@ config S390_CCW_VIRTIO
|
||||||
select S390_FLIC
|
select S390_FLIC
|
||||||
select SCLPCONSOLE
|
select SCLPCONSOLE
|
||||||
select VIRTIO_CCW
|
select VIRTIO_CCW
|
||||||
|
select MSI_NONBROKEN
|
||||||
|
|
|
@ -2,6 +2,7 @@ config R2D
|
||||||
bool
|
bool
|
||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
|
imply RTL8139_PCI
|
||||||
select I82378 if TEST_DEVICES
|
select I82378 if TEST_DEVICES
|
||||||
select IDE_MMIO
|
select IDE_MMIO
|
||||||
select PFLASH_CFI02
|
select PFLASH_CFI02
|
||||||
|
|
|
@ -3,13 +3,13 @@ config SUN4U
|
||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
imply SUNHME
|
imply SUNHME
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
|
imply PARALLEL
|
||||||
select M48T59
|
select M48T59
|
||||||
select ISA_BUS
|
select ISA_BUS
|
||||||
select FDC
|
select FDC
|
||||||
select SERIAL_ISA
|
select SERIAL_ISA
|
||||||
select PCI_SABRE
|
select PCI_SABRE
|
||||||
select IDE_CMD646
|
select IDE_CMD646
|
||||||
select PARALLEL
|
|
||||||
select PCKBD
|
select PCKBD
|
||||||
select SIMBA
|
select SIMBA
|
||||||
|
|
||||||
|
|
|
@ -105,8 +105,8 @@ struct VTDAddressSpace {
|
||||||
uint8_t devfn;
|
uint8_t devfn;
|
||||||
AddressSpace as;
|
AddressSpace as;
|
||||||
IOMMUMemoryRegion iommu;
|
IOMMUMemoryRegion iommu;
|
||||||
MemoryRegion root;
|
MemoryRegion root; /* The root container of the device */
|
||||||
MemoryRegion sys_alias;
|
MemoryRegion nodmar; /* The alias of shared nodmar MR */
|
||||||
MemoryRegion iommu_ir; /* Interrupt region: 0xfeeXXXXX */
|
MemoryRegion iommu_ir; /* Interrupt region: 0xfeeXXXXX */
|
||||||
IntelIOMMUState *iommu_state;
|
IntelIOMMUState *iommu_state;
|
||||||
VTDContextCacheEntry context_cache_entry;
|
VTDContextCacheEntry context_cache_entry;
|
||||||
|
@ -221,6 +221,9 @@ union VTD_IR_MSIAddress {
|
||||||
struct IntelIOMMUState {
|
struct IntelIOMMUState {
|
||||||
X86IOMMUState x86_iommu;
|
X86IOMMUState x86_iommu;
|
||||||
MemoryRegion csrmem;
|
MemoryRegion csrmem;
|
||||||
|
MemoryRegion mr_nodmar;
|
||||||
|
MemoryRegion mr_ir;
|
||||||
|
MemoryRegion mr_sys_alias;
|
||||||
uint8_t csr[DMAR_REG_SIZE]; /* register values */
|
uint8_t csr[DMAR_REG_SIZE]; /* register values */
|
||||||
uint8_t wmask[DMAR_REG_SIZE]; /* R/W bytes */
|
uint8_t wmask[DMAR_REG_SIZE]; /* R/W bytes */
|
||||||
uint8_t w1cmask[DMAR_REG_SIZE]; /* RW1C(Write 1 to Clear) bytes */
|
uint8_t w1cmask[DMAR_REG_SIZE]; /* RW1C(Write 1 to Clear) bytes */
|
||||||
|
|
9
memory.c
9
memory.c
|
@ -1649,10 +1649,17 @@ void memory_region_init_ram_device_ptr(MemoryRegion *mr,
|
||||||
uint64_t size,
|
uint64_t size,
|
||||||
void *ptr)
|
void *ptr)
|
||||||
{
|
{
|
||||||
memory_region_init_ram_ptr(mr, owner, name, size, ptr);
|
memory_region_init(mr, owner, name, size);
|
||||||
|
mr->ram = true;
|
||||||
|
mr->terminates = true;
|
||||||
mr->ram_device = true;
|
mr->ram_device = true;
|
||||||
mr->ops = &ram_device_mem_ops;
|
mr->ops = &ram_device_mem_ops;
|
||||||
mr->opaque = mr;
|
mr->opaque = mr;
|
||||||
|
mr->destructor = memory_region_destructor_ram;
|
||||||
|
mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0;
|
||||||
|
/* qemu_ram_alloc_from_ptr cannot fail with ptr != NULL. */
|
||||||
|
assert(ptr != NULL);
|
||||||
|
mr->ram_block = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_fatal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void memory_region_init_alias(MemoryRegion *mr,
|
void memory_region_init_alias(MemoryRegion *mr,
|
||||||
|
|
|
@ -592,7 +592,7 @@ class KconfigParser:
|
||||||
if not self.src.startswith(rest, self.cursor):
|
if not self.src.startswith(rest, self.cursor):
|
||||||
return False
|
return False
|
||||||
length = len(rest)
|
length = len(rest)
|
||||||
if self.src[self.cursor + length].isalnum() or self.src[self.cursor + length] == '|':
|
if self.src[self.cursor + length].isalnum() or self.src[self.cursor + length] == '_':
|
||||||
return False
|
return False
|
||||||
self.cursor += length
|
self.cursor += length
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -131,6 +131,17 @@ sev_ram_block_added(RAMBlockNotifier *n, void *host, size_t size)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
struct kvm_enc_region range;
|
struct kvm_enc_region range;
|
||||||
|
ram_addr_t offset;
|
||||||
|
MemoryRegion *mr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The RAM device presents a memory region that should be treated
|
||||||
|
* as IO region and should not be pinned.
|
||||||
|
*/
|
||||||
|
mr = memory_region_from_host(host, &offset);
|
||||||
|
if (mr && memory_region_is_ram_device(mr)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
range.addr = (__u64)(unsigned long)host;
|
range.addr = (__u64)(unsigned long)host;
|
||||||
range.size = size;
|
range.size = size;
|
||||||
|
|
|
@ -195,7 +195,6 @@ check-qtest-i386-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF)
|
||||||
check-qtest-i386-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
|
check-qtest-i386-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
|
||||||
check-qtest-i386-$(CONFIG_RTL8139_PCI) += tests/test-filter-redirector$(EXESUF)
|
check-qtest-i386-$(CONFIG_RTL8139_PCI) += tests/test-filter-redirector$(EXESUF)
|
||||||
check-qtest-i386-y += tests/migration-test$(EXESUF)
|
check-qtest-i386-y += tests/migration-test$(EXESUF)
|
||||||
check-qtest-i386-y += tests/test-announce-self$(EXESUF)
|
|
||||||
check-qtest-i386-y += tests/test-x86-cpuid-compat$(EXESUF)
|
check-qtest-i386-y += tests/test-x86-cpuid-compat$(EXESUF)
|
||||||
check-qtest-i386-y += tests/numa-test$(EXESUF)
|
check-qtest-i386-y += tests/numa-test$(EXESUF)
|
||||||
check-qtest-x86_64-y += $(check-qtest-i386-y)
|
check-qtest-x86_64-y += $(check-qtest-i386-y)
|
||||||
|
@ -232,7 +231,6 @@ check-qtest-ppc64-y += $(check-qtest-ppc-y)
|
||||||
check-qtest-ppc64-$(CONFIG_PSERIES) += tests/device-plug-test$(EXESUF)
|
check-qtest-ppc64-$(CONFIG_PSERIES) += tests/device-plug-test$(EXESUF)
|
||||||
check-qtest-ppc64-$(CONFIG_POWERNV) += tests/pnv-xscom-test$(EXESUF)
|
check-qtest-ppc64-$(CONFIG_POWERNV) += tests/pnv-xscom-test$(EXESUF)
|
||||||
check-qtest-ppc64-y += tests/migration-test$(EXESUF)
|
check-qtest-ppc64-y += tests/migration-test$(EXESUF)
|
||||||
check-qtest-ppc64-y += tests/test-announce-self$(EXESUF)
|
|
||||||
check-qtest-ppc64-$(CONFIG_PSERIES) += tests/rtas-test$(EXESUF)
|
check-qtest-ppc64-$(CONFIG_PSERIES) += tests/rtas-test$(EXESUF)
|
||||||
check-qtest-ppc64-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF)
|
check-qtest-ppc64-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF)
|
||||||
check-qtest-ppc64-$(CONFIG_USB_UHCI) += tests/usb-hcd-uhci-test$(EXESUF)
|
check-qtest-ppc64-$(CONFIG_USB_UHCI) += tests/usb-hcd-uhci-test$(EXESUF)
|
||||||
|
@ -817,7 +815,6 @@ tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb-obj-y)
|
||||||
tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb-obj-y)
|
tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb-obj-y)
|
||||||
tests/cpu-plug-test$(EXESUF): tests/cpu-plug-test.o
|
tests/cpu-plug-test$(EXESUF): tests/cpu-plug-test.o
|
||||||
tests/migration-test$(EXESUF): tests/migration-test.o
|
tests/migration-test$(EXESUF): tests/migration-test.o
|
||||||
tests/test-announce-self$(EXESUF): tests/test-announce-self.o
|
|
||||||
tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o
|
tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o
|
||||||
tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o $(test-util-obj-y)
|
tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o $(test-util-obj-y)
|
||||||
tests/test-keyval$(EXESUF): tests/test-keyval.o $(test-util-obj-y) $(test-qapi-obj-y)
|
tests/test-keyval$(EXESUF): tests/test-keyval.o $(test-util-obj-y) $(test-qapi-obj-y)
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
/*
|
|
||||||
* QTest testcase for qemu_announce_self
|
|
||||||
*
|
|
||||||
* Copyright (c) 2017 Red hat, Inc.
|
|
||||||
* Copyright (c) 2014 SUSE LINUX Products GmbH
|
|
||||||
*
|
|
||||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
||||||
* See the COPYING file in the top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
|
||||||
#include "libqtest.h"
|
|
||||||
#include "qapi/qmp/qdict.h"
|
|
||||||
#include "qemu-common.h"
|
|
||||||
#include "qemu/sockets.h"
|
|
||||||
#include "qemu/iov.h"
|
|
||||||
#include "libqos/libqos-pc.h"
|
|
||||||
#include "libqos/libqos-spapr.h"
|
|
||||||
|
|
||||||
#ifndef ETH_P_RARP
|
|
||||||
#define ETH_P_RARP 0x8035
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void test_announce(QTestState *qs, int socket)
|
|
||||||
{
|
|
||||||
char buffer[60];
|
|
||||||
int len;
|
|
||||||
QDict *rsp;
|
|
||||||
int ret;
|
|
||||||
uint16_t *proto = (uint16_t *)&buffer[12];
|
|
||||||
|
|
||||||
rsp = qtest_qmp(qs, "{ 'execute' : 'announce-self', "
|
|
||||||
" 'arguments': {"
|
|
||||||
" 'initial': 50, 'max': 550,"
|
|
||||||
" 'rounds': 10, 'step': 50 } }");
|
|
||||||
assert(!qdict_haskey(rsp, "error"));
|
|
||||||
qobject_unref(rsp);
|
|
||||||
|
|
||||||
/* Catch the packet and make sure it's a RARP */
|
|
||||||
ret = qemu_recv(socket, &len, sizeof(len), 0);
|
|
||||||
g_assert_cmpint(ret, ==, sizeof(len));
|
|
||||||
len = ntohl(len);
|
|
||||||
|
|
||||||
ret = qemu_recv(socket, buffer, len, 0);
|
|
||||||
g_assert_cmpint(*proto, ==, htons(ETH_P_RARP));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setup(gconstpointer data)
|
|
||||||
{
|
|
||||||
QTestState *qs;
|
|
||||||
void (*func) (QTestState *qs, int socket) = data;
|
|
||||||
int sv[2], ret;
|
|
||||||
|
|
||||||
ret = socketpair(PF_UNIX, SOCK_STREAM, 0, sv);
|
|
||||||
g_assert_cmpint(ret, !=, -1);
|
|
||||||
|
|
||||||
qs = qtest_initf("-netdev socket,fd=%d,id=hs0 -device "
|
|
||||||
"virtio-net-pci,netdev=hs0", sv[1]);
|
|
||||||
func(qs, sv[0]);
|
|
||||||
|
|
||||||
/* End test */
|
|
||||||
close(sv[0]);
|
|
||||||
qtest_quit(qs);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
g_test_init(&argc, &argv, NULL);
|
|
||||||
qtest_add_data_func("/virtio/net/test_announce_self", test_announce, setup);
|
|
||||||
|
|
||||||
return g_test_run();
|
|
||||||
}
|
|
|
@ -15,6 +15,10 @@
|
||||||
#include "libqos/qgraph.h"
|
#include "libqos/qgraph.h"
|
||||||
#include "libqos/virtio-net.h"
|
#include "libqos/virtio-net.h"
|
||||||
|
|
||||||
|
#ifndef ETH_P_RARP
|
||||||
|
#define ETH_P_RARP 0x8035
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PCI_SLOT_HP 0x06
|
#define PCI_SLOT_HP 0x06
|
||||||
#define PCI_SLOT 0x04
|
#define PCI_SLOT 0x04
|
||||||
|
|
||||||
|
@ -168,6 +172,31 @@ static void hotplug(void *obj, void *data, QGuestAllocator *t_alloc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void announce_self(void *obj, void *data, QGuestAllocator *t_alloc)
|
||||||
|
{
|
||||||
|
int *sv = data;
|
||||||
|
char buffer[60];
|
||||||
|
int len;
|
||||||
|
QDict *rsp;
|
||||||
|
int ret;
|
||||||
|
uint16_t *proto = (uint16_t *)&buffer[12];
|
||||||
|
|
||||||
|
rsp = qmp("{ 'execute' : 'announce-self', "
|
||||||
|
" 'arguments': {"
|
||||||
|
" 'initial': 50, 'max': 550,"
|
||||||
|
" 'rounds': 10, 'step': 50 } }");
|
||||||
|
assert(!qdict_haskey(rsp, "error"));
|
||||||
|
qobject_unref(rsp);
|
||||||
|
|
||||||
|
/* Catch the packet and make sure it's a RARP */
|
||||||
|
ret = qemu_recv(sv[0], &len, sizeof(len), 0);
|
||||||
|
g_assert_cmpint(ret, ==, sizeof(len));
|
||||||
|
len = ntohl(len);
|
||||||
|
|
||||||
|
ret = qemu_recv(sv[0], buffer, len, 0);
|
||||||
|
g_assert_cmpint(*proto, ==, htons(ETH_P_RARP));
|
||||||
|
}
|
||||||
|
|
||||||
static void virtio_net_test_cleanup(void *sockets)
|
static void virtio_net_test_cleanup(void *sockets)
|
||||||
{
|
{
|
||||||
int *sv = sockets;
|
int *sv = sockets;
|
||||||
|
@ -233,6 +262,7 @@ static void register_virtio_net_test(void)
|
||||||
qos_add_test("basic", "virtio-net", send_recv_test, &opts);
|
qos_add_test("basic", "virtio-net", send_recv_test, &opts);
|
||||||
qos_add_test("rx_stop_cont", "virtio-net", stop_cont_test, &opts);
|
qos_add_test("rx_stop_cont", "virtio-net", stop_cont_test, &opts);
|
||||||
#endif
|
#endif
|
||||||
|
qos_add_test("announce-self", "virtio-net", announce_self, &opts);
|
||||||
|
|
||||||
/* These tests do not need a loopback backend. */
|
/* These tests do not need a loopback backend. */
|
||||||
opts.before = virtio_net_test_setup_nosocket;
|
opts.before = virtio_net_test_setup_nosocket;
|
||||||
|
|
Loading…
Reference in New Issue