123456789101112131415161718192021222324252627282930313233 |
- #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>
- 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;
- }
|