* Re: [RFC] tty/sysrq: Add alternative SysRq key
2021-11-03 15:54 [RFC] tty/sysrq: Add alternative SysRq key Andrzej Pietrasiewicz
@ 2021-11-03 16:19 ` Randy Dunlap
2021-11-04 8:44 ` Andrzej Pietrasiewicz
2021-11-04 9:34 ` Andrzej Pietrasiewicz
2021-11-03 18:44 ` kernel test robot
2021-11-04 12:01 ` Pavel Machek
2 siblings, 2 replies; 16+ messages in thread
From: Randy Dunlap @ 2021-11-03 16:19 UTC (permalink / raw)
To: Andrzej Pietrasiewicz, linux-kernel, linux-input
Cc: Greg Kroah-Hartman, Dmitry Torokhov, Jiri Slaby, kernel
On 11/3/21 8:54 AM, Andrzej Pietrasiewicz wrote:
> There exist machines which don't have SysRq key at all, e.g. chromebooks.
>
> This patch allows configuring an alternative key to act as SysRq. Devices
> which declare KEY_SYSRQ in their 'keybit' bitmap continue using KEY_SYSRQ,
> but other devices use the alternative SysRq key instead, by default F10.
> Which key is actually used can be modified with sysrq's module parameter.
>
> Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> ---
> I'd like to resurrect an old thread regarding supporting alternative SysRq
> key for machines which don't have a physical SysRq key at all.
>
> The old thread:
>
> https://www.spinics.net/lists/linux-input/msg67982.html
>
> I'm resending this patch, rebased onto v5.15.
>
> Any (new) thoughts about it?
>
Hi,
Did you test it with this patch?
>
> drivers/tty/sysrq.c | 28 +++++++++++++++++++++++++---
> 1 file changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c
> index c911196ac893..6dd288e53ce9 100644
> --- a/drivers/tty/sysrq.c
> +++ b/drivers/tty/sysrq.c
> @@ -634,6 +634,7 @@ EXPORT_SYMBOL(handle_sysrq);
>
> #ifdef CONFIG_INPUT
> static int sysrq_reset_downtime_ms;
> +static unsigned short alternative_sysrq_key = KEY_F10;
>
> /* Simple translation table for the SysRq keys */
> static const unsigned char sysrq_xlate[KEY_CNT] =
> @@ -653,6 +654,7 @@ struct sysrq_state {
> unsigned int alt_use;
> unsigned int shift;
> unsigned int shift_use;
> + unsigned short sys
That line appears to need an ending ';'.
Or maybe that line was truncated since 'sys' isn't used anywhere in this patch.
> bool active;
> bool need_reinject;
> bool reinjecting;
> @@ -802,10 +804,10 @@ static void sysrq_reinject_alt_sysrq(struct work_struct *work)
>
> /* Simulate press and release of Alt + SysRq */
> input_inject_event(handle, EV_KEY, alt_code, 1);
> - input_inject_event(handle, EV_KEY, KEY_SYSRQ, 1);
> + input_inject_event(handle, EV_KEY, sysrq->sysrq_key, 1);
> input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
>
> - input_inject_event(handle, EV_KEY, KEY_SYSRQ, 0);
> + input_inject_event(handle, EV_KEY, sysrq->sysrq_key, 0);
> input_inject_event(handle, EV_KEY, alt_code, 0);
> input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
>
> @@ -845,6 +847,7 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
> sysrq->shift = code;
> break;
>
> +key_sysrq:
> case KEY_SYSRQ:
> if (value == 1 && sysrq->alt != KEY_RESERVED) {
> sysrq->active = true;
> @@ -867,11 +870,15 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
> * triggering print screen function.
> */
> if (sysrq->active)
> - clear_bit(KEY_SYSRQ, sysrq->handle.dev->key);
> + clear_bit(sysrq->sysrq_key, sysrq->handle.dev->key);
>
> break;
>
> default:
> + /* handle non-default sysrq key */
> + if (code == sysrq->sysrq_key)
> + goto key_sysrq;
> +
> if (sysrq->active && value && value != 2) {
> unsigned char c = sysrq_xlate[code];
>
> @@ -970,6 +977,14 @@ static int sysrq_connect(struct input_handler *handler,
> sysrq->handle.private = sysrq;
> timer_setup(&sysrq->keyreset_timer, sysrq_do_reset, 0);
>
> + if (test_bit(KEY_SYSRQ, dev->keybit)) {
> + sysrq->sysrq_key = KEY_SYSRQ;
> + pr_info("%s: using default sysrq key [%x]\n", dev->name, KEY_SYSRQ);
> + } else {
> + sysrq->sysrq_key = alternative_sysrq_key;
> + pr_info("%s: Using alternative sysrq key: [%x]\n", dev->name, sysrq->sysrq_key);
> + }
> +
> error = input_register_handle(&sysrq->handle);
> if (error) {
> pr_err("Failed to register input sysrq handler, error %d\n",
> @@ -1078,6 +1093,13 @@ module_param_array_named(reset_seq, sysrq_reset_seq, sysrq_reset_seq,
>
> module_param_named(sysrq_downtime_ms, sysrq_reset_downtime_ms, int, 0644);
>
> +module_param(alternative_sysrq_key, ushort, 0644);
> +MODULE_PARM_DESC(alternative_sysrq_key,
> + "Alternative SysRq key for input devices that don't have SysRq key. F10 by default.\n"
> + "Example\n"
> + "Using F9 as SysRq:\n"
> + "sysrq.alternative_sysrq_key=0x43\n");
> +
> #else
>
> static inline void sysrq_register_handler(void)
>
--
~Randy
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [RFC] tty/sysrq: Add alternative SysRq key
2021-11-03 15:54 [RFC] tty/sysrq: Add alternative SysRq key Andrzej Pietrasiewicz
2021-11-03 16:19 ` Randy Dunlap
@ 2021-11-03 18:44 ` kernel test robot
2021-11-04 12:01 ` Pavel Machek
2 siblings, 0 replies; 16+ messages in thread
From: kernel test robot @ 2021-11-03 18:44 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 44923 bytes --]
Hi Andrzej,
[FYI, it's a private test report for your RFC patch.]
[auto build test ERROR on linux/master]
[also build test ERROR on hid/for-next linus/master v5.15 next-20211103]
[cannot apply to tty/tty-testing]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Andrzej-Pietrasiewicz/tty-sysrq-Add-alternative-SysRq-key/20211103-235630
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2f111a6fd5b5297b4e92f53798ca086f7c7d33a4
config: um-x86_64_defconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/ed36496ef4a480d6bc468152578cfb49a500e2dd
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Andrzej-Pietrasiewicz/tty-sysrq-Add-alternative-SysRq-key/20211103-235630
git checkout ed36496ef4a480d6bc468152578cfb49a500e2dd
# save the attached .config to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=um SUBARCH=x86_64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/tty/sysrq.c:658:2: error: expected ':', ',', ';', '}' or '__attribute__' before 'bool'
658 | bool active;
| ^~~~
drivers/tty/sysrq.c: In function 'sysrq_parse_reset_sequence':
>> drivers/tty/sysrq.c:682:7: error: 'struct sysrq_state' has no member named 'reset_seq_cnt'
682 | state->reset_seq_cnt = 0;
| ^~
>> drivers/tty/sysrq.c:690:23: error: 'struct sysrq_state' has no member named 'reset_keybit'
690 | __set_bit(key, state->reset_keybit);
| ^~
>> drivers/tty/sysrq.c:691:8: error: 'struct sysrq_state' has no member named 'reset_seq_len'
691 | state->reset_seq_len++;
| ^~
drivers/tty/sysrq.c:694:9: error: 'struct sysrq_state' has no member named 'reset_seq_cnt'
694 | state->reset_seq_cnt++;
| ^~
>> drivers/tty/sysrq.c:698:7: error: 'struct sysrq_state' has no member named 'reset_canceled'
698 | state->reset_canceled = state->reset_seq_cnt != 0;
| ^~
drivers/tty/sysrq.c:698:31: error: 'struct sysrq_state' has no member named 'reset_seq_cnt'
698 | state->reset_canceled = state->reset_seq_cnt != 0;
| ^~
>> drivers/tty/sysrq.c:700:7: error: 'struct sysrq_state' has no member named 'reset_seq_version'
700 | state->reset_seq_version = sysrq_reset_seq_version;
| ^~
In file included from <command-line>:
drivers/tty/sysrq.c: In function 'sysrq_do_reset':
>> include/linux/kernel.h:495:51: error: 'struct sysrq_state' has no member named 'keyreset_timer'
495 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
| ^~
include/linux/compiler_types.h:302:9: note: in definition of macro '__compiletime_assert'
302 | if (!(condition)) \
| ^~~~~~~~~
include/linux/compiler_types.h:322:2: note: in expansion of macro '_compiletime_assert'
322 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
| ^~~~~~~~~~~~~~~~~~
include/linux/kernel.h:495:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
495 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
| ^~~~~~~~~~~~~~~~
include/linux/kernel.h:495:20: note: in expansion of macro '__same_type'
495 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
| ^~~~~~~~~~~
include/linux/timer.h:154:2: note: in expansion of macro 'container_of'
154 | container_of(callback_timer, typeof(*var), timer_fieldname)
| ^~~~~~~~~~~~
drivers/tty/sysrq.c:705:30: note: in expansion of macro 'from_timer'
705 | struct sysrq_state *state = from_timer(state, t, keyreset_timer);
| ^~~~~~~~~~
>> include/linux/compiler_types.h:140:35: error: 'struct sysrq_state' has no member named 'keyreset_timer'
140 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
| ^~~~~~~~~~~~~~~~~~
include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof'
17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
| ^~~~~~~~~~~~~~~~~~~
include/linux/kernel.h:498:21: note: in expansion of macro 'offsetof'
498 | ((type *)(__mptr - offsetof(type, member))); })
| ^~~~~~~~
include/linux/timer.h:154:2: note: in expansion of macro 'container_of'
154 | container_of(callback_timer, typeof(*var), timer_fieldname)
| ^~~~~~~~~~~~
drivers/tty/sysrq.c:705:30: note: in expansion of macro 'from_timer'
705 | struct sysrq_state *state = from_timer(state, t, keyreset_timer);
| ^~~~~~~~~~
>> drivers/tty/sysrq.c:707:7: error: 'struct sysrq_state' has no member named 'reset_requested'
707 | state->reset_requested = true;
| ^~
drivers/tty/sysrq.c: In function 'sysrq_handle_reset_request':
drivers/tty/sysrq.c:714:11: error: 'struct sysrq_state' has no member named 'reset_requested'
714 | if (state->reset_requested)
| ^~
>> drivers/tty/sysrq.c:718:19: error: 'struct sysrq_state' has no member named 'keyreset_timer'
718 | mod_timer(&state->keyreset_timer,
| ^~
drivers/tty/sysrq.c:721:24: error: 'struct sysrq_state' has no member named 'keyreset_timer'
721 | sysrq_do_reset(&state->keyreset_timer);
| ^~
drivers/tty/sysrq.c: In function 'sysrq_detect_reset_sequence':
drivers/tty/sysrq.c:727:27: error: 'struct sysrq_state' has no member named 'reset_keybit'
727 | if (!test_bit(code, state->reset_keybit)) {
| ^~
drivers/tty/sysrq.c:734:21: error: 'struct sysrq_state' has no member named 'reset_seq_cnt'
734 | if (value && state->reset_seq_cnt) {
| ^~
drivers/tty/sysrq.c:735:9: error: 'struct sysrq_state' has no member named 'reset_canceled'
735 | state->reset_canceled = true;
| ^~
drivers/tty/sysrq.c:736:20: error: 'struct sysrq_state' has no member named 'keyreset_timer'
736 | del_timer(&state->keyreset_timer);
| ^~
drivers/tty/sysrq.c:744:19: error: 'struct sysrq_state' has no member named 'keyreset_timer'
744 | del_timer(&state->keyreset_timer);
| ^~
drivers/tty/sysrq.c:746:14: error: 'struct sysrq_state' has no member named 'reset_seq_cnt'
746 | if (--state->reset_seq_cnt == 0)
| ^~
drivers/tty/sysrq.c:747:9: error: 'struct sysrq_state' has no member named 'reset_canceled'
747 | state->reset_canceled = false;
| ^~
drivers/tty/sysrq.c:750:14: error: 'struct sysrq_state' has no member named 'reset_seq_cnt'
750 | if (++state->reset_seq_cnt == state->reset_seq_len &&
| ^~
drivers/tty/sysrq.c:750:38: error: 'struct sysrq_state' has no member named 'reset_seq_len'
750 | if (++state->reset_seq_cnt == state->reset_seq_len &&
| ^~
drivers/tty/sysrq.c:751:13: error: 'struct sysrq_state' has no member named 'reset_canceled'
751 | !state->reset_canceled) {
| ^~
drivers/tty/sysrq.c: In function 'sysrq_reinject_alt_sysrq':
>> drivers/tty/sysrq.c:800:11: error: 'struct sysrq_state' has no member named 'need_reinject'
800 | if (sysrq->need_reinject) {
| ^~
>> drivers/tty/sysrq.c:802:10: error: 'struct sysrq_state' has no member named 'reinjecting'; did you mean 'reinject_work'?
802 | sysrq->reinjecting = true;
| ^~~~~~~~~~~
| reinject_work
>> drivers/tty/sysrq.c:807:43: error: 'struct sysrq_state' has no member named 'sysrq_key'
807 | input_inject_event(handle, EV_KEY, sysrq->sysrq_key, 1);
| ^~
drivers/tty/sysrq.c:810:43: error: 'struct sysrq_state' has no member named 'sysrq_key'
810 | input_inject_event(handle, EV_KEY, sysrq->sysrq_key, 0);
| ^~
drivers/tty/sysrq.c:815:10: error: 'struct sysrq_state' has no member named 'reinjecting'; did you mean 'reinject_work'?
815 | sysrq->reinjecting = false;
| ^~~~~~~~~~~
| reinject_work
drivers/tty/sysrq.c: In function 'sysrq_handle_keypress':
>> drivers/tty/sysrq.c:822:25: error: 'struct sysrq_state' has no member named 'active'
822 | bool was_active = sysrq->active;
| ^~
drivers/tty/sysrq.c:831:13: error: 'struct sysrq_state' has no member named 'active'
831 | if (sysrq->active && code == sysrq->alt_use)
| ^~
drivers/tty/sysrq.c:832:10: error: 'struct sysrq_state' has no member named 'active'
832 | sysrq->active = false;
| ^~
drivers/tty/sysrq.c:838:9: error: 'struct sysrq_state' has no member named 'need_reinject'
838 | sysrq->need_reinject = false;
| ^~
drivers/tty/sysrq.c:853:9: error: 'struct sysrq_state' has no member named 'active'
853 | sysrq->active = true;
| ^~
drivers/tty/sysrq.c:861:9: error: 'struct sysrq_state' has no member named 'need_reinject'
861 | sysrq->need_reinject = true;
| ^~
drivers/tty/sysrq.c:872:12: error: 'struct sysrq_state' has no member named 'active'
872 | if (sysrq->active)
| ^~
drivers/tty/sysrq.c:873:19: error: 'struct sysrq_state' has no member named 'sysrq_key'
873 | clear_bit(sysrq->sysrq_key, sysrq->handle.dev->key);
| ^~
drivers/tty/sysrq.c:879:20: error: 'struct sysrq_state' has no member named 'sysrq_key'
879 | if (code == sysrq->sysrq_key)
| ^~
drivers/tty/sysrq.c:882:12: error: 'struct sysrq_state' has no member named 'active'
882 | if (sysrq->active && value && value != 2) {
| ^~
drivers/tty/sysrq.c:885:9: error: 'struct sysrq_state' has no member named 'need_reinject'
885 | sysrq->need_reinject = false;
| ^~
drivers/tty/sysrq.c:893:18: error: 'struct sysrq_state' has no member named 'active'
893 | suppress = sysrq->active;
| ^~
drivers/tty/sysrq.c:895:12: error: 'struct sysrq_state' has no member named 'active'
895 | if (!sysrq->active) {
| ^~
drivers/tty/sysrq.c:900:12: error: 'struct sysrq_state' has no member named 'reset_seq_version'
900 | if (sysrq->reset_seq_version != sysrq_reset_seq_version)
| ^~
drivers/tty/sysrq.c: In function 'sysrq_filter':
drivers/tty/sysrq.c:940:13: error: 'struct sysrq_state' has no member named 'reinjecting'; did you mean 'reinject_work'?
940 | if (sysrq->reinjecting)
| ^~~~~~~~~~~
| reinject_work
drivers/tty/sysrq.c:954:19: error: 'struct sysrq_state' has no member named 'active'
954 | suppress = sysrq->active;
| ^~
In file included from include/linux/workqueue.h:9,
from include/linux/rhashtable-types.h:15,
from include/linux/ipc.h:7,
from include/uapi/linux/sem.h:5,
from include/linux/sem.h:5,
from include/linux/sched.h:15,
from include/linux/sched/signal.h:7,
from drivers/tty/sysrq.c:18:
drivers/tty/sysrq.c: In function 'sysrq_connect':
drivers/tty/sysrq.c:978:20: error: 'struct sysrq_state' has no member named 'keyreset_timer'
978 | timer_setup(&sysrq->keyreset_timer, sysrq_do_reset, 0);
| ^~
include/linux/timer.h:126:18: note: in definition of macro '__init_timer'
126 | init_timer_key((_timer), (_fn), (_flags), NULL, NULL)
| ^~~~~~
drivers/tty/sysrq.c:978:2: note: in expansion of macro 'timer_setup'
978 | timer_setup(&sysrq->keyreset_timer, sysrq_do_reset, 0);
| ^~~~~~~~~~~
drivers/tty/sysrq.c:981:8: error: 'struct sysrq_state' has no member named 'sysrq_key'
981 | sysrq->sysrq_key = KEY_SYSRQ;
| ^~
drivers/tty/sysrq.c:984:8: error: 'struct sysrq_state' has no member named 'sysrq_key'
984 | sysrq->sysrq_key = alternative_sysrq_key;
| ^~
In file included from include/linux/kernel.h:19,
from include/linux/list.h:9,
from include/linux/rculist.h:10,
from include/linux/sched/signal.h:5,
from drivers/tty/sysrq.c:18:
drivers/tty/sysrq.c:985:70: error: 'struct sysrq_state' has no member named 'sysrq_key'
985 | pr_info("%s: Using alternative sysrq key: [%x]\n", dev->name, sysrq->sysrq_key);
| ^~
include/linux/printk.h:418:19: note: in definition of macro 'printk_index_wrap'
418 | _p_func(_fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/printk.h:519:2: note: in expansion of macro 'printk'
519 | printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~
drivers/tty/sysrq.c:985:3: note: in expansion of macro 'pr_info'
985 | pr_info("%s: Using alternative sysrq key: [%x]\n", dev->name, sysrq->sysrq_key);
| ^~~~~~~
In file included from include/linux/workqueue.h:9,
from include/linux/rhashtable-types.h:15,
from include/linux/ipc.h:7,
from include/uapi/linux/sem.h:5,
from include/linux/sem.h:5,
from include/linux/sched.h:15,
from include/linux/sched/signal.h:7,
from drivers/tty/sysrq.c:18:
drivers/tty/sysrq.c: In function 'sysrq_disconnect':
drivers/tty/sysrq.c:1016:23: error: 'struct sysrq_state' has no member named 'keyreset_timer'
vim +658 drivers/tty/sysrq.c
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 638
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 639 /* Simple translation table for the SysRq keys */
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 640 static const unsigned char sysrq_xlate[KEY_CNT] =
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 641 "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 642 "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 643 "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 644 "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 645 "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 646 "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 647 "\r\000/"; /* 0x60 - 0x6f */
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 648
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 649 struct sysrq_state {
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 650 struct input_handle handle;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 651 struct work_struct reinject_work;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 652 unsigned long key_down[BITS_TO_LONGS(KEY_CNT)];
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 653 unsigned int alt;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 654 unsigned int alt_use;
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 655 unsigned int shift;
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 656 unsigned int shift_use;
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 657 unsigned short sys
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 @658 bool active;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 659 bool need_reinject;
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 660 bool reinjecting;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 661
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 662 /* reset sequence handling */
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 663 bool reset_canceled;
3d289517dfd48f drivers/tty/sysrq.c Mathieu J. Poirier 2013-06-05 664 bool reset_requested;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 665 unsigned long reset_keybit[BITS_TO_LONGS(KEY_CNT)];
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 666 int reset_seq_len;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 667 int reset_seq_cnt;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 668 int reset_seq_version;
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 669 struct timer_list keyreset_timer;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 670 };
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 671
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 672 #define SYSRQ_KEY_RESET_MAX 20 /* Should be plenty */
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 673 static unsigned short sysrq_reset_seq[SYSRQ_KEY_RESET_MAX];
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 674 static unsigned int sysrq_reset_seq_len;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 675 static unsigned int sysrq_reset_seq_version = 1;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 676
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 677 static void sysrq_parse_reset_sequence(struct sysrq_state *state)
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 678 {
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 679 int i;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 680 unsigned short key;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 681
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 @682 state->reset_seq_cnt = 0;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 683
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 684 for (i = 0; i < sysrq_reset_seq_len; i++) {
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 685 key = sysrq_reset_seq[i];
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 686
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 687 if (key == KEY_RESERVED || key > KEY_MAX)
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 688 break;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 689
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 @690 __set_bit(key, state->reset_keybit);
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 @691 state->reset_seq_len++;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 692
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 693 if (test_bit(key, state->key_down))
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 694 state->reset_seq_cnt++;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 695 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 696
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 697 /* Disable reset until old keys are not released */
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 @698 state->reset_canceled = state->reset_seq_cnt != 0;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 699
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 @700 state->reset_seq_version = sysrq_reset_seq_version;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 701 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 702
8c318fa93dfcd1 drivers/tty/sysrq.c Kees Cook 2017-10-16 703 static void sysrq_do_reset(struct timer_list *t)
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 704 {
8c318fa93dfcd1 drivers/tty/sysrq.c Kees Cook 2017-10-16 705 struct sysrq_state *state = from_timer(state, t, keyreset_timer);
3d289517dfd48f drivers/tty/sysrq.c Mathieu J. Poirier 2013-06-05 706
3d289517dfd48f drivers/tty/sysrq.c Mathieu J. Poirier 2013-06-05 @707 state->reset_requested = true;
3d289517dfd48f drivers/tty/sysrq.c Mathieu J. Poirier 2013-06-05 708
8fefbc6d4b2660 drivers/tty/sysrq.c Mark Tomlinson 2018-11-27 709 orderly_reboot();
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 710 }
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 711
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 712 static void sysrq_handle_reset_request(struct sysrq_state *state)
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 713 {
3d289517dfd48f drivers/tty/sysrq.c Mathieu J. Poirier 2013-06-05 714 if (state->reset_requested)
3d289517dfd48f drivers/tty/sysrq.c Mathieu J. Poirier 2013-06-05 715 __handle_sysrq(sysrq_xlate[KEY_B], false);
3d289517dfd48f drivers/tty/sysrq.c Mathieu J. Poirier 2013-06-05 716
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 717 if (sysrq_reset_downtime_ms)
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 @718 mod_timer(&state->keyreset_timer,
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 719 jiffies + msecs_to_jiffies(sysrq_reset_downtime_ms));
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 720 else
8c318fa93dfcd1 drivers/tty/sysrq.c Kees Cook 2017-10-16 721 sysrq_do_reset(&state->keyreset_timer);
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 722 }
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 723
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 724 static void sysrq_detect_reset_sequence(struct sysrq_state *state,
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 725 unsigned int code, int value)
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 726 {
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 727 if (!test_bit(code, state->reset_keybit)) {
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 728 /*
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 729 * Pressing any key _not_ in reset sequence cancels
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 730 * the reset sequence. Also cancelling the timer in
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 731 * case additional keys were pressed after a reset
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 732 * has been requested.
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 733 */
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 734 if (value && state->reset_seq_cnt) {
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 735 state->reset_canceled = true;
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 736 del_timer(&state->keyreset_timer);
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 737 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 738 } else if (value == 0) {
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 739 /*
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 740 * Key release - all keys in the reset sequence need
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 741 * to be pressed and held for the reset timeout
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 742 * to hold.
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 743 */
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 744 del_timer(&state->keyreset_timer);
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 745
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 746 if (--state->reset_seq_cnt == 0)
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 747 state->reset_canceled = false;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 748 } else if (value == 1) {
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 749 /* key press, not autorepeat */
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 750 if (++state->reset_seq_cnt == state->reset_seq_len &&
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 751 !state->reset_canceled) {
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 752 sysrq_handle_reset_request(state);
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 753 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 754 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 755 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 756
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 757 #ifdef CONFIG_OF
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 758 static void sysrq_of_get_keyreset_config(void)
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 759 {
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 760 u32 key;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 761 struct device_node *np;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 762 struct property *prop;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 763 const __be32 *p;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 764
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 765 np = of_find_node_by_path("/chosen/linux,sysrq-reset-seq");
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 766 if (!np) {
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 767 pr_debug("No sysrq node found");
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 768 return;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 769 }
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 770
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 771 /* Reset in case a __weak definition was present */
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 772 sysrq_reset_seq_len = 0;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 773
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 774 of_property_for_each_u32(np, "keyset", prop, p, key) {
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 775 if (key == KEY_RESERVED || key > KEY_MAX ||
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 776 sysrq_reset_seq_len == SYSRQ_KEY_RESET_MAX)
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 777 break;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 778
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 779 sysrq_reset_seq[sysrq_reset_seq_len++] = (unsigned short)key;
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 780 }
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 781
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 782 /* Get reset timeout if any. */
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 783 of_property_read_u32(np, "timeout-ms", &sysrq_reset_downtime_ms);
279070b96a5a08 drivers/tty/sysrq.c Yangtao Li 2018-11-21 784
279070b96a5a08 drivers/tty/sysrq.c Yangtao Li 2018-11-21 785 of_node_put(np);
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 786 }
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 787 #else
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 788 static void sysrq_of_get_keyreset_config(void)
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 789 {
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 790 }
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 791 #endif
4c076eb0cfd9fa drivers/tty/sysrq.c Mathieu J. Poirier 2013-08-03 792
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 793 static void sysrq_reinject_alt_sysrq(struct work_struct *work)
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 794 {
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 795 struct sysrq_state *sysrq =
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 796 container_of(work, struct sysrq_state, reinject_work);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 797 struct input_handle *handle = &sysrq->handle;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 798 unsigned int alt_code = sysrq->alt_use;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 799
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 @800 if (sysrq->need_reinject) {
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 801 /* we do not want the assignment to be reordered */
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 @802 sysrq->reinjecting = true;
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 803 mb();
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 804
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 805 /* Simulate press and release of Alt + SysRq */
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 806 input_inject_event(handle, EV_KEY, alt_code, 1);
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 @807 input_inject_event(handle, EV_KEY, sysrq->sysrq_key, 1);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 808 input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 809
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 810 input_inject_event(handle, EV_KEY, sysrq->sysrq_key, 0);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 811 input_inject_event(handle, EV_KEY, alt_code, 0);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 812 input_inject_event(handle, EV_SYN, SYN_REPORT, 1);
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 813
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 814 mb();
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 815 sysrq->reinjecting = false;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 816 }
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 817 }
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 818
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 819 static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 820 unsigned int code, int value)
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 821 {
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 @822 bool was_active = sysrq->active;
1966cb225c6f90 drivers/char/sysrq.c Dmitry Torokhov 2010-09-29 823 bool suppress;
1966cb225c6f90 drivers/char/sysrq.c Dmitry Torokhov 2010-09-29 824
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 825 switch (code) {
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 826
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 827 case KEY_LEFTALT:
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 828 case KEY_RIGHTALT:
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 829 if (!value) {
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 830 /* One of ALTs is being released */
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 831 if (sysrq->active && code == sysrq->alt_use)
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 832 sysrq->active = false;
f5dec51172b81d drivers/char/sysrq.c Dmitry Torokhov 2010-06-09 833
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 834 sysrq->alt = KEY_RESERVED;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 835
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 836 } else if (value != 2) {
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 837 sysrq->alt = code;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 838 sysrq->need_reinject = false;
f5dec51172b81d drivers/char/sysrq.c Dmitry Torokhov 2010-06-09 839 }
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 840 break;
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 841
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 842 case KEY_LEFTSHIFT:
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 843 case KEY_RIGHTSHIFT:
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 844 if (!value)
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 845 sysrq->shift = KEY_RESERVED;
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 846 else if (value != 2)
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 847 sysrq->shift = code;
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 848 break;
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 849
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 850 key_sysrq:
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 851 case KEY_SYSRQ:
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 852 if (value == 1 && sysrq->alt != KEY_RESERVED) {
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 853 sysrq->active = true;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 854 sysrq->alt_use = sysrq->alt;
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 855 /* either RESERVED (for released) or actual code */
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 856 sysrq->shift_use = sysrq->shift;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 857 /*
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 858 * If nothing else will be pressed we'll need
7ab7b5adfb9239 drivers/char/sysrq.c Dmitry Torokhov 2011-02-02 859 * to re-inject Alt-SysRq keysroke.
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 860 */
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 861 sysrq->need_reinject = true;
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 862 }
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 863
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 864 /*
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 865 * Pretend that sysrq was never pressed at all. This
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 866 * is needed to properly handle KGDB which will try
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 867 * to release all keys after exiting debugger. If we
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 868 * do not clear key bit it KGDB will end up sending
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 869 * release events for Alt and SysRq, potentially
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 870 * triggering print screen function.
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 871 */
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 872 if (sysrq->active)
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 873 clear_bit(sysrq->sysrq_key, sysrq->handle.dev->key);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 874
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 875 break;
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 876
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 877 default:
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 878 /* handle non-default sysrq key */
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 879 if (code == sysrq->sysrq_key)
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 880 goto key_sysrq;
ed36496ef4a480 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2021-11-03 881
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 882 if (sysrq->active && value && value != 2) {
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 883 unsigned char c = sysrq_xlate[code];
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 884
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 885 sysrq->need_reinject = false;
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 886 if (sysrq->shift_use != KEY_RESERVED)
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 887 c = toupper(c);
a27eb0cb4b2104 drivers/tty/sysrq.c Andrzej Pietrasiewicz 2020-08-18 888 __handle_sysrq(c, true);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 889 }
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 890 break;
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 891 }
97f5f0cd8cd0a0 drivers/char/sysrq.c Dmitry Torokhov 2010-03-21 892
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 893 suppress = sysrq->active;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 894
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 895 if (!sysrq->active) {
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 896
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 897 /*
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 898 * See if reset sequence has changed since the last time.
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 899 */
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 900 if (sysrq->reset_seq_version != sysrq_reset_seq_version)
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 901 sysrq_parse_reset_sequence(sysrq);
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 902
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 903 /*
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 904 * If we are not suppressing key presses keep track of
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 905 * keyboard state so we can release keys that have been
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 906 * pressed before entering SysRq mode.
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 907 */
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 908 if (value)
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 909 set_bit(code, sysrq->key_down);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 910 else
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 911 clear_bit(code, sysrq->key_down);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 912
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 913 if (was_active)
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 914 schedule_work(&sysrq->reinject_work);
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 915
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 916 /* Check for reset sequence */
3903078677a8dc drivers/tty/sysrq.c Mathieu J. Poirier 2013-04-01 917 sysrq_detect_reset_sequence(sysrq, code, value);
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 918
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 919 } else if (value == 0 && test_and_clear_bit(code, sysrq->key_down)) {
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 920 /*
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 921 * Pass on release events for keys that was pressed before
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 922 * entering SysRq mode.
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 923 */
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 924 suppress = false;
fcb7193096969c drivers/char/sysrq.c Dmitry Torokhov 2010-11-15 925 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 926
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 927 return suppress;
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 928 }
154b7a489a5b1d drivers/tty/sysrq.c Mathieu Poirier 2013-01-06 929
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 9705 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread