0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0017
0018 #include <linux/sched/signal.h>
0019 #include <linux/sched/rt.h>
0020 #include <linux/sched/debug.h>
0021 #include <linux/sched/task.h>
0022 #include <linux/ctype.h>
0023 #include <linux/interrupt.h>
0024 #include <linux/mm.h>
0025 #include <linux/fs.h>
0026 #include <linux/mount.h>
0027 #include <linux/kdev_t.h>
0028 #include <linux/major.h>
0029 #include <linux/reboot.h>
0030 #include <linux/sysrq.h>
0031 #include <linux/kbd_kern.h>
0032 #include <linux/proc_fs.h>
0033 #include <linux/nmi.h>
0034 #include <linux/quotaops.h>
0035 #include <linux/perf_event.h>
0036 #include <linux/kernel.h>
0037 #include <linux/module.h>
0038 #include <linux/suspend.h>
0039 #include <linux/writeback.h>
0040 #include <linux/swap.h>
0041 #include <linux/spinlock.h>
0042 #include <linux/vt_kern.h>
0043 #include <linux/workqueue.h>
0044 #include <linux/hrtimer.h>
0045 #include <linux/oom.h>
0046 #include <linux/slab.h>
0047 #include <linux/input.h>
0048 #include <linux/uaccess.h>
0049 #include <linux/moduleparam.h>
0050 #include <linux/jiffies.h>
0051 #include <linux/syscalls.h>
0052 #include <linux/of.h>
0053 #include <linux/rcupdate.h>
0054
0055 #include <asm/ptrace.h>
0056 #include <asm/irq_regs.h>
0057
0058
0059 static int __read_mostly sysrq_enabled = CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE;
0060 static bool __read_mostly sysrq_always_enabled;
0061
0062 static bool sysrq_on(void)
0063 {
0064 return sysrq_enabled || sysrq_always_enabled;
0065 }
0066
0067
0068
0069
0070
0071
0072 int sysrq_mask(void)
0073 {
0074 if (sysrq_always_enabled)
0075 return 1;
0076 return sysrq_enabled;
0077 }
0078 EXPORT_SYMBOL_GPL(sysrq_mask);
0079
0080
0081
0082
0083 static bool sysrq_on_mask(int mask)
0084 {
0085 return sysrq_always_enabled ||
0086 sysrq_enabled == 1 ||
0087 (sysrq_enabled & mask);
0088 }
0089
0090 static int __init sysrq_always_enabled_setup(char *str)
0091 {
0092 sysrq_always_enabled = true;
0093 pr_info("sysrq always enabled.\n");
0094
0095 return 1;
0096 }
0097
0098 __setup("sysrq_always_enabled", sysrq_always_enabled_setup);
0099
0100
0101 static void sysrq_handle_loglevel(int key)
0102 {
0103 int i;
0104
0105 i = key - '0';
0106 console_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
0107 pr_info("Loglevel set to %d\n", i);
0108 console_loglevel = i;
0109 }
0110 static const struct sysrq_key_op sysrq_loglevel_op = {
0111 .handler = sysrq_handle_loglevel,
0112 .help_msg = "loglevel(0-9)",
0113 .action_msg = "Changing Loglevel",
0114 .enable_mask = SYSRQ_ENABLE_LOG,
0115 };
0116
0117 #ifdef CONFIG_VT
0118 static void sysrq_handle_SAK(int key)
0119 {
0120 struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
0121
0122 schedule_work(SAK_work);
0123 }
0124 static const struct sysrq_key_op sysrq_SAK_op = {
0125 .handler = sysrq_handle_SAK,
0126 .help_msg = "sak(k)",
0127 .action_msg = "SAK",
0128 .enable_mask = SYSRQ_ENABLE_KEYBOARD,
0129 };
0130 #else
0131 #define sysrq_SAK_op (*(const struct sysrq_key_op *)NULL)
0132 #endif
0133
0134 #ifdef CONFIG_VT
0135 static void sysrq_handle_unraw(int key)
0136 {
0137 vt_reset_unicode(fg_console);
0138 }
0139
0140 static const struct sysrq_key_op sysrq_unraw_op = {
0141 .handler = sysrq_handle_unraw,
0142 .help_msg = "unraw(r)",
0143 .action_msg = "Keyboard mode set to system default",
0144 .enable_mask = SYSRQ_ENABLE_KEYBOARD,
0145 };
0146 #else
0147 #define sysrq_unraw_op (*(const struct sysrq_key_op *)NULL)
0148 #endif
0149
0150 static void sysrq_handle_crash(int key)
0151 {
0152
0153 rcu_read_unlock();
0154
0155 panic("sysrq triggered crash\n");
0156 }
0157 static const struct sysrq_key_op sysrq_crash_op = {
0158 .handler = sysrq_handle_crash,
0159 .help_msg = "crash(c)",
0160 .action_msg = "Trigger a crash",
0161 .enable_mask = SYSRQ_ENABLE_DUMP,
0162 };
0163
0164 static void sysrq_handle_reboot(int key)
0165 {
0166 lockdep_off();
0167 local_irq_enable();
0168 emergency_restart();
0169 }
0170 static const struct sysrq_key_op sysrq_reboot_op = {
0171 .handler = sysrq_handle_reboot,
0172 .help_msg = "reboot(b)",
0173 .action_msg = "Resetting",
0174 .enable_mask = SYSRQ_ENABLE_BOOT,
0175 };
0176
0177 const struct sysrq_key_op *__sysrq_reboot_op = &sysrq_reboot_op;
0178
0179 static void sysrq_handle_sync(int key)
0180 {
0181 emergency_sync();
0182 }
0183 static const struct sysrq_key_op sysrq_sync_op = {
0184 .handler = sysrq_handle_sync,
0185 .help_msg = "sync(s)",
0186 .action_msg = "Emergency Sync",
0187 .enable_mask = SYSRQ_ENABLE_SYNC,
0188 };
0189
0190 static void sysrq_handle_show_timers(int key)
0191 {
0192 sysrq_timer_list_show();
0193 }
0194
0195 static const struct sysrq_key_op sysrq_show_timers_op = {
0196 .handler = sysrq_handle_show_timers,
0197 .help_msg = "show-all-timers(q)",
0198 .action_msg = "Show clockevent devices & pending hrtimers (no others)",
0199 };
0200
0201 static void sysrq_handle_mountro(int key)
0202 {
0203 emergency_remount();
0204 }
0205 static const struct sysrq_key_op sysrq_mountro_op = {
0206 .handler = sysrq_handle_mountro,
0207 .help_msg = "unmount(u)",
0208 .action_msg = "Emergency Remount R/O",
0209 .enable_mask = SYSRQ_ENABLE_REMOUNT,
0210 };
0211
0212 #ifdef CONFIG_LOCKDEP
0213 static void sysrq_handle_showlocks(int key)
0214 {
0215 debug_show_all_locks();
0216 }
0217
0218 static const struct sysrq_key_op sysrq_showlocks_op = {
0219 .handler = sysrq_handle_showlocks,
0220 .help_msg = "show-all-locks(d)",
0221 .action_msg = "Show Locks Held",
0222 };
0223 #else
0224 #define sysrq_showlocks_op (*(const struct sysrq_key_op *)NULL)
0225 #endif
0226
0227 #ifdef CONFIG_SMP
0228 static DEFINE_RAW_SPINLOCK(show_lock);
0229
0230 static void showacpu(void *dummy)
0231 {
0232 unsigned long flags;
0233
0234
0235 if (idle_cpu(smp_processor_id())) {
0236 pr_info("CPU%d: backtrace skipped as idling\n", smp_processor_id());
0237 return;
0238 }
0239
0240 raw_spin_lock_irqsave(&show_lock, flags);
0241 pr_info("CPU%d:\n", smp_processor_id());
0242 show_stack(NULL, NULL, KERN_INFO);
0243 raw_spin_unlock_irqrestore(&show_lock, flags);
0244 }
0245
0246 static void sysrq_showregs_othercpus(struct work_struct *dummy)
0247 {
0248 smp_call_function(showacpu, NULL, 0);
0249 }
0250
0251 static DECLARE_WORK(sysrq_showallcpus, sysrq_showregs_othercpus);
0252
0253 static void sysrq_handle_showallcpus(int key)
0254 {
0255
0256
0257
0258
0259
0260 if (!trigger_all_cpu_backtrace()) {
0261 struct pt_regs *regs = NULL;
0262
0263 if (in_hardirq())
0264 regs = get_irq_regs();
0265
0266 pr_info("CPU%d:\n", smp_processor_id());
0267 if (regs)
0268 show_regs(regs);
0269 else
0270 show_stack(NULL, NULL, KERN_INFO);
0271
0272 schedule_work(&sysrq_showallcpus);
0273 }
0274 }
0275
0276 static const struct sysrq_key_op sysrq_showallcpus_op = {
0277 .handler = sysrq_handle_showallcpus,
0278 .help_msg = "show-backtrace-all-active-cpus(l)",
0279 .action_msg = "Show backtrace of all active CPUs",
0280 .enable_mask = SYSRQ_ENABLE_DUMP,
0281 };
0282 #else
0283 #define sysrq_showallcpus_op (*(const struct sysrq_key_op *)NULL)
0284 #endif
0285
0286 static void sysrq_handle_showregs(int key)
0287 {
0288 struct pt_regs *regs = NULL;
0289
0290 if (in_hardirq())
0291 regs = get_irq_regs();
0292 if (regs)
0293 show_regs(regs);
0294 perf_event_print_debug();
0295 }
0296 static const struct sysrq_key_op sysrq_showregs_op = {
0297 .handler = sysrq_handle_showregs,
0298 .help_msg = "show-registers(p)",
0299 .action_msg = "Show Regs",
0300 .enable_mask = SYSRQ_ENABLE_DUMP,
0301 };
0302
0303 static void sysrq_handle_showstate(int key)
0304 {
0305 show_state();
0306 show_all_workqueues();
0307 }
0308 static const struct sysrq_key_op sysrq_showstate_op = {
0309 .handler = sysrq_handle_showstate,
0310 .help_msg = "show-task-states(t)",
0311 .action_msg = "Show State",
0312 .enable_mask = SYSRQ_ENABLE_DUMP,
0313 };
0314
0315 static void sysrq_handle_showstate_blocked(int key)
0316 {
0317 show_state_filter(TASK_UNINTERRUPTIBLE);
0318 }
0319 static const struct sysrq_key_op sysrq_showstate_blocked_op = {
0320 .handler = sysrq_handle_showstate_blocked,
0321 .help_msg = "show-blocked-tasks(w)",
0322 .action_msg = "Show Blocked State",
0323 .enable_mask = SYSRQ_ENABLE_DUMP,
0324 };
0325
0326 #ifdef CONFIG_TRACING
0327 #include <linux/ftrace.h>
0328
0329 static void sysrq_ftrace_dump(int key)
0330 {
0331 ftrace_dump(DUMP_ALL);
0332 }
0333 static const struct sysrq_key_op sysrq_ftrace_dump_op = {
0334 .handler = sysrq_ftrace_dump,
0335 .help_msg = "dump-ftrace-buffer(z)",
0336 .action_msg = "Dump ftrace buffer",
0337 .enable_mask = SYSRQ_ENABLE_DUMP,
0338 };
0339 #else
0340 #define sysrq_ftrace_dump_op (*(const struct sysrq_key_op *)NULL)
0341 #endif
0342
0343 static void sysrq_handle_showmem(int key)
0344 {
0345 show_mem(0, NULL);
0346 }
0347 static const struct sysrq_key_op sysrq_showmem_op = {
0348 .handler = sysrq_handle_showmem,
0349 .help_msg = "show-memory-usage(m)",
0350 .action_msg = "Show Memory",
0351 .enable_mask = SYSRQ_ENABLE_DUMP,
0352 };
0353
0354
0355
0356
0357 static void send_sig_all(int sig)
0358 {
0359 struct task_struct *p;
0360
0361 read_lock(&tasklist_lock);
0362 for_each_process(p) {
0363 if (p->flags & PF_KTHREAD)
0364 continue;
0365 if (is_global_init(p))
0366 continue;
0367
0368 do_send_sig_info(sig, SEND_SIG_PRIV, p, PIDTYPE_MAX);
0369 }
0370 read_unlock(&tasklist_lock);
0371 }
0372
0373 static void sysrq_handle_term(int key)
0374 {
0375 send_sig_all(SIGTERM);
0376 console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
0377 }
0378 static const struct sysrq_key_op sysrq_term_op = {
0379 .handler = sysrq_handle_term,
0380 .help_msg = "terminate-all-tasks(e)",
0381 .action_msg = "Terminate All Tasks",
0382 .enable_mask = SYSRQ_ENABLE_SIGNAL,
0383 };
0384
0385 static void moom_callback(struct work_struct *ignored)
0386 {
0387 const gfp_t gfp_mask = GFP_KERNEL;
0388 struct oom_control oc = {
0389 .zonelist = node_zonelist(first_memory_node, gfp_mask),
0390 .nodemask = NULL,
0391 .memcg = NULL,
0392 .gfp_mask = gfp_mask,
0393 .order = -1,
0394 };
0395
0396 mutex_lock(&oom_lock);
0397 if (!out_of_memory(&oc))
0398 pr_info("OOM request ignored. No task eligible\n");
0399 mutex_unlock(&oom_lock);
0400 }
0401
0402 static DECLARE_WORK(moom_work, moom_callback);
0403
0404 static void sysrq_handle_moom(int key)
0405 {
0406 schedule_work(&moom_work);
0407 }
0408 static const struct sysrq_key_op sysrq_moom_op = {
0409 .handler = sysrq_handle_moom,
0410 .help_msg = "memory-full-oom-kill(f)",
0411 .action_msg = "Manual OOM execution",
0412 .enable_mask = SYSRQ_ENABLE_SIGNAL,
0413 };
0414
0415 #ifdef CONFIG_BLOCK
0416 static void sysrq_handle_thaw(int key)
0417 {
0418 emergency_thaw_all();
0419 }
0420 static const struct sysrq_key_op sysrq_thaw_op = {
0421 .handler = sysrq_handle_thaw,
0422 .help_msg = "thaw-filesystems(j)",
0423 .action_msg = "Emergency Thaw of all frozen filesystems",
0424 .enable_mask = SYSRQ_ENABLE_SIGNAL,
0425 };
0426 #else
0427 #define sysrq_thaw_op (*(const struct sysrq_key_op *)NULL)
0428 #endif
0429
0430 static void sysrq_handle_kill(int key)
0431 {
0432 send_sig_all(SIGKILL);
0433 console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
0434 }
0435 static const struct sysrq_key_op sysrq_kill_op = {
0436 .handler = sysrq_handle_kill,
0437 .help_msg = "kill-all-tasks(i)",
0438 .action_msg = "Kill All Tasks",
0439 .enable_mask = SYSRQ_ENABLE_SIGNAL,
0440 };
0441
0442 static void sysrq_handle_unrt(int key)
0443 {
0444 normalize_rt_tasks();
0445 }
0446 static const struct sysrq_key_op sysrq_unrt_op = {
0447 .handler = sysrq_handle_unrt,
0448 .help_msg = "nice-all-RT-tasks(n)",
0449 .action_msg = "Nice All RT Tasks",
0450 .enable_mask = SYSRQ_ENABLE_RTNICE,
0451 };
0452
0453
0454 static DEFINE_SPINLOCK(sysrq_key_table_lock);
0455
0456 static const struct sysrq_key_op *sysrq_key_table[62] = {
0457 &sysrq_loglevel_op,
0458 &sysrq_loglevel_op,
0459 &sysrq_loglevel_op,
0460 &sysrq_loglevel_op,
0461 &sysrq_loglevel_op,
0462 &sysrq_loglevel_op,
0463 &sysrq_loglevel_op,
0464 &sysrq_loglevel_op,
0465 &sysrq_loglevel_op,
0466 &sysrq_loglevel_op,
0467
0468
0469
0470
0471
0472 NULL,
0473 &sysrq_reboot_op,
0474 &sysrq_crash_op,
0475 &sysrq_showlocks_op,
0476 &sysrq_term_op,
0477 &sysrq_moom_op,
0478
0479 NULL,
0480 NULL,
0481 &sysrq_kill_op,
0482 &sysrq_thaw_op,
0483 &sysrq_SAK_op,
0484 &sysrq_showallcpus_op,
0485 &sysrq_showmem_op,
0486 &sysrq_unrt_op,
0487
0488 NULL,
0489 &sysrq_showregs_op,
0490 &sysrq_show_timers_op,
0491 &sysrq_unraw_op,
0492 &sysrq_sync_op,
0493 &sysrq_showstate_op,
0494 &sysrq_mountro_op,
0495
0496 NULL,
0497 &sysrq_showstate_blocked_op,
0498
0499
0500
0501 NULL,
0502
0503 NULL,
0504 &sysrq_ftrace_dump_op,
0505 NULL,
0506 NULL,
0507 NULL,
0508 NULL,
0509 NULL,
0510 NULL,
0511 NULL,
0512 NULL,
0513 NULL,
0514 NULL,
0515 NULL,
0516 NULL,
0517 NULL,
0518 NULL,
0519 NULL,
0520 NULL,
0521 NULL,
0522 NULL,
0523 NULL,
0524 NULL,
0525 NULL,
0526 NULL,
0527 NULL,
0528 NULL,
0529 NULL,
0530 NULL,
0531 };
0532
0533
0534 static int sysrq_key_table_key2index(int key)
0535 {
0536 int retval;
0537
0538 if ((key >= '0') && (key <= '9'))
0539 retval = key - '0';
0540 else if ((key >= 'a') && (key <= 'z'))
0541 retval = key + 10 - 'a';
0542 else if ((key >= 'A') && (key <= 'Z'))
0543 retval = key + 36 - 'A';
0544 else
0545 retval = -1;
0546 return retval;
0547 }
0548
0549
0550
0551
0552 static const struct sysrq_key_op *__sysrq_get_key_op(int key)
0553 {
0554 const struct sysrq_key_op *op_p = NULL;
0555 int i;
0556
0557 i = sysrq_key_table_key2index(key);
0558 if (i != -1)
0559 op_p = sysrq_key_table[i];
0560
0561 return op_p;
0562 }
0563
0564 static void __sysrq_put_key_op(int key, const struct sysrq_key_op *op_p)
0565 {
0566 int i = sysrq_key_table_key2index(key);
0567
0568 if (i != -1)
0569 sysrq_key_table[i] = op_p;
0570 }
0571
0572 void __handle_sysrq(int key, bool check_mask)
0573 {
0574 const struct sysrq_key_op *op_p;
0575 int orig_log_level;
0576 int orig_suppress_printk;
0577 int i;
0578
0579 orig_suppress_printk = suppress_printk;
0580 suppress_printk = 0;
0581
0582 rcu_sysrq_start();
0583 rcu_read_lock();
0584
0585
0586
0587
0588
0589
0590 orig_log_level = console_loglevel;
0591 console_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
0592
0593 op_p = __sysrq_get_key_op(key);
0594 if (op_p) {
0595
0596
0597
0598
0599 if (!check_mask || sysrq_on_mask(op_p->enable_mask)) {
0600 pr_info("%s\n", op_p->action_msg);
0601 console_loglevel = orig_log_level;
0602 op_p->handler(key);
0603 } else {
0604 pr_info("This sysrq operation is disabled.\n");
0605 console_loglevel = orig_log_level;
0606 }
0607 } else {
0608 pr_info("HELP : ");
0609
0610 for (i = 0; i < ARRAY_SIZE(sysrq_key_table); i++) {
0611 if (sysrq_key_table[i]) {
0612 int j;
0613
0614 for (j = 0; sysrq_key_table[i] !=
0615 sysrq_key_table[j]; j++)
0616 ;
0617 if (j != i)
0618 continue;
0619 pr_cont("%s ", sysrq_key_table[i]->help_msg);
0620 }
0621 }
0622 pr_cont("\n");
0623 console_loglevel = orig_log_level;
0624 }
0625 rcu_read_unlock();
0626 rcu_sysrq_end();
0627
0628 suppress_printk = orig_suppress_printk;
0629 }
0630
0631 void handle_sysrq(int key)
0632 {
0633 if (sysrq_on())
0634 __handle_sysrq(key, true);
0635 }
0636 EXPORT_SYMBOL(handle_sysrq);
0637
0638 #ifdef CONFIG_INPUT
0639 static int sysrq_reset_downtime_ms;
0640
0641
0642 static const unsigned char sysrq_xlate[KEY_CNT] =
0643 "\000\0331234567890-=\177\t"
0644 "qwertyuiop[]\r\000as"
0645 "dfghjkl;'`\000\\zxcv"
0646 "bnm,./\000*\000 \000\201\202\203\204\205"
0647 "\206\207\210\211\212\000\000789-456+1"
0648 "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000"
0649 "\r\000/";
0650
0651 struct sysrq_state {
0652 struct input_handle handle;
0653 struct work_struct reinject_work;
0654 unsigned long key_down[BITS_TO_LONGS(KEY_CNT)];
0655 unsigned int alt;
0656 unsigned int alt_use;
0657 unsigned int shift;
0658 unsigned int shift_use;
0659 bool active;
0660 bool need_reinject;
0661 bool reinjecting;
0662
0663
0664 bool reset_canceled;
0665 bool reset_requested;
0666 unsigned long reset_keybit[BITS_TO_LONGS(KEY_CNT)];
0667 int reset_seq_len;
0668 int reset_seq_cnt;
0669 int reset_seq_version;
0670 struct timer_list keyreset_timer;
0671 };
0672
0673 #define SYSRQ_KEY_RESET_MAX 20
0674 static unsigned short sysrq_reset_seq[SYSRQ_KEY_RESET_MAX];
0675 static unsigned int sysrq_reset_seq_len;
0676 static unsigned int sysrq_reset_seq_version = 1;
0677
0678 static void sysrq_parse_reset_sequence(struct sysrq_state *state)
0679 {
0680 int i;
0681 unsigned short key;
0682
0683 state->reset_seq_cnt = 0;
0684
0685 for (i = 0; i < sysrq_reset_seq_len; i++) {
0686 key = sysrq_reset_seq[i];
0687
0688 if (key == KEY_RESERVED || key > KEY_MAX)
0689 break;
0690
0691 __set_bit(key, state->reset_keybit);
0692 state->reset_seq_len++;
0693
0694 if (test_bit(key, state->key_down))
0695 state->reset_seq_cnt++;
0696 }
0697
0698
0699 state->reset_canceled = state->reset_seq_cnt != 0;
0700
0701 state->reset_seq_version = sysrq_reset_seq_version;
0702 }
0703
0704 static void sysrq_do_reset(struct timer_list *t)
0705 {
0706 struct sysrq_state *state = from_timer(state, t, keyreset_timer);
0707
0708 state->reset_requested = true;
0709
0710 orderly_reboot();
0711 }
0712
0713 static void sysrq_handle_reset_request(struct sysrq_state *state)
0714 {
0715 if (state->reset_requested)
0716 __handle_sysrq(sysrq_xlate[KEY_B], false);
0717
0718 if (sysrq_reset_downtime_ms)
0719 mod_timer(&state->keyreset_timer,
0720 jiffies + msecs_to_jiffies(sysrq_reset_downtime_ms));
0721 else
0722 sysrq_do_reset(&state->keyreset_timer);
0723 }
0724
0725 static void sysrq_detect_reset_sequence(struct sysrq_state *state,
0726 unsigned int code, int value)
0727 {
0728 if (!test_bit(code, state->reset_keybit)) {
0729
0730
0731
0732
0733
0734
0735 if (value && state->reset_seq_cnt) {
0736 state->reset_canceled = true;
0737 del_timer(&state->keyreset_timer);
0738 }
0739 } else if (value == 0) {
0740
0741
0742
0743
0744
0745 del_timer(&state->keyreset_timer);
0746
0747 if (--state->reset_seq_cnt == 0)
0748 state->reset_canceled = false;
0749 } else if (value == 1) {
0750
0751 if (++state->reset_seq_cnt == state->reset_seq_len &&
0752 !state->reset_canceled) {
0753 sysrq_handle_reset_request(state);
0754 }
0755 }
0756 }
0757
0758 #ifdef CONFIG_OF
0759 static void sysrq_of_get_keyreset_config(void)
0760 {
0761 u32 key;
0762 struct device_node *np;
0763 struct property *prop;
0764 const __be32 *p;
0765
0766 np = of_find_node_by_path("/chosen/linux,sysrq-reset-seq");
0767 if (!np) {
0768 pr_debug("No sysrq node found");
0769 return;
0770 }
0771
0772
0773 sysrq_reset_seq_len = 0;
0774
0775 of_property_for_each_u32(np, "keyset", prop, p, key) {
0776 if (key == KEY_RESERVED || key > KEY_MAX ||
0777 sysrq_reset_seq_len == SYSRQ_KEY_RESET_MAX)
0778 break;
0779
0780 sysrq_reset_seq[sysrq_reset_seq_len++] = (unsigned short)key;
0781 }
0782
0783
0784 of_property_read_u32(np, "timeout-ms", &sysrq_reset_downtime_ms);
0785
0786 of_node_put(np);
0787 }
0788 #else
0789 static void sysrq_of_get_keyreset_config(void)
0790 {
0791 }
0792 #endif
0793
0794 static void sysrq_reinject_alt_sysrq(struct work_struct *work)
0795 {
0796 struct sysrq_state *sysrq =
0797 container_of(work, struct sysrq_state, reinject_work);
0798 struct input_handle *handle = &sysrq->handle;
0799 unsigned int alt_code = sysrq->alt_use;
0800
0801 if (sysrq->need_reinject) {
0802
0803 sysrq->reinjecting = true;
0804 mb();
0805
0806
0807 input_inject_event(handle, EV_KEY, alt_code, 1);
0808 input_inject_event(handle, EV_KEY, KEY_SYSRQ, 1);
0809 input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
0810
0811 input_inject_event(handle, EV_KEY, KEY_SYSRQ, 0);
0812 input_inject_event(handle, EV_KEY, alt_code, 0);
0813 input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
0814
0815 mb();
0816 sysrq->reinjecting = false;
0817 }
0818 }
0819
0820 static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
0821 unsigned int code, int value)
0822 {
0823 bool was_active = sysrq->active;
0824 bool suppress;
0825
0826 switch (code) {
0827
0828 case KEY_LEFTALT:
0829 case KEY_RIGHTALT:
0830 if (!value) {
0831
0832 if (sysrq->active && code == sysrq->alt_use)
0833 sysrq->active = false;
0834
0835 sysrq->alt = KEY_RESERVED;
0836
0837 } else if (value != 2) {
0838 sysrq->alt = code;
0839 sysrq->need_reinject = false;
0840 }
0841 break;
0842
0843 case KEY_LEFTSHIFT:
0844 case KEY_RIGHTSHIFT:
0845 if (!value)
0846 sysrq->shift = KEY_RESERVED;
0847 else if (value != 2)
0848 sysrq->shift = code;
0849 if (sysrq->active)
0850 sysrq->shift_use = sysrq->shift;
0851 break;
0852
0853 case KEY_SYSRQ:
0854 if (value == 1 && sysrq->alt != KEY_RESERVED) {
0855 sysrq->active = true;
0856 sysrq->alt_use = sysrq->alt;
0857
0858 sysrq->shift_use = sysrq->shift;
0859
0860
0861
0862
0863 sysrq->need_reinject = true;
0864 }
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874 if (sysrq->active)
0875 clear_bit(KEY_SYSRQ, sysrq->handle.dev->key);
0876
0877 break;
0878
0879 default:
0880 if (sysrq->active && value && value != 2) {
0881 unsigned char c = sysrq_xlate[code];
0882
0883 sysrq->need_reinject = false;
0884 if (sysrq->shift_use != KEY_RESERVED)
0885 c = toupper(c);
0886 __handle_sysrq(c, true);
0887 }
0888 break;
0889 }
0890
0891 suppress = sysrq->active;
0892
0893 if (!sysrq->active) {
0894
0895
0896
0897
0898 if (sysrq->reset_seq_version != sysrq_reset_seq_version)
0899 sysrq_parse_reset_sequence(sysrq);
0900
0901
0902
0903
0904
0905
0906 if (value)
0907 set_bit(code, sysrq->key_down);
0908 else
0909 clear_bit(code, sysrq->key_down);
0910
0911 if (was_active)
0912 schedule_work(&sysrq->reinject_work);
0913
0914
0915 sysrq_detect_reset_sequence(sysrq, code, value);
0916
0917 } else if (value == 0 && test_and_clear_bit(code, sysrq->key_down)) {
0918
0919
0920
0921
0922 suppress = false;
0923 }
0924
0925 return suppress;
0926 }
0927
0928 static bool sysrq_filter(struct input_handle *handle,
0929 unsigned int type, unsigned int code, int value)
0930 {
0931 struct sysrq_state *sysrq = handle->private;
0932 bool suppress;
0933
0934
0935
0936
0937
0938 if (sysrq->reinjecting)
0939 return false;
0940
0941 switch (type) {
0942
0943 case EV_SYN:
0944 suppress = false;
0945 break;
0946
0947 case EV_KEY:
0948 suppress = sysrq_handle_keypress(sysrq, code, value);
0949 break;
0950
0951 default:
0952 suppress = sysrq->active;
0953 break;
0954 }
0955
0956 return suppress;
0957 }
0958
0959 static int sysrq_connect(struct input_handler *handler,
0960 struct input_dev *dev,
0961 const struct input_device_id *id)
0962 {
0963 struct sysrq_state *sysrq;
0964 int error;
0965
0966 sysrq = kzalloc(sizeof(struct sysrq_state), GFP_KERNEL);
0967 if (!sysrq)
0968 return -ENOMEM;
0969
0970 INIT_WORK(&sysrq->reinject_work, sysrq_reinject_alt_sysrq);
0971
0972 sysrq->handle.dev = dev;
0973 sysrq->handle.handler = handler;
0974 sysrq->handle.name = "sysrq";
0975 sysrq->handle.private = sysrq;
0976 timer_setup(&sysrq->keyreset_timer, sysrq_do_reset, 0);
0977
0978 error = input_register_handle(&sysrq->handle);
0979 if (error) {
0980 pr_err("Failed to register input sysrq handler, error %d\n",
0981 error);
0982 goto err_free;
0983 }
0984
0985 error = input_open_device(&sysrq->handle);
0986 if (error) {
0987 pr_err("Failed to open input device, error %d\n", error);
0988 goto err_unregister;
0989 }
0990
0991 return 0;
0992
0993 err_unregister:
0994 input_unregister_handle(&sysrq->handle);
0995 err_free:
0996 kfree(sysrq);
0997 return error;
0998 }
0999
1000 static void sysrq_disconnect(struct input_handle *handle)
1001 {
1002 struct sysrq_state *sysrq = handle->private;
1003
1004 input_close_device(handle);
1005 cancel_work_sync(&sysrq->reinject_work);
1006 del_timer_sync(&sysrq->keyreset_timer);
1007 input_unregister_handle(handle);
1008 kfree(sysrq);
1009 }
1010
1011
1012
1013
1014
1015
1016 static const struct input_device_id sysrq_ids[] = {
1017 {
1018 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1019 INPUT_DEVICE_ID_MATCH_KEYBIT,
1020 .evbit = { [BIT_WORD(EV_KEY)] = BIT_MASK(EV_KEY) },
1021 .keybit = { [BIT_WORD(KEY_LEFTALT)] = BIT_MASK(KEY_LEFTALT) },
1022 },
1023 { },
1024 };
1025
1026 static struct input_handler sysrq_handler = {
1027 .filter = sysrq_filter,
1028 .connect = sysrq_connect,
1029 .disconnect = sysrq_disconnect,
1030 .name = "sysrq",
1031 .id_table = sysrq_ids,
1032 };
1033
1034 static inline void sysrq_register_handler(void)
1035 {
1036 int error;
1037
1038 sysrq_of_get_keyreset_config();
1039
1040 error = input_register_handler(&sysrq_handler);
1041 if (error)
1042 pr_err("Failed to register input handler, error %d", error);
1043 }
1044
1045 static inline void sysrq_unregister_handler(void)
1046 {
1047 input_unregister_handler(&sysrq_handler);
1048 }
1049
1050 static int sysrq_reset_seq_param_set(const char *buffer,
1051 const struct kernel_param *kp)
1052 {
1053 unsigned long val;
1054 int error;
1055
1056 error = kstrtoul(buffer, 0, &val);
1057 if (error < 0)
1058 return error;
1059
1060 if (val > KEY_MAX)
1061 return -EINVAL;
1062
1063 *((unsigned short *)kp->arg) = val;
1064 sysrq_reset_seq_version++;
1065
1066 return 0;
1067 }
1068
1069 static const struct kernel_param_ops param_ops_sysrq_reset_seq = {
1070 .get = param_get_ushort,
1071 .set = sysrq_reset_seq_param_set,
1072 };
1073
1074 #define param_check_sysrq_reset_seq(name, p) \
1075 __param_check(name, p, unsigned short)
1076
1077
1078
1079
1080
1081 module_param_array_named(reset_seq, sysrq_reset_seq, sysrq_reset_seq,
1082 &sysrq_reset_seq_len, 0644);
1083
1084 module_param_named(sysrq_downtime_ms, sysrq_reset_downtime_ms, int, 0644);
1085
1086 #else
1087
1088 static inline void sysrq_register_handler(void)
1089 {
1090 }
1091
1092 static inline void sysrq_unregister_handler(void)
1093 {
1094 }
1095
1096 #endif
1097
1098 int sysrq_toggle_support(int enable_mask)
1099 {
1100 bool was_enabled = sysrq_on();
1101
1102 sysrq_enabled = enable_mask;
1103
1104 if (was_enabled != sysrq_on()) {
1105 if (sysrq_on())
1106 sysrq_register_handler();
1107 else
1108 sysrq_unregister_handler();
1109 }
1110
1111 return 0;
1112 }
1113 EXPORT_SYMBOL_GPL(sysrq_toggle_support);
1114
1115 static int __sysrq_swap_key_ops(int key, const struct sysrq_key_op *insert_op_p,
1116 const struct sysrq_key_op *remove_op_p)
1117 {
1118 int retval;
1119
1120 spin_lock(&sysrq_key_table_lock);
1121 if (__sysrq_get_key_op(key) == remove_op_p) {
1122 __sysrq_put_key_op(key, insert_op_p);
1123 retval = 0;
1124 } else {
1125 retval = -1;
1126 }
1127 spin_unlock(&sysrq_key_table_lock);
1128
1129
1130
1131
1132
1133
1134 synchronize_rcu();
1135
1136 return retval;
1137 }
1138
1139 int register_sysrq_key(int key, const struct sysrq_key_op *op_p)
1140 {
1141 return __sysrq_swap_key_ops(key, op_p, NULL);
1142 }
1143 EXPORT_SYMBOL(register_sysrq_key);
1144
1145 int unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)
1146 {
1147 return __sysrq_swap_key_ops(key, NULL, op_p);
1148 }
1149 EXPORT_SYMBOL(unregister_sysrq_key);
1150
1151 #ifdef CONFIG_PROC_FS
1152
1153
1154
1155 static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf,
1156 size_t count, loff_t *ppos)
1157 {
1158 if (count) {
1159 char c;
1160
1161 if (get_user(c, buf))
1162 return -EFAULT;
1163 __handle_sysrq(c, false);
1164 }
1165
1166 return count;
1167 }
1168
1169 static const struct proc_ops sysrq_trigger_proc_ops = {
1170 .proc_write = write_sysrq_trigger,
1171 .proc_lseek = noop_llseek,
1172 };
1173
1174 static void sysrq_init_procfs(void)
1175 {
1176 if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
1177 &sysrq_trigger_proc_ops))
1178 pr_err("Failed to register proc interface\n");
1179 }
1180
1181 #else
1182
1183 static inline void sysrq_init_procfs(void)
1184 {
1185 }
1186
1187 #endif
1188
1189 static int __init sysrq_init(void)
1190 {
1191 sysrq_init_procfs();
1192
1193 if (sysrq_on())
1194 sysrq_register_handler();
1195
1196 return 0;
1197 }
1198 device_initcall(sysrq_init);