1 #include <linux/init.h> 2 3 #include <asm/x86_init.h> 4 #include <asm/apic.h> 5 #include <asm/xen/hypercall.h> 6 7 #include <xen/xen.h> 8 #include <xen/interface/physdev.h> 9 #include "xen-ops.h" 10 11 static unsigned int xen_io_apic_read(unsigned apic, unsigned reg) 12 { 13 struct physdev_apic apic_op; 14 int ret; 15 16 apic_op.apic_physbase = mpc_ioapic_addr(apic); 17 apic_op.reg = reg; 18 ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op); 19 if (!ret) 20 return apic_op.value; 21 22 /* fallback to return an emulated IO_APIC values */ 23 if (reg == 0x1) 24 return 0x00170020; 25 else if (reg == 0x0) 26 return apic << 24; 27 28 return 0xfd; 29 } 30 31 void __init xen_init_apic(void) 32 { 33 x86_io_apic_ops.read = xen_io_apic_read; 34 } 35