| #include <linux/init.h> |
| #include <asm/x86_init.h> |
| #include <asm/apic.h> |
| #include <xen/interface/physdev.h> |
| #include <asm/xen/hypercall.h> |
| |
| 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; |
| } |