summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLin Ming <mlin@ss.pku.edu.cn>2012-05-01 00:16:27 +0800
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-05-01 14:52:12 -0400
commitab6ec39a191243b9968bb9ac7f26cc7ec30c618b (patch)
tree00f009dd98820504f014867299338af7b360a1c9
parent27abd14bd9f1117dc7bdeee81a2de0557e077b61 (diff)
xen/apic: implement io apic read with hypercall
Implements xen_io_apic_read with hypercall, so it returns proper IO-APIC information instead of fabricated one. Fallback to return an emulated IO_APIC values if hypercall fails. [v2: fallback to return an emulated IO_APIC values if hypercall fails] Signed-off-by: Lin Ming <mlin@ss.pku.edu.cn> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-rw-r--r--arch/x86/xen/apic.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/x86/xen/apic.c b/arch/x86/xen/apic.c
index 73ade38caa3..1913bf2d2a9 100644
--- a/arch/x86/xen/apic.c
+++ b/arch/x86/xen/apic.c
@@ -1,8 +1,21 @@
#include <linux/init.h>
#include <asm/x86_init.h>
+#include <asm/apic.h>
+#include <xen/interface/physdev.h>
+#include <asm/xen/hypercall.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)