From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konstantin Khlebnikov Subject: [PATCH] device-assignment: fix guest irq routing Date: Sun, 27 Mar 2011 23:23:01 +0400 Message-ID: <20110327192301.20148.17464.stgit@localhost6> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Cc: To: Return-path: Received: from relay.parallels.com ([195.214.232.42]:51341 "EHLO relay.parallels.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754208Ab1C0T3R (ORCPT ); Sun, 27 Mar 2011 15:29:17 -0400 Sender: kvm-owner@vger.kernel.org List-ID: For guest IRQ assign use emulated interrupt pin, not the real one. Signed-off-by: Konstantin Khlebnikov --- hw/device-assignment.c | 12 +++++------- hw/device-assignment.h | 1 - 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index db82e73..4e7ea18 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -964,13 +964,15 @@ static int assign_device(AssignedDevice *dev) static int assign_irq(AssignedDevice *dev) { struct kvm_assigned_irq assigned_irq_data; - int irq, r = 0; + int pin, irq, r = 0; + + pin = pci_get_byte(dev->dev.config + PCI_INTERRUPT_PIN); /* Interrupt PIN 0 means don't use INTx */ - if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0) + if (pin == 0) return 0; - irq = pci_map_irq(&dev->dev, dev->intpin); + irq = pci_map_irq(&dev->dev, pin - 1); irq = piix_get_irq(irq); #ifdef TARGET_IA64 @@ -1705,7 +1707,6 @@ static void reset_assigned_device(DeviceState *dev) static int assigned_initfn(struct PCIDevice *pci_dev) { AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev); - uint8_t e_device, e_intx; int r; if (!kvm_enabled()) { @@ -1732,9 +1733,6 @@ static int assigned_initfn(struct PCIDevice *pci_dev) goto out; /* handle interrupt routing */ - e_device = (dev->dev.devfn >> 3) & 0x1f; - e_intx = dev->dev.config[0x3d] - 1; - dev->intpin = e_intx; dev->run = 0; dev->girq = -1; dev->h_segnr = dev->host.seg; diff --git a/hw/device-assignment.h b/hw/device-assignment.h index 86af0a9..c5afdaf 100644 --- a/hw/device-assignment.h +++ b/hw/device-assignment.h @@ -84,7 +84,6 @@ typedef struct AssignedDevice { PCIDevice dev; PCIHostDevice host; uint32_t features; - int intpin; uint8_t debug_flags; AssignedDevRegion v_addrs[PCI_NUM_REGIONS - 1]; PCIDevRegions real_device;