aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLin Ming <mlin@ss.pku.edu.cn>2012-04-30 12:16:27 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-05-01 14:52:12 -0400
commitab6ec39a191243b9968bb9ac7f26cc7ec30c618b (patch)
tree00f009dd98820504f014867299338af7b360a1c9 /arch
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>
Diffstat (limited to 'arch')
-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 73ade38caa32..1913bf2d2a9c 100644
--- a/arch/x86/xen/apic.c
+++ b/arch/x86/xen/apic.c
@@ -1,8 +1,21 @@
1#include <linux/init.h> 1#include <linux/init.h>
2#include <asm/x86_init.h> 2#include <asm/x86_init.h>
3#include <asm/apic.h>
4#include <xen/interface/physdev.h>
5#include <asm/xen/hypercall.h>
3 6
4unsigned int xen_io_apic_read(unsigned apic, unsigned reg) 7unsigned int xen_io_apic_read(unsigned apic, unsigned reg)
5{ 8{
9 struct physdev_apic apic_op;
10 int ret;
11
12 apic_op.apic_physbase = mpc_ioapic_addr(apic);
13 apic_op.reg = reg;
14 ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op);
15 if (!ret)
16 return apic_op.value;
17
18 /* fallback to return an emulated IO_APIC values */
6 if (reg == 0x1) 19 if (reg == 0x1)
7 return 0x00170020; 20 return 0x00170020;
8 else if (reg == 0x0) 21 else if (reg == 0x0)