diff options
author | Lin Ming <mlin@ss.pku.edu.cn> | 2012-04-30 12:16:27 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-05-01 14:52:12 -0400 |
commit | ab6ec39a191243b9968bb9ac7f26cc7ec30c618b (patch) | |
tree | 00f009dd98820504f014867299338af7b360a1c9 /arch | |
parent | 27abd14bd9f1117dc7bdeee81a2de0557e077b61 (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.c | 13 |
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 | ||
4 | unsigned int xen_io_apic_read(unsigned apic, unsigned reg) | 7 | unsigned 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) |