[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] MSI / MSIX injection for Xen HVM
Hi all This patch adds MSI / MSIX injection for Xen HVM guest. This is not new, six months ago we had a discussion in http://marc.info/?l=qemu-devel&m=130639451725966&w=2 Wei. -------8<----- MSI / MSIX injection for Xen. This is supposed to be used in conjunction with Xen's hypercall interface for emualted MSI / MSIX injection. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- hw/msi.c | 7 ++++++- hw/msix.c | 8 +++++++- hw/xen.h | 1 + xen-all.c | 5 +++++ xen-stub.c | 4 ++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/hw/msi.c b/hw/msi.c index 5d6ceb6..b11eeac 100644 --- a/hw/msi.c +++ b/hw/msi.c @@ -20,6 +20,7 @@ #include "msi.h" #include "range.h" +#include "xen.h" /* Eventually those constants should go to Linux pci_regs.h */ #define PCI_MSI_PENDING_32 0x10 @@ -257,7 +258,11 @@ void msi_notify(PCIDevice *dev, unsigned int vector) "notify vector 0x%x" " address: 0x%"PRIx64" data: 0x%"PRIx32"\n", vector, address, data); - stl_le_phys(address, data); + if (xen_enabled()) { + xen_hvm_inject_msi(address, data); + } else { + stl_le_phys(address, data); + } } /* call this function after updating configs by pci_default_write_config(). */ diff --git a/hw/msix.c b/hw/msix.c index 3835eaa..1ddd34e 100644 --- a/hw/msix.c +++ b/hw/msix.c @@ -19,6 +19,7 @@ #include "msix.h" #include "pci.h" #include "range.h" +#include "xen.h" #define MSIX_CAP_LENGTH 12 @@ -365,7 +366,12 @@ void msix_notify(PCIDevice *dev, unsigned vector) address = pci_get_quad(table_entry + PCI_MSIX_ENTRY_LOWER_ADDR); data = pci_get_long(table_entry + PCI_MSIX_ENTRY_DATA); - stl_le_phys(address, data); + + if (xen_enabled()) { + xen_hvm_inject_msi(address, data); + } else { + stl_le_phys(address, data); + } } void msix_reset(PCIDevice *dev) diff --git a/hw/xen.h b/hw/xen.h index b46879c..e5926b7 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -34,6 +34,7 @@ static inline int xen_enabled(void) int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); void xen_piix3_set_irq(void *opaque, int irq_num, int level); void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len); +void xen_hvm_inject_msi(uint64_t addr, uint32_t data); void xen_cmos_set_s3_resume(void *opaque, int irq, int level); qemu_irq *xen_interrupt_controller_init(void); diff --git a/xen-all.c b/xen-all.c index b0ed1ed..78c6df3 100644 --- a/xen-all.c +++ b/xen-all.c @@ -122,6 +122,11 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) } } +void xen_hvm_inject_msi(uint64_t addr, uint32_t data) +{ + xc_hvm_inject_msi(xen_xc, xen_domid, addr, data); +} + static void xen_suspend_notifier(Notifier *notifier, void *data) { xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3); diff --git a/xen-stub.c b/xen-stub.c index 9ea02d4..8ff2b79 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -29,6 +29,10 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) { } +void xen_hvm_inject_msi(uint64_t addr, uint32_t data) +{ +} + void xen_cmos_set_s3_resume(void *opaque, int irq, int level) { } -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |