mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
pc,pci,virtio: lots of new features
Lots of last minute stuff. vhost-user-i2c. vhost-vsock SOCK_SEQPACKET support. IOMMU bypass. ACPI based pci hotplug. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmDxoZ8PHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRp76oH/1NJm5vFD+IjXC2sjKfxgqhi4QZGZOgU5rP6 fDQA4HA0VM0iO7wUqIwc77Dn2BJLDnHG2biNlr1E0LnUWcpTATjX9qlonMz4gFn0 1j49t1CmlkXinW55rVLsD5tjish1dR4mdzZMLQAxuUVxb5lH+rI2RDcbS2xrBs9G jPOm5TBl1FDREqnToVpWD+/gaCQAvFyjpXbSBKDahsxAZDL9GCpcZKNGgyBQrnPK 1cYxPJZwTjVPwDXVArbFNCqUFemux2f5Hgx8gNFHomiNk9+mW0Q2quuVLwWHkbHC KEI7ZTfpjJkDXsQayhQ7HCTsiFl0qwj44BNUX07ZvpNkxNXXRHM= =4iA8 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/mst/tags/for_upstream3' into staging pc,pci,virtio: lots of new features Lots of last minute stuff. vhost-user-i2c. vhost-vsock SOCK_SEQPACKET support. IOMMU bypass. ACPI based pci hotplug. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # gpg: Signature made Fri 16 Jul 2021 16:11:27 BST # gpg: using RSA key 5D09FD0871C8F85B94CA8A0D281F0DB8D28D5469 # gpg: issuer "mst@redhat.com" # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" [full] # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" [full] # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * remotes/mst/tags/for_upstream3: vhost-vsock: SOCK_SEQPACKET feature bit support docs: Add documentation for iommu bypass hw/i386/acpi-build: Add IVRS support to bypass iommu hw/i386/acpi-build: Add DMAR support to bypass iommu hw/arm/virt-acpi-build: Add IORT support to bypass SMMUv3 hw/pci: Add pci_bus_range() to get PCI bus number range hw/i386: Add a default_bus_bypass_iommu pc machine option hw/arm/virt: Add default_bus_bypass_iommu machine option hw/pxb: Add a bypass iommu property hw/pci/pci_host: Allow PCI host to bypass iommu docs: Add '-device intel-iommu' entry hw/virtio: add vhost-user-i2c-pci boilerplate hw/virtio: add boilerplate for vhost-user-i2c device bios-tables-test: Update golden binaries hw/acpi/ich9: Set ACPI PCI hot-plug as default on Q35 bios-tables-test: Allow changes in DSDT ACPI tables hw/pci/pcie: Do not set HPC flag if acpihp is used hw/acpi/ich9: Enable ACPI PCI hot-plug hw/i386/acpi-build: Add ACPI PCI hot-plug methods to Q35 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
a97fca4ceb
43 changed files with 949 additions and 42 deletions
89
docs/bypass-iommu.txt
Normal file
89
docs/bypass-iommu.txt
Normal file
|
@ -0,0 +1,89 @@
|
|||
BYPASS IOMMU PROPERTY
|
||||
=====================
|
||||
|
||||
Description
|
||||
===========
|
||||
Traditionally, there is a global switch to enable/disable vIOMMU. All
|
||||
devices in the system can only support go through vIOMMU or not, which
|
||||
is not flexible. We introduce this bypass iommu property to support
|
||||
coexist of devices go through vIOMMU and devices not. This is useful to
|
||||
passthrough devices with no-iommu mode and devices go through vIOMMU in
|
||||
the same virtual machine.
|
||||
|
||||
PCI host bridges have a bypass_iommu property. This property is used to
|
||||
determine whether the devices attached on the PCI host bridge will bypass
|
||||
virtual iommu. The bypass_iommu property is valid only when there is a
|
||||
virtual iommu in the system, it is implemented to allow some devices to
|
||||
bypass vIOMMU. When bypass_iommu property is not set for a host bridge,
|
||||
the attached devices will go through vIOMMU by default.
|
||||
|
||||
Usage
|
||||
=====
|
||||
The bypass iommu feature support PXB host bridge and default main host
|
||||
bridge, we add a bypass_iommu property for PXB and default_bus_bypass_iommu
|
||||
for machine. Note that default_bus_bypass_iommu is available only when
|
||||
the 'q35' machine type on x86 architecture and the 'virt' machine type
|
||||
on AArch64. Other machine types do not support bypass iommu for default
|
||||
root bus.
|
||||
|
||||
1. The following is the bypass iommu options:
|
||||
(1) PCI expander bridge
|
||||
qemu -device pxb-pcie,bus_nr=0x10,addr=0x1,bypass_iommu=true
|
||||
(2) Arm default host bridge
|
||||
qemu -machine virt,iommu=smmuv3,default_bus_bypass_iommu=true
|
||||
(3) X86 default root bus bypass iommu:
|
||||
qemu -machine q35,default_bus_bypass_iommu=true
|
||||
|
||||
2. Here is the detailed qemu command line for 'virt' machine with PXB on
|
||||
AArch64:
|
||||
|
||||
qemu-system-aarch64 \
|
||||
-machine virt,kernel_irqchip=on,iommu=smmuv3,default_bus_bypass_iommu=true \
|
||||
-device pxb-pcie,bus_nr=0x10,id=pci.10,bus=pcie.0,addr=0x3.0x1 \
|
||||
-device pxb-pcie,bus_nr=0x20,id=pci.20,bus=pcie.0,addr=0x3.0x2,bypass_iommu=true \
|
||||
|
||||
And we got:
|
||||
- a default host bridge which bypass SMMUv3
|
||||
- a pxb host bridge which go through SMMUv3
|
||||
- a pxb host bridge which bypass SMMUv3
|
||||
|
||||
3. Here is the detailed qemu command line for 'q35' machine with PXB on
|
||||
x86 architecture:
|
||||
|
||||
qemu-system-x86_64 \
|
||||
-machine q35,accel=kvm,default_bus_bypass_iommu=true \
|
||||
-device pxb-pcie,bus_nr=0x10,id=pci.10,bus=pcie.0,addr=0x3 \
|
||||
-device pxb-pcie,bus_nr=0x20,id=pci.20,bus=pcie.0,addr=0x4,bypass_iommu=true \
|
||||
-device intel-iommu \
|
||||
|
||||
And we got:
|
||||
- a default host bridge which bypass iommu
|
||||
- a pxb host bridge which go through iommu
|
||||
- a pxb host bridge which bypass iommu
|
||||
|
||||
Limitations
|
||||
===========
|
||||
There might be potential security risk when devices bypass iommu, because
|
||||
devices might send malicious dma request to virtual machine if there is no
|
||||
iommu isolation. So it would be necessary to only bypass iommu for trusted
|
||||
device.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
The bypass iommu feature includes:
|
||||
- Address space
|
||||
Add bypass iommu property check of PCI Host and do not get iommu address
|
||||
space for devices bypass iommu.
|
||||
- Arm SMMUv3 support
|
||||
We traverse all PCI root bus and get bus number ranges, then build explicit
|
||||
RID mapping for devices which do not bypass iommu.
|
||||
- X86 IOMMU support
|
||||
To support Intel iommu, we traverse all PCI host bridge and get information
|
||||
of devices which do not bypass iommu, then fill the DMAR drhd struct with
|
||||
explicit device scope info. To support AMD iommu, add check of bypass iommu
|
||||
when traverse the PCI hsot bridge.
|
||||
- Machine and PXB options
|
||||
We add bypass iommu options in machine option for default root bus, and add
|
||||
option for PXB also. Note that the default value of bypass iommu is false,
|
||||
so that the devices will by default go through iommu if there exist one.
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue