From b126fa9cc35e42692f22be1009645b13c72c3288 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Fri, 29 Jan 2016 12:32:08 +0000 Subject: [PATCH] xen: Use libxendevicemodel for emulated IRQ handling Create the necessary shim layer for older versions of Xen, as usual using the new library API as the basis. Signed-off-by: Ian Campbell --- configure | 1 + include/hw/xen/xen_common.h | 7 +++++++ xen-hvm.c | 10 ++++++---- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 21c276a3e..3c272cfef 100755 --- a/configure +++ b/configure @@ -2183,6 +2183,7 @@ int main(void) { dm = xendevicemodel_open(NULL, 0, 0, NULL); xendevicemodel_shutdown(dm); + xendevicemodel_set_pci_intx_level(dm, 0, 0, 0, 0, 0); return 0; } EOF diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h index 803afd3bf..d8ddf8587 100644 --- a/include/hw/xen/xen_common.h +++ b/include/hw/xen/xen_common.h @@ -121,6 +121,13 @@ typedef xc_interface xendevicemodel_handle; #define xendevicemodel_s3_awaken(h) \ xc_set_hvm_param(h, xen_domid, HVM_PARAM_ACPI_S_STATE, 0); +#define xendevicemodel_set_pci_intx_level(h, d, b, dv, i, a) \ + xc_hvm_set_pci_intx_level(h, xen_domid, b, d, dv, i, a) +#define xendevicemodel_route_pci_intx_to_isa_irq(h, ix, ii) \ + xc_hvm_set_pci_link_route(h, xen_domid, ix, ii) +#define xendevicemodel_set_isa_irq_level(h, i, a) \ + xc_hvm_set_isa_irq_level(h, xen_domid, i, a) + #endif /* Xen before 4.6 */ diff --git a/xen-hvm.c b/xen-hvm.c index 28514ccf5..c090c5e75 100644 --- a/xen-hvm.c +++ b/xen-hvm.c @@ -126,8 +126,9 @@ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) void xen_piix3_set_irq(void *opaque, int irq_num, int level) { - xc_hvm_set_pci_intx_level(xen_xc, xen_domid, 0, 0, irq_num >> 2, - irq_num & 3, level); + xendevicemodel_set_pci_intx_level(xen_dm, 0, 0, + irq_num >> 2, irq_num & 3, + !!level); } void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) @@ -142,7 +143,8 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) } v &= 0xf; if (((address + i) >= 0x60) && ((address + i) <= 0x63)) { - xc_hvm_set_pci_link_route(xen_xc, xen_domid, address + i - 0x60, v); + xendevicemodel_route_pci_intx_to_isa_irq(xen_dm, + address + i - 0x60, v); } } } @@ -169,7 +171,7 @@ static void xen_suspend_notifier(Notifier *n, void *data) static void xen_set_irq(void *opaque, int irq, int level) { - xc_hvm_set_isa_irq_level(xen_xc, xen_domid, irq, level); + xendevicemodel_set_isa_irq_level(xen_dm, irq, level); } qemu_irq *xen_interrupt_controller_init(void) -- 2.39.5