]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/x86/kernel/reboot.c
x86: disable IRQs before doing anything on nmi_shootdown_cpus()
[linux-2.6-omap-h63xx.git] / arch / x86 / kernel / reboot.c
1 #include <linux/module.h>
2 #include <linux/reboot.h>
3 #include <linux/init.h>
4 #include <linux/pm.h>
5 #include <linux/efi.h>
6 #include <acpi/reboot.h>
7 #include <asm/io.h>
8 #include <asm/apic.h>
9 #include <asm/desc.h>
10 #include <asm/hpet.h>
11 #include <asm/pgtable.h>
12 #include <asm/proto.h>
13 #include <asm/reboot_fixups.h>
14 #include <asm/reboot.h>
15
16 #ifdef CONFIG_X86_32
17 # include <linux/dmi.h>
18 # include <linux/ctype.h>
19 # include <linux/mc146818rtc.h>
20 #else
21 # include <asm/iommu.h>
22 #endif
23
24 #include <mach_ipi.h>
25
26
27 /*
28  * Power off function, if any
29  */
30 void (*pm_power_off)(void);
31 EXPORT_SYMBOL(pm_power_off);
32
33 static const struct desc_ptr no_idt = {};
34 static int reboot_mode;
35 enum reboot_type reboot_type = BOOT_KBD;
36 int reboot_force;
37
38 #if defined(CONFIG_X86_32) && defined(CONFIG_SMP)
39 static int reboot_cpu = -1;
40 #endif
41
42 /* reboot=b[ios] | s[mp] | t[riple] | k[bd] | e[fi] [, [w]arm | [c]old]
43    warm   Don't set the cold reboot flag
44    cold   Set the cold reboot flag
45    bios   Reboot by jumping through the BIOS (only for X86_32)
46    smp    Reboot by executing reset on BSP or other CPU (only for X86_32)
47    triple Force a triple fault (init)
48    kbd    Use the keyboard controller. cold reset (default)
49    acpi   Use the RESET_REG in the FADT
50    efi    Use efi reset_system runtime service
51    force  Avoid anything that could hang.
52  */
53 static int __init reboot_setup(char *str)
54 {
55         for (;;) {
56                 switch (*str) {
57                 case 'w':
58                         reboot_mode = 0x1234;
59                         break;
60
61                 case 'c':
62                         reboot_mode = 0;
63                         break;
64
65 #ifdef CONFIG_X86_32
66 #ifdef CONFIG_SMP
67                 case 's':
68                         if (isdigit(*(str+1))) {
69                                 reboot_cpu = (int) (*(str+1) - '0');
70                                 if (isdigit(*(str+2)))
71                                         reboot_cpu = reboot_cpu*10 + (int)(*(str+2) - '0');
72                         }
73                                 /* we will leave sorting out the final value
74                                    when we are ready to reboot, since we might not
75                                    have set up boot_cpu_id or smp_num_cpu */
76                         break;
77 #endif /* CONFIG_SMP */
78
79                 case 'b':
80 #endif
81                 case 'a':
82                 case 'k':
83                 case 't':
84                 case 'e':
85                         reboot_type = *str;
86                         break;
87
88                 case 'f':
89                         reboot_force = 1;
90                         break;
91                 }
92
93                 str = strchr(str, ',');
94                 if (str)
95                         str++;
96                 else
97                         break;
98         }
99         return 1;
100 }
101
102 __setup("reboot=", reboot_setup);
103
104
105 #ifdef CONFIG_X86_32
106 /*
107  * Reboot options and system auto-detection code provided by
108  * Dell Inc. so their systems "just work". :-)
109  */
110
111 /*
112  * Some machines require the "reboot=b"  commandline option,
113  * this quirk makes that automatic.
114  */
115 static int __init set_bios_reboot(const struct dmi_system_id *d)
116 {
117         if (reboot_type != BOOT_BIOS) {
118                 reboot_type = BOOT_BIOS;
119                 printk(KERN_INFO "%s series board detected. Selecting BIOS-method for reboots.\n", d->ident);
120         }
121         return 0;
122 }
123
124 static struct dmi_system_id __initdata reboot_dmi_table[] = {
125         {       /* Handle problems with rebooting on Dell E520's */
126                 .callback = set_bios_reboot,
127                 .ident = "Dell E520",
128                 .matches = {
129                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
130                         DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM061"),
131                 },
132         },
133         {       /* Handle problems with rebooting on Dell 1300's */
134                 .callback = set_bios_reboot,
135                 .ident = "Dell PowerEdge 1300",
136                 .matches = {
137                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
138                         DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1300/"),
139                 },
140         },
141         {       /* Handle problems with rebooting on Dell 300's */
142                 .callback = set_bios_reboot,
143                 .ident = "Dell PowerEdge 300",
144                 .matches = {
145                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
146                         DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 300/"),
147                 },
148         },
149         {       /* Handle problems with rebooting on Dell Optiplex 745's SFF*/
150                 .callback = set_bios_reboot,
151                 .ident = "Dell OptiPlex 745",
152                 .matches = {
153                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
154                         DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
155                 },
156         },
157         {       /* Handle problems with rebooting on Dell Optiplex 745's DFF*/
158                 .callback = set_bios_reboot,
159                 .ident = "Dell OptiPlex 745",
160                 .matches = {
161                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
162                         DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
163                         DMI_MATCH(DMI_BOARD_NAME, "0MM599"),
164                 },
165         },
166         {       /* Handle problems with rebooting on Dell Optiplex 745 with 0KW626 */
167                 .callback = set_bios_reboot,
168                 .ident = "Dell OptiPlex 745",
169                 .matches = {
170                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
171                         DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
172                         DMI_MATCH(DMI_BOARD_NAME, "0KW626"),
173                 },
174         },
175         {       /* Handle problems with rebooting on Dell 2400's */
176                 .callback = set_bios_reboot,
177                 .ident = "Dell PowerEdge 2400",
178                 .matches = {
179                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
180                         DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),
181                 },
182         },
183         {       /* Handle problems with rebooting on Dell T5400's */
184                 .callback = set_bios_reboot,
185                 .ident = "Dell Precision T5400",
186                 .matches = {
187                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
188                         DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"),
189                 },
190         },
191         {       /* Handle problems with rebooting on HP laptops */
192                 .callback = set_bios_reboot,
193                 .ident = "HP Compaq Laptop",
194                 .matches = {
195                         DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
196                         DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
197                 },
198         },
199         { }
200 };
201
202 static int __init reboot_init(void)
203 {
204         dmi_check_system(reboot_dmi_table);
205         return 0;
206 }
207 core_initcall(reboot_init);
208
209 /* The following code and data reboots the machine by switching to real
210    mode and jumping to the BIOS reset entry point, as if the CPU has
211    really been reset.  The previous version asked the keyboard
212    controller to pulse the CPU reset line, which is more thorough, but
213    doesn't work with at least one type of 486 motherboard.  It is easy
214    to stop this code working; hence the copious comments. */
215 static const unsigned long long
216 real_mode_gdt_entries [3] =
217 {
218         0x0000000000000000ULL,  /* Null descriptor */
219         0x00009b000000ffffULL,  /* 16-bit real-mode 64k code at 0x00000000 */
220         0x000093000100ffffULL   /* 16-bit real-mode 64k data at 0x00000100 */
221 };
222
223 static const struct desc_ptr
224 real_mode_gdt = { sizeof (real_mode_gdt_entries) - 1, (long)real_mode_gdt_entries },
225 real_mode_idt = { 0x3ff, 0 };
226
227 /* This is 16-bit protected mode code to disable paging and the cache,
228    switch to real mode and jump to the BIOS reset code.
229
230    The instruction that switches to real mode by writing to CR0 must be
231    followed immediately by a far jump instruction, which set CS to a
232    valid value for real mode, and flushes the prefetch queue to avoid
233    running instructions that have already been decoded in protected
234    mode.
235
236    Clears all the flags except ET, especially PG (paging), PE
237    (protected-mode enable) and TS (task switch for coprocessor state
238    save).  Flushes the TLB after paging has been disabled.  Sets CD and
239    NW, to disable the cache on a 486, and invalidates the cache.  This
240    is more like the state of a 486 after reset.  I don't know if
241    something else should be done for other chips.
242
243    More could be done here to set up the registers as if a CPU reset had
244    occurred; hopefully real BIOSs don't assume much. */
245 static const unsigned char real_mode_switch [] =
246 {
247         0x66, 0x0f, 0x20, 0xc0,                 /*    movl  %cr0,%eax        */
248         0x66, 0x83, 0xe0, 0x11,                 /*    andl  $0x00000011,%eax */
249         0x66, 0x0d, 0x00, 0x00, 0x00, 0x60,     /*    orl   $0x60000000,%eax */
250         0x66, 0x0f, 0x22, 0xc0,                 /*    movl  %eax,%cr0        */
251         0x66, 0x0f, 0x22, 0xd8,                 /*    movl  %eax,%cr3        */
252         0x66, 0x0f, 0x20, 0xc3,                 /*    movl  %cr0,%ebx        */
253         0x66, 0x81, 0xe3, 0x00, 0x00, 0x00, 0x60,       /*    andl  $0x60000000,%ebx */
254         0x74, 0x02,                             /*    jz    f                */
255         0x0f, 0x09,                             /*    wbinvd                 */
256         0x24, 0x10,                             /* f: andb  $0x10,al         */
257         0x66, 0x0f, 0x22, 0xc0                  /*    movl  %eax,%cr0        */
258 };
259 static const unsigned char jump_to_bios [] =
260 {
261         0xea, 0x00, 0x00, 0xff, 0xff            /*    ljmp  $0xffff,$0x0000  */
262 };
263
264 /*
265  * Switch to real mode and then execute the code
266  * specified by the code and length parameters.
267  * We assume that length will aways be less that 100!
268  */
269 void machine_real_restart(const unsigned char *code, int length)
270 {
271         local_irq_disable();
272
273         /* Write zero to CMOS register number 0x0f, which the BIOS POST
274            routine will recognize as telling it to do a proper reboot.  (Well
275            that's what this book in front of me says -- it may only apply to
276            the Phoenix BIOS though, it's not clear).  At the same time,
277            disable NMIs by setting the top bit in the CMOS address register,
278            as we're about to do peculiar things to the CPU.  I'm not sure if
279            `outb_p' is needed instead of just `outb'.  Use it to be on the
280            safe side.  (Yes, CMOS_WRITE does outb_p's. -  Paul G.)
281          */
282         spin_lock(&rtc_lock);
283         CMOS_WRITE(0x00, 0x8f);
284         spin_unlock(&rtc_lock);
285
286         /* Remap the kernel at virtual address zero, as well as offset zero
287            from the kernel segment.  This assumes the kernel segment starts at
288            virtual address PAGE_OFFSET. */
289         memcpy(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY,
290                 sizeof(swapper_pg_dir [0]) * KERNEL_PGD_PTRS);
291
292         /*
293          * Use `swapper_pg_dir' as our page directory.
294          */
295         load_cr3(swapper_pg_dir);
296
297         /* Write 0x1234 to absolute memory location 0x472.  The BIOS reads
298            this on booting to tell it to "Bypass memory test (also warm
299            boot)".  This seems like a fairly standard thing that gets set by
300            REBOOT.COM programs, and the previous reset routine did this
301            too. */
302         *((unsigned short *)0x472) = reboot_mode;
303
304         /* For the switch to real mode, copy some code to low memory.  It has
305            to be in the first 64k because it is running in 16-bit mode, and it
306            has to have the same physical and virtual address, because it turns
307            off paging.  Copy it near the end of the first page, out of the way
308            of BIOS variables. */
309         memcpy((void *)(0x1000 - sizeof(real_mode_switch) - 100),
310                 real_mode_switch, sizeof (real_mode_switch));
311         memcpy((void *)(0x1000 - 100), code, length);
312
313         /* Set up the IDT for real mode. */
314         load_idt(&real_mode_idt);
315
316         /* Set up a GDT from which we can load segment descriptors for real
317            mode.  The GDT is not used in real mode; it is just needed here to
318            prepare the descriptors. */
319         load_gdt(&real_mode_gdt);
320
321         /* Load the data segment registers, and thus the descriptors ready for
322            real mode.  The base address of each segment is 0x100, 16 times the
323            selector value being loaded here.  This is so that the segment
324            registers don't have to be reloaded after switching to real mode:
325            the values are consistent for real mode operation already. */
326         __asm__ __volatile__ ("movl $0x0010,%%eax\n"
327                                 "\tmovl %%eax,%%ds\n"
328                                 "\tmovl %%eax,%%es\n"
329                                 "\tmovl %%eax,%%fs\n"
330                                 "\tmovl %%eax,%%gs\n"
331                                 "\tmovl %%eax,%%ss" : : : "eax");
332
333         /* Jump to the 16-bit code that we copied earlier.  It disables paging
334            and the cache, switches to real mode, and jumps to the BIOS reset
335            entry point. */
336         __asm__ __volatile__ ("ljmp $0x0008,%0"
337                                 :
338                                 : "i" ((void *)(0x1000 - sizeof (real_mode_switch) - 100)));
339 }
340 #ifdef CONFIG_APM_MODULE
341 EXPORT_SYMBOL(machine_real_restart);
342 #endif
343
344 #endif /* CONFIG_X86_32 */
345
346 static inline void kb_wait(void)
347 {
348         int i;
349
350         for (i = 0; i < 0x10000; i++) {
351                 if ((inb(0x64) & 0x02) == 0)
352                         break;
353                 udelay(2);
354         }
355 }
356
357 void __attribute__((weak)) mach_reboot_fixups(void)
358 {
359 }
360
361 static void native_machine_emergency_restart(void)
362 {
363         int i;
364
365         /* Tell the BIOS if we want cold or warm reboot */
366         *((unsigned short *)__va(0x472)) = reboot_mode;
367
368         for (;;) {
369                 /* Could also try the reset bit in the Hammer NB */
370                 switch (reboot_type) {
371                 case BOOT_KBD:
372                         mach_reboot_fixups(); /* for board specific fixups */
373
374                         for (i = 0; i < 10; i++) {
375                                 kb_wait();
376                                 udelay(50);
377                                 outb(0xfe, 0x64); /* pulse reset low */
378                                 udelay(50);
379                         }
380
381                 case BOOT_TRIPLE:
382                         load_idt(&no_idt);
383                         __asm__ __volatile__("int3");
384
385                         reboot_type = BOOT_KBD;
386                         break;
387
388 #ifdef CONFIG_X86_32
389                 case BOOT_BIOS:
390                         machine_real_restart(jump_to_bios, sizeof(jump_to_bios));
391
392                         reboot_type = BOOT_KBD;
393                         break;
394 #endif
395
396                 case BOOT_ACPI:
397                         acpi_reboot();
398                         reboot_type = BOOT_KBD;
399                         break;
400
401
402                 case BOOT_EFI:
403                         if (efi_enabled)
404                                 efi.reset_system(reboot_mode ? EFI_RESET_WARM : EFI_RESET_COLD,
405                                                  EFI_SUCCESS, 0, NULL);
406
407                         reboot_type = BOOT_KBD;
408                         break;
409                 }
410         }
411 }
412
413 void native_machine_shutdown(void)
414 {
415         /* Stop the cpus and apics */
416 #ifdef CONFIG_SMP
417
418         /* The boot cpu is always logical cpu 0 */
419         int reboot_cpu_id = 0;
420
421 #ifdef CONFIG_X86_32
422         /* See if there has been given a command line override */
423         if ((reboot_cpu != -1) && (reboot_cpu < NR_CPUS) &&
424                 cpu_online(reboot_cpu))
425                 reboot_cpu_id = reboot_cpu;
426 #endif
427
428         /* Make certain the cpu I'm about to reboot on is online */
429         if (!cpu_online(reboot_cpu_id))
430                 reboot_cpu_id = smp_processor_id();
431
432         /* Make certain I only run on the appropriate processor */
433         set_cpus_allowed_ptr(current, &cpumask_of_cpu(reboot_cpu_id));
434
435         /* O.K Now that I'm on the appropriate processor,
436          * stop all of the others.
437          */
438         smp_send_stop();
439 #endif
440
441         lapic_shutdown();
442
443 #ifdef CONFIG_X86_IO_APIC
444         disable_IO_APIC();
445 #endif
446
447 #ifdef CONFIG_HPET_TIMER
448         hpet_disable();
449 #endif
450
451 #ifdef CONFIG_X86_64
452         pci_iommu_shutdown();
453 #endif
454 }
455
456 static void native_machine_restart(char *__unused)
457 {
458         printk("machine restart\n");
459
460         if (!reboot_force)
461                 machine_shutdown();
462         machine_emergency_restart();
463 }
464
465 static void native_machine_halt(void)
466 {
467 }
468
469 static void native_machine_power_off(void)
470 {
471         if (pm_power_off) {
472                 if (!reboot_force)
473                         machine_shutdown();
474                 pm_power_off();
475         }
476 }
477
478 struct machine_ops machine_ops = {
479         .power_off = native_machine_power_off,
480         .shutdown = native_machine_shutdown,
481         .emergency_restart = native_machine_emergency_restart,
482         .restart = native_machine_restart,
483         .halt = native_machine_halt,
484 #ifdef CONFIG_KEXEC
485         .crash_shutdown = native_machine_crash_shutdown,
486 #endif
487 };
488
489 void machine_power_off(void)
490 {
491         machine_ops.power_off();
492 }
493
494 void machine_shutdown(void)
495 {
496         machine_ops.shutdown();
497 }
498
499 void machine_emergency_restart(void)
500 {
501         machine_ops.emergency_restart();
502 }
503
504 void machine_restart(char *cmd)
505 {
506         machine_ops.restart(cmd);
507 }
508
509 void machine_halt(void)
510 {
511         machine_ops.halt();
512 }
513
514 #ifdef CONFIG_KEXEC
515 void machine_crash_shutdown(struct pt_regs *regs)
516 {
517         machine_ops.crash_shutdown(regs);
518 }
519 #endif
520
521
522 #if defined(CONFIG_SMP)
523
524 /* This keeps a track of which one is crashing cpu. */
525 static int crashing_cpu;
526 static nmi_shootdown_cb shootdown_callback;
527
528 static atomic_t waiting_for_crash_ipi;
529
530 static int crash_nmi_callback(struct notifier_block *self,
531                         unsigned long val, void *data)
532 {
533         int cpu;
534
535         if (val != DIE_NMI_IPI)
536                 return NOTIFY_OK;
537
538         cpu = raw_smp_processor_id();
539
540         /* Don't do anything if this handler is invoked on crashing cpu.
541          * Otherwise, system will completely hang. Crashing cpu can get
542          * an NMI if system was initially booted with nmi_watchdog parameter.
543          */
544         if (cpu == crashing_cpu)
545                 return NOTIFY_STOP;
546         local_irq_disable();
547
548         shootdown_callback(cpu, (struct die_args *)data);
549
550         atomic_dec(&waiting_for_crash_ipi);
551         /* Assume hlt works */
552         halt();
553         for (;;)
554                 cpu_relax();
555
556         return 1;
557 }
558
559 static void smp_send_nmi_allbutself(void)
560 {
561         cpumask_t mask = cpu_online_map;
562         cpu_clear(safe_smp_processor_id(), mask);
563         if (!cpus_empty(mask))
564                 send_IPI_mask(mask, NMI_VECTOR);
565 }
566
567 static struct notifier_block crash_nmi_nb = {
568         .notifier_call = crash_nmi_callback,
569 };
570
571 /* Halt all other CPUs, calling the specified function on each of them
572  *
573  * This function can be used to halt all other CPUs on crash
574  * or emergency reboot time. The function passed as parameter
575  * will be called inside a NMI handler on all CPUs.
576  */
577 void nmi_shootdown_cpus(nmi_shootdown_cb callback)
578 {
579         unsigned long msecs;
580         local_irq_disable();
581
582         /* Make a note of crashing cpu. Will be used in NMI callback.*/
583         crashing_cpu = safe_smp_processor_id();
584
585         shootdown_callback = callback;
586
587         atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
588         /* Would it be better to replace the trap vector here? */
589         if (register_die_notifier(&crash_nmi_nb))
590                 return;         /* return what? */
591         /* Ensure the new callback function is set before sending
592          * out the NMI
593          */
594         wmb();
595
596         smp_send_nmi_allbutself();
597
598         msecs = 1000; /* Wait at most a second for the other cpus to stop */
599         while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
600                 mdelay(1);
601                 msecs--;
602         }
603
604         /* Leave the nmi callback set */
605 }
606 #else /* !CONFIG_SMP */
607 void nmi_shootdown_cpus(nmi_shootdown_cb callback)
608 {
609         /* No other CPUs to shoot down */
610 }
611 #endif