@@ -2067,23 +2067,34 @@ static void evtchn_fixup(struct domain *d, struct kernel_info *kinfo)
printk("Allocating PPI %u for event channel interrupt\n",
d->arch.evtchn_irq);
- /* Fix up "interrupts" in /hypervisor node */
- node = fdt_path_offset(kinfo->fdt, "/hypervisor");
- if ( node < 0 )
- panic("Cannot find the /hypervisor node");
-
- /* Interrupt event channel upcall:
- * - Active-low level-sensitive
- * - All CPUs
- *
- * TODO: Handle properly the cpumask
- */
- set_interrupt_ppi(intr, d->arch.evtchn_irq, 0xf,
- DT_IRQ_TYPE_LEVEL_LOW);
- res = fdt_setprop_inplace(kinfo->fdt, node, "interrupts",
- &intr, sizeof(intr));
- if ( res )
- panic("Cannot fix up \"interrupts\" property of the hypervisor node");
+ if ( acpi_disabled )
+ {
+ /* Fix up "interrupts" in /hypervisor node */
+ node = fdt_path_offset(kinfo->fdt, "/hypervisor");
+ if ( node < 0 )
+ panic("Cannot find the /hypervisor node");
+
+ /* Interrupt event channel upcall:
+ * - Active-low level-sensitive
+ * - All CPUs
+ *
+ * TODO: Handle properly the cpumask
+ */
+ set_interrupt_ppi(intr, d->arch.evtchn_irq, 0xf,
+ DT_IRQ_TYPE_LEVEL_LOW);
+ res = fdt_setprop_inplace(kinfo->fdt, node, "interrupts",
+ &intr, sizeof(intr));
+ if ( res )
+ panic("Cannot fix up \"interrupts\" property of the hypervisor node");
+ }
+ else
+ {
+ int type = 3;
+ int flag = 2; /* Active-low level-sensitive */
+ d->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ] = (u64)type << 56
+ | flag << 8
+ | d->arch.evtchn_irq;
+ }
}
static void __init find_gnttab_region(struct domain *d,