linux/kernel/reboot.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  linux/kernel/reboot.c
   4 *
   5 *  Copyright (C) 2013  Linus Torvalds
   6 */
   7
   8#define pr_fmt(fmt)     "reboot: " fmt
   9
  10#include <linux/ctype.h>
  11#include <linux/export.h>
  12#include <linux/kexec.h>
  13#include <linux/kmod.h>
  14#include <linux/kmsg_dump.h>
  15#include <linux/reboot.h>
  16#include <linux/suspend.h>
  17#include <linux/syscalls.h>
  18#include <linux/syscore_ops.h>
  19#include <linux/uaccess.h>
  20
  21/*
  22 * this indicates whether you can reboot with ctrl-alt-del: the default is yes
  23 */
  24
  25int C_A_D = 1;
  26struct pid *cad_pid;
  27EXPORT_SYMBOL(cad_pid);
  28
  29#if defined(CONFIG_ARM) || defined(CONFIG_UNICORE32)
  30#define DEFAULT_REBOOT_MODE             = REBOOT_HARD
  31#else
  32#define DEFAULT_REBOOT_MODE
  33#endif
  34enum reboot_mode reboot_mode DEFAULT_REBOOT_MODE;
  35enum reboot_mode panic_reboot_mode = REBOOT_UNDEFINED;
  36
  37/*
  38 * This variable is used privately to keep track of whether or not
  39 * reboot_type is still set to its default value (i.e., reboot= hasn't
  40 * been set on the command line).  This is needed so that we can
  41 * suppress DMI scanning for reboot quirks.  Without it, it's
  42 * impossible to override a faulty reboot quirk without recompiling.
  43 */
  44int reboot_default = 1;
  45int reboot_cpu;
  46enum reboot_type reboot_type = BOOT_ACPI;
  47int reboot_force;
  48
  49/*
  50 * If set, this is used for preparing the system to power off.
  51 */
  52
  53void (*pm_power_off_prepare)(void);
  54EXPORT_SYMBOL_GPL(pm_power_off_prepare);
  55
  56/**
  57 *      emergency_restart - reboot the system
  58 *
  59 *      Without shutting down any hardware or taking any locks
  60 *      reboot the system.  This is called when we know we are in
  61 *      trouble so this is our best effort to reboot.  This is
  62 *      safe to call in interrupt context.
  63 */
  64void emergency_restart(void)
  65{
  66        kmsg_dump(KMSG_DUMP_EMERG);
  67        machine_emergency_restart();
  68}
  69EXPORT_SYMBOL_GPL(emergency_restart);
  70
  71void kernel_restart_prepare(char *cmd)
  72{
  73        blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
  74        system_state = SYSTEM_RESTART;
  75        usermodehelper_disable();
  76        device_shutdown();
  77}
  78
  79/**
  80 *      register_reboot_notifier - Register function to be called at reboot time
  81 *      @nb: Info about notifier function to be called
  82 *
  83 *      Registers a function with the list of functions
  84 *      to be called at reboot time.
  85 *
  86 *      Currently always returns zero, as blocking_notifier_chain_register()
  87 *      always returns zero.
  88 */
  89int register_reboot_notifier(struct notifier_block *nb)
  90{
  91        return blocking_notifier_chain_register(&reboot_notifier_list, nb);
  92}
  93EXPORT_SYMBOL(register_reboot_notifier);
  94
  95/**
  96 *      unregister_reboot_notifier - Unregister previously registered reboot notifier
  97 *      @nb: Hook to be unregistered
  98 *
  99 *      Unregisters a previously registered reboot
 100 *      notifier function.
 101 *
 102 *      Returns zero on success, or %-ENOENT on failure.
 103 */
 104int unregister_reboot_notifier(struct notifier_block *nb)
 105{
 106        return blocking_notifier_chain_unregister(&reboot_notifier_list, nb);
 107}
 108EXPORT_SYMBOL(unregister_reboot_notifier);
 109
 110static void devm_unregister_reboot_notifier(struct device *dev, void *res)
 111{
 112        WARN_ON(unregister_reboot_notifier(*(struct notifier_block **)res));
 113}
 114
 115int devm_register_reboot_notifier(struct device *dev, struct notifier_block *nb)
 116{
 117        struct notifier_block **rcnb;
 118        int ret;
 119
 120        rcnb = devres_alloc(devm_unregister_reboot_notifier,
 121                            sizeof(*rcnb), GFP_KERNEL);
 122        if (!rcnb)
 123                return -ENOMEM;
 124
 125        ret = register_reboot_notifier(nb);
 126        if (!ret) {
 127                *rcnb = nb;
 128                devres_add(dev, rcnb);
 129        } else {
 130                devres_free(rcnb);
 131        }
 132
 133        return ret;
 134}
 135EXPORT_SYMBOL(devm_register_reboot_notifier);
 136
 137/*
 138 *      Notifier list for kernel code which wants to be called
 139 *      to restart the system.
 140 */
 141static ATOMIC_NOTIFIER_HEAD(restart_handler_list);
 142
 143/**
 144 *      register_restart_handler - Register function to be called to reset
 145 *                                 the system
 146 *      @nb: Info about handler function to be called
 147 *      @nb->priority:  Handler priority. Handlers should follow the
 148 *                      following guidelines for setting priorities.
 149 *                      0:      Restart handler of last resort,
 150 *                              with limited restart capabilities
 151 *                      128:    Default restart handler; use if no other
 152 *                              restart handler is expected to be available,
 153 *                              and/or if restart functionality is
 154 *                              sufficient to restart the entire system
 155 *                      255:    Highest priority restart handler, will
 156 *                              preempt all other restart handlers
 157 *
 158 *      Registers a function with code to be called to restart the
 159 *      system.
 160 *
 161 *      Registered functions will be called from machine_restart as last
 162 *      step of the restart sequence (if the architecture specific
 163 *      machine_restart function calls do_kernel_restart - see below
 164 *      for details).
 165 *      Registered functions are expected to restart the system immediately.
 166 *      If more than one function is registered, the restart handler priority
 167 *      selects which function will be called first.
 168 *
 169 *      Restart handlers are expected to be registered from non-architecture
 170 *      code, typically from drivers. A typical use case would be a system
 171 *      where restart functionality is provided through a watchdog. Multiple
 172 *      restart handlers may exist; for example, one restart handler might
 173 *      restart the entire system, while another only restarts the CPU.
 174 *      In such cases, the restart handler which only restarts part of the
 175 *      hardware is expected to register with low priority to ensure that
 176 *      it only runs if no other means to restart the system is available.
 177 *
 178 *      Currently always returns zero, as atomic_notifier_chain_register()
 179 *      always returns zero.
 180 */
 181int register_restart_handler(struct notifier_block *nb)
 182{
 183        return atomic_notifier_chain_register(&restart_handler_list, nb);
 184}
 185EXPORT_SYMBOL(register_restart_handler);
 186
 187/**
 188 *      unregister_restart_handler - Unregister previously registered
 189 *                                   restart handler
 190 *      @nb: Hook to be unregistered
 191 *
 192 *      Unregisters a previously registered restart handler function.
 193 *
 194 *      Returns zero on success, or %-ENOENT on failure.
 195 */
 196int unregister_restart_handler(struct notifier_block *nb)
 197{
 198        return atomic_notifier_chain_unregister(&restart_handler_list, nb);
 199}
 200EXPORT_SYMBOL(unregister_restart_handler);
 201
 202/**
 203 *      do_kernel_restart - Execute kernel restart handler call chain
 204 *
 205 *      Calls functions registered with register_restart_handler.
 206 *
 207 *      Expected to be called from machine_restart as last step of the restart
 208 *      sequence.
 209 *
 210 *      Restarts the system immediately if a restart handler function has been
 211 *      registered. Otherwise does nothing.
 212 */
 213void do_kernel_restart(char *cmd)
 214{
 215        atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd);
 216}
 217
 218void migrate_to_reboot_cpu(void)
 219{
 220        /* The boot cpu is always logical cpu 0 */
 221        int cpu = reboot_cpu;
 222
 223        cpu_hotplug_disable();
 224
 225        /* Make certain the cpu I'm about to reboot on is online */
 226        if (!cpu_online(cpu))
 227                cpu = cpumask_first(cpu_online_mask);
 228
 229        /* Prevent races with other tasks migrating this task */
 230        current->flags |= PF_NO_SETAFFINITY;
 231
 232        /* Make certain I only run on the appropriate processor */
 233        set_cpus_allowed_ptr(current, cpumask_of(cpu));
 234}
 235
 236/**
 237 *      kernel_restart - reboot the system
 238 *      @cmd: pointer to buffer containing command to execute for restart
 239 *              or %NULL
 240 *
 241 *      Shutdown everything and perform a clean reboot.
 242 *      This is not safe to call in interrupt context.
 243 */
 244void kernel_restart(char *cmd)
 245{
 246        kernel_restart_prepare(cmd);
 247        migrate_to_reboot_cpu();
 248        syscore_shutdown();
 249        if (!cmd)
 250                pr_emerg("Restarting system\n");
 251        else
 252                pr_emerg("Restarting system with command '%s'\n", cmd);
 253        kmsg_dump(KMSG_DUMP_RESTART);
 254        machine_restart(cmd);
 255}
 256EXPORT_SYMBOL_GPL(kernel_restart);
 257
 258static void kernel_shutdown_prepare(enum system_states state)
 259{
 260        blocking_notifier_call_chain(&reboot_notifier_list,
 261                (state == SYSTEM_HALT) ? SYS_HALT : SYS_POWER_OFF, NULL);
 262        system_state = state;
 263        usermodehelper_disable();
 264        device_shutdown();
 265}
 266/**
 267 *      kernel_halt - halt the system
 268 *
 269 *      Shutdown everything and perform a clean system halt.
 270 */
 271void kernel_halt(void)
 272{
 273        kernel_shutdown_prepare(SYSTEM_HALT);
 274        migrate_to_reboot_cpu();
 275        syscore_shutdown();
 276        pr_emerg("System halted\n");
 277        kmsg_dump(KMSG_DUMP_HALT);
 278        machine_halt();
 279}
 280EXPORT_SYMBOL_GPL(kernel_halt);
 281
 282/**
 283 *      kernel_power_off - power_off the system
 284 *
 285 *      Shutdown everything and perform a clean system power_off.
 286 */
 287void kernel_power_off(void)
 288{
 289        kernel_shutdown_prepare(SYSTEM_POWER_OFF);
 290        if (pm_power_off_prepare)
 291                pm_power_off_prepare();
 292        migrate_to_reboot_cpu();
 293        syscore_shutdown();
 294        pr_emerg("Power down\n");
 295        kmsg_dump(KMSG_DUMP_POWEROFF);
 296        machine_power_off();
 297}
 298EXPORT_SYMBOL_GPL(kernel_power_off);
 299
 300DEFINE_MUTEX(system_transition_mutex);
 301
 302/*
 303 * Reboot system call: for obvious reasons only root may call it,
 304 * and even root needs to set up some magic numbers in the registers
 305 * so that some mistake won't make this reboot the whole machine.
 306 * You can also set the meaning of the ctrl-alt-del-key here.
 307 *
 308 * reboot doesn't sync: do that yourself before calling this.
 309 */
 310SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
 311                void __user *, arg)
 312{
 313        struct pid_namespace *pid_ns = task_active_pid_ns(current);
 314        char buffer[256];
 315        int ret = 0;
 316
 317        /* We only trust the superuser with rebooting the system. */
 318        if (!ns_capable(pid_ns->user_ns, CAP_SYS_BOOT))
 319                return -EPERM;
 320
 321        /* For safety, we require "magic" arguments. */
 322        if (magic1 != LINUX_REBOOT_MAGIC1 ||
 323                        (magic2 != LINUX_REBOOT_MAGIC2 &&
 324                        magic2 != LINUX_REBOOT_MAGIC2A &&
 325                        magic2 != LINUX_REBOOT_MAGIC2B &&
 326                        magic2 != LINUX_REBOOT_MAGIC2C))
 327                return -EINVAL;
 328
 329        /*
 330         * If pid namespaces are enabled and the current task is in a child
 331         * pid_namespace, the command is handled by reboot_pid_ns() which will
 332         * call do_exit().
 333         */
 334        ret = reboot_pid_ns(pid_ns, cmd);
 335        if (ret)
 336                return ret;
 337
 338        /* Instead of trying to make the power_off code look like
 339         * halt when pm_power_off is not set do it the easy way.
 340         */
 341        if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
 342                cmd = LINUX_REBOOT_CMD_HALT;
 343
 344        mutex_lock(&system_transition_mutex);
 345        switch (cmd) {
 346        case LINUX_REBOOT_CMD_RESTART:
 347                kernel_restart(NULL);
 348                break;
 349
 350        case LINUX_REBOOT_CMD_CAD_ON:
 351                C_A_D = 1;
 352                break;
 353
 354        case LINUX_REBOOT_CMD_CAD_OFF:
 355                C_A_D = 0;
 356                break;
 357
 358        case LINUX_REBOOT_CMD_HALT:
 359                kernel_halt();
 360                do_exit(0);
 361                panic("cannot halt");
 362
 363        case LINUX_REBOOT_CMD_POWER_OFF:
 364                kernel_power_off();
 365                do_exit(0);
 366                break;
 367
 368        case LINUX_REBOOT_CMD_RESTART2:
 369                ret = strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1);
 370                if (ret < 0) {
 371                        ret = -EFAULT;
 372                        break;
 373                }
 374                buffer[sizeof(buffer) - 1] = '\0';
 375
 376                kernel_restart(buffer);
 377                break;
 378
 379#ifdef CONFIG_KEXEC_CORE
 380        case LINUX_REBOOT_CMD_KEXEC:
 381                ret = kernel_kexec();
 382                break;
 383#endif
 384
 385#ifdef CONFIG_HIBERNATION
 386        case LINUX_REBOOT_CMD_SW_SUSPEND:
 387                ret = hibernate();
 388                break;
 389#endif
 390
 391        default:
 392                ret = -EINVAL;
 393                break;
 394        }
 395        mutex_unlock(&system_transition_mutex);
 396        return ret;
 397}
 398
 399static void deferred_cad(struct work_struct *dummy)
 400{
 401        kernel_restart(NULL);
 402}
 403
 404/*
 405 * This function gets called by ctrl-alt-del - ie the keyboard interrupt.
 406 * As it's called within an interrupt, it may NOT sync: the only choice
 407 * is whether to reboot at once, or just ignore the ctrl-alt-del.
 408 */
 409void ctrl_alt_del(void)
 410{
 411        static DECLARE_WORK(cad_work, deferred_cad);
 412
 413        if (C_A_D)
 414                schedule_work(&cad_work);
 415        else
 416                kill_cad_pid(SIGINT, 1);
 417}
 418
 419char poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
 420static const char reboot_cmd[] = "/sbin/reboot";
 421
 422static int run_cmd(const char *cmd)
 423{
 424        char **argv;
 425        static char *envp[] = {
 426                "HOME=/",
 427                "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
 428                NULL
 429        };
 430        int ret;
 431        argv = argv_split(GFP_KERNEL, cmd, NULL);
 432        if (argv) {
 433                ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
 434                argv_free(argv);
 435        } else {
 436                ret = -ENOMEM;
 437        }
 438
 439        return ret;
 440}
 441
 442static int __orderly_reboot(void)
 443{
 444        int ret;
 445
 446        ret = run_cmd(reboot_cmd);
 447
 448        if (ret) {
 449                pr_warn("Failed to start orderly reboot: forcing the issue\n");
 450                emergency_sync();
 451                kernel_restart(NULL);
 452        }
 453
 454        return ret;
 455}
 456
 457static int __orderly_poweroff(bool force)
 458{
 459        int ret;
 460
 461        ret = run_cmd(poweroff_cmd);
 462
 463        if (ret && force) {
 464                pr_warn("Failed to start orderly shutdown: forcing the issue\n");
 465
 466                /*
 467                 * I guess this should try to kick off some daemon to sync and
 468                 * poweroff asap.  Or not even bother syncing if we're doing an
 469                 * emergency shutdown?
 470                 */
 471                emergency_sync();
 472                kernel_power_off();
 473        }
 474
 475        return ret;
 476}
 477
 478static bool poweroff_force;
 479
 480static void poweroff_work_func(struct work_struct *work)
 481{
 482        __orderly_poweroff(poweroff_force);
 483}
 484
 485static DECLARE_WORK(poweroff_work, poweroff_work_func);
 486
 487/**
 488 * orderly_poweroff - Trigger an orderly system poweroff
 489 * @force: force poweroff if command execution fails
 490 *
 491 * This may be called from any context to trigger a system shutdown.
 492 * If the orderly shutdown fails, it will force an immediate shutdown.
 493 */
 494void orderly_poweroff(bool force)
 495{
 496        if (force) /* do not override the pending "true" */
 497                poweroff_force = true;
 498        schedule_work(&poweroff_work);
 499}
 500EXPORT_SYMBOL_GPL(orderly_poweroff);
 501
 502static void reboot_work_func(struct work_struct *work)
 503{
 504        __orderly_reboot();
 505}
 506
 507static DECLARE_WORK(reboot_work, reboot_work_func);
 508
 509/**
 510 * orderly_reboot - Trigger an orderly system reboot
 511 *
 512 * This may be called from any context to trigger a system reboot.
 513 * If the orderly reboot fails, it will force an immediate reboot.
 514 */
 515void orderly_reboot(void)
 516{
 517        schedule_work(&reboot_work);
 518}
 519EXPORT_SYMBOL_GPL(orderly_reboot);
 520
 521static int __init reboot_setup(char *str)
 522{
 523        for (;;) {
 524                enum reboot_mode *mode;
 525
 526                /*
 527                 * Having anything passed on the command line via
 528                 * reboot= will cause us to disable DMI checking
 529                 * below.
 530                 */
 531                reboot_default = 0;
 532
 533                if (!strncmp(str, "panic_", 6)) {
 534                        mode = &panic_reboot_mode;
 535                        str += 6;
 536                } else {
 537                        mode = &reboot_mode;
 538                }
 539
 540                switch (*str) {
 541                case 'w':
 542                        *mode = REBOOT_WARM;
 543                        break;
 544
 545                case 'c':
 546                        *mode = REBOOT_COLD;
 547                        break;
 548
 549                case 'h':
 550                        *mode = REBOOT_HARD;
 551                        break;
 552
 553                case 's':
 554                {
 555                        int rc;
 556
 557                        if (isdigit(*(str+1))) {
 558                                rc = kstrtoint(str+1, 0, &reboot_cpu);
 559                                if (rc)
 560                                        return rc;
 561                        } else if (str[1] == 'm' && str[2] == 'p' &&
 562                                   isdigit(*(str+3))) {
 563                                rc = kstrtoint(str+3, 0, &reboot_cpu);
 564                                if (rc)
 565                                        return rc;
 566                        } else
 567                                *mode = REBOOT_SOFT;
 568                        break;
 569                }
 570                case 'g':
 571                        *mode = REBOOT_GPIO;
 572                        break;
 573
 574                case 'b':
 575                case 'a':
 576                case 'k':
 577                case 't':
 578                case 'e':
 579                case 'p':
 580                        reboot_type = *str;
 581                        break;
 582
 583                case 'f':
 584                        reboot_force = 1;
 585                        break;
 586                }
 587
 588                str = strchr(str, ',');
 589                if (str)
 590                        str++;
 591                else
 592                        break;
 593        }
 594        return 1;
 595}
 596__setup("reboot=", reboot_setup);
 597