| 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. |
| |