xref: /linux/arch/x86/xen/apic.c (revision 25aee3debe0464f6c680173041fa3de30ec9ff54)
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 
10 unsigned int xen_io_apic_read(unsigned apic, unsigned reg)
11 {
12 	struct physdev_apic apic_op;
13 	int ret;
14 
15 	apic_op.apic_physbase = mpc_ioapic_addr(apic);
16 	apic_op.reg = reg;
17 	ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op);
18 	if (!ret)
19 		return apic_op.value;
20 
21 	/* fallback to return an emulated IO_APIC values */
22 	if (reg == 0x1)
23 		return 0x00170020;
24 	else if (reg == 0x0)
25 		return apic << 24;
26 
27 	return 0xfd;
28 }
29 
30 void __init xen_init_apic(void)
31 {
32 	x86_io_apic_ops.read = xen_io_apic_read;
33 }
34