Lines Matching +full:key +full:- +full:code

1 // SPDX-License-Identifier: GPL-2.0
3 * Linux Magic System Request Key Hacks
9 * overhauled to use key registration
68 * sysrq_mask - Getter for sysrq_enabled mask.
101 static void sysrq_handle_loglevel(u8 key) in sysrq_handle_loglevel() argument
103 u8 loglevel = key - '0'; in sysrq_handle_loglevel()
111 .help_msg = "loglevel(0-9)",
117 static void sysrq_handle_SAK(u8 key) in sysrq_handle_SAK() argument
134 static void sysrq_handle_unraw(u8 key) in sysrq_handle_unraw() argument
149 static void sysrq_handle_crash(u8 key) in sysrq_handle_crash() argument
163 static void sysrq_handle_reboot(u8 key) in sysrq_handle_reboot() argument
178 static void sysrq_handle_sync(u8 key) in sysrq_handle_sync() argument
189 static void sysrq_handle_show_timers(u8 key) in sysrq_handle_show_timers() argument
196 .help_msg = "show-all-timers(q)",
200 static void sysrq_handle_mountro(u8 key) in sysrq_handle_mountro() argument
212 static void sysrq_handle_showlocks(u8 key) in sysrq_handle_showlocks() argument
219 .help_msg = "show-all-locks(d)",
252 static void sysrq_handle_showallcpus(u8 key) in sysrq_handle_showallcpus() argument
277 .help_msg = "show-backtrace-all-active-cpus(l)",
285 static void sysrq_handle_showregs(u8 key) in sysrq_handle_showregs() argument
297 .help_msg = "show-registers(p)",
302 static void sysrq_handle_showstate(u8 key) in sysrq_handle_showstate() argument
309 .help_msg = "show-task-states(t)",
314 static void sysrq_handle_showstate_blocked(u8 key) in sysrq_handle_showstate_blocked() argument
320 .help_msg = "show-blocked-tasks(w)",
328 static void sysrq_ftrace_dump(u8 key) in sysrq_ftrace_dump() argument
334 .help_msg = "dump-ftrace-buffer(z)",
342 static void sysrq_handle_showmem(u8 key) in sysrq_handle_showmem() argument
348 .help_msg = "show-memory-usage(m)",
362 if (p->flags & PF_KTHREAD) in send_sig_all()
372 static void sysrq_handle_term(u8 key) in sysrq_handle_term() argument
379 .help_msg = "terminate-all-tasks(e)",
392 .order = -1, in moom_callback()
403 static void sysrq_handle_moom(u8 key) in sysrq_handle_moom() argument
409 .help_msg = "memory-full-oom-kill(f)",
415 static void sysrq_handle_thaw(u8 key) in sysrq_handle_thaw() argument
421 .help_msg = "thaw-filesystems(j)",
429 static void sysrq_handle_kill(u8 key) in sysrq_handle_kill() argument
436 .help_msg = "kill-all-tasks(i)",
441 static void sysrq_handle_unrt(u8 key) in sysrq_handle_unrt() argument
447 .help_msg = "nice-all-RT-tasks(n)",
452 /* Key Operations table and lock */
479 NULL, /* h - reserved for help */
532 /* key2index calculation, -1 on invalid index */
533 static int sysrq_key_table_key2index(u8 key) in sysrq_key_table_key2index() argument
535 switch (key) { in sysrq_key_table_key2index()
537 return key - '0'; in sysrq_key_table_key2index()
539 return key - 'a' + 10; in sysrq_key_table_key2index()
541 return key - 'A' + 10 + 26; in sysrq_key_table_key2index()
543 return -1; in sysrq_key_table_key2index()
550 static const struct sysrq_key_op *__sysrq_get_key_op(u8 key) in __sysrq_get_key_op() argument
555 i = sysrq_key_table_key2index(key); in __sysrq_get_key_op()
556 if (i != -1) in __sysrq_get_key_op()
562 static void __sysrq_put_key_op(u8 key, const struct sysrq_key_op *op_p) in __sysrq_put_key_op() argument
564 int i = sysrq_key_table_key2index(key); in __sysrq_put_key_op()
566 if (i != -1) in __sysrq_put_key_op()
570 void __handle_sysrq(u8 key, bool check_mask) in __handle_sysrq() argument
591 op_p = __sysrq_get_key_op(key); in __handle_sysrq()
594 * Should we check for enabled operations (/proc/sysrq-trigger in __handle_sysrq()
597 if (!check_mask || sysrq_on_mask(op_p->enable_mask)) { in __handle_sysrq()
598 pr_info("%s\n", op_p->action_msg); in __handle_sysrq()
600 op_p->handler(key); in __handle_sysrq()
617 pr_cont("%s ", sysrq_key_table[i]->help_msg); in __handle_sysrq()
629 void handle_sysrq(u8 key) in handle_sysrq() argument
632 __handle_sysrq(key, true); in handle_sysrq()
641 "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */
642 "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */
643 "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */
644 "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */
645 "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */
646 "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
647 "\r\000/"; /* 0x60 - 0x6f */
679 unsigned short key; in sysrq_parse_reset_sequence() local
681 state->reset_seq_cnt = 0; in sysrq_parse_reset_sequence()
684 key = sysrq_reset_seq[i]; in sysrq_parse_reset_sequence()
686 if (key == KEY_RESERVED || key > KEY_MAX) in sysrq_parse_reset_sequence()
689 __set_bit(key, state->reset_keybit); in sysrq_parse_reset_sequence()
690 state->reset_seq_len++; in sysrq_parse_reset_sequence()
692 if (test_bit(key, state->key_down)) in sysrq_parse_reset_sequence()
693 state->reset_seq_cnt++; in sysrq_parse_reset_sequence()
697 state->reset_canceled = state->reset_seq_cnt != 0; in sysrq_parse_reset_sequence()
699 state->reset_seq_version = sysrq_reset_seq_version; in sysrq_parse_reset_sequence()
706 state->reset_requested = true; in sysrq_do_reset()
713 if (state->reset_requested) in sysrq_handle_reset_request()
717 mod_timer(&state->keyreset_timer, in sysrq_handle_reset_request()
720 sysrq_do_reset(&state->keyreset_timer); in sysrq_handle_reset_request()
724 unsigned int code, int value) in sysrq_detect_reset_sequence() argument
726 if (!test_bit(code, state->reset_keybit)) { in sysrq_detect_reset_sequence()
728 * Pressing any key _not_ in reset sequence cancels in sysrq_detect_reset_sequence()
733 if (value && state->reset_seq_cnt) { in sysrq_detect_reset_sequence()
734 state->reset_canceled = true; in sysrq_detect_reset_sequence()
735 del_timer(&state->keyreset_timer); in sysrq_detect_reset_sequence()
739 * Key release - all keys in the reset sequence need in sysrq_detect_reset_sequence()
743 del_timer(&state->keyreset_timer); in sysrq_detect_reset_sequence()
745 if (--state->reset_seq_cnt == 0) in sysrq_detect_reset_sequence()
746 state->reset_canceled = false; in sysrq_detect_reset_sequence()
748 /* key press, not autorepeat */ in sysrq_detect_reset_sequence()
749 if (++state->reset_seq_cnt == state->reset_seq_len && in sysrq_detect_reset_sequence()
750 !state->reset_canceled) { in sysrq_detect_reset_sequence()
759 u32 key; in sysrq_of_get_keyreset_config() local
764 np = of_find_node_by_path("/chosen/linux,sysrq-reset-seq"); in sysrq_of_get_keyreset_config()
773 of_property_for_each_u32(np, "keyset", prop, p, key) { in sysrq_of_get_keyreset_config()
774 if (key == KEY_RESERVED || key > KEY_MAX || in sysrq_of_get_keyreset_config()
778 sysrq_reset_seq[sysrq_reset_seq_len++] = (unsigned short)key; in sysrq_of_get_keyreset_config()
782 of_property_read_u32(np, "timeout-ms", &sysrq_reset_downtime_ms); in sysrq_of_get_keyreset_config()
796 struct input_handle *handle = &sysrq->handle; in sysrq_reinject_alt_sysrq()
797 unsigned int alt_code = sysrq->alt_use; in sysrq_reinject_alt_sysrq()
799 if (sysrq->need_reinject) { in sysrq_reinject_alt_sysrq()
801 sysrq->reinjecting = true; in sysrq_reinject_alt_sysrq()
814 sysrq->reinjecting = false; in sysrq_reinject_alt_sysrq()
819 unsigned int code, int value) in sysrq_handle_keypress() argument
821 bool was_active = sysrq->active; in sysrq_handle_keypress()
824 switch (code) { in sysrq_handle_keypress()
830 if (sysrq->active && code == sysrq->alt_use) in sysrq_handle_keypress()
831 sysrq->active = false; in sysrq_handle_keypress()
833 sysrq->alt = KEY_RESERVED; in sysrq_handle_keypress()
836 sysrq->alt = code; in sysrq_handle_keypress()
837 sysrq->need_reinject = false; in sysrq_handle_keypress()
844 sysrq->shift = KEY_RESERVED; in sysrq_handle_keypress()
846 sysrq->shift = code; in sysrq_handle_keypress()
847 if (sysrq->active) in sysrq_handle_keypress()
848 sysrq->shift_use = sysrq->shift; in sysrq_handle_keypress()
852 if (value == 1 && sysrq->alt != KEY_RESERVED) { in sysrq_handle_keypress()
853 sysrq->active = true; in sysrq_handle_keypress()
854 sysrq->alt_use = sysrq->alt; in sysrq_handle_keypress()
855 /* either RESERVED (for released) or actual code */ in sysrq_handle_keypress()
856 sysrq->shift_use = sysrq->shift; in sysrq_handle_keypress()
859 * to re-inject Alt-SysRq keysroke. in sysrq_handle_keypress()
861 sysrq->need_reinject = true; in sysrq_handle_keypress()
868 * do not clear key bit it KGDB will end up sending in sysrq_handle_keypress()
872 if (sysrq->active) in sysrq_handle_keypress()
873 clear_bit(KEY_SYSRQ, sysrq->handle.dev->key); in sysrq_handle_keypress()
878 if (sysrq->active && value && value != 2) { in sysrq_handle_keypress()
879 unsigned char c = sysrq_xlate[code]; in sysrq_handle_keypress()
881 sysrq->need_reinject = false; in sysrq_handle_keypress()
882 if (sysrq->shift_use != KEY_RESERVED) in sysrq_handle_keypress()
889 suppress = sysrq->active; in sysrq_handle_keypress()
891 if (!sysrq->active) { in sysrq_handle_keypress()
896 if (sysrq->reset_seq_version != sysrq_reset_seq_version) in sysrq_handle_keypress()
900 * If we are not suppressing key presses keep track of in sysrq_handle_keypress()
905 set_bit(code, sysrq->key_down); in sysrq_handle_keypress()
907 clear_bit(code, sysrq->key_down); in sysrq_handle_keypress()
910 schedule_work(&sysrq->reinject_work); in sysrq_handle_keypress()
913 sysrq_detect_reset_sequence(sysrq, code, value); in sysrq_handle_keypress()
915 } else if (value == 0 && test_and_clear_bit(code, sysrq->key_down)) { in sysrq_handle_keypress()
927 unsigned int type, unsigned int code, int value) in sysrq_filter() argument
929 struct sysrq_state *sysrq = handle->private; in sysrq_filter()
933 * Do not filter anything if we are in the process of re-injecting in sysrq_filter()
936 if (sysrq->reinjecting) in sysrq_filter()
946 suppress = sysrq_handle_keypress(sysrq, code, value); in sysrq_filter()
950 suppress = sysrq->active; in sysrq_filter()
966 return -ENOMEM; in sysrq_connect()
968 INIT_WORK(&sysrq->reinject_work, sysrq_reinject_alt_sysrq); in sysrq_connect()
970 sysrq->handle.dev = dev; in sysrq_connect()
971 sysrq->handle.handler = handler; in sysrq_connect()
972 sysrq->handle.name = "sysrq"; in sysrq_connect()
973 sysrq->handle.private = sysrq; in sysrq_connect()
974 timer_setup(&sysrq->keyreset_timer, sysrq_do_reset, 0); in sysrq_connect()
976 error = input_register_handle(&sysrq->handle); in sysrq_connect()
983 error = input_open_device(&sysrq->handle); in sysrq_connect()
992 input_unregister_handle(&sysrq->handle); in sysrq_connect()
1000 struct sysrq_state *sysrq = handle->private; in sysrq_disconnect()
1003 cancel_work_sync(&sysrq->reinject_work); in sysrq_disconnect()
1004 timer_shutdown_sync(&sysrq->keyreset_timer); in sysrq_disconnect()
1011 * keyboards have SysRq key predefined and so user may add it to keymap
1059 return -EINVAL; in sysrq_reset_seq_param_set()
1061 *((unsigned short *)kp->arg) = val; in sysrq_reset_seq_param_set()
1113 static int __sysrq_swap_key_ops(u8 key, const struct sysrq_key_op *insert_op_p, in __sysrq_swap_key_ops() argument
1119 if (__sysrq_get_key_op(key) == remove_op_p) { in __sysrq_swap_key_ops()
1120 __sysrq_put_key_op(key, insert_op_p); in __sysrq_swap_key_ops()
1123 retval = -1; in __sysrq_swap_key_ops()
1129 * Wait for it to go away before returning, so the code for an old in __sysrq_swap_key_ops()
1137 int register_sysrq_key(u8 key, const struct sysrq_key_op *op_p) in register_sysrq_key() argument
1139 return __sysrq_swap_key_ops(key, op_p, NULL); in register_sysrq_key()
1143 int unregister_sysrq_key(u8 key, const struct sysrq_key_op *op_p) in unregister_sysrq_key() argument
1145 return __sysrq_swap_key_ops(key, NULL, op_p); in unregister_sysrq_key()
1151 * writing 'C' to /proc/sysrq-trigger is like sysrq-C
1160 return -EFAULT; in write_sysrq_trigger()
1174 if (!proc_create("sysrq-trigger", S_IWUSR, NULL, in sysrq_init_procfs()