[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [VTD][patch 0/5] HVM device assignment using vt-d
The following 5 patches are re-submissions of the vt-d patch. This set of patches has been tested against cs# 15080 and is now much more mature and tested against more environments than the original patch. Specifically, we have successfully tested the patch with following environements: - 32/64-bit Linux HVM guest - 32-bit Windows XP/Vista (64-bit should work but did not test) - 32PAE/64-bit hypervisor - APIC and PIC interrupt mechanisms - PCIe E1000 and PCI E100 NICs Allen ---------------------- 1) patch description: vtd1.patch: - vt-d specific code - low risk changes in common code vtd2.patch: - io port handling vtd3.patch: - interrupt handling vtd4.patch: - mmio handling vtd5.patch: - turn on VT-d processing in ACPI table 2) how to run - Use same syntax as PV driver domain method to "hide" and assign PCI device - use pciback.hid=(02:00.0) to "hide" device from dom0 - use pci = [ '02:00.00' ] in /etc/xen/hvm.conf to assign device to HVM domain - set acpi and apic to 0 in hvm.conf as current patch only works with PIC - grub.conf: use "ioapic_ack=old" for /boot/xen.gz (io_apic.c contains code for avoiding global interrupt problem) 4) description of hvm PCI device assignment design: - pci config virtualization - Control panel and qemu changed to pass assigned PCI devices to qemu. - A new file ioemu/hw/dpci.c reads assigned devices PCI conf and constructs a new virtual device and attaches to the guest PCI bus. - PCI read/write functions are similar to other virtual devices. Except write function intercepts writes to COMMAND register and do actual hardware writes. - interrupt virtualization - Currently only works for ACPI/APIC mode - dpci.c makes a hypercall to tell xen device/intx on vPCI - In do_IRQ_guest(), when Xen determines a interrupt belongs to a device owned by HVM domain, it injects guest IRQ to the domain - Revert back to ioapic_ack=old to allow for IRQ sharing amongst guests. - Implemented new method for mask/unmask in io_apic.c to avoid spurious interrupt issue. - mmio - When guest BIOS (i.e hvmloader) or OS changes PCI BAR, PCI config write function in qemu makes a hypercall to instruct Xen to construct p2m mapping. - shadow page table fault handler have been modified to allow memory above max_pages to be mapped. - ioport - Xen intercepts guest io port accesses - translates guest io port to machine io port - does machine port access on behalf of guest 5) new hypercalls int xc_assign_device(int xc_handle, uint32_t domain_id, uint32_t machine_bdf); int xc_domain_ioport_mapping(int xc_handle, uint32_t domid, uint32_t first_gport, uint32_t first_mport, uint32_t nr_ports, uint32_t add_mapping); int xc_irq_mapping(int xc_handle, uint32_t domain_id, uint32_t method, uint32_t machine_irq, uint32_t device, uint32_t intx, uint32_t add_mapping); int xc_domain_memory_mapping(int xc_handle, uint32_t domid, unsigned long first_gfn, unsigned long first_mfn, unsigned long nr_mfns, uint32_t add_mapping); 6) interface to common code: int iommu_setup(void); int iommu_domain_init(struct domain *d); int assign_device(struct domain *d, u8 bus, u8 devfn); int release_devices(struct vcpu *v); int hvm_do_IRQ_dpci(struct domain *d, unsigned int irq); int dpci_ioport_intercept(ioreq_t *p, int type); int iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn); int iommu_unmap_page( struct domain *d, unsigned long gfn); void iommu_flush(struct domain *d, unsigned long gfn, u64 *p2m_entry); void iommu_set_pgd(struct domain *d); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |