--- xen-4.3.1.orig/xen/drivers/passthrough/amd/iommu_acpi.c 2013-07-09 05:46:56.000000000 -0500 +++ xen-4.3.1/xen/drivers/passthrough/amd/iommu_acpi.c 2013-07-18 02:31:38.767195258 -0500 @@ -668,26 +668,26 @@ */ for ( apic = 0; apic < nr_ioapics; apic++ ) { - if ( IO_APIC_ID(apic) != special->handle ) + if ( ioapic_sbdf[IO_APIC_ID(apic)].bdf != ioapic_sbdf[special->handle].bdf ) continue; - if ( special->handle >= ARRAY_SIZE(ioapic_sbdf) ) + if ( IO_APIC_ID(apic) >= ARRAY_SIZE(ioapic_sbdf) ) { printk(XENLOG_ERR "IVHD Error: IO-APIC %#x entry beyond bounds\n", - special->handle); + IO_APIC_ID(apic)); return 0; } - if ( ioapic_sbdf[special->handle].pin_setup ) + if ( ioapic_sbdf[IO_APIC_ID(apic)].pin_setup ) { - if ( ioapic_sbdf[special->handle].bdf == bdf && - ioapic_sbdf[special->handle].seg == seg ) + if ( ioapic_sbdf[IO_APIC_ID(apic)].bdf == bdf && + ioapic_sbdf[IO_APIC_ID(apic)].seg == seg ) AMD_IOMMU_DEBUG("IVHD Warning: Duplicate IO-APIC %#x entries\n", - special->handle); + IO_APIC_ID(apic)); else { printk(XENLOG_ERR "IVHD Error: Conflicting IO-APIC %#x entries\n", - special->handle); + IO_APIC_ID(apic)); if ( amd_iommu_perdev_intremap ) return 0; } @@ -695,10 +695,10 @@ else { /* set device id of ioapic */ - ioapic_sbdf[special->handle].bdf = bdf; - ioapic_sbdf[special->handle].seg = seg; + ioapic_sbdf[IO_APIC_ID(apic)].bdf = bdf; + ioapic_sbdf[IO_APIC_ID(apic)].seg = seg; - ioapic_sbdf[special->handle].pin_setup = xzalloc_array( + ioapic_sbdf[IO_APIC_ID(apic)].pin_setup = xzalloc_array( unsigned long, BITS_TO_LONGS(nr_ioapic_entries[apic])); if ( nr_ioapic_entries[apic] && !ioapic_sbdf[IO_APIC_ID(apic)].pin_setup )