| 
									
										
										
										
											2012-03-20 18:53:10 -04:00
										 |  |  | #include <linux/init.h>
 | 
					
						
							| 
									
										
										
										
											2012-05-18 09:34:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 18:53:10 -04:00
										 |  |  | #include <asm/x86_init.h>
 | 
					
						
							| 
									
										
										
										
											2012-05-01 00:16:27 +08:00
										 |  |  | #include <asm/apic.h>
 | 
					
						
							|  |  |  | #include <asm/xen/hypercall.h>
 | 
					
						
							| 
									
										
										
										
											2012-03-20 18:53:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 09:34:45 +02:00
										 |  |  | #include <xen/xen.h>
 | 
					
						
							|  |  |  | #include <xen/interface/physdev.h>
 | 
					
						
							| 
									
										
										
										
											2012-08-21 14:49:34 -04:00
										 |  |  | #include "xen-ops.h"
 | 
					
						
							| 
									
										
										
										
											2012-05-18 09:34:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-21 14:49:34 -04:00
										 |  |  | static unsigned int xen_io_apic_read(unsigned apic, unsigned reg) | 
					
						
							| 
									
										
										
										
											2012-03-20 18:53:10 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-01 00:16:27 +08:00
										 |  |  | 	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 */ | 
					
						
							| 
									
										
										
										
											2012-03-20 18:53:10 -04:00
										 |  |  | 	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; | 
					
						
							|  |  |  | } |