x86-64: Reduce SMP locks table size
[linux-2.6-block.git] / arch / x86 / kernel / alternative.c
1 #include <linux/module.h>
2 #include <linux/sched.h>
3 #include <linux/mutex.h>
4 #include <linux/list.h>
5 #include <linux/stringify.h>
6 #include <linux/kprobes.h>
7 #include <linux/mm.h>
8 #include <linux/vmalloc.h>
9 #include <linux/memory.h>
10 #include <linux/stop_machine.h>
11 #include <linux/slab.h>
12 #include <asm/alternative.h>
13 #include <asm/sections.h>
14 #include <asm/pgtable.h>
15 #include <asm/mce.h>
16 #include <asm/nmi.h>
17 #include <asm/vsyscall.h>
18 #include <asm/cacheflush.h>
19 #include <asm/tlbflush.h>
20 #include <asm/io.h>
21 #include <asm/fixmap.h>
22
23 #define MAX_PATCH_LEN (255-1)
24
25 #ifdef CONFIG_HOTPLUG_CPU
26 static int smp_alt_once;
27
28 static int __init bootonly(char *str)
29 {
30         smp_alt_once = 1;
31         return 1;
32 }
33 __setup("smp-alt-boot", bootonly);
34 #else
35 #define smp_alt_once 1
36 #endif
37
38 static int __initdata_or_module debug_alternative;
39
40 static int __init debug_alt(char *str)
41 {
42         debug_alternative = 1;
43         return 1;
44 }
45 __setup("debug-alternative", debug_alt);
46
47 static int noreplace_smp;
48
49 static int __init setup_noreplace_smp(char *str)
50 {
51         noreplace_smp = 1;
52         return 1;
53 }
54 __setup("noreplace-smp", setup_noreplace_smp);
55
56 #ifdef CONFIG_PARAVIRT
57 static int __initdata_or_module noreplace_paravirt = 0;
58
59 static int __init setup_noreplace_paravirt(char *str)
60 {
61         noreplace_paravirt = 1;
62         return 1;
63 }
64 __setup("noreplace-paravirt", setup_noreplace_paravirt);
65 #endif
66
67 #define DPRINTK(fmt, args...) if (debug_alternative) \
68         printk(KERN_DEBUG fmt, args)
69
70 #if defined(GENERIC_NOP1) && !defined(CONFIG_X86_64)
71 /* Use inline assembly to define this because the nops are defined
72    as inline assembly strings in the include files and we cannot
73    get them easily into strings. */
74 asm("\t" __stringify(__INITRODATA_OR_MODULE) "\nintelnops: "
75         GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6
76         GENERIC_NOP7 GENERIC_NOP8
77     "\t.previous");
78 extern const unsigned char intelnops[];
79 static const unsigned char *const __initconst_or_module
80 intel_nops[ASM_NOP_MAX+1] = {
81         NULL,
82         intelnops,
83         intelnops + 1,
84         intelnops + 1 + 2,
85         intelnops + 1 + 2 + 3,
86         intelnops + 1 + 2 + 3 + 4,
87         intelnops + 1 + 2 + 3 + 4 + 5,
88         intelnops + 1 + 2 + 3 + 4 + 5 + 6,
89         intelnops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
90 };
91 #endif
92
93 #ifdef K8_NOP1
94 asm("\t" __stringify(__INITRODATA_OR_MODULE) "\nk8nops: "
95         K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6
96         K8_NOP7 K8_NOP8
97     "\t.previous");
98 extern const unsigned char k8nops[];
99 static const unsigned char *const __initconst_or_module
100 k8_nops[ASM_NOP_MAX+1] = {
101         NULL,
102         k8nops,
103         k8nops + 1,
104         k8nops + 1 + 2,
105         k8nops + 1 + 2 + 3,
106         k8nops + 1 + 2 + 3 + 4,
107         k8nops + 1 + 2 + 3 + 4 + 5,
108         k8nops + 1 + 2 + 3 + 4 + 5 + 6,
109         k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
110 };
111 #endif
112
113 #if defined(K7_NOP1) && !defined(CONFIG_X86_64)
114 asm("\t" __stringify(__INITRODATA_OR_MODULE) "\nk7nops: "
115         K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6
116         K7_NOP7 K7_NOP8
117     "\t.previous");
118 extern const unsigned char k7nops[];
119 static const unsigned char *const __initconst_or_module
120 k7_nops[ASM_NOP_MAX+1] = {
121         NULL,
122         k7nops,
123         k7nops + 1,
124         k7nops + 1 + 2,
125         k7nops + 1 + 2 + 3,
126         k7nops + 1 + 2 + 3 + 4,
127         k7nops + 1 + 2 + 3 + 4 + 5,
128         k7nops + 1 + 2 + 3 + 4 + 5 + 6,
129         k7nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
130 };
131 #endif
132
133 #ifdef P6_NOP1
134 asm("\t" __stringify(__INITRODATA_OR_MODULE) "\np6nops: "
135         P6_NOP1 P6_NOP2 P6_NOP3 P6_NOP4 P6_NOP5 P6_NOP6
136         P6_NOP7 P6_NOP8
137     "\t.previous");
138 extern const unsigned char p6nops[];
139 static const unsigned char *const __initconst_or_module
140 p6_nops[ASM_NOP_MAX+1] = {
141         NULL,
142         p6nops,
143         p6nops + 1,
144         p6nops + 1 + 2,
145         p6nops + 1 + 2 + 3,
146         p6nops + 1 + 2 + 3 + 4,
147         p6nops + 1 + 2 + 3 + 4 + 5,
148         p6nops + 1 + 2 + 3 + 4 + 5 + 6,
149         p6nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
150 };
151 #endif
152
153 #ifdef CONFIG_X86_64
154
155 extern char __vsyscall_0;
156 static const unsigned char *const *__init_or_module find_nop_table(void)
157 {
158         if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
159             boot_cpu_has(X86_FEATURE_NOPL))
160                 return p6_nops;
161         else
162                 return k8_nops;
163 }
164
165 #else /* CONFIG_X86_64 */
166
167 static const unsigned char *const *__init_or_module find_nop_table(void)
168 {
169         if (boot_cpu_has(X86_FEATURE_K8))
170                 return k8_nops;
171         else if (boot_cpu_has(X86_FEATURE_K7))
172                 return k7_nops;
173         else if (boot_cpu_has(X86_FEATURE_NOPL))
174                 return p6_nops;
175         else
176                 return intel_nops;
177 }
178
179 #endif /* CONFIG_X86_64 */
180
181 /* Use this to add nops to a buffer, then text_poke the whole buffer. */
182 static void __init_or_module add_nops(void *insns, unsigned int len)
183 {
184         const unsigned char *const *noptable = find_nop_table();
185
186         while (len > 0) {
187                 unsigned int noplen = len;
188                 if (noplen > ASM_NOP_MAX)
189                         noplen = ASM_NOP_MAX;
190                 memcpy(insns, noptable[noplen], noplen);
191                 insns += noplen;
192                 len -= noplen;
193         }
194 }
195
196 extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
197 extern s32 __smp_locks[], __smp_locks_end[];
198 static void *text_poke_early(void *addr, const void *opcode, size_t len);
199
200 /* Replace instructions with better alternatives for this CPU type.
201    This runs before SMP is initialized to avoid SMP problems with
202    self modifying code. This implies that assymetric systems where
203    APs have less capabilities than the boot processor are not handled.
204    Tough. Make sure you disable such features by hand. */
205
206 void __init_or_module apply_alternatives(struct alt_instr *start,
207                                          struct alt_instr *end)
208 {
209         struct alt_instr *a;
210         u8 insnbuf[MAX_PATCH_LEN];
211
212         DPRINTK("%s: alt table %p -> %p\n", __func__, start, end);
213         for (a = start; a < end; a++) {
214                 u8 *instr = a->instr;
215                 BUG_ON(a->replacementlen > a->instrlen);
216                 BUG_ON(a->instrlen > sizeof(insnbuf));
217                 if (!boot_cpu_has(a->cpuid))
218                         continue;
219 #ifdef CONFIG_X86_64
220                 /* vsyscall code is not mapped yet. resolve it manually. */
221                 if (instr >= (u8 *)VSYSCALL_START && instr < (u8*)VSYSCALL_END) {
222                         instr = __va(instr - (u8*)VSYSCALL_START + (u8*)__pa_symbol(&__vsyscall_0));
223                         DPRINTK("%s: vsyscall fixup: %p => %p\n",
224                                 __func__, a->instr, instr);
225                 }
226 #endif
227                 memcpy(insnbuf, a->replacement, a->replacementlen);
228                 if (*insnbuf == 0xe8 && a->replacementlen == 5)
229                     *(s32 *)(insnbuf + 1) += a->replacement - a->instr;
230                 add_nops(insnbuf + a->replacementlen,
231                          a->instrlen - a->replacementlen);
232                 text_poke_early(instr, insnbuf, a->instrlen);
233         }
234 }
235
236 #ifdef CONFIG_SMP
237
238 static void alternatives_smp_lock(const s32 *start, const s32 *end,
239                                   u8 *text, u8 *text_end)
240 {
241         const s32 *poff;
242
243         mutex_lock(&text_mutex);
244         for (poff = start; poff < end; poff++) {
245                 u8 *ptr = (u8 *)poff + *poff;
246
247                 if (!*poff || ptr < text || ptr >= text_end)
248                         continue;
249                 /* turn DS segment override prefix into lock prefix */
250                 text_poke(ptr, ((unsigned char []){0xf0}), 1);
251         };
252         mutex_unlock(&text_mutex);
253 }
254
255 static void alternatives_smp_unlock(const s32 *start, const s32 *end,
256                                     u8 *text, u8 *text_end)
257 {
258         const s32 *poff;
259
260         if (noreplace_smp)
261                 return;
262
263         mutex_lock(&text_mutex);
264         for (poff = start; poff < end; poff++) {
265                 u8 *ptr = (u8 *)poff + *poff;
266
267                 if (!*poff || ptr < text || ptr >= text_end)
268                         continue;
269                 /* turn lock prefix into DS segment override prefix */
270                 text_poke(ptr, ((unsigned char []){0x3E}), 1);
271         };
272         mutex_unlock(&text_mutex);
273 }
274
275 struct smp_alt_module {
276         /* what is this ??? */
277         struct module   *mod;
278         char            *name;
279
280         /* ptrs to lock prefixes */
281         const s32       *locks;
282         const s32       *locks_end;
283
284         /* .text segment, needed to avoid patching init code ;) */
285         u8              *text;
286         u8              *text_end;
287
288         struct list_head next;
289 };
290 static LIST_HEAD(smp_alt_modules);
291 static DEFINE_MUTEX(smp_alt);
292 static int smp_mode = 1;        /* protected by smp_alt */
293
294 void __init_or_module alternatives_smp_module_add(struct module *mod,
295                                                   char *name,
296                                                   void *locks, void *locks_end,
297                                                   void *text,  void *text_end)
298 {
299         struct smp_alt_module *smp;
300
301         if (noreplace_smp)
302                 return;
303
304         if (smp_alt_once) {
305                 if (boot_cpu_has(X86_FEATURE_UP))
306                         alternatives_smp_unlock(locks, locks_end,
307                                                 text, text_end);
308                 return;
309         }
310
311         smp = kzalloc(sizeof(*smp), GFP_KERNEL);
312         if (NULL == smp)
313                 return; /* we'll run the (safe but slow) SMP code then ... */
314
315         smp->mod        = mod;
316         smp->name       = name;
317         smp->locks      = locks;
318         smp->locks_end  = locks_end;
319         smp->text       = text;
320         smp->text_end   = text_end;
321         DPRINTK("%s: locks %p -> %p, text %p -> %p, name %s\n",
322                 __func__, smp->locks, smp->locks_end,
323                 smp->text, smp->text_end, smp->name);
324
325         mutex_lock(&smp_alt);
326         list_add_tail(&smp->next, &smp_alt_modules);
327         if (boot_cpu_has(X86_FEATURE_UP))
328                 alternatives_smp_unlock(smp->locks, smp->locks_end,
329                                         smp->text, smp->text_end);
330         mutex_unlock(&smp_alt);
331 }
332
333 void __init_or_module alternatives_smp_module_del(struct module *mod)
334 {
335         struct smp_alt_module *item;
336
337         if (smp_alt_once || noreplace_smp)
338                 return;
339
340         mutex_lock(&smp_alt);
341         list_for_each_entry(item, &smp_alt_modules, next) {
342                 if (mod != item->mod)
343                         continue;
344                 list_del(&item->next);
345                 mutex_unlock(&smp_alt);
346                 DPRINTK("%s: %s\n", __func__, item->name);
347                 kfree(item);
348                 return;
349         }
350         mutex_unlock(&smp_alt);
351 }
352
353 void alternatives_smp_switch(int smp)
354 {
355         struct smp_alt_module *mod;
356
357 #ifdef CONFIG_LOCKDEP
358         /*
359          * Older binutils section handling bug prevented
360          * alternatives-replacement from working reliably.
361          *
362          * If this still occurs then you should see a hang
363          * or crash shortly after this line:
364          */
365         printk("lockdep: fixing up alternatives.\n");
366 #endif
367
368         if (noreplace_smp || smp_alt_once)
369                 return;
370         BUG_ON(!smp && (num_online_cpus() > 1));
371
372         mutex_lock(&smp_alt);
373
374         /*
375          * Avoid unnecessary switches because it forces JIT based VMs to
376          * throw away all cached translations, which can be quite costly.
377          */
378         if (smp == smp_mode) {
379                 /* nothing */
380         } else if (smp) {
381                 printk(KERN_INFO "SMP alternatives: switching to SMP code\n");
382                 clear_cpu_cap(&boot_cpu_data, X86_FEATURE_UP);
383                 clear_cpu_cap(&cpu_data(0), X86_FEATURE_UP);
384                 list_for_each_entry(mod, &smp_alt_modules, next)
385                         alternatives_smp_lock(mod->locks, mod->locks_end,
386                                               mod->text, mod->text_end);
387         } else {
388                 printk(KERN_INFO "SMP alternatives: switching to UP code\n");
389                 set_cpu_cap(&boot_cpu_data, X86_FEATURE_UP);
390                 set_cpu_cap(&cpu_data(0), X86_FEATURE_UP);
391                 list_for_each_entry(mod, &smp_alt_modules, next)
392                         alternatives_smp_unlock(mod->locks, mod->locks_end,
393                                                 mod->text, mod->text_end);
394         }
395         smp_mode = smp;
396         mutex_unlock(&smp_alt);
397 }
398
399 /* Return 1 if the address range is reserved for smp-alternatives */
400 int alternatives_text_reserved(void *start, void *end)
401 {
402         struct smp_alt_module *mod;
403         const s32 *poff;
404         u8 *text_start = start;
405         u8 *text_end = end;
406
407         list_for_each_entry(mod, &smp_alt_modules, next) {
408                 if (mod->text > text_end || mod->text_end < text_start)
409                         continue;
410                 for (poff = mod->locks; poff < mod->locks_end; poff++) {
411                         const u8 *ptr = (const u8 *)poff + *poff;
412
413                         if (text_start <= ptr && text_end > ptr)
414                                 return 1;
415                 }
416         }
417
418         return 0;
419 }
420 #endif
421
422 #ifdef CONFIG_PARAVIRT
423 void __init_or_module apply_paravirt(struct paravirt_patch_site *start,
424                                      struct paravirt_patch_site *end)
425 {
426         struct paravirt_patch_site *p;
427         char insnbuf[MAX_PATCH_LEN];
428
429         if (noreplace_paravirt)
430                 return;
431
432         for (p = start; p < end; p++) {
433                 unsigned int used;
434
435                 BUG_ON(p->len > MAX_PATCH_LEN);
436                 /* prep the buffer with the original instructions */
437                 memcpy(insnbuf, p->instr, p->len);
438                 used = pv_init_ops.patch(p->instrtype, p->clobbers, insnbuf,
439                                          (unsigned long)p->instr, p->len);
440
441                 BUG_ON(used > p->len);
442
443                 /* Pad the rest with nops */
444                 add_nops(insnbuf + used, p->len - used);
445                 text_poke_early(p->instr, insnbuf, p->len);
446         }
447 }
448 extern struct paravirt_patch_site __start_parainstructions[],
449         __stop_parainstructions[];
450 #endif  /* CONFIG_PARAVIRT */
451
452 void __init alternative_instructions(void)
453 {
454         /* The patching is not fully atomic, so try to avoid local interruptions
455            that might execute the to be patched code.
456            Other CPUs are not running. */
457         stop_nmi();
458
459         /*
460          * Don't stop machine check exceptions while patching.
461          * MCEs only happen when something got corrupted and in this
462          * case we must do something about the corruption.
463          * Ignoring it is worse than a unlikely patching race.
464          * Also machine checks tend to be broadcast and if one CPU
465          * goes into machine check the others follow quickly, so we don't
466          * expect a machine check to cause undue problems during to code
467          * patching.
468          */
469
470         apply_alternatives(__alt_instructions, __alt_instructions_end);
471
472         /* switch to patch-once-at-boottime-only mode and free the
473          * tables in case we know the number of CPUs will never ever
474          * change */
475 #ifdef CONFIG_HOTPLUG_CPU
476         if (num_possible_cpus() < 2)
477                 smp_alt_once = 1;
478 #endif
479
480 #ifdef CONFIG_SMP
481         if (smp_alt_once) {
482                 if (1 == num_possible_cpus()) {
483                         printk(KERN_INFO "SMP alternatives: switching to UP code\n");
484                         set_cpu_cap(&boot_cpu_data, X86_FEATURE_UP);
485                         set_cpu_cap(&cpu_data(0), X86_FEATURE_UP);
486
487                         alternatives_smp_unlock(__smp_locks, __smp_locks_end,
488                                                 _text, _etext);
489                 }
490         } else {
491                 alternatives_smp_module_add(NULL, "core kernel",
492                                             __smp_locks, __smp_locks_end,
493                                             _text, _etext);
494
495                 /* Only switch to UP mode if we don't immediately boot others */
496                 if (num_present_cpus() == 1 || setup_max_cpus <= 1)
497                         alternatives_smp_switch(0);
498         }
499 #endif
500         apply_paravirt(__parainstructions, __parainstructions_end);
501
502         if (smp_alt_once)
503                 free_init_pages("SMP alternatives",
504                                 (unsigned long)__smp_locks,
505                                 (unsigned long)__smp_locks_end);
506
507         restart_nmi();
508 }
509
510 /**
511  * text_poke_early - Update instructions on a live kernel at boot time
512  * @addr: address to modify
513  * @opcode: source of the copy
514  * @len: length to copy
515  *
516  * When you use this code to patch more than one byte of an instruction
517  * you need to make sure that other CPUs cannot execute this code in parallel.
518  * Also no thread must be currently preempted in the middle of these
519  * instructions. And on the local CPU you need to be protected again NMI or MCE
520  * handlers seeing an inconsistent instruction while you patch.
521  */
522 static void *__init_or_module text_poke_early(void *addr, const void *opcode,
523                                               size_t len)
524 {
525         unsigned long flags;
526         local_irq_save(flags);
527         memcpy(addr, opcode, len);
528         sync_core();
529         local_irq_restore(flags);
530         /* Could also do a CLFLUSH here to speed up CPU recovery; but
531            that causes hangs on some VIA CPUs. */
532         return addr;
533 }
534
535 /**
536  * text_poke - Update instructions on a live kernel
537  * @addr: address to modify
538  * @opcode: source of the copy
539  * @len: length to copy
540  *
541  * Only atomic text poke/set should be allowed when not doing early patching.
542  * It means the size must be writable atomically and the address must be aligned
543  * in a way that permits an atomic write. It also makes sure we fit on a single
544  * page.
545  *
546  * Note: Must be called under text_mutex.
547  */
548 void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
549 {
550         unsigned long flags;
551         char *vaddr;
552         struct page *pages[2];
553         int i;
554
555         if (!core_kernel_text((unsigned long)addr)) {
556                 pages[0] = vmalloc_to_page(addr);
557                 pages[1] = vmalloc_to_page(addr + PAGE_SIZE);
558         } else {
559                 pages[0] = virt_to_page(addr);
560                 WARN_ON(!PageReserved(pages[0]));
561                 pages[1] = virt_to_page(addr + PAGE_SIZE);
562         }
563         BUG_ON(!pages[0]);
564         local_irq_save(flags);
565         set_fixmap(FIX_TEXT_POKE0, page_to_phys(pages[0]));
566         if (pages[1])
567                 set_fixmap(FIX_TEXT_POKE1, page_to_phys(pages[1]));
568         vaddr = (char *)fix_to_virt(FIX_TEXT_POKE0);
569         memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len);
570         clear_fixmap(FIX_TEXT_POKE0);
571         if (pages[1])
572                 clear_fixmap(FIX_TEXT_POKE1);
573         local_flush_tlb();
574         sync_core();
575         /* Could also do a CLFLUSH here to speed up CPU recovery; but
576            that causes hangs on some VIA CPUs. */
577         for (i = 0; i < len; i++)
578                 BUG_ON(((char *)addr)[i] != ((char *)opcode)[i]);
579         local_irq_restore(flags);
580         return addr;
581 }
582
583 /*
584  * Cross-modifying kernel text with stop_machine().
585  * This code originally comes from immediate value.
586  */
587 static atomic_t stop_machine_first;
588 static int wrote_text;
589
590 struct text_poke_params {
591         void *addr;
592         const void *opcode;
593         size_t len;
594 };
595
596 static int __kprobes stop_machine_text_poke(void *data)
597 {
598         struct text_poke_params *tpp = data;
599
600         if (atomic_dec_and_test(&stop_machine_first)) {
601                 text_poke(tpp->addr, tpp->opcode, tpp->len);
602                 smp_wmb();      /* Make sure other cpus see that this has run */
603                 wrote_text = 1;
604         } else {
605                 while (!wrote_text)
606                         cpu_relax();
607                 smp_mb();       /* Load wrote_text before following execution */
608         }
609
610         flush_icache_range((unsigned long)tpp->addr,
611                            (unsigned long)tpp->addr + tpp->len);
612         return 0;
613 }
614
615 /**
616  * text_poke_smp - Update instructions on a live kernel on SMP
617  * @addr: address to modify
618  * @opcode: source of the copy
619  * @len: length to copy
620  *
621  * Modify multi-byte instruction by using stop_machine() on SMP. This allows
622  * user to poke/set multi-byte text on SMP. Only non-NMI/MCE code modifying
623  * should be allowed, since stop_machine() does _not_ protect code against
624  * NMI and MCE.
625  *
626  * Note: Must be called under get_online_cpus() and text_mutex.
627  */
628 void *__kprobes text_poke_smp(void *addr, const void *opcode, size_t len)
629 {
630         struct text_poke_params tpp;
631
632         tpp.addr = addr;
633         tpp.opcode = opcode;
634         tpp.len = len;
635         atomic_set(&stop_machine_first, 1);
636         wrote_text = 0;
637         stop_machine(stop_machine_text_poke, (void *)&tpp, NULL);
638         return addr;
639 }
640