1
2
3
4
5
6
7#define pr_fmt(fmt) "reboot: " fmt
8
9#include <linux/ctype.h>
10#include <linux/export.h>
11#include <linux/kexec.h>
12#include <linux/kmod.h>
13#include <linux/kmsg_dump.h>
14#include <linux/reboot.h>
15#include <linux/suspend.h>
16#include <linux/syscalls.h>
17#include <linux/syscore_ops.h>
18#include <linux/uaccess.h>
19
20
21
22
23
24int C_A_D = 1;
25struct pid *cad_pid;
26EXPORT_SYMBOL(cad_pid);
27
28#if defined(CONFIG_ARM) || defined(CONFIG_UNICORE32)
29#define DEFAULT_REBOOT_MODE = REBOOT_HARD
30#else
31#define DEFAULT_REBOOT_MODE
32#endif
33enum reboot_mode reboot_mode DEFAULT_REBOOT_MODE;
34
35
36
37
38
39
40
41
42int reboot_default = 1;
43int reboot_cpu;
44enum reboot_type reboot_type = BOOT_ACPI;
45int reboot_force;
46
47
48
49
50
51void (*pm_power_off_prepare)(void);
52
53
54
55
56
57
58
59
60
61void emergency_restart(void)
62{
63 kmsg_dump(KMSG_DUMP_EMERG);
64 machine_emergency_restart();
65}
66EXPORT_SYMBOL_GPL(emergency_restart);
67
68void kernel_restart_prepare(char *cmd)
69{
70 blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
71 system_state = SYSTEM_RESTART;
72 usermodehelper_disable();
73 device_shutdown();
74}
75
76
77
78
79
80
81
82
83
84
85
86int register_reboot_notifier(struct notifier_block *nb)
87{
88 return blocking_notifier_chain_register(&reboot_notifier_list, nb);
89}
90EXPORT_SYMBOL(register_reboot_notifier);
91
92
93
94
95
96
97
98
99
100
101int unregister_reboot_notifier(struct notifier_block *nb)
102{
103 return blocking_notifier_chain_unregister(&reboot_notifier_list, nb);
104}
105EXPORT_SYMBOL(unregister_reboot_notifier);
106
107static void devm_unregister_reboot_notifier(struct device *dev, void *res)
108{
109 WARN_ON(unregister_reboot_notifier(*(struct notifier_block **)res));
110}
111
112int devm_register_reboot_notifier(struct device *dev, struct notifier_block *nb)
113{
114 struct notifier_block **rcnb;
115 int ret;
116
117 rcnb = devres_alloc(devm_unregister_reboot_notifier,
118 sizeof(*rcnb), GFP_KERNEL);
119 if (!rcnb)
120 return -ENOMEM;
121
122 ret = register_reboot_notifier(nb);
123 if (!ret) {
124 *rcnb = nb;
125 devres_add(dev, rcnb);
126 } else {
127 devres_free(rcnb);
128 }
129
130 return ret;
131}
132EXPORT_SYMBOL(devm_register_reboot_notifier);
133
134
135
136
137
138static ATOMIC_NOTIFIER_HEAD(restart_handler_list);
139
140
141
142
143
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
178int register_restart_handler(struct notifier_block *nb)
179{
180 return atomic_notifier_chain_register(&restart_handler_list, nb);
181}
182EXPORT_SYMBOL(register_restart_handler);
183
184
185
186
187
188
189
190
191
192
193int unregister_restart_handler(struct notifier_block *nb)
194{
195 return atomic_notifier_chain_unregister(&restart_handler_list, nb);
196}
197EXPORT_SYMBOL(unregister_restart_handler);
198
199
200
201
202
203
204
205
206
207
208
209
210void do_kernel_restart(char *cmd)
211{
212 atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd);
213}
214
215void migrate_to_reboot_cpu(void)
216{
217
218 int cpu = reboot_cpu;
219
220 cpu_hotplug_disable();
221
222
223 if (!cpu_online(cpu))
224 cpu = cpumask_first(cpu_online_mask);
225
226
227 current->flags |= PF_NO_SETAFFINITY;
228
229
230 set_cpus_allowed_ptr(current, cpumask_of(cpu));
231}
232
233
234
235
236
237
238
239
240
241void kernel_restart(char *cmd)
242{
243 kernel_restart_prepare(cmd);
244 migrate_to_reboot_cpu();
245 syscore_shutdown();
246 if (!cmd)
247 pr_emerg("Restarting system\n");
248 else
249 pr_emerg("Restarting system with command '%s'\n", cmd);
250 kmsg_dump(KMSG_DUMP_RESTART);
251 machine_restart(cmd);
252}
253EXPORT_SYMBOL_GPL(kernel_restart);
254
255static void kernel_shutdown_prepare(enum system_states state)
256{
257 blocking_notifier_call_chain(&reboot_notifier_list,
258 (state == SYSTEM_HALT) ? SYS_HALT : SYS_POWER_OFF, NULL);
259 system_state = state;
260 usermodehelper_disable();
261 device_shutdown();
262}
263
264
265
266
267
268void kernel_halt(void)
269{
270 kernel_shutdown_prepare(SYSTEM_HALT);
271 migrate_to_reboot_cpu();
272 syscore_shutdown();
273 pr_emerg("System halted\n");
274 kmsg_dump(KMSG_DUMP_HALT);
275 machine_halt();
276}
277EXPORT_SYMBOL_GPL(kernel_halt);
278
279
280
281
282
283
284void kernel_power_off(void)
285{
286 kernel_shutdown_prepare(SYSTEM_POWER_OFF);
287 if (pm_power_off_prepare)
288 pm_power_off_prepare();
289 migrate_to_reboot_cpu();
290 syscore_shutdown();
291 pr_emerg("Power down\n");
292 kmsg_dump(KMSG_DUMP_POWEROFF);
293 machine_power_off();
294}
295EXPORT_SYMBOL_GPL(kernel_power_off);
296
297static DEFINE_MUTEX(reboot_mutex);
298
299
300
301
302
303
304
305
306
307SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
308 void __user *, arg)
309{
310 struct pid_namespace *pid_ns = task_active_pid_ns(current);
311 char buffer[256];
312 int ret = 0;
313
314
315 if (!ns_capable(pid_ns->user_ns, CAP_SYS_BOOT))
316 return -EPERM;
317
318
319 if (magic1 != LINUX_REBOOT_MAGIC1 ||
320 (magic2 != LINUX_REBOOT_MAGIC2 &&
321 magic2 != LINUX_REBOOT_MAGIC2A &&
322 magic2 != LINUX_REBOOT_MAGIC2B &&
323 magic2 != LINUX_REBOOT_MAGIC2C))
324 return -EINVAL;
325
326
327
328
329
330
331 ret = reboot_pid_ns(pid_ns, cmd);
332 if (ret)
333 return ret;
334
335
336
337
338 if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
339 cmd = LINUX_REBOOT_CMD_HALT;
340
341 mutex_lock(&reboot_mutex);
342 switch (cmd) {
343 case LINUX_REBOOT_CMD_RESTART:
344 kernel_restart(NULL);
345 break;
346
347 case LINUX_REBOOT_CMD_CAD_ON:
348 C_A_D = 1;
349 break;
350
351 case LINUX_REBOOT_CMD_CAD_OFF:
352 C_A_D = 0;
353 break;
354
355 case LINUX_REBOOT_CMD_HALT:
356 kernel_halt();
357 do_exit(0);
358 panic("cannot halt");
359
360 case LINUX_REBOOT_CMD_POWER_OFF:
361 kernel_power_off();
362 do_exit(0);
363 break;
364
365 case LINUX_REBOOT_CMD_RESTART2:
366 ret = strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1);
367 if (ret < 0) {
368 ret = -EFAULT;
369 break;
370 }
371 buffer[sizeof(buffer) - 1] = '\0';
372
373 kernel_restart(buffer);
374 break;
375
376#ifdef CONFIG_KEXEC_CORE
377 case LINUX_REBOOT_CMD_KEXEC:
378 ret = kernel_kexec();
379 break;
380#endif
381
382#ifdef CONFIG_HIBERNATION
383 case LINUX_REBOOT_CMD_SW_SUSPEND:
384 ret = hibernate();
385 break;
386#endif
387
388 default:
389 ret = -EINVAL;
390 break;
391 }
392 mutex_unlock(&reboot_mutex);
393 return ret;
394}
395
396static void deferred_cad(struct work_struct *dummy)
397{
398 kernel_restart(NULL);
399}
400
401
402
403
404
405
406void ctrl_alt_del(void)
407{
408 static DECLARE_WORK(cad_work, deferred_cad);
409
410 if (C_A_D)
411 schedule_work(&cad_work);
412 else
413 kill_cad_pid(SIGINT, 1);
414}
415
416char poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
417static const char reboot_cmd[] = "/sbin/reboot";
418
419static int run_cmd(const char *cmd)
420{
421 char **argv;
422 static char *envp[] = {
423 "HOME=/",
424 "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
425 NULL
426 };
427 int ret;
428 argv = argv_split(GFP_KERNEL, cmd, NULL);
429 if (argv) {
430 ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
431 argv_free(argv);
432 } else {
433 ret = -ENOMEM;
434 }
435
436 return ret;
437}
438
439static int __orderly_reboot(void)
440{
441 int ret;
442
443 ret = run_cmd(reboot_cmd);
444
445 if (ret) {
446 pr_warn("Failed to start orderly reboot: forcing the issue\n");
447 emergency_sync();
448 kernel_restart(NULL);
449 }
450
451 return ret;
452}
453
454static int __orderly_poweroff(bool force)
455{
456 int ret;
457
458 ret = run_cmd(poweroff_cmd);
459
460 if (ret && force) {
461 pr_warn("Failed to start orderly shutdown: forcing the issue\n");
462
463
464
465
466
467
468 emergency_sync();
469 kernel_power_off();
470 }
471
472 return ret;
473}
474
475static bool poweroff_force;
476
477static void poweroff_work_func(struct work_struct *work)
478{
479 __orderly_poweroff(poweroff_force);
480}
481
482static DECLARE_WORK(poweroff_work, poweroff_work_func);
483
484
485
486
487
488
489
490
491void orderly_poweroff(bool force)
492{
493 if (force)
494 poweroff_force = true;
495 schedule_work(&poweroff_work);
496}
497EXPORT_SYMBOL_GPL(orderly_poweroff);
498
499static void reboot_work_func(struct work_struct *work)
500{
501 __orderly_reboot();
502}
503
504static DECLARE_WORK(reboot_work, reboot_work_func);
505
506
507
508
509
510
511
512void orderly_reboot(void)
513{
514 schedule_work(&reboot_work);
515}
516EXPORT_SYMBOL_GPL(orderly_reboot);
517
518static int __init reboot_setup(char *str)
519{
520 for (;;) {
521
522
523
524
525
526 reboot_default = 0;
527
528 switch (*str) {
529 case 'w':
530 reboot_mode = REBOOT_WARM;
531 break;
532
533 case 'c':
534 reboot_mode = REBOOT_COLD;
535 break;
536
537 case 'h':
538 reboot_mode = REBOOT_HARD;
539 break;
540
541 case 's':
542 {
543 int rc;
544
545 if (isdigit(*(str+1))) {
546 rc = kstrtoint(str+1, 0, &reboot_cpu);
547 if (rc)
548 return rc;
549 } else if (str[1] == 'm' && str[2] == 'p' &&
550 isdigit(*(str+3))) {
551 rc = kstrtoint(str+3, 0, &reboot_cpu);
552 if (rc)
553 return rc;
554 } else
555 reboot_mode = REBOOT_SOFT;
556 break;
557 }
558 case 'g':
559 reboot_mode = REBOOT_GPIO;
560 break;
561
562 case 'b':
563 case 'a':
564 case 'k':
565 case 't':
566 case 'e':
567 case 'p':
568 reboot_type = *str;
569 break;
570
571 case 'f':
572 reboot_force = 1;
573 break;
574 }
575
576 str = strchr(str, ',');
577 if (str)
578 str++;
579 else
580 break;
581 }
582 return 1;
583}
584__setup("reboot=", reboot_setup);
585