1
2
3
4
5
6
7
8#define pr_fmt(fmt) "reboot: " fmt
9
10#include <linux/atomic.h>
11#include <linux/ctype.h>
12#include <linux/export.h>
13#include <linux/kexec.h>
14#include <linux/kmod.h>
15#include <linux/kmsg_dump.h>
16#include <linux/reboot.h>
17#include <linux/suspend.h>
18#include <linux/syscalls.h>
19#include <linux/syscore_ops.h>
20#include <linux/uaccess.h>
21
22
23
24
25
26int C_A_D = 1;
27struct pid *cad_pid;
28EXPORT_SYMBOL(cad_pid);
29
30#if defined(CONFIG_ARM)
31#define DEFAULT_REBOOT_MODE = REBOOT_HARD
32#else
33#define DEFAULT_REBOOT_MODE
34#endif
35enum reboot_mode reboot_mode DEFAULT_REBOOT_MODE;
36EXPORT_SYMBOL_GPL(reboot_mode);
37enum reboot_mode panic_reboot_mode = REBOOT_UNDEFINED;
38
39
40
41
42
43
44
45
46int reboot_default = 1;
47int reboot_cpu;
48enum reboot_type reboot_type = BOOT_ACPI;
49int reboot_force;
50
51
52
53
54
55void (*pm_power_off_prepare)(void);
56EXPORT_SYMBOL_GPL(pm_power_off_prepare);
57
58
59
60
61
62
63
64
65
66void emergency_restart(void)
67{
68 kmsg_dump(KMSG_DUMP_EMERG);
69 machine_emergency_restart();
70}
71EXPORT_SYMBOL_GPL(emergency_restart);
72
73void kernel_restart_prepare(char *cmd)
74{
75 blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
76 system_state = SYSTEM_RESTART;
77 usermodehelper_disable();
78 device_shutdown();
79}
80
81
82
83
84
85
86
87
88
89
90
91int register_reboot_notifier(struct notifier_block *nb)
92{
93 return blocking_notifier_chain_register(&reboot_notifier_list, nb);
94}
95EXPORT_SYMBOL(register_reboot_notifier);
96
97
98
99
100
101
102
103
104
105
106int unregister_reboot_notifier(struct notifier_block *nb)
107{
108 return blocking_notifier_chain_unregister(&reboot_notifier_list, nb);
109}
110EXPORT_SYMBOL(unregister_reboot_notifier);
111
112static void devm_unregister_reboot_notifier(struct device *dev, void *res)
113{
114 WARN_ON(unregister_reboot_notifier(*(struct notifier_block **)res));
115}
116
117int devm_register_reboot_notifier(struct device *dev, struct notifier_block *nb)
118{
119 struct notifier_block **rcnb;
120 int ret;
121
122 rcnb = devres_alloc(devm_unregister_reboot_notifier,
123 sizeof(*rcnb), GFP_KERNEL);
124 if (!rcnb)
125 return -ENOMEM;
126
127 ret = register_reboot_notifier(nb);
128 if (!ret) {
129 *rcnb = nb;
130 devres_add(dev, rcnb);
131 } else {
132 devres_free(rcnb);
133 }
134
135 return ret;
136}
137EXPORT_SYMBOL(devm_register_reboot_notifier);
138
139
140
141
142
143static ATOMIC_NOTIFIER_HEAD(restart_handler_list);
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183int register_restart_handler(struct notifier_block *nb)
184{
185 return atomic_notifier_chain_register(&restart_handler_list, nb);
186}
187EXPORT_SYMBOL(register_restart_handler);
188
189
190
191
192
193
194
195
196
197
198int unregister_restart_handler(struct notifier_block *nb)
199{
200 return atomic_notifier_chain_unregister(&restart_handler_list, nb);
201}
202EXPORT_SYMBOL(unregister_restart_handler);
203
204
205
206
207
208
209
210
211
212
213
214
215void do_kernel_restart(char *cmd)
216{
217 atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd);
218}
219
220void migrate_to_reboot_cpu(void)
221{
222
223 int cpu = reboot_cpu;
224
225 cpu_hotplug_disable();
226
227
228 if (!cpu_online(cpu))
229 cpu = cpumask_first(cpu_online_mask);
230
231
232 current->flags |= PF_NO_SETAFFINITY;
233
234
235 set_cpus_allowed_ptr(current, cpumask_of(cpu));
236}
237
238
239
240
241
242
243
244
245
246void kernel_restart(char *cmd)
247{
248 kernel_restart_prepare(cmd);
249 migrate_to_reboot_cpu();
250 syscore_shutdown();
251 if (!cmd)
252 pr_emerg("Restarting system\n");
253 else
254 pr_emerg("Restarting system with command '%s'\n", cmd);
255 kmsg_dump(KMSG_DUMP_SHUTDOWN);
256 machine_restart(cmd);
257}
258EXPORT_SYMBOL_GPL(kernel_restart);
259
260static void kernel_shutdown_prepare(enum system_states state)
261{
262 blocking_notifier_call_chain(&reboot_notifier_list,
263 (state == SYSTEM_HALT) ? SYS_HALT : SYS_POWER_OFF, NULL);
264 system_state = state;
265 usermodehelper_disable();
266 device_shutdown();
267}
268
269
270
271
272
273void kernel_halt(void)
274{
275 kernel_shutdown_prepare(SYSTEM_HALT);
276 migrate_to_reboot_cpu();
277 syscore_shutdown();
278 pr_emerg("System halted\n");
279 kmsg_dump(KMSG_DUMP_SHUTDOWN);
280 machine_halt();
281}
282EXPORT_SYMBOL_GPL(kernel_halt);
283
284
285
286
287
288
289void kernel_power_off(void)
290{
291 kernel_shutdown_prepare(SYSTEM_POWER_OFF);
292 if (pm_power_off_prepare)
293 pm_power_off_prepare();
294 migrate_to_reboot_cpu();
295 syscore_shutdown();
296 pr_emerg("Power down\n");
297 kmsg_dump(KMSG_DUMP_SHUTDOWN);
298 machine_power_off();
299}
300EXPORT_SYMBOL_GPL(kernel_power_off);
301
302DEFINE_MUTEX(system_transition_mutex);
303
304
305
306
307
308
309
310
311
312SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
313 void __user *, arg)
314{
315 struct pid_namespace *pid_ns = task_active_pid_ns(current);
316 char buffer[256];
317 int ret = 0;
318
319
320 if (!ns_capable(pid_ns->user_ns, CAP_SYS_BOOT))
321 return -EPERM;
322
323
324 if (magic1 != LINUX_REBOOT_MAGIC1 ||
325 (magic2 != LINUX_REBOOT_MAGIC2 &&
326 magic2 != LINUX_REBOOT_MAGIC2A &&
327 magic2 != LINUX_REBOOT_MAGIC2B &&
328 magic2 != LINUX_REBOOT_MAGIC2C))
329 return -EINVAL;
330
331
332
333
334
335
336 ret = reboot_pid_ns(pid_ns, cmd);
337 if (ret)
338 return ret;
339
340
341
342
343 if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
344 cmd = LINUX_REBOOT_CMD_HALT;
345
346 mutex_lock(&system_transition_mutex);
347 switch (cmd) {
348 case LINUX_REBOOT_CMD_RESTART:
349 kernel_restart(NULL);
350 break;
351
352 case LINUX_REBOOT_CMD_CAD_ON:
353 C_A_D = 1;
354 break;
355
356 case LINUX_REBOOT_CMD_CAD_OFF:
357 C_A_D = 0;
358 break;
359
360 case LINUX_REBOOT_CMD_HALT:
361 kernel_halt();
362 do_exit(0);
363
364 case LINUX_REBOOT_CMD_POWER_OFF:
365 kernel_power_off();
366 do_exit(0);
367 break;
368
369 case LINUX_REBOOT_CMD_RESTART2:
370 ret = strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1);
371 if (ret < 0) {
372 ret = -EFAULT;
373 break;
374 }
375 buffer[sizeof(buffer) - 1] = '\0';
376
377 kernel_restart(buffer);
378 break;
379
380#ifdef CONFIG_KEXEC_CORE
381 case LINUX_REBOOT_CMD_KEXEC:
382 ret = kernel_kexec();
383 break;
384#endif
385
386#ifdef CONFIG_HIBERNATION
387 case LINUX_REBOOT_CMD_SW_SUSPEND:
388 ret = hibernate();
389 break;
390#endif
391
392 default:
393 ret = -EINVAL;
394 break;
395 }
396 mutex_unlock(&system_transition_mutex);
397 return ret;
398}
399
400static void deferred_cad(struct work_struct *dummy)
401{
402 kernel_restart(NULL);
403}
404
405
406
407
408
409
410void ctrl_alt_del(void)
411{
412 static DECLARE_WORK(cad_work, deferred_cad);
413
414 if (C_A_D)
415 schedule_work(&cad_work);
416 else
417 kill_cad_pid(SIGINT, 1);
418}
419
420char poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
421static const char reboot_cmd[] = "/sbin/reboot";
422
423static int run_cmd(const char *cmd)
424{
425 char **argv;
426 static char *envp[] = {
427 "HOME=/",
428 "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
429 NULL
430 };
431 int ret;
432 argv = argv_split(GFP_KERNEL, cmd, NULL);
433 if (argv) {
434 ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
435 argv_free(argv);
436 } else {
437 ret = -ENOMEM;
438 }
439
440 return ret;
441}
442
443static int __orderly_reboot(void)
444{
445 int ret;
446
447 ret = run_cmd(reboot_cmd);
448
449 if (ret) {
450 pr_warn("Failed to start orderly reboot: forcing the issue\n");
451 emergency_sync();
452 kernel_restart(NULL);
453 }
454
455 return ret;
456}
457
458static int __orderly_poweroff(bool force)
459{
460 int ret;
461
462 ret = run_cmd(poweroff_cmd);
463
464 if (ret && force) {
465 pr_warn("Failed to start orderly shutdown: forcing the issue\n");
466
467
468
469
470
471
472 emergency_sync();
473 kernel_power_off();
474 }
475
476 return ret;
477}
478
479static bool poweroff_force;
480
481static void poweroff_work_func(struct work_struct *work)
482{
483 __orderly_poweroff(poweroff_force);
484}
485
486static DECLARE_WORK(poweroff_work, poweroff_work_func);
487
488
489
490
491
492
493
494
495void orderly_poweroff(bool force)
496{
497 if (force)
498 poweroff_force = true;
499 schedule_work(&poweroff_work);
500}
501EXPORT_SYMBOL_GPL(orderly_poweroff);
502
503static void reboot_work_func(struct work_struct *work)
504{
505 __orderly_reboot();
506}
507
508static DECLARE_WORK(reboot_work, reboot_work_func);
509
510
511
512
513
514
515
516void orderly_reboot(void)
517{
518 schedule_work(&reboot_work);
519}
520EXPORT_SYMBOL_GPL(orderly_reboot);
521
522
523
524
525
526
527
528
529static void hw_failure_emergency_poweroff_func(struct work_struct *work)
530{
531
532
533
534
535
536
537
538
539 pr_emerg("Hardware protection timed-out. Trying forced poweroff\n");
540 kernel_power_off();
541
542
543
544
545 pr_emerg("Hardware protection shutdown failed. Trying emergency restart\n");
546 emergency_restart();
547}
548
549static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work,
550 hw_failure_emergency_poweroff_func);
551
552
553
554
555
556
557
558static void hw_failure_emergency_poweroff(int poweroff_delay_ms)
559{
560 if (poweroff_delay_ms <= 0)
561 return;
562 schedule_delayed_work(&hw_failure_emergency_poweroff_work,
563 msecs_to_jiffies(poweroff_delay_ms));
564}
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581void hw_protection_shutdown(const char *reason, int ms_until_forced)
582{
583 static atomic_t allow_proceed = ATOMIC_INIT(1);
584
585 pr_emerg("HARDWARE PROTECTION shutdown (%s)\n", reason);
586
587
588 if (!atomic_dec_and_test(&allow_proceed))
589 return;
590
591
592
593
594
595 hw_failure_emergency_poweroff(ms_until_forced);
596 orderly_poweroff(true);
597}
598EXPORT_SYMBOL_GPL(hw_protection_shutdown);
599
600static int __init reboot_setup(char *str)
601{
602 for (;;) {
603 enum reboot_mode *mode;
604
605
606
607
608
609
610 reboot_default = 0;
611
612 if (!strncmp(str, "panic_", 6)) {
613 mode = &panic_reboot_mode;
614 str += 6;
615 } else {
616 mode = &reboot_mode;
617 }
618
619 switch (*str) {
620 case 'w':
621 *mode = REBOOT_WARM;
622 break;
623
624 case 'c':
625 *mode = REBOOT_COLD;
626 break;
627
628 case 'h':
629 *mode = REBOOT_HARD;
630 break;
631
632 case 's':
633
634
635
636
637 str += str[1] == 'm' && str[2] == 'p' ? 3 : 1;
638
639 if (isdigit(str[0])) {
640 int cpu = simple_strtoul(str, NULL, 0);
641
642 if (cpu >= num_possible_cpus()) {
643 pr_err("Ignoring the CPU number in reboot= option. "
644 "CPU %d exceeds possible cpu number %d\n",
645 cpu, num_possible_cpus());
646 break;
647 }
648 reboot_cpu = cpu;
649 } else
650 *mode = REBOOT_SOFT;
651 break;
652
653 case 'g':
654 *mode = REBOOT_GPIO;
655 break;
656
657 case 'b':
658 case 'a':
659 case 'k':
660 case 't':
661 case 'e':
662 case 'p':
663 reboot_type = *str;
664 break;
665
666 case 'f':
667 reboot_force = 1;
668 break;
669 }
670
671 str = strchr(str, ',');
672 if (str)
673 str++;
674 else
675 break;
676 }
677 return 1;
678}
679__setup("reboot=", reboot_setup);
680
681#ifdef CONFIG_SYSFS
682
683#define REBOOT_COLD_STR "cold"
684#define REBOOT_WARM_STR "warm"
685#define REBOOT_HARD_STR "hard"
686#define REBOOT_SOFT_STR "soft"
687#define REBOOT_GPIO_STR "gpio"
688#define REBOOT_UNDEFINED_STR "undefined"
689
690#define BOOT_TRIPLE_STR "triple"
691#define BOOT_KBD_STR "kbd"
692#define BOOT_BIOS_STR "bios"
693#define BOOT_ACPI_STR "acpi"
694#define BOOT_EFI_STR "efi"
695#define BOOT_PCI_STR "pci"
696
697static ssize_t mode_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
698{
699 const char *val;
700
701 switch (reboot_mode) {
702 case REBOOT_COLD:
703 val = REBOOT_COLD_STR;
704 break;
705 case REBOOT_WARM:
706 val = REBOOT_WARM_STR;
707 break;
708 case REBOOT_HARD:
709 val = REBOOT_HARD_STR;
710 break;
711 case REBOOT_SOFT:
712 val = REBOOT_SOFT_STR;
713 break;
714 case REBOOT_GPIO:
715 val = REBOOT_GPIO_STR;
716 break;
717 default:
718 val = REBOOT_UNDEFINED_STR;
719 }
720
721 return sprintf(buf, "%s\n", val);
722}
723static ssize_t mode_store(struct kobject *kobj, struct kobj_attribute *attr,
724 const char *buf, size_t count)
725{
726 if (!capable(CAP_SYS_BOOT))
727 return -EPERM;
728
729 if (!strncmp(buf, REBOOT_COLD_STR, strlen(REBOOT_COLD_STR)))
730 reboot_mode = REBOOT_COLD;
731 else if (!strncmp(buf, REBOOT_WARM_STR, strlen(REBOOT_WARM_STR)))
732 reboot_mode = REBOOT_WARM;
733 else if (!strncmp(buf, REBOOT_HARD_STR, strlen(REBOOT_HARD_STR)))
734 reboot_mode = REBOOT_HARD;
735 else if (!strncmp(buf, REBOOT_SOFT_STR, strlen(REBOOT_SOFT_STR)))
736 reboot_mode = REBOOT_SOFT;
737 else if (!strncmp(buf, REBOOT_GPIO_STR, strlen(REBOOT_GPIO_STR)))
738 reboot_mode = REBOOT_GPIO;
739 else
740 return -EINVAL;
741
742 reboot_default = 0;
743
744 return count;
745}
746static struct kobj_attribute reboot_mode_attr = __ATTR_RW(mode);
747
748#ifdef CONFIG_X86
749static ssize_t force_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
750{
751 return sprintf(buf, "%d\n", reboot_force);
752}
753static ssize_t force_store(struct kobject *kobj, struct kobj_attribute *attr,
754 const char *buf, size_t count)
755{
756 bool res;
757
758 if (!capable(CAP_SYS_BOOT))
759 return -EPERM;
760
761 if (kstrtobool(buf, &res))
762 return -EINVAL;
763
764 reboot_default = 0;
765 reboot_force = res;
766
767 return count;
768}
769static struct kobj_attribute reboot_force_attr = __ATTR_RW(force);
770
771static ssize_t type_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
772{
773 const char *val;
774
775 switch (reboot_type) {
776 case BOOT_TRIPLE:
777 val = BOOT_TRIPLE_STR;
778 break;
779 case BOOT_KBD:
780 val = BOOT_KBD_STR;
781 break;
782 case BOOT_BIOS:
783 val = BOOT_BIOS_STR;
784 break;
785 case BOOT_ACPI:
786 val = BOOT_ACPI_STR;
787 break;
788 case BOOT_EFI:
789 val = BOOT_EFI_STR;
790 break;
791 case BOOT_CF9_FORCE:
792 val = BOOT_PCI_STR;
793 break;
794 default:
795 val = REBOOT_UNDEFINED_STR;
796 }
797
798 return sprintf(buf, "%s\n", val);
799}
800static ssize_t type_store(struct kobject *kobj, struct kobj_attribute *attr,
801 const char *buf, size_t count)
802{
803 if (!capable(CAP_SYS_BOOT))
804 return -EPERM;
805
806 if (!strncmp(buf, BOOT_TRIPLE_STR, strlen(BOOT_TRIPLE_STR)))
807 reboot_type = BOOT_TRIPLE;
808 else if (!strncmp(buf, BOOT_KBD_STR, strlen(BOOT_KBD_STR)))
809 reboot_type = BOOT_KBD;
810 else if (!strncmp(buf, BOOT_BIOS_STR, strlen(BOOT_BIOS_STR)))
811 reboot_type = BOOT_BIOS;
812 else if (!strncmp(buf, BOOT_ACPI_STR, strlen(BOOT_ACPI_STR)))
813 reboot_type = BOOT_ACPI;
814 else if (!strncmp(buf, BOOT_EFI_STR, strlen(BOOT_EFI_STR)))
815 reboot_type = BOOT_EFI;
816 else if (!strncmp(buf, BOOT_PCI_STR, strlen(BOOT_PCI_STR)))
817 reboot_type = BOOT_CF9_FORCE;
818 else
819 return -EINVAL;
820
821 reboot_default = 0;
822
823 return count;
824}
825static struct kobj_attribute reboot_type_attr = __ATTR_RW(type);
826#endif
827
828#ifdef CONFIG_SMP
829static ssize_t cpu_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
830{
831 return sprintf(buf, "%d\n", reboot_cpu);
832}
833static ssize_t cpu_store(struct kobject *kobj, struct kobj_attribute *attr,
834 const char *buf, size_t count)
835{
836 unsigned int cpunum;
837 int rc;
838
839 if (!capable(CAP_SYS_BOOT))
840 return -EPERM;
841
842 rc = kstrtouint(buf, 0, &cpunum);
843
844 if (rc)
845 return rc;
846
847 if (cpunum >= num_possible_cpus())
848 return -ERANGE;
849
850 reboot_default = 0;
851 reboot_cpu = cpunum;
852
853 return count;
854}
855static struct kobj_attribute reboot_cpu_attr = __ATTR_RW(cpu);
856#endif
857
858static struct attribute *reboot_attrs[] = {
859 &reboot_mode_attr.attr,
860#ifdef CONFIG_X86
861 &reboot_force_attr.attr,
862 &reboot_type_attr.attr,
863#endif
864#ifdef CONFIG_SMP
865 &reboot_cpu_attr.attr,
866#endif
867 NULL,
868};
869
870static const struct attribute_group reboot_attr_group = {
871 .attrs = reboot_attrs,
872};
873
874static int __init reboot_ksysfs_init(void)
875{
876 struct kobject *reboot_kobj;
877 int ret;
878
879 reboot_kobj = kobject_create_and_add("reboot", kernel_kobj);
880 if (!reboot_kobj)
881 return -ENOMEM;
882
883 ret = sysfs_create_group(reboot_kobj, &reboot_attr_group);
884 if (ret) {
885 kobject_put(reboot_kobj);
886 return ret;
887 }
888
889 return 0;
890}
891late_initcall(reboot_ksysfs_init);
892
893#endif
894