| Konrad Rzeszutek Wilk | 31b3c9d | 2012-03-20 18:53:10 -0400 | [diff] [blame] | 1 | #include <linux/init.h> | 
| Ingo Molnar | 87e4baa | 2012-05-18 09:34:45 +0200 | [diff] [blame] | 2 |  | 
| Konrad Rzeszutek Wilk | 31b3c9d | 2012-03-20 18:53:10 -0400 | [diff] [blame] | 3 | #include <asm/x86_init.h> | 
| Lin Ming | ab6ec39 | 2012-05-01 00:16:27 +0800 | [diff] [blame] | 4 | #include <asm/apic.h> | 
| Lin Ming | ab6ec39 | 2012-05-01 00:16:27 +0800 | [diff] [blame] | 5 | #include <asm/xen/hypercall.h> | 
| Konrad Rzeszutek Wilk | 31b3c9d | 2012-03-20 18:53:10 -0400 | [diff] [blame] | 6 |  | 
| Ingo Molnar | 87e4baa | 2012-05-18 09:34:45 +0200 | [diff] [blame] | 7 | #include <xen/xen.h> | 
 | 8 | #include <xen/interface/physdev.h> | 
 | 9 |  | 
| Konrad Rzeszutek Wilk | 31b3c9d | 2012-03-20 18:53:10 -0400 | [diff] [blame] | 10 | unsigned int xen_io_apic_read(unsigned apic, unsigned reg) | 
 | 11 | { | 
| Lin Ming | ab6ec39 | 2012-05-01 00:16:27 +0800 | [diff] [blame] | 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 */ | 
| Konrad Rzeszutek Wilk | 31b3c9d | 2012-03-20 18:53:10 -0400 | [diff] [blame] | 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 | } |