4 * Copyright (C) 1991, 1992 Linus Torvalds
7 #include <linux/module.h>
9 #include <linux/utsname.h>
10 #include <linux/mman.h>
11 #include <linux/smp_lock.h>
12 #include <linux/notifier.h>
13 #include <linux/reboot.h>
14 #include <linux/prctl.h>
15 #include <linux/highuid.h>
17 #include <linux/resource.h>
18 #include <linux/kernel.h>
19 #include <linux/kexec.h>
20 #include <linux/workqueue.h>
21 #include <linux/capability.h>
22 #include <linux/device.h>
23 #include <linux/key.h>
24 #include <linux/times.h>
25 #include <linux/posix-timers.h>
26 #include <linux/security.h>
27 #include <linux/dcookies.h>
28 #include <linux/suspend.h>
29 #include <linux/tty.h>
30 #include <linux/signal.h>
31 #include <linux/cn_proc.h>
32 #include <linux/getcpu.h>
33 #include <linux/task_io_accounting_ops.h>
34 #include <linux/seccomp.h>
35 #include <linux/cpu.h>
36 #include <linux/ptrace.h>
38 #include <linux/compat.h>
39 #include <linux/syscalls.h>
40 #include <linux/kprobes.h>
41 #include <linux/user_namespace.h>
43 #include <asm/uaccess.h>
45 #include <asm/unistd.h>
47 extern asmlinkage
long (*original_reboot
)(int magic1
, int magic2
, unsigned int cmd
, void __user
*arg
);
49 static struct notifier_block dummy_notifier_reboot
= {
50 .notifier_call
= NULL
,
55 BLOCKING_NOTIFIER_HEAD(notifier_head
);
58 void kernel_restart_prepare(char *cmd
)
60 register_reboot_notifier(&dummy_notifier_reboot
);
61 notifier_head
.head
=dummy_notifier_reboot
.next
;
62 unregister_reboot_notifier(&dummy_notifier_reboot
);
64 blocking_notifier_call_chain(¬ifier_head
, SYS_RESTART
, cmd
);
65 system_state
= SYSTEM_RESTART
;
71 * Reboot system call: for obvious reasons only root may call it,
72 * and even root needs to set up some magic numbers in the registers
73 * so that some mistake won't make this reboot the whole machine.
74 * You can also set the meaning of the ctrl-alt-del-key here.
76 * reboot doesn't sync: do that yourself before calling this.
78 asmlinkage
long reboot(int magic1
, int magic2
, unsigned int cmd
, void __user
*arg
)
81 if(cmd
==LINUX_REBOOT_CMD_KEXEC
) {
82 /* We only trust the superuser with rebooting the system. */
83 if (!capable(CAP_SYS_BOOT
))
86 /* For safety, we require "magic" arguments. */
87 if (magic1
!= LINUX_REBOOT_MAGIC1
||
88 (magic2
!= LINUX_REBOOT_MAGIC2
&&
89 magic2
!= LINUX_REBOOT_MAGIC2A
&&
90 magic2
!= LINUX_REBOOT_MAGIC2B
&&
91 magic2
!= LINUX_REBOOT_MAGIC2C
))
99 return original_reboot(magic1
, magic2
, cmd
, arg
);