Subject: xen: add hypercall to get Xen's ACPI IRQ model Rather than having Xen and dom0 independently reach the same conclusion about the ACPI IRQ routing model (one hopes), add a hypercall so that dom0 can query Xen's state. This allows dom0 to call the ACPI _PIC method appropriately so that everyone (ACPI, Xen, dom0) all have consistent views of what the interrupt routing model is. Signed-off-by: Jeremy Fitzhardinge diff -r c484823b49a6 -r 257864bc4286 xen/arch/x86/physdev.c --- a/xen/arch/x86/physdev.c Tue Jul 14 14:39:09 2009 -0700 +++ b/xen/arch/x86/physdev.c Fri Jul 24 12:18:41 2009 -0700 @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -418,6 +419,31 @@ break; } + case PHYSDEVOP_acpi_irq_model: + if (!acpi_lapic || !acpi_ioapic) + ret = -ENODEV; + else { + uint32_t m; + struct physdev_acpi_irq_model model; + + ret = 0; + switch ( acpi_irq_model ) { + case ACPI_IRQ_MODEL_PIC: m = XEN_ACPI_IRQ_MODEL_PIC; break; + case ACPI_IRQ_MODEL_IOAPIC: m = XEN_ACPI_IRQ_MODEL_IOAPIC; break; + case ACPI_IRQ_MODEL_IOSAPIC: m = XEN_ACPI_IRQ_MODEL_IOSAPIC; break; + default: + ret = -EINVAL; + break; + } + + if (ret == 0) { + model.irq_model = m; + if ( copy_to_guest(arg, &model, sizeof(model)) != 0 ) + ret = -EFAULT; + } + } + break; + case PHYSDEVOP_set_iopl: { struct physdev_set_iopl set_iopl; ret = -EFAULT; diff -r c484823b49a6 -r 257864bc4286 xen/include/public/physdev.h --- a/xen/include/public/physdev.h Tue Jul 14 14:39:09 2009 -0700 +++ b/xen/include/public/physdev.h Fri Jul 24 12:18:41 2009 -0700 @@ -236,6 +236,30 @@ #define XENROUTEGSI_masked (1U<<_XENROUTEGSI_masked) /* + * Return Xen's ACPI interrupt model. When Xen probes ACPI and the + * host's interrupt hardware, it determines whether we're using ACPI + * for interrupt routing at all, and if so, whether its in PIC or + * IOAPIC mode. Xen then requires dom0 to match this, and call the + * appropriate corresponding AML code, which the host. + * + * Fails with ENODEV if Xen is not using ACPI for interrupts at all. + * + * @arg = pointer to physdev_acpi_irq_model + */ +#define PHYSDEVOP_acpi_irq_model 22 +struct physdev_acpi_irq_model { + /* OUT */ + uint32_t irq_model; +}; +typedef struct physdev_acpi_irq_model physdev_acpi_irq_model_t; +DEFINE_XEN_GUEST_HANDLE(physdev_acpi_irq_model_t); + +#define XEN_ACPI_IRQ_MODEL_PIC (0) +#define XEN_ACPI_IRQ_MODEL_IOAPIC (1) +#define XEN_ACPI_IRQ_MODEL_IOSAPIC (2) + + +/* * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op() * hypercall since 0x00030202. */