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