#include <linux/init.h> #include <asm/x86_init.h> #include <asm/apic.h> #include <asm/xen/hypercall.h> #include <xen/xen.h> #include <xen/interface/physdev.h> #include "xen-ops.h" static unsigned int xen_io_apic_read(unsigned apic, unsigned reg) { struct physdev_apic apic_op; int ret; apic_op.apic_physbase = mpc_ioapic_addr(apic); apic_op.reg = reg; ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op); if (!ret) return apic_op.value; /* fallback to return an emulated IO_APIC values */ if (reg == 0x1) return 0x00170020; else if (reg == 0x0) return apic << 24; return 0xfd; } void __init xen_init_apic(void) { x86_io_apic_ops.read = xen_io_apic_read; }