From 76f2e28e1324ff9ad3821e59546cd944cffb296b Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Fri, 18 Oct 2019 16:21:23 +0800 Subject: [PATCH] doc: update hv device passthrough document Fixed misspellings and rst formatting issues. Added ptdev.h to the list of include file for doxygen Tracked-On: #3882 Signed-off-by: Binbin Wu Signed-off-by: David B. Kinder --- doc/acrn.doxyfile | 1 + .../hld/hv-dev-passthrough.rst | 180 ++++++++++++++---- .../hld/images/passthru-image22.png | Bin 40986 -> 25682 bytes .../hld/images/passthru-image72.png | Bin 4307 -> 0 bytes hypervisor/include/common/ptdev.h | 26 +-- 5 files changed, 154 insertions(+), 53 deletions(-) delete mode 100644 doc/developer-guides/hld/images/passthru-image72.png diff --git a/doc/acrn.doxyfile b/doc/acrn.doxyfile index 603f7ec21..4af6dcf61 100644 --- a/doc/acrn.doxyfile +++ b/doc/acrn.doxyfile @@ -808,6 +808,7 @@ INPUT = custom-doxygen/mainpage.md \ ../hypervisor/include/arch/x86/guest/vmx_io.h \ ../hypervisor/include/arch/x86/guest/assign.h \ ../hypervisor/include/common/hypercall.h \ + ../hypervisor/include/common/ptdev.h \ ../hypervisor/include/public/acrn_common.h \ ../hypervisor/include/public/acrn_hv_defs.h \ ../hypervisor/include/arch/x86/guest/vcpu.h \ diff --git a/doc/developer-guides/hld/hv-dev-passthrough.rst b/doc/developer-guides/hld/hv-dev-passthrough.rst index 855cb6375..fe730abe0 100644 --- a/doc/developer-guides/hld/hv-dev-passthrough.rst +++ b/doc/developer-guides/hld/hv-dev-passthrough.rst @@ -7,9 +7,9 @@ A critical part of virtualization is virtualizing devices: exposing all aspects of a device including its I/O, interrupts, DMA, and configuration. There are three typical device virtualization methods: emulation, para-virtualization, and passthrough. -Both emulation and passthrough are used in ACRN project. Device -emulation is discussed in :ref:`hld-io-emulation` and -device passthrough will be discussed here. +All emulation, para-virtualization and passthrough are used in ACRN project. Device +emulation is discussed in :ref:`hld-io-emulation`, para-virtualization is discussed +in :ref:`hld-virtio-devices` and device passthrough will be discussed here. In the ACRN project, device emulation means emulating all existing hardware resource through a software component device model running in the @@ -34,15 +34,18 @@ can't support device sharing. Passthrough in the hypervisor provides the following functionalities to allow VM to access PCI devices directly: -- DMA Remapping by VT-d for PCI device: hypervisor will setup DMA +- VT-d DMA Remapping for PCI devices: hypervisor will setup DMA remapping during VM initialization phase. +- VT-d Interrupt-remapping for PCI devices: hypervisor will enable + VT-d interrupt-remapping for PCI devices for security considerations. - MMIO Remapping between virtual and physical BAR - Device configuration Emulation -- Remapping interrupts for PCI device +- Remapping interrupts for PCI devices - ACPI configuration Virtualization - GSI sharing violation check -The following diagram details passthrough initialization control flow in ACRN: +The following diagram details passthrough initialization control flow in ACRN +for post-launched VM: .. figure:: images/passthru-image22.png :align: center @@ -60,14 +63,39 @@ passthrough, as detailed here: Passthrough Device Status -DMA Remapping -************* +Owner of Passthrough Devices +**************************** + +ACRN hypervisor will do PCI enumeration to discover the PCI devices on the platform. +According to the hypervisor/VM configurations, the owner of these PCI devices can be +one the following 4 cases: + +- **Hypervisor**: hypervisor uses UART device as the console in debug version for + debug purpose, so the UART device is owned by hypervisor and is not visible + to any VM. For now, UART is the only pci device could be owned by hypervisor. +- **Pre-launched VM**: The passthrough devices will be used in a pre-launched VM is + pre-defined in VM configuration. These passthrough devices are owned by the + pre-launched VM after the VM is created. These devices will not be removed + from the pre-launched VM. There could be pre-launched VM(s) in logical partition + mode and hybrid mode. +- **Service VM**: All the passthrough devices except these described above (owned by + hypervisor or pre-launched VM(s)) are assigned to Service VM. And some of these devices + can be assigned to a post-launched VM according to the passthrough device list + specified in the parameters of the ACRN DM. +- **Post-launched VM**: A list of passthrough devices can be specified in the parameters of + the ACRN DM. When creating a post-launched VM, these specified devices will be moved + from Service VM domain to the post-launched VM domain. After the post-launched VM is + powered-off, these devices will be moved back to Service VM domain. + + +VT-d DMA Remapping +****************** To enable passthrough, for VM DMA access the VM can only support GPA, while physical DMA requires HPA. One work-around is building identity mapping so that GPA is equal to HPA, but this is not recommended as some VM don't support relocation well. To -address this issue, Intel introduces VT-d in chipset to add one +address this issue, Intel introduces VT-d in the chipset to add one remapping engine to translate GPA to HPA for DMA operations. Each VT-d engine (DMAR Unit), maintains a remapping structure @@ -76,21 +104,16 @@ page table for GPA/HPA translation as output. The GPA/HPA translation page table is similar to a normal multi-level page table. VM DMA depends on Intel VT-d to do the translation from GPA to HPA, so we -need to enable VT-d IOMMU engine in ACRN before we can passthrough any device. SOS +need to enable VT-d IOMMU engine in ACRN before we can passthrough any device. Service VM in ACRN is a VM running in non-root mode which also depends -on VT-d to access a device. In SOS DMA remapping +on VT-d to access a device. In Service VM DMA remapping engine settings, GPA is equal to HPA. ACRN hypervisor checks DMA-Remapping Hardware unit Definition (DRHD) in host DMAR ACPI table to get basic info, then sets up each DMAR unit. For simplicity, ACRN reuses EPT table as the translation table in DMAR -unit for each passthrough device. The control flow is shown in the -following figures: - -.. figure:: images/passthru-image72.png - :align: center - - DMA Remapping control flow during HV init +unit for each passthrough device. The control flow of assigning and de-assigning +a passthrough device to/from a post-launched VM is shown in the following figures: .. figure:: images/passthru-image86.png :align: center @@ -102,25 +125,45 @@ following figures: ptdev de-assignment control flow +VT-d Interrupt-remapping +************************ + +The VT-d interrupt-remapping architecture enables system software to +control and censor external interrupt requests generated by all sources +including those from interrupt controllers (I/OxAPICs), MSI/MSI-X capable +devices including endpoints, root-ports and Root-Complex integrated +end-points. +ACRN forces to enabled VT-d interrupt-remapping feature for security reasons. +If the VT-d hardware doesn't support interrupt-remapping, then ACRN will +refuse to boot VMs. +VT-d Interrupt-remapping is NOT related to the translation from physical +interrupt to virtual interrupt or vice versa. The term VT-d interrupt-remapping +remaps the interrupt index in the VT-d interrupt-remapping table to the physical +interrupt vector after checking the external interrupt request is valid. Translation +physical vector to virtual vector is still needed to be done by hypervisor, which is +also described in the below section :ref:`_interrupt-remapping`. MMIO Remapping ************** For PCI MMIO BAR, hypervisor builds EPT mapping between virtual BAR and physical BAR, then VM can access MMIO directly. +There is one exception, MSI-X table is also in a MMIO BAR. Hypervisor needs to trap the +accesses to MSI-X table. So the page(s) having MSI-X table should not be accessed by guest +directly. EPT mapping is not built for these pages having MSI-X table. Device configuration emulation ****************************** PCI configuration is based on access of port 0xCF8/CFC. ACRN implements PCI configuration emulation to handle 0xCF8/CFC to control -PCI device through two paths: implemented in hypervisor or in SOS device +PCI device through two paths: implemented in hypervisor or in Service VM device model. - When configuration emulation is in the hypervisor, the interception of 0xCF8/CFC port and emulation of PCI configuration space access are tricky and unclean. Therefore the final solution is to reuse the - PCI emulation infrastructure of SOS device model. The hypervisor + PCI emulation infrastructure of Service VM device model. The hypervisor routes the UOS 0xCF8/CFC access to device model, and keeps blind to the physical PCI devices. Upon receiving UOS PCI configuration space access request, device model needs to emulate some critical space, for instance, @@ -131,6 +174,25 @@ model. this, device model is linked with lib pci access to access physical PCI device. +MSI-X table emulation +********************* + +VM accesses to MSI-X table should be trapped so that hypervisor has the +information to map the virtual vector and physical vector. EPT mapping should +be skipped for the 4KB pages having MSI-X table. + +There are three situations for the emulation of MSI-X table: + +- **Service VM**: accesses to MSI-X table are handled by HV MMIO handler (4KB adjusted up + and down). HV will remap interrupts. +- **Post-launched VM**: accesses to MSI-X Tables are handled by DM MMIO handler + (4KB adjusted up and down) and when DM (Service VM) writes to the table, it will be + intercepted by HV MMIO handler and HV will remap interrupts. +- **Pre-launched VM**: Writes to MMIO region in MSI-X Table BAR handled by HV MMIO + handler. If the offset falls within the MSI-X table (offset, offset+tables_size), + HV remaps interrupts. + + .. _interrupt-remapping: Interrupt Remapping @@ -152,17 +214,17 @@ The hypervisor will record different information for interrupt distribution: physical and virtual IOAPIC pin for IOAPIC source, physical and virtual BDF and other info for MSI source. -SOS passthrough is also in the scope of interrupt remapping which is +Service VM passthrough is also in the scope of interrupt remapping which is done on-demand rather than on hypervisor initialization. .. figure:: images/passthru-image102.png :align: center :name: init-remapping - Initialization of remapping of virtual IOAPIC interrupts for SOS + Initialization of remapping of virtual IOAPIC interrupts for Service VM :numref:`init-remapping` above illustrates how remapping of (virtual) IOAPIC -interrupts are remapped for SOS. VM exit occurs whenever SOS tries to +interrupts are remapped for Service VM. VM exit occurs whenever Service VM tries to unmask an interrupt in (virtual) IOAPIC by writing to the Redirection Table Entry (or RTE). The hypervisor then invokes the IOAPIC emulation handler (refer to :ref:`hld-io-emulation` for details on I/O emulation) which @@ -173,13 +235,13 @@ Remapping of (virtual) PIC interrupts are set up in a similar sequence: .. figure:: images/passthru-image98.png :align: center - Initialization of remapping of virtual MSI for SOS + Initialization of remapping of virtual MSI for Service VM This figure illustrates how mappings of MSI or MSIX are set up for -SOS. SOS is responsible for issuing an hypercall to notify the +Service VM. Service VM is responsible for issuing a hypercall to notify the hypervisor before it configures the PCI configuration space to enable an MSI. The hypervisor takes this opportunity to set up a remapping for the -given MSI or MSIX before it is actually enabled by SOS. +given MSI or MSIX before it is actually enabled by Service VM. When the UOS needs to access the physical device by passthrough, it uses the following steps: @@ -191,15 +253,15 @@ the following steps: according to ptirq_remapping_info. - Hypervisor delivers the interrupt to UOS. -When the SOS needs to use the physical device, the passthrough is also -active because the SOS is the first VM. The detail steps are: +When the Service VM needs to use the physical device, the passthrough is also +active because the Service VM is the first VM. The detail steps are: -- SOS get all physical interrupts. It assigns different interrupts for +- Service VM get all physical interrupts. It assigns different interrupts for different VMs during initialization and reassign when a VM is created or deleted. - When physical interrupt is trapped, an exception will happen after VMCS has been set. -- Hypervisor will handle the vm exit issue according to +- Hypervisor will handle the VM exit issue according to ptirq_remapping_info and translates the vector. - The interrupt will be injected the same as a virtual interrupt. @@ -209,32 +271,40 @@ ACPI Virtualization ACPI virtualization is designed in ACRN with these assumptions: - HV has no knowledge of ACPI, -- SOS owns all physical ACPI resources, +- Service VM owns all physical ACPI resources, - UOS sees virtual ACPI resources emulated by device model. Some passthrough devices require physical ACPI table entry for initialization. The device model will create such device entry based on the physical one according to vendor ID and device ID. Virtualization is -implemented in SOS device model and not in scope of the hypervisor. +implemented in Service VM device model and not in scope of the hypervisor. +For pre-launched VM, ACRN hypervisor doesn't support the ACPI virtualization, +so devices relying on ACPI table are not supported. GSI Sharing Violation Check *************************** All the PCI devices that are sharing the same GSI should be assigned to -the same VM to avoid physical GSI sharing between multiple VMs. For -devices that don't support MSI, ACRN DM -shares the same GSI pin to a GSI +the same VM to avoid physical GSI sharing between multiple VMs. +In logical partition mode or hybrid mode, the PCI devices assigned to +pre-launched VM is statically pre-defined. Developers should take care not to +violate the rule. +For post-launched VM, devices that don't support MSI, ACRN DM puts the devices +sharing the same GSI pin to a GSI sharing group. The devices in the same group should be assigned together to the current VM, otherwise, none of them should be assigned to the current VM. A device that violates the rule will be rejected to be -passthrough. The checking logic is implemented in Device Mode and not +passed-through. The checking logic is implemented in Device Model and not in scope of hypervisor. +The platform GSI information is in devicemodel/hw/pci/platform_gsi_info.c +for limited platform (currently, only APL MRB). For other platforms, the platform +specific GSI information should be added to activate the checking of GSI sharing violation. Data structures and interfaces ****************************** -The following APIs are provided to initialize interrupt remapping for -SOS: +The following APIs are common APIs provided to initialize interrupt remapping for +VMs: .. doxygenfunction:: ptirq_intx_pin_remap :project: Project ACRN @@ -242,8 +312,9 @@ SOS: .. doxygenfunction:: ptirq_prepare_msix_remap :project: Project ACRN -The following APIs are provided to manipulate the interrupt remapping -for UOS. +Post-launched VM needs to pre-allocate interrupt entries during VM initialization. +Post-launched VM needs to free interrupt entries during VM de-initialization. +The following APIs are provided to pre-allocate/free interrupt entries for post-launched VM: .. doxygenfunction:: ptirq_add_intx_remapping :project: Project ACRN @@ -258,3 +329,32 @@ The following APIs are provided to acknowledge a virtual interrupt. .. doxygenfunction:: ptirq_intx_ack :project: Project ACRN + +The following APIs are provided to handle ptdev interrupt: + +.. doxygenfunction:: ptdev_init + :project: Project ACRN + +.. doxygenfunction:: ptirq_softirq + :project: Project ACRN + +.. doxygenfunction:: ptirq_alloc_entry + :project: Project ACRN + +.. doxygenfunction:: ptirq_release_entry + :project: Project ACRN + +.. doxygenfunction:: ptdev_release_all_entries + :project: Project ACRN + +.. doxygenfunction:: ptirq_activate_entry + :project: Project ACRN + +.. doxygenfunction:: ptirq_deactivate_entry + :project: Project ACRN + +.. doxygenfunction:: ptirq_dequeue_softirq + :project: Project ACRN + +.. doxygenfunction:: ptirq_get_intr_data + :project: Project ACRN diff --git a/doc/developer-guides/hld/images/passthru-image22.png b/doc/developer-guides/hld/images/passthru-image22.png index b3be307149fac6420443aa5243e319105b1ea346..bd4c2fd050955ea5db92f6fad1edaadffbd09aa4 100644 GIT binary patch literal 25682 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 Um{lG8!N!s6I!4;Xns=Z74`j(eBLDyZ literal 40986 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 diff --git a/doc/developer-guides/hld/images/passthru-image72.png b/doc/developer-guides/hld/images/passthru-image72.png deleted file mode 100644 index 311a50d8a18f2ca9a6b4cc92696c4e19acab32b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4307 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 JkD7L2{{vl%9Pa=C diff --git a/hypervisor/include/common/ptdev.h b/hypervisor/include/common/ptdev.h index 4de43269f..a356497c2 100644 --- a/hypervisor/include/common/ptdev.h +++ b/hypervisor/include/common/ptdev.h @@ -156,14 +156,14 @@ extern spinlock_t ptdev_lock; /** * @brief Handler of softirq for passthrough device. * - * When hypervisor receive a physcial interrupt from passthrough device, it + * When hypervisor receive a physical interrupt from passthrough device, it * will enqueue a ptirq entry and raise softirq SOFTIRQ_PTDEV. This function * is the handler of the softirq, it handles the interrupt and injects the * virtual into VM. - * The handler is reigstered by calling @ref ptdev_init during hypervisor - * intialization. + * The handler is registered by calling @ref ptdev_init during hypervisor + * initialization. * - * @param[in] pcpu_id physcial cpu id of the soft irq + * @param[in] pcpu_id physical cpu id of the soft irq * */ void ptirq_softirq(uint16_t pcpu_id); @@ -178,14 +178,14 @@ void ptirq_softirq(uint16_t pcpu_id); */ void ptdev_init(void); /** - * @brief Deactiveate and release all ptirq entries for a VM. + * @brief Deactivate and release all ptirq entries for a VM. * - * This function deactiveates and releases all ptirq entries for a VM. The function + * This function deactivates and releases all ptirq entries for a VM. The function * should only be called after the VM is already down. * * @param[in] vm acrn_vm on which the ptirq entries will be released * - * @pre VM is realdy down + * @pre VM is already down * */ void ptdev_release_all_entries(const struct acrn_vm *vm); @@ -193,9 +193,9 @@ void ptdev_release_all_entries(const struct acrn_vm *vm); /** * @brief Dequeue an entry from per cpu ptdev softirq queue. * - * Dequeue an entry from the ptdev softirq queue on the specific physcial cpu. + * Dequeue an entry from the ptdev softirq queue on the specific physical cpu. * - * @param[in] pcpu_id physcial cpu id + * @param[in] pcpu_id physical cpu id * * @retval NULL when \p when the queue is empty * @retval !NULL when \p there is available ptirq_remapping_info entry in the queue @@ -227,11 +227,11 @@ void ptirq_release_entry(struct ptirq_remapping_info *entry); /** * @brief Activate a irq for the associated passthrough device. * - * After activating the ptirq entry, the physcial interrupt irq of passthrough device will be handled + * After activating the ptirq entry, the physical interrupt irq of passthrough device will be handled * by the handler ptirq_interrupt_handler. * - * @param[in] entry the ptirq_remapping_info entry that will be associated with the physcial irq. - * @param[in] phys_irq physcial interrupt irq for the entry + * @param[in] entry the ptirq_remapping_info entry that will be associated with the physical irq. + * @param[in] phys_irq physical interrupt irq for the entry * * @retval success when \p return value >=0 * @retval success when \p return <0 @@ -252,7 +252,7 @@ void ptirq_deactivate_entry(struct ptirq_remapping_info *entry); * @param[out] buffer the buffer to interrupt information stored to. * @param[in] buffer_cnt the size of the buffer. * - * @retval the actural size the buffer filled with the interrupt information + * @retval the actual size the buffer filled with the interrupt information * */ uint32_t ptirq_get_intr_data(const struct acrn_vm *target_vm, uint64_t *buffer, uint32_t buffer_cnt);