1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17
18#include <linux/sched/signal.h>
19#include <linux/sched/rt.h>
20#include <linux/sched/debug.h>
21#include <linux/sched/task.h>
22#include <linux/ctype.h>
23#include <linux/interrupt.h>
24#include <linux/mm.h>
25#include <linux/fs.h>
26#include <linux/mount.h>
27#include <linux/kdev_t.h>
28#include <linux/major.h>
29#include <linux/reboot.h>
30#include <linux/sysrq.h>
31#include <linux/kbd_kern.h>
32#include <linux/proc_fs.h>
33#include <linux/nmi.h>
34#include <linux/quotaops.h>
35#include <linux/perf_event.h>
36#include <linux/kernel.h>
37#include <linux/module.h>
38#include <linux/suspend.h>
39#include <linux/writeback.h>
40#include <linux/swap.h>
41#include <linux/spinlock.h>
42#include <linux/vt_kern.h>
43#include <linux/workqueue.h>
44#include <linux/hrtimer.h>
45#include <linux/oom.h>
46#include <linux/slab.h>
47#include <linux/input.h>
48#include <linux/uaccess.h>
49#include <linux/moduleparam.h>
50#include <linux/jiffies.h>
51#include <linux/syscalls.h>
52#include <linux/of.h>
53#include <linux/rcupdate.h>
54
55#include <asm/ptrace.h>
56#include <asm/irq_regs.h>
57
58
59static int __read_mostly sysrq_enabled = CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE;
60static bool __read_mostly sysrq_always_enabled;
61
62static bool sysrq_on(void)
63{
64 return sysrq_enabled || sysrq_always_enabled;
65}
66
67
68
69
70
71
72int sysrq_mask(void)
73{
74 if (sysrq_always_enabled)
75 return 1;
76 return sysrq_enabled;
77}
78EXPORT_SYMBOL_GPL(sysrq_mask);
79
80
81
82
83static bool sysrq_on_mask(int mask)
84{
85 return sysrq_always_enabled ||
86 sysrq_enabled == 1 ||
87 (sysrq_enabled & mask);
88}
89
90static int __init sysrq_always_enabled_setup(char *str)
91{
92 sysrq_always_enabled = true;
93 pr_info("sysrq always enabled.\n");
94
95 return 1;
96}
97
98__setup("sysrq_always_enabled", sysrq_always_enabled_setup);
99
100
101static void sysrq_handle_loglevel(int key)
102{
103 int i;
104
105 i = key - '0';
106 console_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
107 pr_info("Loglevel set to %d\n", i);
108 console_loglevel = i;
109}
110static const struct sysrq_key_op sysrq_loglevel_op = {
111 .handler = sysrq_handle_loglevel,
112 .help_msg = "loglevel(0-9)",
113 .action_msg = "Changing Loglevel",
114 .enable_mask = SYSRQ_ENABLE_LOG,
115};
116
117#ifdef CONFIG_VT
118static void sysrq_handle_SAK(int key)
119{
120 struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
121
122 schedule_work(SAK_work);
123}
124static const struct sysrq_key_op sysrq_SAK_op = {
125 .handler = sysrq_handle_SAK,
126 .help_msg = "sak(k)",
127 .action_msg = "SAK",
128 .enable_mask = SYSRQ_ENABLE_KEYBOARD,
129};
130#else
131#define sysrq_SAK_op (*(const struct sysrq_key_op *)NULL)
132#endif
133
134#ifdef CONFIG_VT
135static void sysrq_handle_unraw(int key)
136{
137 vt_reset_unicode(fg_console);
138}
139
140static const struct sysrq_key_op sysrq_unraw_op = {
141 .handler = sysrq_handle_unraw,
142 .help_msg = "unraw(r)",
143 .action_msg = "Keyboard mode set to system default",
144 .enable_mask = SYSRQ_ENABLE_KEYBOARD,
145};
146#else
147#define sysrq_unraw_op (*(const struct sysrq_key_op *)NULL)
148#endif
149
150static void sysrq_handle_crash(int key)
151{
152
153 rcu_read_unlock();
154
155 panic("sysrq triggered crash\n");
156}
157static const struct sysrq_key_op sysrq_crash_op = {
158 .handler = sysrq_handle_crash,
159 .help_msg = "crash(c)",
160 .action_msg = "Trigger a crash",
161 .enable_mask = SYSRQ_ENABLE_DUMP,
162};
163
164static void sysrq_handle_reboot(int key)
165{
166 lockdep_off();
167 local_irq_enable();
168 emergency_restart();
169}
170static const struct sysrq_key_op sysrq_reboot_op = {
171 .handler = sysrq_handle_reboot,
172 .help_msg = "reboot(b)",
173 .action_msg = "Resetting",
174 .enable_mask = SYSRQ_ENABLE_BOOT,
175};
176
177const struct sysrq_key_op *__sysrq_reboot_op = &sysrq_reboot_op;
178
179static void sysrq_handle_sync(int key)
180{
181 emergency_sync();
182}
183static const struct sysrq_key_op sysrq_sync_op = {
184 .handler = sysrq_handle_sync,
185 .help_msg = "sync(s)",
186 .action_msg = "Emergency Sync",
187 .enable_mask = SYSRQ_ENABLE_SYNC,
188};
189
190static void sysrq_handle_show_timers(int key)
191{
192 sysrq_timer_list_show();
193}
194
195static const struct sysrq_key_op sysrq_show_timers_op = {
196 .handler = sysrq_handle_show_timers,
197 .help_msg = "show-all-timers(q)",
198 .action_msg = "Show clockevent devices & pending hrtimers (no others)",
199};
200
201static void sysrq_handle_mountro(int key)
202{
203 emergency_remount();
204}
205static const struct sysrq_key_op sysrq_mountro_op = {
206 .handler = sysrq_handle_mountro,
207 .help_msg = "unmount(u)",
208 .action_msg = "Emergency Remount R/O",
209 .enable_mask = SYSRQ_ENABLE_REMOUNT,
210};
211
212#ifdef CONFIG_LOCKDEP
213static void sysrq_handle_showlocks(int key)
214{
215 debug_show_all_locks();
216}
217
218static const struct sysrq_key_op sysrq_showlocks_op = {
219 .handler = sysrq_handle_showlocks,
220 .help_msg = "show-all-locks(d)",
221 .action_msg = "Show Locks Held",
222};
223#else
224#define sysrq_showlocks_op (*(const struct sysrq_key_op *)NULL)
225#endif
226
227#ifdef CONFIG_SMP
228static DEFINE_RAW_SPINLOCK(show_lock);
229
230static void showacpu(void *dummy)
231{
232 unsigned long flags;
233
234
235 if (idle_cpu(smp_processor_id()))
236 return;
237
238 raw_spin_lock_irqsave(&show_lock, flags);
239 pr_info("CPU%d:\n", smp_processor_id());
240 show_stack(NULL, NULL, KERN_INFO);
241 raw_spin_unlock_irqrestore(&show_lock, flags);
242}
243
244static void sysrq_showregs_othercpus(struct work_struct *dummy)
245{
246 smp_call_function(showacpu, NULL, 0);
247}
248
249static DECLARE_WORK(sysrq_showallcpus, sysrq_showregs_othercpus);
250
251static void sysrq_handle_showallcpus(int key)
252{
253
254
255
256
257
258 if (!trigger_all_cpu_backtrace()) {
259 struct pt_regs *regs = NULL;
260
261 if (in_hardirq())
262 regs = get_irq_regs();
263 if (regs) {
264 pr_info("CPU%d:\n", smp_processor_id());
265 show_regs(regs);
266 }
267 schedule_work(&sysrq_showallcpus);
268 }
269}
270
271static const struct sysrq_key_op sysrq_showallcpus_op = {
272 .handler = sysrq_handle_showallcpus,
273 .help_msg = "show-backtrace-all-active-cpus(l)",
274 .action_msg = "Show backtrace of all active CPUs",
275 .enable_mask = SYSRQ_ENABLE_DUMP,
276};
277#endif
278
279static void sysrq_handle_showregs(int key)
280{
281 struct pt_regs *regs = NULL;
282
283 if (in_hardirq())
284 regs = get_irq_regs();
285 if (regs)
286 show_regs(regs);
287 perf_event_print_debug();
288}
289static const struct sysrq_key_op sysrq_showregs_op = {
290 .handler = sysrq_handle_showregs,
291 .help_msg = "show-registers(p)",
292 .action_msg = "Show Regs",
293 .enable_mask = SYSRQ_ENABLE_DUMP,
294};
295
296static void sysrq_handle_showstate(int key)
297{
298 show_state();
299 show_workqueue_state();
300}
301static const struct sysrq_key_op sysrq_showstate_op = {
302 .handler = sysrq_handle_showstate,
303 .help_msg = "show-task-states(t)",
304 .action_msg = "Show State",
305 .enable_mask = SYSRQ_ENABLE_DUMP,
306};
307
308static void sysrq_handle_showstate_blocked(int key)
309{
310 show_state_filter(TASK_UNINTERRUPTIBLE);
311}
312static const struct sysrq_key_op sysrq_showstate_blocked_op = {
313 .handler = sysrq_handle_showstate_blocked,
314 .help_msg = "show-blocked-tasks(w)",
315 .action_msg = "Show Blocked State",
316 .enable_mask = SYSRQ_ENABLE_DUMP,
317};
318
319#ifdef CONFIG_TRACING
320#include <linux/ftrace.h>
321
322static void sysrq_ftrace_dump(int key)
323{
324 ftrace_dump(DUMP_ALL);
325}
326static const struct sysrq_key_op sysrq_ftrace_dump_op = {
327 .handler = sysrq_ftrace_dump,
328 .help_msg = "dump-ftrace-buffer(z)",
329 .action_msg = "Dump ftrace buffer",
330 .enable_mask = SYSRQ_ENABLE_DUMP,
331};
332#else
333#define sysrq_ftrace_dump_op (*(const struct sysrq_key_op *)NULL)
334#endif
335
336static void sysrq_handle_showmem(int key)
337{
338 show_mem(0, NULL);
339}
340static const struct sysrq_key_op sysrq_showmem_op = {
341 .handler = sysrq_handle_showmem,
342 .help_msg = "show-memory-usage(m)",
343 .action_msg = "Show Memory",
344 .enable_mask = SYSRQ_ENABLE_DUMP,
345};
346
347
348
349
350static void send_sig_all(int sig)
351{
352 struct task_struct *p;
353
354 read_lock(&tasklist_lock);
355 for_each_process(p) {
356 if (p->flags & PF_KTHREAD)
357 continue;
358 if (is_global_init(p))
359 continue;
360
361 do_send_sig_info(sig, SEND_SIG_PRIV, p, PIDTYPE_MAX);
362 }
363 read_unlock(&tasklist_lock);
364}
365
366static void sysrq_handle_term(int key)
367{
368 send_sig_all(SIGTERM);
369 console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
370}
371static const struct sysrq_key_op sysrq_term_op = {
372 .handler = sysrq_handle_term,
373 .help_msg = "terminate-all-tasks(e)",
374 .action_msg = "Terminate All Tasks",
375 .enable_mask = SYSRQ_ENABLE_SIGNAL,
376};
377
378static void moom_callback(struct work_struct *ignored)
379{
380 const gfp_t gfp_mask = GFP_KERNEL;
381 struct oom_control oc = {
382 .zonelist = node_zonelist(first_memory_node, gfp_mask),
383 .nodemask = NULL,
384 .memcg = NULL,
385 .gfp_mask = gfp_mask,
386 .order = -1,
387 };
388
389 mutex_lock(&oom_lock);
390 if (!out_of_memory(&oc))
391 pr_info("OOM request ignored. No task eligible\n");
392 mutex_unlock(&oom_lock);
393}
394
395static DECLARE_WORK(moom_work, moom_callback);
396
397static void sysrq_handle_moom(int key)
398{
399 schedule_work(&moom_work);
400}
401static const struct sysrq_key_op sysrq_moom_op = {
402 .handler = sysrq_handle_moom,
403 .help_msg = "memory-full-oom-kill(f)",
404 .action_msg = "Manual OOM execution",
405 .enable_mask = SYSRQ_ENABLE_SIGNAL,
406};
407
408static void sysrq_handle_thaw(int key)
409{
410 emergency_thaw_all();
411}
412static const struct sysrq_key_op sysrq_thaw_op = {
413 .handler = sysrq_handle_thaw,
414 .help_msg = "thaw-filesystems(j)",
415 .action_msg = "Emergency Thaw of all frozen filesystems",
416 .enable_mask = SYSRQ_ENABLE_SIGNAL,
417};
418
419static void sysrq_handle_kill(int key)
420{
421 send_sig_all(SIGKILL);
422 console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
423}
424static const struct sysrq_key_op sysrq_kill_op = {
425 .handler = sysrq_handle_kill,
426 .help_msg = "kill-all-tasks(i)",
427 .action_msg = "Kill All Tasks",
428 .enable_mask = SYSRQ_ENABLE_SIGNAL,
429};
430
431static void sysrq_handle_unrt(int key)
432{
433 normalize_rt_tasks();
434}
435static const struct sysrq_key_op sysrq_unrt_op = {
436 .handler = sysrq_handle_unrt,
437 .help_msg = "nice-all-RT-tasks(n)",
438 .action_msg = "Nice All RT Tasks",
439 .enable_mask = SYSRQ_ENABLE_RTNICE,
440};
441
442
443static DEFINE_SPINLOCK(sysrq_key_table_lock);
444
445static const struct sysrq_key_op *sysrq_key_table[62] = {
446 &sysrq_loglevel_op,
447 &sysrq_loglevel_op,
448 &sysrq_loglevel_op,
449 &sysrq_loglevel_op,
450 &sysrq_loglevel_op,
451 &sysrq_loglevel_op,
452 &sysrq_loglevel_op,
453 &sysrq_loglevel_op,
454 &sysrq_loglevel_op,
455 &sysrq_loglevel_op,
456
457
458
459
460
461 NULL,
462 &sysrq_reboot_op,
463 &sysrq_crash_op,
464 &sysrq_showlocks_op,
465 &sysrq_term_op,
466 &sysrq_moom_op,
467
468 NULL,
469 NULL,
470 &sysrq_kill_op,
471#ifdef CONFIG_BLOCK
472 &sysrq_thaw_op,
473#else
474 NULL,
475#endif
476 &sysrq_SAK_op,
477#ifdef CONFIG_SMP
478 &sysrq_showallcpus_op,
479#else
480 NULL,
481#endif
482 &sysrq_showmem_op,
483 &sysrq_unrt_op,
484
485 NULL,
486 &sysrq_showregs_op,
487 &sysrq_show_timers_op,
488 &sysrq_unraw_op,
489 &sysrq_sync_op,
490 &sysrq_showstate_op,
491 &sysrq_mountro_op,
492
493 NULL,
494 &sysrq_showstate_blocked_op,
495
496
497
498 NULL,
499
500 NULL,
501 &sysrq_ftrace_dump_op,
502 NULL,
503 NULL,
504 NULL,
505 NULL,
506 NULL,
507 NULL,
508 NULL,
509 NULL,
510 NULL,
511 NULL,
512 NULL,
513 NULL,
514 NULL,
515 NULL,
516 NULL,
517 NULL,
518 NULL,
519 NULL,
520 NULL,
521 NULL,
522 NULL,
523 NULL,
524 NULL,
525 NULL,
526 NULL,
527 NULL,
528};
529
530
531static int sysrq_key_table_key2index(int key)
532{
533 int retval;
534
535 if ((key >= '0') && (key <= '9'))
536 retval = key - '0';
537 else if ((key >= 'a') && (key <= 'z'))
538 retval = key + 10 - 'a';
539 else if ((key >= 'A') && (key <= 'Z'))
540 retval = key + 36 - 'A';
541 else
542 retval = -1;
543 return retval;
544}
545
546
547
548
549static const struct sysrq_key_op *__sysrq_get_key_op(int key)
550{
551 const struct sysrq_key_op *op_p = NULL;
552 int i;
553
554 i = sysrq_key_table_key2index(key);
555 if (i != -1)
556 op_p = sysrq_key_table[i];
557
558 return op_p;
559}
560
561static void __sysrq_put_key_op(int key, const struct sysrq_key_op *op_p)
562{
563 int i = sysrq_key_table_key2index(key);
564
565 if (i != -1)
566 sysrq_key_table[i] = op_p;
567}
568
569void __handle_sysrq(int key, bool check_mask)
570{
571 const struct sysrq_key_op *op_p;
572 int orig_log_level;
573 int orig_suppress_printk;
574 int i;
575
576 orig_suppress_printk = suppress_printk;
577 suppress_printk = 0;
578
579 rcu_sysrq_start();
580 rcu_read_lock();
581
582
583
584
585
586
587 orig_log_level = console_loglevel;
588 console_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
589
590 op_p = __sysrq_get_key_op(key);
591 if (op_p) {
592
593
594
595
596 if (!check_mask || sysrq_on_mask(op_p->enable_mask)) {
597 pr_info("%s\n", op_p->action_msg);
598 console_loglevel = orig_log_level;
599 op_p->handler(key);
600 } else {
601 pr_info("This sysrq operation is disabled.\n");
602 console_loglevel = orig_log_level;
603 }
604 } else {
605 pr_info("HELP : ");
606
607 for (i = 0; i < ARRAY_SIZE(sysrq_key_table); i++) {
608 if (sysrq_key_table[i]) {
609 int j;
610
611 for (j = 0; sysrq_key_table[i] !=
612 sysrq_key_table[j]; j++)
613 ;
614 if (j != i)
615 continue;
616 pr_cont("%s ", sysrq_key_table[i]->help_msg);
617 }
618 }
619 pr_cont("\n");
620 console_loglevel = orig_log_level;
621 }
622 rcu_read_unlock();
623 rcu_sysrq_end();
624
625 suppress_printk = orig_suppress_printk;
626}
627
628void handle_sysrq(int key)
629{
630 if (sysrq_on())
631 __handle_sysrq(key, true);
632}
633EXPORT_SYMBOL(handle_sysrq);
634
635#ifdef CONFIG_INPUT
636static int sysrq_reset_downtime_ms;
637
638
639static const unsigned char sysrq_xlate[KEY_CNT] =
640 "\000\0331234567890-=\177\t"
641 "qwertyuiop[]\r\000as"
642 "dfghjkl;'`\000\\zxcv"
643 "bnm,./\000*\000 \000\201\202\203\204\205"
644 "\206\207\210\211\212\000\000789-456+1"
645 "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000"
646 "\r\000/";
647
648struct sysrq_state {
649 struct input_handle handle;
650 struct work_struct reinject_work;
651 unsigned long key_down[BITS_TO_LONGS(KEY_CNT)];
652 unsigned int alt;
653 unsigned int alt_use;
654 unsigned int shift;
655 unsigned int shift_use;
656 bool active;
657 bool need_reinject;
658 bool reinjecting;
659
660
661 bool reset_canceled;
662 bool reset_requested;
663 unsigned long reset_keybit[BITS_TO_LONGS(KEY_CNT)];
664 int reset_seq_len;
665 int reset_seq_cnt;
666 int reset_seq_version;
667 struct timer_list keyreset_timer;
668};
669
670#define SYSRQ_KEY_RESET_MAX 20
671static unsigned short sysrq_reset_seq[SYSRQ_KEY_RESET_MAX];
672static unsigned int sysrq_reset_seq_len;
673static unsigned int sysrq_reset_seq_version = 1;
674
675static void sysrq_parse_reset_sequence(struct sysrq_state *state)
676{
677 int i;
678 unsigned short key;
679
680 state->reset_seq_cnt = 0;
681
682 for (i = 0; i < sysrq_reset_seq_len; i++) {
683 key = sysrq_reset_seq[i];
684
685 if (key == KEY_RESERVED || key > KEY_MAX)
686 break;
687
688 __set_bit(key, state->reset_keybit);
689 state->reset_seq_len++;
690
691 if (test_bit(key, state->key_down))
692 state->reset_seq_cnt++;
693 }
694
695
696 state->reset_canceled = state->reset_seq_cnt != 0;
697
698 state->reset_seq_version = sysrq_reset_seq_version;
699}
700
701static void sysrq_do_reset(struct timer_list *t)
702{
703 struct sysrq_state *state = from_timer(state, t, keyreset_timer);
704
705 state->reset_requested = true;
706
707 orderly_reboot();
708}
709
710static void sysrq_handle_reset_request(struct sysrq_state *state)
711{
712 if (state->reset_requested)
713 __handle_sysrq(sysrq_xlate[KEY_B], false);
714
715 if (sysrq_reset_downtime_ms)
716 mod_timer(&state->keyreset_timer,
717 jiffies + msecs_to_jiffies(sysrq_reset_downtime_ms));
718 else
719 sysrq_do_reset(&state->keyreset_timer);
720}
721
722static void sysrq_detect_reset_sequence(struct sysrq_state *state,
723 unsigned int code, int value)
724{
725 if (!test_bit(code, state->reset_keybit)) {
726
727
728
729
730
731
732 if (value && state->reset_seq_cnt) {
733 state->reset_canceled = true;
734 del_timer(&state->keyreset_timer);
735 }
736 } else if (value == 0) {
737
738
739
740
741
742 del_timer(&state->keyreset_timer);
743
744 if (--state->reset_seq_cnt == 0)
745 state->reset_canceled = false;
746 } else if (value == 1) {
747
748 if (++state->reset_seq_cnt == state->reset_seq_len &&
749 !state->reset_canceled) {
750 sysrq_handle_reset_request(state);
751 }
752 }
753}
754
755#ifdef CONFIG_OF
756static void sysrq_of_get_keyreset_config(void)
757{
758 u32 key;
759 struct device_node *np;
760 struct property *prop;
761 const __be32 *p;
762
763 np = of_find_node_by_path("/chosen/linux,sysrq-reset-seq");
764 if (!np) {
765 pr_debug("No sysrq node found");
766 return;
767 }
768
769
770 sysrq_reset_seq_len = 0;
771
772 of_property_for_each_u32(np, "keyset", prop, p, key) {
773 if (key == KEY_RESERVED || key > KEY_MAX ||
774 sysrq_reset_seq_len == SYSRQ_KEY_RESET_MAX)
775 break;
776
777 sysrq_reset_seq[sysrq_reset_seq_len++] = (unsigned short)key;
778 }
779
780
781 of_property_read_u32(np, "timeout-ms", &sysrq_reset_downtime_ms);
782
783 of_node_put(np);
784}
785#else
786static void sysrq_of_get_keyreset_config(void)
787{
788}
789#endif
790
791static void sysrq_reinject_alt_sysrq(struct work_struct *work)
792{
793 struct sysrq_state *sysrq =
794 container_of(work, struct sysrq_state, reinject_work);
795 struct input_handle *handle = &sysrq->handle;
796 unsigned int alt_code = sysrq->alt_use;
797
798 if (sysrq->need_reinject) {
799
800 sysrq->reinjecting = true;
801 mb();
802
803
804 input_inject_event(handle, EV_KEY, alt_code, 1);
805 input_inject_event(handle, EV_KEY, KEY_SYSRQ, 1);
806 input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
807
808 input_inject_event(handle, EV_KEY, KEY_SYSRQ, 0);
809 input_inject_event(handle, EV_KEY, alt_code, 0);
810 input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
811
812 mb();
813 sysrq->reinjecting = false;
814 }
815}
816
817static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
818 unsigned int code, int value)
819{
820 bool was_active = sysrq->active;
821 bool suppress;
822
823 switch (code) {
824
825 case KEY_LEFTALT:
826 case KEY_RIGHTALT:
827 if (!value) {
828
829 if (sysrq->active && code == sysrq->alt_use)
830 sysrq->active = false;
831
832 sysrq->alt = KEY_RESERVED;
833
834 } else if (value != 2) {
835 sysrq->alt = code;
836 sysrq->need_reinject = false;
837 }
838 break;
839
840 case KEY_LEFTSHIFT:
841 case KEY_RIGHTSHIFT:
842 if (!value)
843 sysrq->shift = KEY_RESERVED;
844 else if (value != 2)
845 sysrq->shift = code;
846 break;
847
848 case KEY_SYSRQ:
849 if (value == 1 && sysrq->alt != KEY_RESERVED) {
850 sysrq->active = true;
851 sysrq->alt_use = sysrq->alt;
852
853 sysrq->shift_use = sysrq->shift;
854
855
856
857
858 sysrq->need_reinject = true;
859 }
860
861
862
863
864
865
866
867
868
869 if (sysrq->active)
870 clear_bit(KEY_SYSRQ, sysrq->handle.dev->key);
871
872 break;
873
874 default:
875 if (sysrq->active && value && value != 2) {
876 unsigned char c = sysrq_xlate[code];
877
878 sysrq->need_reinject = false;
879 if (sysrq->shift_use != KEY_RESERVED)
880 c = toupper(c);
881 __handle_sysrq(c, true);
882 }
883 break;
884 }
885
886 suppress = sysrq->active;
887
888 if (!sysrq->active) {
889
890
891
892
893 if (sysrq->reset_seq_version != sysrq_reset_seq_version)
894 sysrq_parse_reset_sequence(sysrq);
895
896
897
898
899
900
901 if (value)
902 set_bit(code, sysrq->key_down);
903 else
904 clear_bit(code, sysrq->key_down);
905
906 if (was_active)
907 schedule_work(&sysrq->reinject_work);
908
909
910 sysrq_detect_reset_sequence(sysrq, code, value);
911
912 } else if (value == 0 && test_and_clear_bit(code, sysrq->key_down)) {
913
914
915
916
917 suppress = false;
918 }
919
920 return suppress;
921}
922
923static bool sysrq_filter(struct input_handle *handle,
924 unsigned int type, unsigned int code, int value)
925{
926 struct sysrq_state *sysrq = handle->private;
927 bool suppress;
928
929
930
931
932
933 if (sysrq->reinjecting)
934 return false;
935
936 switch (type) {
937
938 case EV_SYN:
939 suppress = false;
940 break;
941
942 case EV_KEY:
943 suppress = sysrq_handle_keypress(sysrq, code, value);
944 break;
945
946 default:
947 suppress = sysrq->active;
948 break;
949 }
950
951 return suppress;
952}
953
954static int sysrq_connect(struct input_handler *handler,
955 struct input_dev *dev,
956 const struct input_device_id *id)
957{
958 struct sysrq_state *sysrq;
959 int error;
960
961 sysrq = kzalloc(sizeof(struct sysrq_state), GFP_KERNEL);
962 if (!sysrq)
963 return -ENOMEM;
964
965 INIT_WORK(&sysrq->reinject_work, sysrq_reinject_alt_sysrq);
966
967 sysrq->handle.dev = dev;
968 sysrq->handle.handler = handler;
969 sysrq->handle.name = "sysrq";
970 sysrq->handle.private = sysrq;
971 timer_setup(&sysrq->keyreset_timer, sysrq_do_reset, 0);
972
973 error = input_register_handle(&sysrq->handle);
974 if (error) {
975 pr_err("Failed to register input sysrq handler, error %d\n",
976 error);
977 goto err_free;
978 }
979
980 error = input_open_device(&sysrq->handle);
981 if (error) {
982 pr_err("Failed to open input device, error %d\n", error);
983 goto err_unregister;
984 }
985
986 return 0;
987
988 err_unregister:
989 input_unregister_handle(&sysrq->handle);
990 err_free:
991 kfree(sysrq);
992 return error;
993}
994
995static void sysrq_disconnect(struct input_handle *handle)
996{
997 struct sysrq_state *sysrq = handle->private;
998
999 input_close_device(handle);
1000 cancel_work_sync(&sysrq->reinject_work);
1001 del_timer_sync(&sysrq->keyreset_timer);
1002 input_unregister_handle(handle);
1003 kfree(sysrq);
1004}
1005
1006
1007
1008
1009
1010
1011static const struct input_device_id sysrq_ids[] = {
1012 {
1013 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1014 INPUT_DEVICE_ID_MATCH_KEYBIT,
1015 .evbit = { [BIT_WORD(EV_KEY)] = BIT_MASK(EV_KEY) },
1016 .keybit = { [BIT_WORD(KEY_LEFTALT)] = BIT_MASK(KEY_LEFTALT) },
1017 },
1018 { },
1019};
1020
1021static struct input_handler sysrq_handler = {
1022 .filter = sysrq_filter,
1023 .connect = sysrq_connect,
1024 .disconnect = sysrq_disconnect,
1025 .name = "sysrq",
1026 .id_table = sysrq_ids,
1027};
1028
1029static inline void sysrq_register_handler(void)
1030{
1031 int error;
1032
1033 sysrq_of_get_keyreset_config();
1034
1035 error = input_register_handler(&sysrq_handler);
1036 if (error)
1037 pr_err("Failed to register input handler, error %d", error);
1038}
1039
1040static inline void sysrq_unregister_handler(void)
1041{
1042 input_unregister_handler(&sysrq_handler);
1043}
1044
1045static int sysrq_reset_seq_param_set(const char *buffer,
1046 const struct kernel_param *kp)
1047{
1048 unsigned long val;
1049 int error;
1050
1051 error = kstrtoul(buffer, 0, &val);
1052 if (error < 0)
1053 return error;
1054
1055 if (val > KEY_MAX)
1056 return -EINVAL;
1057
1058 *((unsigned short *)kp->arg) = val;
1059 sysrq_reset_seq_version++;
1060
1061 return 0;
1062}
1063
1064static const struct kernel_param_ops param_ops_sysrq_reset_seq = {
1065 .get = param_get_ushort,
1066 .set = sysrq_reset_seq_param_set,
1067};
1068
1069#define param_check_sysrq_reset_seq(name, p) \
1070 __param_check(name, p, unsigned short)
1071
1072
1073
1074
1075
1076module_param_array_named(reset_seq, sysrq_reset_seq, sysrq_reset_seq,
1077 &sysrq_reset_seq_len, 0644);
1078
1079module_param_named(sysrq_downtime_ms, sysrq_reset_downtime_ms, int, 0644);
1080
1081#else
1082
1083static inline void sysrq_register_handler(void)
1084{
1085}
1086
1087static inline void sysrq_unregister_handler(void)
1088{
1089}
1090
1091#endif
1092
1093int sysrq_toggle_support(int enable_mask)
1094{
1095 bool was_enabled = sysrq_on();
1096
1097 sysrq_enabled = enable_mask;
1098
1099 if (was_enabled != sysrq_on()) {
1100 if (sysrq_on())
1101 sysrq_register_handler();
1102 else
1103 sysrq_unregister_handler();
1104 }
1105
1106 return 0;
1107}
1108EXPORT_SYMBOL_GPL(sysrq_toggle_support);
1109
1110static int __sysrq_swap_key_ops(int key, const struct sysrq_key_op *insert_op_p,
1111 const struct sysrq_key_op *remove_op_p)
1112{
1113 int retval;
1114
1115 spin_lock(&sysrq_key_table_lock);
1116 if (__sysrq_get_key_op(key) == remove_op_p) {
1117 __sysrq_put_key_op(key, insert_op_p);
1118 retval = 0;
1119 } else {
1120 retval = -1;
1121 }
1122 spin_unlock(&sysrq_key_table_lock);
1123
1124
1125
1126
1127
1128
1129 synchronize_rcu();
1130
1131 return retval;
1132}
1133
1134int register_sysrq_key(int key, const struct sysrq_key_op *op_p)
1135{
1136 return __sysrq_swap_key_ops(key, op_p, NULL);
1137}
1138EXPORT_SYMBOL(register_sysrq_key);
1139
1140int unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)
1141{
1142 return __sysrq_swap_key_ops(key, NULL, op_p);
1143}
1144EXPORT_SYMBOL(unregister_sysrq_key);
1145
1146#ifdef CONFIG_PROC_FS
1147
1148
1149
1150static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf,
1151 size_t count, loff_t *ppos)
1152{
1153 if (count) {
1154 char c;
1155
1156 if (get_user(c, buf))
1157 return -EFAULT;
1158 __handle_sysrq(c, false);
1159 }
1160
1161 return count;
1162}
1163
1164static const struct proc_ops sysrq_trigger_proc_ops = {
1165 .proc_write = write_sysrq_trigger,
1166 .proc_lseek = noop_llseek,
1167};
1168
1169static void sysrq_init_procfs(void)
1170{
1171 if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
1172 &sysrq_trigger_proc_ops))
1173 pr_err("Failed to register proc interface\n");
1174}
1175
1176#else
1177
1178static inline void sysrq_init_procfs(void)
1179{
1180}
1181
1182#endif
1183
1184static int __init sysrq_init(void)
1185{
1186 sysrq_init_procfs();
1187
1188 if (sysrq_on())
1189 sysrq_register_handler();
1190
1191 return 0;
1192}
1193device_initcall(sysrq_init);
1194