1 From: Suresh Siddha <suresh.b.siddha@intel.com>
2 Subject: x2apic: xen64 paravirt basic apic ops
3 References: fate #303948 and fate #303984
4 Patch-Mainline: queued for .28
5 Commit-ID: ad66dd340f561bdde2285992314d9e4fd9b6191e
7 Signed-off-by: Thomas Renninger <trenn@suse.de>
9 Define the Xen specific basic apic ops, in additon to paravirt apic ops,
10 with some misc warning fixes.
12 Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
13 Cc: Jeremy Fitzhardinge <jeremy@goop.org>
14 Cc: akpm@linux-foundation.org
15 Signed-off-by: Ingo Molnar <mingo@elte.hu>
18 arch/x86/lguest/boot.c | 4 ++--
19 arch/x86/xen/enlighten.c | 41 +++++++++++++++++++++++++++++++++++++++--
20 include/asm-x86/paravirt.h | 11 ++++++-----
21 3 files changed, 47 insertions(+), 9 deletions(-)
23 Index: linux-2.6.26/arch/x86/lguest/boot.c
24 ===================================================================
25 --- linux-2.6.26.orig/arch/x86/lguest/boot.c
26 +++ linux-2.6.26/arch/x86/lguest/boot.c
27 @@ -783,11 +783,11 @@ static void lguest_wbinvd(void)
28 * code qualifies for Advanced. It will also never interrupt anything. It
29 * does, however, allow us to get through the Linux boot code. */
30 #ifdef CONFIG_X86_LOCAL_APIC
31 -static void lguest_apic_write(unsigned long reg, u32 v)
32 +static void lguest_apic_write(u32 reg, u32 v)
36 -static u32 lguest_apic_read(unsigned long reg)
37 +static u32 lguest_apic_read(u32 reg)
41 Index: linux-2.6.26/arch/x86/xen/enlighten.c
42 ===================================================================
43 --- linux-2.6.26.orig/arch/x86/xen/enlighten.c
44 +++ linux-2.6.26/arch/x86/xen/enlighten.c
45 @@ -580,16 +580,45 @@ static void xen_io_delay(void)
48 #ifdef CONFIG_X86_LOCAL_APIC
49 -static u32 xen_apic_read(unsigned long reg)
50 +static u32 xen_apic_read(u32 reg)
55 -static void xen_apic_write(unsigned long reg, u32 val)
56 +static void xen_apic_write(u32 reg, u32 val)
58 /* Warn to see if there's any stray references */
63 +static u64 xen_apic_icr_read(void)
68 +static void xen_apic_icr_write(u32 low, u32 id)
70 + /* Warn to see if there's any stray references */
74 +static void xen_apic_wait_icr_idle(void)
79 +static struct apic_ops xen_basic_apic_ops = {
80 + .read = xen_apic_read,
81 + .write = xen_apic_write,
82 + .write_atomic = xen_apic_write,
83 + .icr_read = xen_apic_icr_read,
84 + .icr_write = xen_apic_icr_write,
85 + .wait_icr_idle = xen_apic_wait_icr_idle,
86 + .safe_wait_icr_idle = xen_apic_wait_icr_idle,
92 static void xen_flush_tlb(void)
93 @@ -1273,8 +1302,10 @@ static const struct pv_irq_ops xen_irq_o
95 static const struct pv_apic_ops xen_apic_ops __initdata = {
96 #ifdef CONFIG_X86_LOCAL_APIC
97 +#ifndef CONFIG_X86_64
98 .apic_write = xen_apic_write,
99 .apic_read = xen_apic_read,
101 .setup_boot_clock = paravirt_nop,
102 .setup_secondary_clock = paravirt_nop,
103 .startup_ipi_hook = paravirt_nop,
104 @@ -1676,6 +1707,12 @@ asmlinkage void __init xen_start_kernel(
105 pv_irq_ops = xen_irq_ops;
106 pv_apic_ops = xen_apic_ops;
107 pv_mmu_ops = xen_mmu_ops;
108 +#ifdef CONFIG_X86_64
110 + * for 64bit, set up the basic apic ops aswell.
112 + apic_ops = &xen_basic_apic_ops;
115 if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
116 pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
117 Index: linux-2.6.26/include/asm-x86/paravirt.h
118 ===================================================================
119 --- linux-2.6.26.orig/include/asm-x86/paravirt.h
120 +++ linux-2.6.26/include/asm-x86/paravirt.h
121 @@ -200,15 +200,16 @@ struct pv_irq_ops {
124 #ifdef CONFIG_X86_LOCAL_APIC
125 +#ifndef CONFIG_X86_64
127 * Direct APIC operations, principally for VMI. Ideally
128 * these shouldn't be in this interface.
130 - void (*apic_write)(unsigned long reg, u32 v);
131 - u32 (*apic_read)(unsigned long reg);
132 + void (*apic_write)(u32 reg, u32 v);
133 + u32 (*apic_read)(u32 reg);
135 void (*setup_boot_clock)(void);
136 void (*setup_secondary_clock)(void);
138 void (*startup_ipi_hook)(int phys_apicid,
139 unsigned long start_eip,
140 unsigned long start_esp);
141 @@ -902,12 +903,12 @@ static inline void slow_down_io(void)
142 * Basic functions accessing APICs.
144 #ifndef CONFIG_X86_64
145 -static inline void apic_write(unsigned long reg, u32 v)
146 +static inline void apic_write(u32 reg, u32 v)
148 PVOP_VCALL2(pv_apic_ops.apic_write, reg, v);
151 -static inline u32 apic_read(unsigned long reg)
152 +static inline u32 apic_read(u32 reg)
154 return PVOP_CALL1(unsigned long, pv_apic_ops.apic_read, reg);