diff --git a/devicemodel/core/vmmapi.c b/devicemodel/core/vmmapi.c index ebd3e0b7f..89bc848ea 100644 --- a/devicemodel/core/vmmapi.c +++ b/devicemodel/core/vmmapi.c @@ -579,7 +579,8 @@ vm_set_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf, uint16_t phys_bdf, } int -vm_reset_ptdev_intx_info(struct vmctx *ctx, int virt_pin, bool pic_pin) +vm_reset_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf, uint16_t phys_bdf, + int virt_pin, bool pic_pin) { struct ic_ptdev_irq ptirq; @@ -587,6 +588,8 @@ vm_reset_ptdev_intx_info(struct vmctx *ctx, int virt_pin, bool pic_pin) ptirq.type = IRQ_INTX; ptirq.intx.virt_pin = virt_pin; ptirq.intx.is_pic_pin = pic_pin; + ptirq.virt_bdf = virt_bdf; + ptirq.phys_bdf = phys_bdf; return ioctl(ctx->fd, IC_RESET_PTDEV_INTR_INFO, &ptirq); } diff --git a/devicemodel/hw/pci/passthrough.c b/devicemodel/hw/pci/passthrough.c index 03c0961c8..f60efb0e3 100644 --- a/devicemodel/hw/pci/passthrough.c +++ b/devicemodel/hw/pci/passthrough.c @@ -914,7 +914,10 @@ passthru_deinit(struct vmctx *ctx, struct pci_vdev *dev, char *opts) printf("vm_reset_ptdev_intx:0x%x-%x, ioapic virpin=%d.\n", virt_bdf, ptdev->phys_bdf, dev->lintr.ioapic_irq); - vm_reset_ptdev_intx_info(ctx, dev->lintr.ioapic_irq, false); + + if (dev->lintr.pin != 0) { + vm_reset_ptdev_intx_info(ctx, virt_bdf, ptdev->phys_bdf, dev->lintr.ioapic_irq, false); + } /* unmap the physical BAR in guest MMIO space */ for (i = 0; i <= PCI_BARMAX; i++) { diff --git a/devicemodel/include/vmmapi.h b/devicemodel/include/vmmapi.h index c8248a2e5..82260f95c 100644 --- a/devicemodel/include/vmmapi.h +++ b/devicemodel/include/vmmapi.h @@ -137,7 +137,8 @@ int vm_reset_ptdev_msix_info(struct vmctx *ctx, uint16_t virt_bdf, uint16_t phys int vector_count); int vm_set_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf, uint16_t phys_bdf, int virt_pin, int phys_pin, bool pic_pin); -int vm_reset_ptdev_intx_info(struct vmctx *ctx, int virt_pin, bool pic_pin); +int vm_reset_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf, + uint16_t phys_bdf, int virt_pin, bool pic_pin); int vm_create_vcpu(struct vmctx *ctx, uint16_t vcpu_id); int vm_set_vcpu_regs(struct vmctx *ctx, struct acrn_set_vcpu_regs *cpu_regs);