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
);