Commit a27eb0cb authored by Andrzej Pietrasiewicz's avatar Andrzej Pietrasiewicz Committed by Greg Kroah-Hartman

tty/sysrq: Extend the sysrq_key_table to cover capital letters

All slots in sysrq_key_table[] are either used, reserved or at least
commented with their intended use. This patch adds capital letter versions
available, which means adding 26 more entries.

For already existing SysRq operations the user presses Alt-SysRq-<key>, and
for the newly added ones Alt-Shift-SysRq-<key>.
Signed-off-by: default avatarAndrzej Pietrasiewicz <andrzej.p@collabora.com>
Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://lore.kernel.org/r/20200818112825.6445-2-andrzej.p@collabora.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fce3c5c1
...@@ -79,6 +79,8 @@ On all ...@@ -79,6 +79,8 @@ On all
echo t > /proc/sysrq-trigger echo t > /proc/sysrq-trigger
The :kbd:`<command key>` is case sensitive.
What are the 'command' keys? What are the 'command' keys?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......
...@@ -325,7 +325,7 @@ static void drm_fb_helper_sysrq(int dummy1) ...@@ -325,7 +325,7 @@ static void drm_fb_helper_sysrq(int dummy1)
static const struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { static const struct sysrq_key_op sysrq_drm_fb_helper_restore_op = {
.handler = drm_fb_helper_sysrq, .handler = drm_fb_helper_sysrq,
.help_msg = "force-fb(V)", .help_msg = "force-fb(v)",
.action_msg = "Restore framebuffer console", .action_msg = "Restore framebuffer console",
}; };
#else #else
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/sched/rt.h> #include <linux/sched/rt.h>
#include <linux/sched/debug.h> #include <linux/sched/debug.h>
#include <linux/sched/task.h> #include <linux/sched/task.h>
#include <linux/ctype.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/fs.h> #include <linux/fs.h>
...@@ -440,7 +441,7 @@ static const struct sysrq_key_op sysrq_unrt_op = { ...@@ -440,7 +441,7 @@ static const struct sysrq_key_op sysrq_unrt_op = {
/* Key Operations table and lock */ /* Key Operations table and lock */
static DEFINE_SPINLOCK(sysrq_key_table_lock); static DEFINE_SPINLOCK(sysrq_key_table_lock);
static const struct sysrq_key_op *sysrq_key_table[36] = { static const struct sysrq_key_op *sysrq_key_table[62] = {
&sysrq_loglevel_op, /* 0 */ &sysrq_loglevel_op, /* 0 */
&sysrq_loglevel_op, /* 1 */ &sysrq_loglevel_op, /* 1 */
&sysrq_loglevel_op, /* 2 */ &sysrq_loglevel_op, /* 2 */
...@@ -497,6 +498,32 @@ static const struct sysrq_key_op *sysrq_key_table[36] = { ...@@ -497,6 +498,32 @@ static const struct sysrq_key_op *sysrq_key_table[36] = {
/* y: May be registered on sparc64 for global register dump */ /* y: May be registered on sparc64 for global register dump */
NULL, /* y */ NULL, /* y */
&sysrq_ftrace_dump_op, /* z */ &sysrq_ftrace_dump_op, /* z */
NULL, /* A */
NULL, /* B */
NULL, /* C */
NULL, /* D */
NULL, /* E */
NULL, /* F */
NULL, /* G */
NULL, /* H */
NULL, /* I */
NULL, /* J */
NULL, /* K */
NULL, /* L */
NULL, /* M */
NULL, /* N */
NULL, /* O */
NULL, /* P */
NULL, /* Q */
NULL, /* R */
NULL, /* S */
NULL, /* T */
NULL, /* U */
NULL, /* V */
NULL, /* W */
NULL, /* X */
NULL, /* Y */
NULL, /* Z */
}; };
/* key2index calculation, -1 on invalid index */ /* key2index calculation, -1 on invalid index */
...@@ -508,6 +535,8 @@ static int sysrq_key_table_key2index(int key) ...@@ -508,6 +535,8 @@ static int sysrq_key_table_key2index(int key)
retval = key - '0'; retval = key - '0';
else if ((key >= 'a') && (key <= 'z')) else if ((key >= 'a') && (key <= 'z'))
retval = key + 10 - 'a'; retval = key + 10 - 'a';
else if ((key >= 'A') && (key <= 'Z'))
retval = key + 36 - 'A';
else else
retval = -1; retval = -1;
return retval; return retval;
...@@ -621,6 +650,8 @@ struct sysrq_state { ...@@ -621,6 +650,8 @@ struct sysrq_state {
unsigned long key_down[BITS_TO_LONGS(KEY_CNT)]; unsigned long key_down[BITS_TO_LONGS(KEY_CNT)];
unsigned int alt; unsigned int alt;
unsigned int alt_use; unsigned int alt_use;
unsigned int shift;
unsigned int shift_use;
bool active; bool active;
bool need_reinject; bool need_reinject;
bool reinjecting; bool reinjecting;
...@@ -805,10 +836,20 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq, ...@@ -805,10 +836,20 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
} }
break; break;
case KEY_LEFTSHIFT:
case KEY_RIGHTSHIFT:
if (!value)
sysrq->shift = KEY_RESERVED;
else if (value != 2)
sysrq->shift = code;
break;
case KEY_SYSRQ: case KEY_SYSRQ:
if (value == 1 && sysrq->alt != KEY_RESERVED) { if (value == 1 && sysrq->alt != KEY_RESERVED) {
sysrq->active = true; sysrq->active = true;
sysrq->alt_use = sysrq->alt; sysrq->alt_use = sysrq->alt;
/* either RESERVED (for released) or actual code */
sysrq->shift_use = sysrq->shift;
/* /*
* If nothing else will be pressed we'll need * If nothing else will be pressed we'll need
* to re-inject Alt-SysRq keysroke. * to re-inject Alt-SysRq keysroke.
...@@ -831,8 +872,12 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq, ...@@ -831,8 +872,12 @@ static bool sysrq_handle_keypress(struct sysrq_state *sysrq,
default: default:
if (sysrq->active && value && value != 2) { if (sysrq->active && value && value != 2) {
unsigned char c = sysrq_xlate[code];
sysrq->need_reinject = false; sysrq->need_reinject = false;
__handle_sysrq(sysrq_xlate[code], true); if (sysrq->shift_use != KEY_RESERVED)
c = toupper(c);
__handle_sysrq(c, true);
} }
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment