Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86: fold apic_ops into genapic

Impact: cleanup

make it simpler, don't need have one extra struct.

v2: fix the sgi_uv build

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by

Yinghai Lu and committed by
Ingo Molnar
c1eeb2de 06cd9a7d

+205 -162
+31 -66
arch/x86/include/asm/apic.h
··· 92 92 return *((volatile u32 *)(APIC_BASE + reg)); 93 93 } 94 94 95 + extern void native_apic_wait_icr_idle(void); 96 + extern u32 native_safe_apic_wait_icr_idle(void); 97 + extern void native_apic_icr_write(u32 low, u32 id); 98 + extern u64 native_apic_icr_read(void); 99 + 100 + #ifdef CONFIG_X86_X2APIC 95 101 static inline void native_apic_msr_write(u32 reg, u32 v) 96 102 { 97 103 if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR || ··· 118 112 return low; 119 113 } 120 114 121 - #ifdef CONFIG_X86_X2APIC 115 + static inline void native_x2apic_wait_icr_idle(void) 116 + { 117 + /* no need to wait for icr idle in x2apic */ 118 + return; 119 + } 120 + 121 + static inline u32 native_safe_x2apic_wait_icr_idle(void) 122 + { 123 + /* no need to wait for icr idle in x2apic */ 124 + return 0; 125 + } 126 + 127 + static inline void native_x2apic_icr_write(u32 low, u32 id) 128 + { 129 + wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); 130 + } 131 + 132 + static inline u64 native_x2apic_icr_read(void) 133 + { 134 + unsigned long val; 135 + 136 + rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); 137 + return val; 138 + } 139 + 122 140 extern int x2apic; 123 141 extern void check_x2apic(void); 124 142 extern void enable_x2apic(void); ··· 176 146 } 177 147 #endif 178 148 179 - struct apic_ops { 180 - u32 (*read)(u32 reg); 181 - void (*write)(u32 reg, u32 v); 182 - u64 (*icr_read)(void); 183 - void (*icr_write)(u32 low, u32 high); 184 - void (*wait_icr_idle)(void); 185 - u32 (*safe_wait_icr_idle)(void); 186 - }; 187 - 188 - extern struct apic_ops *apic_ops; 189 - 190 - static inline u32 apic_read(u32 reg) 191 - { 192 - return apic_ops->read(reg); 193 - } 194 - 195 - static inline void apic_write(u32 reg, u32 val) 196 - { 197 - apic_ops->write(reg, val); 198 - } 199 - 200 - static inline u64 apic_icr_read(void) 201 - { 202 - return apic_ops->icr_read(); 203 - } 204 - 205 - static inline void apic_icr_write(u32 low, u32 high) 206 - { 207 - apic_ops->icr_write(low, high); 208 - } 209 - 210 - static inline void apic_wait_icr_idle(void) 211 - { 212 - apic_ops->wait_icr_idle(); 213 - } 214 - 215 - static inline u32 safe_apic_wait_icr_idle(void) 216 - { 217 - return apic_ops->safe_wait_icr_idle(); 218 - } 219 - 220 149 extern int get_physical_broadcast(void); 221 150 222 151 #ifdef CONFIG_X86_X2APIC ··· 185 196 native_apic_msr_write(APIC_EOI, 0); 186 197 } 187 198 #endif 188 - 189 - 190 - static inline void ack_APIC_irq(void) 191 - { 192 - /* 193 - * ack_APIC_irq() actually gets compiled as a single instruction 194 - * ... yummie. 195 - */ 196 - 197 - /* Docs say use 0 for future compatibility */ 198 - apic_write(APIC_EOI, 0); 199 - } 200 199 201 200 extern int lapic_get_maxlvt(void); 202 201 extern void clear_local_APIC(void); ··· 232 255 #ifdef CONFIG_X86_64 233 256 #define SET_APIC_ID(x) (apic->set_apic_id(x)) 234 257 #else 235 - 236 - #ifdef CONFIG_X86_LOCAL_APIC 237 - static inline unsigned default_get_apic_id(unsigned long x) 238 - { 239 - unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); 240 - 241 - if (APIC_XAPIC(ver)) 242 - return (x >> 24) & 0xFF; 243 - else 244 - return (x >> 24) & 0x0F; 245 - } 246 - #endif 247 258 248 259 #endif 249 260
+61
arch/x86/include/asm/genapic.h
··· 5 5 6 6 #include <asm/mpspec.h> 7 7 #include <asm/atomic.h> 8 + #include <asm/apic.h> 8 9 9 10 /* 10 11 * Copyright 2004 James Cleverdon, IBM. ··· 84 83 void (*smp_callin_clear_local_apic)(void); 85 84 void (*store_NMI_vector)(unsigned short *high, unsigned short *low); 86 85 void (*inquire_remote_apic)(int apicid); 86 + 87 + /* apic ops */ 88 + u32 (*read)(u32 reg); 89 + void (*write)(u32 reg, u32 v); 90 + u64 (*icr_read)(void); 91 + void (*icr_write)(u32 low, u32 high); 92 + void (*wait_icr_idle)(void); 93 + u32 (*safe_wait_icr_idle)(void); 87 94 }; 88 95 89 96 extern struct genapic *apic; 97 + 98 + static inline u32 apic_read(u32 reg) 99 + { 100 + return apic->read(reg); 101 + } 102 + 103 + static inline void apic_write(u32 reg, u32 val) 104 + { 105 + apic->write(reg, val); 106 + } 107 + 108 + static inline u64 apic_icr_read(void) 109 + { 110 + return apic->icr_read(); 111 + } 112 + 113 + static inline void apic_icr_write(u32 low, u32 high) 114 + { 115 + apic->icr_write(low, high); 116 + } 117 + 118 + static inline void apic_wait_icr_idle(void) 119 + { 120 + apic->wait_icr_idle(); 121 + } 122 + 123 + static inline u32 safe_apic_wait_icr_idle(void) 124 + { 125 + return apic->safe_wait_icr_idle(); 126 + } 127 + 128 + 129 + static inline void ack_APIC_irq(void) 130 + { 131 + /* 132 + * ack_APIC_irq() actually gets compiled as a single instruction 133 + * ... yummie. 134 + */ 135 + 136 + /* Docs say use 0 for future compatibility */ 137 + apic_write(APIC_EOI, 0); 138 + } 139 + 140 + static inline unsigned default_get_apic_id(unsigned long x) 141 + { 142 + unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); 143 + 144 + if (APIC_XAPIC(ver)) 145 + return (x >> 24) & 0xFF; 146 + else 147 + return (x >> 24) & 0x0F; 148 + } 90 149 91 150 /* 92 151 * Warm reset vector default position:
+4 -59
arch/x86/kernel/apic.c
··· 210 210 return lapic_get_version() >= 0x14; 211 211 } 212 212 213 - /* 214 - * Paravirt kernels also might be using these below ops. So we still 215 - * use generic apic_read()/apic_write(), which might be pointing to different 216 - * ops in PARAVIRT case. 217 - */ 218 - void xapic_wait_icr_idle(void) 213 + void native_apic_wait_icr_idle(void) 219 214 { 220 215 while (apic_read(APIC_ICR) & APIC_ICR_BUSY) 221 216 cpu_relax(); 222 217 } 223 218 224 - u32 safe_xapic_wait_icr_idle(void) 219 + u32 native_safe_apic_wait_icr_idle(void) 225 220 { 226 221 u32 send_status; 227 222 int timeout; ··· 232 237 return send_status; 233 238 } 234 239 235 - void xapic_icr_write(u32 low, u32 id) 240 + void native_apic_icr_write(u32 low, u32 id) 236 241 { 237 242 apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id)); 238 243 apic_write(APIC_ICR, low); 239 244 } 240 245 241 - static u64 xapic_icr_read(void) 246 + u64 native_apic_icr_read(void) 242 247 { 243 248 u32 icr1, icr2; 244 249 ··· 247 252 248 253 return icr1 | ((u64)icr2 << 32); 249 254 } 250 - 251 - static struct apic_ops xapic_ops = { 252 - .read = native_apic_mem_read, 253 - .write = native_apic_mem_write, 254 - .icr_read = xapic_icr_read, 255 - .icr_write = xapic_icr_write, 256 - .wait_icr_idle = xapic_wait_icr_idle, 257 - .safe_wait_icr_idle = safe_xapic_wait_icr_idle, 258 - }; 259 - 260 - struct apic_ops __read_mostly *apic_ops = &xapic_ops; 261 - EXPORT_SYMBOL_GPL(apic_ops); 262 - 263 - #ifdef CONFIG_X86_X2APIC 264 - static void x2apic_wait_icr_idle(void) 265 - { 266 - /* no need to wait for icr idle in x2apic */ 267 - return; 268 - } 269 - 270 - static u32 safe_x2apic_wait_icr_idle(void) 271 - { 272 - /* no need to wait for icr idle in x2apic */ 273 - return 0; 274 - } 275 - 276 - void x2apic_icr_write(u32 low, u32 id) 277 - { 278 - wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); 279 - } 280 - 281 - static u64 x2apic_icr_read(void) 282 - { 283 - unsigned long val; 284 - 285 - rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); 286 - return val; 287 - } 288 - 289 - static struct apic_ops x2apic_ops = { 290 - .read = native_apic_msr_read, 291 - .write = native_apic_msr_write, 292 - .icr_read = x2apic_icr_read, 293 - .icr_write = x2apic_icr_write, 294 - .wait_icr_idle = x2apic_wait_icr_idle, 295 - .safe_wait_icr_idle = safe_x2apic_wait_icr_idle, 296 - }; 297 - #endif 298 255 299 256 /** 300 257 * enable_NMI_through_LVT0 - enable NMI through local vector table 0 ··· 1276 1329 if (msr & X2APIC_ENABLE) { 1277 1330 pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); 1278 1331 x2apic_preenabled = x2apic = 1; 1279 - apic_ops = &x2apic_ops; 1280 1332 } 1281 1333 } 1282 1334 ··· 1349 1403 1350 1404 if (!x2apic) { 1351 1405 x2apic = 1; 1352 - apic_ops = &x2apic_ops; 1353 1406 enable_x2apic(); 1354 1407 } 1355 1408
+7
arch/x86/kernel/bigsmp_32.c
··· 263 263 .smp_callin_clear_local_apic = NULL, 264 264 .store_NMI_vector = NULL, 265 265 .inquire_remote_apic = default_inquire_remote_apic, 266 + 267 + .read = native_apic_mem_read, 268 + .write = native_apic_mem_write, 269 + .icr_read = native_apic_icr_read, 270 + .icr_write = native_apic_icr_write, 271 + .wait_icr_idle = native_apic_wait_icr_idle, 272 + .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 266 273 };
+1 -1
arch/x86/kernel/cpu/mcheck/mce_amd_64.c
··· 24 24 #include <linux/smp.h> 25 25 #include <linux/sysdev.h> 26 26 #include <linux/sysfs.h> 27 - #include <asm/apic.h> 27 + #include <asm/genapic.h> 28 28 #include <asm/mce.h> 29 29 #include <asm/msr.h> 30 30 #include <asm/percpu.h>
+1 -1
arch/x86/kernel/cpu/mcheck/mce_intel_64.c
··· 7 7 #include <linux/interrupt.h> 8 8 #include <linux/percpu.h> 9 9 #include <asm/processor.h> 10 - #include <asm/apic.h> 10 + #include <asm/genapic.h> 11 11 #include <asm/msr.h> 12 12 #include <asm/mce.h> 13 13 #include <asm/hw_irq.h>
+1 -1
arch/x86/kernel/cpu/perfctr-watchdog.c
··· 19 19 #include <linux/nmi.h> 20 20 #include <linux/kprobes.h> 21 21 22 - #include <asm/apic.h> 22 + #include <asm/genapic.h> 23 23 #include <asm/intel_arch_perfmon.h> 24 24 25 25 struct nmi_watchdog_ctlblk {
+7
arch/x86/kernel/es7000_32.c
··· 806 806 .smp_callin_clear_local_apic = NULL, 807 807 .store_NMI_vector = NULL, 808 808 .inquire_remote_apic = default_inquire_remote_apic, 809 + 810 + .read = native_apic_mem_read, 811 + .write = native_apic_mem_write, 812 + .icr_read = native_apic_icr_read, 813 + .icr_write = native_apic_icr_write, 814 + .wait_icr_idle = native_apic_wait_icr_idle, 815 + .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 809 816 };
+1 -1
arch/x86/kernel/genapic_64.c
··· 19 19 #include <linux/dmar.h> 20 20 21 21 #include <asm/smp.h> 22 - #include <asm/ipi.h> 23 22 #include <asm/genapic.h> 23 + #include <asm/ipi.h> 24 24 #include <asm/setup.h> 25 25 26 26 extern struct genapic apic_flat;
+15 -1
arch/x86/kernel/genapic_flat_64.c
··· 17 17 #include <linux/init.h> 18 18 #include <linux/hardirq.h> 19 19 #include <asm/smp.h> 20 - #include <asm/ipi.h> 21 20 #include <asm/genapic.h> 21 + #include <asm/ipi.h> 22 22 23 23 #ifdef CONFIG_ACPI 24 24 #include <acpi/acpi_bus.h> ··· 229 229 .smp_callin_clear_local_apic = NULL, 230 230 .store_NMI_vector = NULL, 231 231 .inquire_remote_apic = NULL, 232 + 233 + .read = native_apic_mem_read, 234 + .write = native_apic_mem_write, 235 + .icr_read = native_apic_icr_read, 236 + .icr_write = native_apic_icr_write, 237 + .wait_icr_idle = native_apic_wait_icr_idle, 238 + .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 232 239 }; 233 240 234 241 /* ··· 381 374 .smp_callin_clear_local_apic = NULL, 382 375 .store_NMI_vector = NULL, 383 376 .inquire_remote_apic = NULL, 377 + 378 + .read = native_apic_mem_read, 379 + .write = native_apic_mem_write, 380 + .icr_read = native_apic_icr_read, 381 + .icr_write = native_apic_icr_write, 382 + .wait_icr_idle = native_apic_wait_icr_idle, 383 + .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 384 384 };
+9 -2
arch/x86/kernel/genx2apic_cluster.c
··· 7 7 #include <linux/dmar.h> 8 8 9 9 #include <asm/smp.h> 10 - #include <asm/ipi.h> 11 10 #include <asm/genapic.h> 11 + #include <asm/ipi.h> 12 12 13 13 DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); 14 14 ··· 46 46 /* 47 47 * send the IPI. 48 48 */ 49 - x2apic_icr_write(cfg, apicid); 49 + native_x2apic_icr_write(cfg, apicid); 50 50 } 51 51 52 52 /* ··· 234 234 .smp_callin_clear_local_apic = NULL, 235 235 .store_NMI_vector = NULL, 236 236 .inquire_remote_apic = NULL, 237 + 238 + .read = native_apic_msr_read, 239 + .write = native_apic_msr_write, 240 + .icr_read = native_x2apic_icr_read, 241 + .icr_write = native_x2apic_icr_write, 242 + .wait_icr_idle = native_x2apic_wait_icr_idle, 243 + .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, 237 244 };
+9 -2
arch/x86/kernel/genx2apic_phys.c
··· 7 7 #include <linux/dmar.h> 8 8 9 9 #include <asm/smp.h> 10 - #include <asm/ipi.h> 11 10 #include <asm/genapic.h> 11 + #include <asm/ipi.h> 12 12 13 13 static int x2apic_phys; 14 14 ··· 50 50 /* 51 51 * send the IPI. 52 52 */ 53 - x2apic_icr_write(cfg, apicid); 53 + native_x2apic_icr_write(cfg, apicid); 54 54 } 55 55 56 56 static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) ··· 220 220 .smp_callin_clear_local_apic = NULL, 221 221 .store_NMI_vector = NULL, 222 222 .inquire_remote_apic = NULL, 223 + 224 + .read = native_apic_msr_read, 225 + .write = native_apic_msr_write, 226 + .icr_read = native_x2apic_icr_read, 227 + .icr_write = native_x2apic_icr_write, 228 + .wait_icr_idle = native_x2apic_wait_icr_idle, 229 + .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, 223 230 };
+8 -1
arch/x86/kernel/genx2apic_uv_x.c
··· 22 22 #include <linux/proc_fs.h> 23 23 #include <asm/current.h> 24 24 #include <asm/smp.h> 25 - #include <asm/ipi.h> 26 25 #include <asm/genapic.h> 26 + #include <asm/ipi.h> 27 27 #include <asm/pgtable.h> 28 28 #include <asm/uv/uv.h> 29 29 #include <asm/uv/uv_mmrs.h> ··· 292 292 .smp_callin_clear_local_apic = NULL, 293 293 .store_NMI_vector = NULL, 294 294 .inquire_remote_apic = NULL, 295 + 296 + .read = native_apic_msr_read, 297 + .write = native_apic_msr_write, 298 + .icr_read = native_x2apic_icr_read, 299 + .icr_write = native_x2apic_icr_write, 300 + .wait_icr_idle = native_x2apic_wait_icr_idle, 301 + .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, 295 302 }; 296 303 297 304 static __cpuinit void set_x2apic_extra_bits(int pnode)
+1 -1
arch/x86/kernel/ipi.c
··· 15 15 #include <asm/mtrr.h> 16 16 #include <asm/tlbflush.h> 17 17 #include <asm/mmu_context.h> 18 - #include <asm/apic.h> 18 + #include <asm/genapic.h> 19 19 #include <asm/proto.h> 20 20 #include <asm/ipi.h> 21 21
+1 -1
arch/x86/kernel/irq.c
··· 8 8 #include <linux/smp.h> 9 9 #include <linux/ftrace.h> 10 10 11 - #include <asm/apic.h> 11 + #include <asm/genapic.h> 12 12 #include <asm/io_apic.h> 13 13 #include <asm/irq.h> 14 14 #include <asm/idle.h>
+1 -1
arch/x86/kernel/nmi.c
··· 11 11 * Mikael Pettersson : PM converted to driver model. Disable/enable API. 12 12 */ 13 13 14 - #include <asm/apic.h> 14 + #include <asm/genapic.h> 15 15 16 16 #include <linux/nmi.h> 17 17 #include <linux/mm.h>
+7
arch/x86/kernel/numaq_32.c
··· 569 569 .smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic, 570 570 .store_NMI_vector = numaq_store_NMI_vector, 571 571 .inquire_remote_apic = NULL, 572 + 573 + .read = native_apic_mem_read, 574 + .write = native_apic_mem_write, 575 + .icr_read = native_apic_icr_read, 576 + .icr_write = native_apic_icr_write, 577 + .wait_icr_idle = native_apic_wait_icr_idle, 578 + .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 572 579 };
+7
arch/x86/kernel/probe_32.c
··· 127 127 .smp_callin_clear_local_apic = NULL, 128 128 .store_NMI_vector = NULL, 129 129 .inquire_remote_apic = default_inquire_remote_apic, 130 + 131 + .read = native_apic_mem_read, 132 + .write = native_apic_mem_write, 133 + .icr_read = native_apic_icr_read, 134 + .icr_write = native_apic_icr_write, 135 + .wait_icr_idle = native_apic_wait_icr_idle, 136 + .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 130 137 }; 131 138 132 139 extern struct genapic apic_numaq;
+7
arch/x86/kernel/summit_32.c
··· 599 599 .smp_callin_clear_local_apic = NULL, 600 600 .store_NMI_vector = NULL, 601 601 .inquire_remote_apic = default_inquire_remote_apic, 602 + 603 + .read = native_apic_mem_read, 604 + .write = native_apic_mem_write, 605 + .icr_read = native_apic_icr_read, 606 + .icr_write = native_apic_icr_write, 607 + .wait_icr_idle = native_apic_wait_icr_idle, 608 + .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 602 609 };
+1 -1
arch/x86/kernel/uv_irq.c
··· 11 11 #include <linux/module.h> 12 12 #include <linux/irq.h> 13 13 14 - #include <asm/apic.h> 14 + #include <asm/genapic.h> 15 15 #include <asm/uv/uv_irq.h> 16 16 17 17 static void uv_noop(unsigned int irq)
+3 -3
arch/x86/kernel/vmi_32.c
··· 32 32 #include <asm/io.h> 33 33 #include <asm/fixmap.h> 34 34 #include <asm/apicdef.h> 35 - #include <asm/apic.h> 35 + #include <asm/genapic.h> 36 36 #include <asm/processor.h> 37 37 #include <asm/timer.h> 38 38 #include <asm/vmi_time.h> ··· 798 798 #endif 799 799 800 800 #ifdef CONFIG_X86_LOCAL_APIC 801 - para_fill(apic_ops->read, APICRead); 802 - para_fill(apic_ops->write, APICWrite); 801 + para_fill(apic->read, APICRead); 802 + para_fill(apic->write, APICWrite); 803 803 #endif 804 804 805 805 /*
+1 -1
arch/x86/kernel/vmiclock_32.c
··· 30 30 #include <asm/vmi_time.h> 31 31 #include <asm/arch_hooks.h> 32 32 #include <asm/apicdef.h> 33 - #include <asm/apic.h> 33 + #include <asm/genapic.h> 34 34 #include <asm/timer.h> 35 35 #include <asm/i8253.h> 36 36 #include <asm/irq_vectors.h>
+10 -9
arch/x86/lguest/boot.c
··· 55 55 #include <linux/lguest_launcher.h> 56 56 #include <linux/virtio_console.h> 57 57 #include <linux/pm.h> 58 - #include <asm/apic.h> 58 + #include <asm/genapic.h> 59 59 #include <asm/lguest.h> 60 60 #include <asm/paravirt.h> 61 61 #include <asm/param.h> ··· 828 828 return 0; 829 829 } 830 830 831 - static struct apic_ops lguest_basic_apic_ops = { 832 - .read = lguest_apic_read, 833 - .write = lguest_apic_write, 834 - .icr_read = lguest_apic_icr_read, 835 - .icr_write = lguest_apic_icr_write, 836 - .wait_icr_idle = lguest_apic_wait_icr_idle, 837 - .safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle, 831 + static void set_lguest_basic_apic_ops(void) 832 + { 833 + apic->read = lguest_apic_read; 834 + apic->write = lguest_apic_write; 835 + apic->icr_read = lguest_apic_icr_read; 836 + apic->icr_write = lguest_apic_icr_write; 837 + apic->wait_icr_idle = lguest_apic_wait_icr_idle; 838 + apic->safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle; 838 839 }; 839 840 #endif 840 841 ··· 1036 1035 1037 1036 #ifdef CONFIG_X86_LOCAL_APIC 1038 1037 /* apic read/write intercepts */ 1039 - apic_ops = &lguest_basic_apic_ops; 1038 + set_lguest_basic_apic_ops(); 1040 1039 #endif 1041 1040 1042 1041 /* time operations */
+11 -10
arch/x86/xen/enlighten.c
··· 36 36 #include <xen/hvc-console.h> 37 37 38 38 #include <asm/paravirt.h> 39 - #include <asm/apic.h> 39 + #include <asm/genapic.h> 40 40 #include <asm/page.h> 41 41 #include <asm/xen/hypercall.h> 42 42 #include <asm/xen/hypervisor.h> ··· 554 554 return 0; 555 555 } 556 556 557 - static struct apic_ops xen_basic_apic_ops = { 558 - .read = xen_apic_read, 559 - .write = xen_apic_write, 560 - .icr_read = xen_apic_icr_read, 561 - .icr_write = xen_apic_icr_write, 562 - .wait_icr_idle = xen_apic_wait_icr_idle, 563 - .safe_wait_icr_idle = xen_safe_apic_wait_icr_idle, 564 - }; 557 + static void set_xen_basic_apic_ops(void) 558 + { 559 + apic->read = xen_apic_read; 560 + apic->write = xen_apic_write; 561 + apic->icr_read = xen_apic_icr_read; 562 + apic->icr_write = xen_apic_icr_write; 563 + apic->wait_icr_idle = xen_apic_wait_icr_idle; 564 + apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; 565 + } 565 566 566 567 #endif 567 568 ··· 899 898 /* 900 899 * set up the basic apic ops. 901 900 */ 902 - apic_ops = &xen_basic_apic_ops; 901 + set_xen_basic_apic_ops(); 903 902 #endif 904 903 905 904 if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {