diff options
| -rw-r--r-- | arch/x86/include/asm/apic.h | 97 | ||||
| -rw-r--r-- | arch/x86/include/asm/genapic.h | 61 | ||||
| -rw-r--r-- | arch/x86/kernel/apic.c | 63 | ||||
| -rw-r--r-- | arch/x86/kernel/bigsmp_32.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_intel_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perfctr-watchdog.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/es7000_32.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/genapic_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/genapic_flat_64.c | 16 | ||||
| -rw-r--r-- | arch/x86/kernel/genx2apic_cluster.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/genx2apic_phys.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/ipi.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/irq.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/nmi.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/numaq_32.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/probe_32.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/summit_32.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/uv_irq.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/vmi_32.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/vmiclock_32.c | 2 | ||||
| -rw-r--r-- | arch/x86/lguest/boot.c | 19 | ||||
| -rw-r--r-- | arch/x86/xen/enlighten.c | 21 |
24 files changed, 205 insertions, 162 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index dc1db99cd40e..4f56e053d347 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
| @@ -92,6 +92,12 @@ static inline u32 native_apic_mem_read(u32 reg) | |||
| 92 | return *((volatile u32 *)(APIC_BASE + reg)); | 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 | static inline void native_apic_msr_write(u32 reg, u32 v) | 101 | static inline void native_apic_msr_write(u32 reg, u32 v) |
| 96 | { | 102 | { |
| 97 | if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR || | 103 | if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR || |
| @@ -112,7 +118,31 @@ static inline u32 native_apic_msr_read(u32 reg) | |||
| 112 | return low; | 118 | return low; |
| 113 | } | 119 | } |
| 114 | 120 | ||
| 115 | #ifdef CONFIG_X86_X2APIC | 121 | static inline void native_x2apic_wait_icr_idle(void) |
| 122 | { | ||
| 123 | /* no need to wait for icr idle in x2apic */ | ||
| 124 | return; | ||
| 125 | } | ||
| 126 | |||
| 127 | static inline u32 native_safe_x2apic_wait_icr_idle(void) | ||
| 128 | { | ||
| 129 | /* no need to wait for icr idle in x2apic */ | ||
| 130 | return 0; | ||
| 131 | } | ||
| 132 | |||
| 133 | static inline void native_x2apic_icr_write(u32 low, u32 id) | ||
| 134 | { | ||
| 135 | wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); | ||
| 136 | } | ||
| 137 | |||
| 138 | static inline u64 native_x2apic_icr_read(void) | ||
| 139 | { | ||
| 140 | unsigned long val; | ||
| 141 | |||
| 142 | rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); | ||
| 143 | return val; | ||
| 144 | } | ||
| 145 | |||
| 116 | extern int x2apic; | 146 | extern int x2apic; |
| 117 | extern void check_x2apic(void); | 147 | extern void check_x2apic(void); |
| 118 | extern void enable_x2apic(void); | 148 | extern void enable_x2apic(void); |
| @@ -146,47 +176,6 @@ static inline int x2apic_enabled(void) | |||
| 146 | } | 176 | } |
| 147 | #endif | 177 | #endif |
| 148 | 178 | ||
| 149 | struct apic_ops { | ||
| 150 | u32 (*read)(u32 reg); | ||
| 151 | void (*write)(u32 reg, u32 v); | ||
| 152 | u64 (*icr_read)(void); | ||
| 153 | void (*icr_write)(u32 low, u32 high); | ||
| 154 | void (*wait_icr_idle)(void); | ||
| 155 | u32 (*safe_wait_icr_idle)(void); | ||
| 156 | }; | ||
| 157 | |||
| 158 | extern struct apic_ops *apic_ops; | ||
| 159 | |||
| 160 | static inline u32 apic_read(u32 reg) | ||
| 161 | { | ||
| 162 | return apic_ops->read(reg); | ||
| 163 | } | ||
| 164 | |||
| 165 | static inline void apic_write(u32 reg, u32 val) | ||
| 166 | { | ||
| 167 | apic_ops->write(reg, val); | ||
| 168 | } | ||
| 169 | |||
| 170 | static inline u64 apic_icr_read(void) | ||
| 171 | { | ||
| 172 | return apic_ops->icr_read(); | ||
| 173 | } | ||
| 174 | |||
| 175 | static inline void apic_icr_write(u32 low, u32 high) | ||
| 176 | { | ||
| 177 | apic_ops->icr_write(low, high); | ||
| 178 | } | ||
| 179 | |||
| 180 | static inline void apic_wait_icr_idle(void) | ||
| 181 | { | ||
| 182 | apic_ops->wait_icr_idle(); | ||
| 183 | } | ||
| 184 | |||
| 185 | static inline u32 safe_apic_wait_icr_idle(void) | ||
| 186 | { | ||
| 187 | return apic_ops->safe_wait_icr_idle(); | ||
| 188 | } | ||
| 189 | |||
| 190 | extern int get_physical_broadcast(void); | 179 | extern int get_physical_broadcast(void); |
| 191 | 180 | ||
| 192 | #ifdef CONFIG_X86_X2APIC | 181 | #ifdef CONFIG_X86_X2APIC |
| @@ -197,18 +186,6 @@ static inline void ack_x2APIC_irq(void) | |||
| 197 | } | 186 | } |
| 198 | #endif | 187 | #endif |
| 199 | 188 | ||
| 200 | |||
| 201 | static inline void ack_APIC_irq(void) | ||
| 202 | { | ||
| 203 | /* | ||
| 204 | * ack_APIC_irq() actually gets compiled as a single instruction | ||
| 205 | * ... yummie. | ||
| 206 | */ | ||
| 207 | |||
| 208 | /* Docs say use 0 for future compatibility */ | ||
| 209 | apic_write(APIC_EOI, 0); | ||
| 210 | } | ||
| 211 | |||
| 212 | extern int lapic_get_maxlvt(void); | 189 | extern int lapic_get_maxlvt(void); |
| 213 | extern void clear_local_APIC(void); | 190 | extern void clear_local_APIC(void); |
| 214 | extern void connect_bsp_APIC(void); | 191 | extern void connect_bsp_APIC(void); |
| @@ -256,18 +233,6 @@ static inline void disable_local_APIC(void) { } | |||
| 256 | #define SET_APIC_ID(x) (apic->set_apic_id(x)) | 233 | #define SET_APIC_ID(x) (apic->set_apic_id(x)) |
| 257 | #else | 234 | #else |
| 258 | 235 | ||
| 259 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 260 | static inline unsigned default_get_apic_id(unsigned long x) | ||
| 261 | { | ||
| 262 | unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); | ||
| 263 | |||
| 264 | if (APIC_XAPIC(ver)) | ||
| 265 | return (x >> 24) & 0xFF; | ||
| 266 | else | ||
| 267 | return (x >> 24) & 0x0F; | ||
| 268 | } | ||
| 269 | #endif | ||
| 270 | |||
| 271 | #endif | 236 | #endif |
| 272 | 237 | ||
| 273 | #endif /* _ASM_X86_APIC_H */ | 238 | #endif /* _ASM_X86_APIC_H */ |
diff --git a/arch/x86/include/asm/genapic.h b/arch/x86/include/asm/genapic.h index 273b99452ae0..a6d0b00a544c 100644 --- a/arch/x86/include/asm/genapic.h +++ b/arch/x86/include/asm/genapic.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include <asm/mpspec.h> | 6 | #include <asm/mpspec.h> |
| 7 | #include <asm/atomic.h> | 7 | #include <asm/atomic.h> |
| 8 | #include <asm/apic.h> | ||
| 8 | 9 | ||
| 9 | /* | 10 | /* |
| 10 | * Copyright 2004 James Cleverdon, IBM. | 11 | * Copyright 2004 James Cleverdon, IBM. |
| @@ -83,10 +84,70 @@ struct genapic { | |||
| 83 | void (*smp_callin_clear_local_apic)(void); | 84 | void (*smp_callin_clear_local_apic)(void); |
| 84 | void (*store_NMI_vector)(unsigned short *high, unsigned short *low); | 85 | void (*store_NMI_vector)(unsigned short *high, unsigned short *low); |
| 85 | void (*inquire_remote_apic)(int apicid); | 86 | void (*inquire_remote_apic)(int apicid); |
| 87 | |||
| 88 | /* apic ops */ | ||
| 89 | u32 (*read)(u32 reg); | ||
| 90 | void (*write)(u32 reg, u32 v); | ||
| 91 | u64 (*icr_read)(void); | ||
| 92 | void (*icr_write)(u32 low, u32 high); | ||
| 93 | void (*wait_icr_idle)(void); | ||
| 94 | u32 (*safe_wait_icr_idle)(void); | ||
| 86 | }; | 95 | }; |
| 87 | 96 | ||
| 88 | extern struct genapic *apic; | 97 | extern struct genapic *apic; |
| 89 | 98 | ||
| 99 | static inline u32 apic_read(u32 reg) | ||
| 100 | { | ||
| 101 | return apic->read(reg); | ||
| 102 | } | ||
| 103 | |||
| 104 | static inline void apic_write(u32 reg, u32 val) | ||
| 105 | { | ||
| 106 | apic->write(reg, val); | ||
| 107 | } | ||
| 108 | |||
| 109 | static inline u64 apic_icr_read(void) | ||
| 110 | { | ||
| 111 | return apic->icr_read(); | ||
| 112 | } | ||
| 113 | |||
| 114 | static inline void apic_icr_write(u32 low, u32 high) | ||
| 115 | { | ||
| 116 | apic->icr_write(low, high); | ||
| 117 | } | ||
| 118 | |||
| 119 | static inline void apic_wait_icr_idle(void) | ||
| 120 | { | ||
| 121 | apic->wait_icr_idle(); | ||
| 122 | } | ||
| 123 | |||
| 124 | static inline u32 safe_apic_wait_icr_idle(void) | ||
| 125 | { | ||
| 126 | return apic->safe_wait_icr_idle(); | ||
| 127 | } | ||
| 128 | |||
| 129 | |||
| 130 | static inline void ack_APIC_irq(void) | ||
| 131 | { | ||
| 132 | /* | ||
| 133 | * ack_APIC_irq() actually gets compiled as a single instruction | ||
| 134 | * ... yummie. | ||
| 135 | */ | ||
| 136 | |||
| 137 | /* Docs say use 0 for future compatibility */ | ||
| 138 | apic_write(APIC_EOI, 0); | ||
| 139 | } | ||
| 140 | |||
| 141 | static inline unsigned default_get_apic_id(unsigned long x) | ||
| 142 | { | ||
| 143 | unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); | ||
| 144 | |||
| 145 | if (APIC_XAPIC(ver)) | ||
| 146 | return (x >> 24) & 0xFF; | ||
| 147 | else | ||
| 148 | return (x >> 24) & 0x0F; | ||
| 149 | } | ||
| 150 | |||
| 90 | /* | 151 | /* |
| 91 | * Warm reset vector default position: | 152 | * Warm reset vector default position: |
| 92 | */ | 153 | */ |
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c index 004aa1c31e4f..af494bad8858 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c | |||
| @@ -210,18 +210,13 @@ static int modern_apic(void) | |||
| 210 | return lapic_get_version() >= 0x14; | 210 | return lapic_get_version() >= 0x14; |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | /* | 213 | void native_apic_wait_icr_idle(void) |
| 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) | ||
| 219 | { | 214 | { |
| 220 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) | 215 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) |
| 221 | cpu_relax(); | 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 | u32 send_status; | 221 | u32 send_status; |
| 227 | int timeout; | 222 | int timeout; |
| @@ -237,13 +232,13 @@ u32 safe_xapic_wait_icr_idle(void) | |||
| 237 | return send_status; | 232 | return send_status; |
| 238 | } | 233 | } |
| 239 | 234 | ||
| 240 | void xapic_icr_write(u32 low, u32 id) | 235 | void native_apic_icr_write(u32 low, u32 id) |
| 241 | { | 236 | { |
| 242 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id)); | 237 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id)); |
| 243 | apic_write(APIC_ICR, low); | 238 | apic_write(APIC_ICR, low); |
| 244 | } | 239 | } |
| 245 | 240 | ||
| 246 | static u64 xapic_icr_read(void) | 241 | u64 native_apic_icr_read(void) |
| 247 | { | 242 | { |
| 248 | u32 icr1, icr2; | 243 | u32 icr1, icr2; |
| 249 | 244 | ||
| @@ -253,54 +248,6 @@ static u64 xapic_icr_read(void) | |||
| 253 | return icr1 | ((u64)icr2 << 32); | 248 | return icr1 | ((u64)icr2 << 32); |
| 254 | } | 249 | } |
| 255 | 250 | ||
| 256 | static struct apic_ops xapic_ops = { | ||
| 257 | .read = native_apic_mem_read, | ||
| 258 | .write = native_apic_mem_write, | ||
| 259 | .icr_read = xapic_icr_read, | ||
| 260 | .icr_write = xapic_icr_write, | ||
| 261 | .wait_icr_idle = xapic_wait_icr_idle, | ||
| 262 | .safe_wait_icr_idle = safe_xapic_wait_icr_idle, | ||
| 263 | }; | ||
| 264 | |||
| 265 | struct apic_ops __read_mostly *apic_ops = &xapic_ops; | ||
| 266 | EXPORT_SYMBOL_GPL(apic_ops); | ||
| 267 | |||
| 268 | #ifdef CONFIG_X86_X2APIC | ||
| 269 | static void x2apic_wait_icr_idle(void) | ||
| 270 | { | ||
| 271 | /* no need to wait for icr idle in x2apic */ | ||
| 272 | return; | ||
| 273 | } | ||
| 274 | |||
| 275 | static u32 safe_x2apic_wait_icr_idle(void) | ||
| 276 | { | ||
| 277 | /* no need to wait for icr idle in x2apic */ | ||
| 278 | return 0; | ||
| 279 | } | ||
| 280 | |||
| 281 | void x2apic_icr_write(u32 low, u32 id) | ||
| 282 | { | ||
| 283 | wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); | ||
| 284 | } | ||
| 285 | |||
| 286 | static u64 x2apic_icr_read(void) | ||
| 287 | { | ||
| 288 | unsigned long val; | ||
| 289 | |||
| 290 | rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); | ||
| 291 | return val; | ||
| 292 | } | ||
| 293 | |||
| 294 | static struct apic_ops x2apic_ops = { | ||
| 295 | .read = native_apic_msr_read, | ||
| 296 | .write = native_apic_msr_write, | ||
| 297 | .icr_read = x2apic_icr_read, | ||
| 298 | .icr_write = x2apic_icr_write, | ||
| 299 | .wait_icr_idle = x2apic_wait_icr_idle, | ||
| 300 | .safe_wait_icr_idle = safe_x2apic_wait_icr_idle, | ||
| 301 | }; | ||
| 302 | #endif | ||
| 303 | |||
| 304 | /** | 251 | /** |
| 305 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 | 252 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 |
| 306 | */ | 253 | */ |
| @@ -1329,7 +1276,6 @@ void check_x2apic(void) | |||
| 1329 | if (msr & X2APIC_ENABLE) { | 1276 | if (msr & X2APIC_ENABLE) { |
| 1330 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); | 1277 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); |
| 1331 | x2apic_preenabled = x2apic = 1; | 1278 | x2apic_preenabled = x2apic = 1; |
| 1332 | apic_ops = &x2apic_ops; | ||
| 1333 | } | 1279 | } |
| 1334 | } | 1280 | } |
| 1335 | 1281 | ||
| @@ -1403,7 +1349,6 @@ void __init enable_IR_x2apic(void) | |||
| 1403 | 1349 | ||
| 1404 | if (!x2apic) { | 1350 | if (!x2apic) { |
| 1405 | x2apic = 1; | 1351 | x2apic = 1; |
| 1406 | apic_ops = &x2apic_ops; | ||
| 1407 | enable_x2apic(); | 1352 | enable_x2apic(); |
| 1408 | } | 1353 | } |
| 1409 | 1354 | ||
diff --git a/arch/x86/kernel/bigsmp_32.c b/arch/x86/kernel/bigsmp_32.c index 47a62f46afdb..9eeb714c5ded 100644 --- a/arch/x86/kernel/bigsmp_32.c +++ b/arch/x86/kernel/bigsmp_32.c | |||
| @@ -263,4 +263,11 @@ struct genapic apic_bigsmp = { | |||
| 263 | .smp_callin_clear_local_apic = NULL, | 263 | .smp_callin_clear_local_apic = NULL, |
| 264 | .store_NMI_vector = NULL, | 264 | .store_NMI_vector = NULL, |
| 265 | .inquire_remote_apic = default_inquire_remote_apic, | 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 | }; |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c index 4772e91e8246..e22d6ed26e61 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | #include <linux/smp.h> | 24 | #include <linux/smp.h> |
| 25 | #include <linux/sysdev.h> | 25 | #include <linux/sysdev.h> |
| 26 | #include <linux/sysfs.h> | 26 | #include <linux/sysfs.h> |
| 27 | #include <asm/apic.h> | 27 | #include <asm/genapic.h> |
| 28 | #include <asm/mce.h> | 28 | #include <asm/mce.h> |
| 29 | #include <asm/msr.h> | 29 | #include <asm/msr.h> |
| 30 | #include <asm/percpu.h> | 30 | #include <asm/percpu.h> |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c index 5e8c79e748a6..42f090702f02 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include <linux/interrupt.h> | 7 | #include <linux/interrupt.h> |
| 8 | #include <linux/percpu.h> | 8 | #include <linux/percpu.h> |
| 9 | #include <asm/processor.h> | 9 | #include <asm/processor.h> |
| 10 | #include <asm/apic.h> | 10 | #include <asm/genapic.h> |
| 11 | #include <asm/msr.h> | 11 | #include <asm/msr.h> |
| 12 | #include <asm/mce.h> | 12 | #include <asm/mce.h> |
| 13 | #include <asm/hw_irq.h> | 13 | #include <asm/hw_irq.h> |
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index 9abd48b22674..f6c70a164e32 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <linux/nmi.h> | 19 | #include <linux/nmi.h> |
| 20 | #include <linux/kprobes.h> | 20 | #include <linux/kprobes.h> |
| 21 | 21 | ||
| 22 | #include <asm/apic.h> | 22 | #include <asm/genapic.h> |
| 23 | #include <asm/intel_arch_perfmon.h> | 23 | #include <asm/intel_arch_perfmon.h> |
| 24 | 24 | ||
| 25 | struct nmi_watchdog_ctlblk { | 25 | struct nmi_watchdog_ctlblk { |
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index 55515d73d9c2..23f1df4ce18e 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
| @@ -806,4 +806,11 @@ struct genapic apic_es7000 = { | |||
| 806 | .smp_callin_clear_local_apic = NULL, | 806 | .smp_callin_clear_local_apic = NULL, |
| 807 | .store_NMI_vector = NULL, | 807 | .store_NMI_vector = NULL, |
| 808 | .inquire_remote_apic = default_inquire_remote_apic, | 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 | }; |
diff --git a/arch/x86/kernel/genapic_64.c b/arch/x86/kernel/genapic_64.c index cdc4772d9c87..70b616b4c629 100644 --- a/arch/x86/kernel/genapic_64.c +++ b/arch/x86/kernel/genapic_64.c | |||
| @@ -19,8 +19,8 @@ | |||
| 19 | #include <linux/dmar.h> | 19 | #include <linux/dmar.h> |
| 20 | 20 | ||
| 21 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
| 22 | #include <asm/ipi.h> | ||
| 23 | #include <asm/genapic.h> | 22 | #include <asm/genapic.h> |
| 23 | #include <asm/ipi.h> | ||
| 24 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
| 25 | 25 | ||
| 26 | extern struct genapic apic_flat; | 26 | extern struct genapic apic_flat; |
diff --git a/arch/x86/kernel/genapic_flat_64.c b/arch/x86/kernel/genapic_flat_64.c index 249d2d3c034c..36ee760fd133 100644 --- a/arch/x86/kernel/genapic_flat_64.c +++ b/arch/x86/kernel/genapic_flat_64.c | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 18 | #include <linux/hardirq.h> | 18 | #include <linux/hardirq.h> |
| 19 | #include <asm/smp.h> | 19 | #include <asm/smp.h> |
| 20 | #include <asm/ipi.h> | ||
| 21 | #include <asm/genapic.h> | 20 | #include <asm/genapic.h> |
| 21 | #include <asm/ipi.h> | ||
| 22 | 22 | ||
| 23 | #ifdef CONFIG_ACPI | 23 | #ifdef CONFIG_ACPI |
| 24 | #include <acpi/acpi_bus.h> | 24 | #include <acpi/acpi_bus.h> |
| @@ -229,6 +229,13 @@ struct genapic apic_flat = { | |||
| 229 | .smp_callin_clear_local_apic = NULL, | 229 | .smp_callin_clear_local_apic = NULL, |
| 230 | .store_NMI_vector = NULL, | 230 | .store_NMI_vector = NULL, |
| 231 | .inquire_remote_apic = NULL, | 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 | /* |
| @@ -374,4 +381,11 @@ struct genapic apic_physflat = { | |||
| 374 | .smp_callin_clear_local_apic = NULL, | 381 | .smp_callin_clear_local_apic = NULL, |
| 375 | .store_NMI_vector = NULL, | 382 | .store_NMI_vector = NULL, |
| 376 | .inquire_remote_apic = NULL, | 383 | .inquire_remote_apic = NULL, |
| 384 | |||
| 385 | .read = native_apic_mem_read, | ||
| 386 | .write = native_apic_mem_write, | ||
| 387 | .icr_read = native_apic_icr_read, | ||
| 388 | .icr_write = native_apic_icr_write, | ||
| 389 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 390 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 377 | }; | 391 | }; |
diff --git a/arch/x86/kernel/genx2apic_cluster.c b/arch/x86/kernel/genx2apic_cluster.c index 7c87156b6411..dd6e8d685426 100644 --- a/arch/x86/kernel/genx2apic_cluster.c +++ b/arch/x86/kernel/genx2apic_cluster.c | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | #include <linux/dmar.h> | 7 | #include <linux/dmar.h> |
| 8 | 8 | ||
| 9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
| 10 | #include <asm/ipi.h> | ||
| 11 | #include <asm/genapic.h> | 10 | #include <asm/genapic.h> |
| 11 | #include <asm/ipi.h> | ||
| 12 | 12 | ||
| 13 | DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); | 13 | DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); |
| 14 | 14 | ||
| @@ -46,7 +46,7 @@ static void | |||
| 46 | /* | 46 | /* |
| 47 | * send the IPI. | 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,4 +234,11 @@ struct genapic apic_x2apic_cluster = { | |||
| 234 | .smp_callin_clear_local_apic = NULL, | 234 | .smp_callin_clear_local_apic = NULL, |
| 235 | .store_NMI_vector = NULL, | 235 | .store_NMI_vector = NULL, |
| 236 | .inquire_remote_apic = NULL, | 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 | }; |
diff --git a/arch/x86/kernel/genx2apic_phys.c b/arch/x86/kernel/genx2apic_phys.c index 5cbae8aa0408..eb1486bb002e 100644 --- a/arch/x86/kernel/genx2apic_phys.c +++ b/arch/x86/kernel/genx2apic_phys.c | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | #include <linux/dmar.h> | 7 | #include <linux/dmar.h> |
| 8 | 8 | ||
| 9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
| 10 | #include <asm/ipi.h> | ||
| 11 | #include <asm/genapic.h> | 10 | #include <asm/genapic.h> |
| 11 | #include <asm/ipi.h> | ||
| 12 | 12 | ||
| 13 | static int x2apic_phys; | 13 | static int x2apic_phys; |
| 14 | 14 | ||
| @@ -50,7 +50,7 @@ static void __x2apic_send_IPI_dest(unsigned int apicid, int vector, | |||
| 50 | /* | 50 | /* |
| 51 | * send the IPI. | 51 | * send the IPI. |
| 52 | */ | 52 | */ |
| 53 | x2apic_icr_write(cfg, apicid); | 53 | native_x2apic_icr_write(cfg, apicid); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) | 56 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) |
| @@ -220,4 +220,11 @@ struct genapic apic_x2apic_phys = { | |||
| 220 | .smp_callin_clear_local_apic = NULL, | 220 | .smp_callin_clear_local_apic = NULL, |
| 221 | .store_NMI_vector = NULL, | 221 | .store_NMI_vector = NULL, |
| 222 | .inquire_remote_apic = NULL, | 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 | }; |
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 89b84e004f04..9ae4a92fac8c 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
| @@ -22,8 +22,8 @@ | |||
| 22 | #include <linux/proc_fs.h> | 22 | #include <linux/proc_fs.h> |
| 23 | #include <asm/current.h> | 23 | #include <asm/current.h> |
| 24 | #include <asm/smp.h> | 24 | #include <asm/smp.h> |
| 25 | #include <asm/ipi.h> | ||
| 26 | #include <asm/genapic.h> | 25 | #include <asm/genapic.h> |
| 26 | #include <asm/ipi.h> | ||
| 27 | #include <asm/pgtable.h> | 27 | #include <asm/pgtable.h> |
| 28 | #include <asm/uv/uv.h> | 28 | #include <asm/uv/uv.h> |
| 29 | #include <asm/uv/uv_mmrs.h> | 29 | #include <asm/uv/uv_mmrs.h> |
| @@ -292,6 +292,13 @@ struct genapic apic_x2apic_uv_x = { | |||
| 292 | .smp_callin_clear_local_apic = NULL, | 292 | .smp_callin_clear_local_apic = NULL, |
| 293 | .store_NMI_vector = NULL, | 293 | .store_NMI_vector = NULL, |
| 294 | .inquire_remote_apic = NULL, | 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 | static __cpuinit void set_x2apic_extra_bits(int pnode) | 304 | static __cpuinit void set_x2apic_extra_bits(int pnode) |
diff --git a/arch/x86/kernel/ipi.c b/arch/x86/kernel/ipi.c index dbf5445727a9..1326272cae43 100644 --- a/arch/x86/kernel/ipi.c +++ b/arch/x86/kernel/ipi.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <asm/mtrr.h> | 15 | #include <asm/mtrr.h> |
| 16 | #include <asm/tlbflush.h> | 16 | #include <asm/tlbflush.h> |
| 17 | #include <asm/mmu_context.h> | 17 | #include <asm/mmu_context.h> |
| 18 | #include <asm/apic.h> | 18 | #include <asm/genapic.h> |
| 19 | #include <asm/proto.h> | 19 | #include <asm/proto.h> |
| 20 | #include <asm/ipi.h> | 20 | #include <asm/ipi.h> |
| 21 | 21 | ||
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index f13ca1650aaf..3957776b1930 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | #include <linux/smp.h> | 8 | #include <linux/smp.h> |
| 9 | #include <linux/ftrace.h> | 9 | #include <linux/ftrace.h> |
| 10 | 10 | ||
| 11 | #include <asm/apic.h> | 11 | #include <asm/genapic.h> |
| 12 | #include <asm/io_apic.h> | 12 | #include <asm/io_apic.h> |
| 13 | #include <asm/irq.h> | 13 | #include <asm/irq.h> |
| 14 | #include <asm/idle.h> | 14 | #include <asm/idle.h> |
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index bdfad80c3cf1..48b9ca5e088c 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * Mikael Pettersson : PM converted to driver model. Disable/enable API. | 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 | #include <linux/nmi.h> | 16 | #include <linux/nmi.h> |
| 17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
diff --git a/arch/x86/kernel/numaq_32.c b/arch/x86/kernel/numaq_32.c index 0cc41a1d2550..f0f0c2f0596b 100644 --- a/arch/x86/kernel/numaq_32.c +++ b/arch/x86/kernel/numaq_32.c | |||
| @@ -569,4 +569,11 @@ struct genapic apic_numaq = { | |||
| 569 | .smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic, | 569 | .smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic, |
| 570 | .store_NMI_vector = numaq_store_NMI_vector, | 570 | .store_NMI_vector = numaq_store_NMI_vector, |
| 571 | .inquire_remote_apic = NULL, | 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 | }; |
diff --git a/arch/x86/kernel/probe_32.c b/arch/x86/kernel/probe_32.c index 22337b75de62..1f701caa95bc 100644 --- a/arch/x86/kernel/probe_32.c +++ b/arch/x86/kernel/probe_32.c | |||
| @@ -127,6 +127,13 @@ struct genapic apic_default = { | |||
| 127 | .smp_callin_clear_local_apic = NULL, | 127 | .smp_callin_clear_local_apic = NULL, |
| 128 | .store_NMI_vector = NULL, | 128 | .store_NMI_vector = NULL, |
| 129 | .inquire_remote_apic = default_inquire_remote_apic, | 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 | extern struct genapic apic_numaq; | 139 | extern struct genapic apic_numaq; |
diff --git a/arch/x86/kernel/summit_32.c b/arch/x86/kernel/summit_32.c index 1e733eff9b33..1cf32c325d12 100644 --- a/arch/x86/kernel/summit_32.c +++ b/arch/x86/kernel/summit_32.c | |||
| @@ -599,4 +599,11 @@ struct genapic apic_summit = { | |||
| 599 | .smp_callin_clear_local_apic = NULL, | 599 | .smp_callin_clear_local_apic = NULL, |
| 600 | .store_NMI_vector = NULL, | 600 | .store_NMI_vector = NULL, |
| 601 | .inquire_remote_apic = default_inquire_remote_apic, | 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 | }; |
diff --git a/arch/x86/kernel/uv_irq.c b/arch/x86/kernel/uv_irq.c index aeef529917e4..75eb5ec5dd2a 100644 --- a/arch/x86/kernel/uv_irq.c +++ b/arch/x86/kernel/uv_irq.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
| 13 | 13 | ||
| 14 | #include <asm/apic.h> | 14 | #include <asm/genapic.h> |
| 15 | #include <asm/uv/uv_irq.h> | 15 | #include <asm/uv/uv_irq.h> |
| 16 | 16 | ||
| 17 | static void uv_noop(unsigned int irq) | 17 | static void uv_noop(unsigned int irq) |
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index f052c84ecbe4..a1c7b71dc0d0 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | #include <asm/io.h> | 32 | #include <asm/io.h> |
| 33 | #include <asm/fixmap.h> | 33 | #include <asm/fixmap.h> |
| 34 | #include <asm/apicdef.h> | 34 | #include <asm/apicdef.h> |
| 35 | #include <asm/apic.h> | 35 | #include <asm/genapic.h> |
| 36 | #include <asm/processor.h> | 36 | #include <asm/processor.h> |
| 37 | #include <asm/timer.h> | 37 | #include <asm/timer.h> |
| 38 | #include <asm/vmi_time.h> | 38 | #include <asm/vmi_time.h> |
| @@ -798,8 +798,8 @@ static inline int __init activate_vmi(void) | |||
| 798 | #endif | 798 | #endif |
| 799 | 799 | ||
| 800 | #ifdef CONFIG_X86_LOCAL_APIC | 800 | #ifdef CONFIG_X86_LOCAL_APIC |
| 801 | para_fill(apic_ops->read, APICRead); | 801 | para_fill(apic->read, APICRead); |
| 802 | para_fill(apic_ops->write, APICWrite); | 802 | para_fill(apic->write, APICWrite); |
| 803 | #endif | 803 | #endif |
| 804 | 804 | ||
| 805 | /* | 805 | /* |
diff --git a/arch/x86/kernel/vmiclock_32.c b/arch/x86/kernel/vmiclock_32.c index a4791ef412d1..2a5e0e6a7c0d 100644 --- a/arch/x86/kernel/vmiclock_32.c +++ b/arch/x86/kernel/vmiclock_32.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | #include <asm/vmi_time.h> | 30 | #include <asm/vmi_time.h> |
| 31 | #include <asm/arch_hooks.h> | 31 | #include <asm/arch_hooks.h> |
| 32 | #include <asm/apicdef.h> | 32 | #include <asm/apicdef.h> |
| 33 | #include <asm/apic.h> | 33 | #include <asm/genapic.h> |
| 34 | #include <asm/timer.h> | 34 | #include <asm/timer.h> |
| 35 | #include <asm/i8253.h> | 35 | #include <asm/i8253.h> |
| 36 | #include <asm/irq_vectors.h> | 36 | #include <asm/irq_vectors.h> |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index da2e314f61b5..bc9893f2c383 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
| @@ -55,7 +55,7 @@ | |||
| 55 | #include <linux/lguest_launcher.h> | 55 | #include <linux/lguest_launcher.h> |
| 56 | #include <linux/virtio_console.h> | 56 | #include <linux/virtio_console.h> |
| 57 | #include <linux/pm.h> | 57 | #include <linux/pm.h> |
| 58 | #include <asm/apic.h> | 58 | #include <asm/genapic.h> |
| 59 | #include <asm/lguest.h> | 59 | #include <asm/lguest.h> |
| 60 | #include <asm/paravirt.h> | 60 | #include <asm/paravirt.h> |
| 61 | #include <asm/param.h> | 61 | #include <asm/param.h> |
| @@ -828,13 +828,14 @@ static u32 lguest_apic_safe_wait_icr_idle(void) | |||
| 828 | return 0; | 828 | return 0; |
| 829 | } | 829 | } |
| 830 | 830 | ||
| 831 | static struct apic_ops lguest_basic_apic_ops = { | 831 | static void set_lguest_basic_apic_ops(void) |
| 832 | .read = lguest_apic_read, | 832 | { |
| 833 | .write = lguest_apic_write, | 833 | apic->read = lguest_apic_read; |
| 834 | .icr_read = lguest_apic_icr_read, | 834 | apic->write = lguest_apic_write; |
| 835 | .icr_write = lguest_apic_icr_write, | 835 | apic->icr_read = lguest_apic_icr_read; |
| 836 | .wait_icr_idle = lguest_apic_wait_icr_idle, | 836 | apic->icr_write = lguest_apic_icr_write; |
| 837 | .safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle, | 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 | #endif | 840 | #endif |
| 840 | 841 | ||
| @@ -1035,7 +1036,7 @@ __init void lguest_init(void) | |||
| 1035 | 1036 | ||
| 1036 | #ifdef CONFIG_X86_LOCAL_APIC | 1037 | #ifdef CONFIG_X86_LOCAL_APIC |
| 1037 | /* apic read/write intercepts */ | 1038 | /* apic read/write intercepts */ |
| 1038 | apic_ops = &lguest_basic_apic_ops; | 1039 | set_lguest_basic_apic_ops(); |
| 1039 | #endif | 1040 | #endif |
| 1040 | 1041 | ||
| 1041 | /* time operations */ | 1042 | /* time operations */ |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 95ff6a0e942a..e3dd3fb67290 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | #include <xen/hvc-console.h> | 36 | #include <xen/hvc-console.h> |
| 37 | 37 | ||
| 38 | #include <asm/paravirt.h> | 38 | #include <asm/paravirt.h> |
| 39 | #include <asm/apic.h> | 39 | #include <asm/genapic.h> |
| 40 | #include <asm/page.h> | 40 | #include <asm/page.h> |
| 41 | #include <asm/xen/hypercall.h> | 41 | #include <asm/xen/hypercall.h> |
| 42 | #include <asm/xen/hypervisor.h> | 42 | #include <asm/xen/hypervisor.h> |
| @@ -554,14 +554,15 @@ static u32 xen_safe_apic_wait_icr_idle(void) | |||
| 554 | return 0; | 554 | return 0; |
| 555 | } | 555 | } |
| 556 | 556 | ||
| 557 | static struct apic_ops xen_basic_apic_ops = { | 557 | static void set_xen_basic_apic_ops(void) |
| 558 | .read = xen_apic_read, | 558 | { |
| 559 | .write = xen_apic_write, | 559 | apic->read = xen_apic_read; |
| 560 | .icr_read = xen_apic_icr_read, | 560 | apic->write = xen_apic_write; |
| 561 | .icr_write = xen_apic_icr_write, | 561 | apic->icr_read = xen_apic_icr_read; |
| 562 | .wait_icr_idle = xen_apic_wait_icr_idle, | 562 | apic->icr_write = xen_apic_icr_write; |
| 563 | .safe_wait_icr_idle = xen_safe_apic_wait_icr_idle, | 563 | apic->wait_icr_idle = xen_apic_wait_icr_idle; |
| 564 | }; | 564 | apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; |
| 565 | } | ||
| 565 | 566 | ||
| 566 | #endif | 567 | #endif |
| 567 | 568 | ||
| @@ -898,7 +899,7 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 898 | /* | 899 | /* |
| 899 | * set up the basic apic ops. | 900 | * set up the basic apic ops. |
| 900 | */ | 901 | */ |
| 901 | apic_ops = &xen_basic_apic_ops; | 902 | set_xen_basic_apic_ops(); |
| 902 | #endif | 903 | #endif |
| 903 | 904 | ||
| 904 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { | 905 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { |
