Stateful Magic Sysrq Key
Subsystems (3)
Quoted 1 line
I'd suggest either making this behaviour optional,
or making it
Quoted 1 line
so that hitting alt-sysrq twice, without any other
keys being
Quoted 1 line
pressed makes the next key stick.
I agree with you that there's a risk. Mike Harris had written a
patch for 2.2 which did something similar, but slightly better
IMO since it avoids risks of mis-press, handles correctly
broken keyboards and keeps compatible with the existing
method. Basically, it allows the user to press Alt, then SysRQ,
release SysRQ then press the desired key, and later release
Alt. In fact, it only resets the "magic-key-mode" flag after Alt
has been released, and doesn't bother when SysRq is released.
I don't remember where it was available, but if
someone needs
it, I still have it here for 2.2.
Willy
___________________________________________________________
Do You Yahoo!? -- Un e-mail gratuit @yahoo.fr !
Yahoo! Courrier : http://fr.mail.yahoo.com
++ 02/10/01 10:48 +0200 - willy tarreau:
Quoted 6 lines
Quoted 1 line
I'd suggest either making this behaviour optional,
or making it
Quoted 1 line
so that hitting alt-sysrq twice, without any other
keys being
Quoted 1 line
pressed makes the next key stick.
Quoted 16 lines
I agree with you that there's a risk. Mike Harris had written a
patch for 2.2 which did something similar, but slightly better
IMO since it avoids risks of mis-press, handles correctly
broken keyboards and keeps compatible with the existing
method. Basically, it allows the user to press Alt, then SysRQ,
release SysRQ then press the desired key, and later release
Alt. In fact, it only resets the "magic-key-mode" flag after Alt
has been released, and doesn't bother when SysRq is released.
But this would require that alt be pressed. This is not acceptable on exactly the sort of boards which require this patch.
I will look at adding a 'sysrq-sticky' entry to proc, which will do the obvious thing. I think that this should address everyone's concerns.
Signature · 3 lines
Crutcher <[email protected]> GCS d--- s+:>+:- a-- C++++$ UL++++$ L+++$>++++ !E PS+++ PE Y+ PGP+>++++ R-(+++) !tv(+++) b+(++++) G+ e>++++ h+>++ r* y+>*$
PATCH 1/1 Stateful Magic Sysrq Key + Sticky Tag
In reply to willy tarreauThis is the previous stateful sysrq patch, plus a 'sysrq-sticky' proc entry, which defaults to off, that controls whether the stateful mode will be used or not.
This reworked patch is against 2.4.11-pre2.
++ 02/10/01 10:18 -0400 - Crutcher Dunnavant:
Quoted 39 lines
++ 02/10/01 10:48 +0200 - willy tarreau:
Quoted 6 lines
Quoted 1 line
I'd suggest either making this behaviour optional,
or making it
Quoted 1 line
so that hitting alt-sysrq twice, without any other
keys being
Quoted 1 line
pressed makes the next key stick.
Quoted 16 lines
I agree with you that there's a risk. Mike Harris had written a
patch for 2.2 which did something similar, but slightly better
IMO since it avoids risks of mis-press, handles correctly
broken keyboards and keeps compatible with the existing
method. Basically, it allows the user to press Alt, then SysRQ,
release SysRQ then press the desired key, and later release
Alt. In fact, it only resets the "magic-key-mode" flag after Alt
has been released, and doesn't bother when SysRq is released.But this would require that alt be pressed. This is not acceptable on exactly the sort of boards which require this patch.
I will look at adding a 'sysrq-sticky' entry to proc, which will do the obvious thing. I think that this should address everyone's concerns.
Signature · 8 lines
Crutcher <[email protected]> GCS d--- s+:>+:- a-- C++++$ UL++++$ L+++$>++++ !E PS+++ PE Y+ PGP+>++++ R-(+++) !tv(+++) b+(++++) G+ e>++++ h+>++ r* y+>*$ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Signature · 3 lines
Crutcher <[email protected]> GCS d--- s+:>+:- a-- C++++$ UL++++$ L+++$>++++ !E PS+++ PE Y+ PGP+>++++ R-(+++) !tv(+++) b+(++++) G+ e>++++ h+>++ r* y+>*$
drivers/char/keyboard.c +83 -9
@@ -21,6 +21,12 @@* * 27-05-97: Added support for the Magic SysRq Key (Martin Mares) * 30-07-98: Dead keys redone, [email protected]. +* +* 28-09-2001: Crutcher Dunnavant <[email protected]> +* Add stateful sysrq features, based upon work from: +* Mathew Mills <[email protected]> +* Norman Murray <[email protected]> +* */ #include <linux/config.h>
@@ -157,7 +163,14 @@struct pt_regs * kbd_pt_regs;#ifdef CONFIG_MAGIC_SYSRQ -static int sysrq_pressed; +static enum { +UP_AND_CLEAR , +DOWN_AND_WAITING , +DOWN_AND_DONE , +UP_AND_WAITING , +DOWN_AND_PASS +} sysrq_state; +extern struct sysrq_ctls_struct sysrq_ctls;#endif static struct pm_dev *pm_kbd;
@@ -246,15 +259,76 @@ }else rep =test_and_set_bit (keycode, key_down); -#ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq Hack */ -if (keycode ==SYSRQ_KEY ) { - sysrq_pressed = !up_flag; - goto out; - }else if (sysrq_pressed) { -if (!up_flag) { -handle_sysrq (kbd_sysrq_xlate[keycode], kbd_pt_regs, kbd, tty); - goto out; +#ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq Hack */ +/* +Pressing magic + command key acts as a chorded command. +Pressing and releasing magic without a command key acts sticky, +using the next non-magic key as a command key +Pressing magic twice without a command key passes the magic key +through. +*/ + +if (sysrq_ctls.enabled) { +if (keycode == sysrq_ctls.keycode)switch (sysrq_state) { +case UP_AND_CLEAR : + sysrq_state = up_flag ?UP_AND_CLEAR : +DOWN_AND_WAITING ; +/* consume the key event */ + goto out; + +case DOWN_AND_WAITING : +if (up_flag) { +if (sysrq_ctls.sticky) { + sysrq_state =UP_AND_WAITING ; + }else { + sysrq_state =UP_AND_CLEAR ; + } + }else { + sysrq_state =DOWN_AND_WAITING ; + } +/* consume the key event */ + goto out; + +case DOWN_AND_DONE : + sysrq_state = up_flag ?UP_AND_CLEAR : +DOWN_AND_DONE ; +/* consume the key event */ + goto out; + +case DOWN_AND_PASS : +case UP_AND_WAITING : + sysrq_state = up_flag ?UP_AND_CLEAR : +DOWN_AND_PASS ; +/* pass the key event through */ +break ; + + }else switch (sysrq_state) { +case UP_AND_WAITING : +case DOWN_AND_WAITING : +case DOWN_AND_DONE : +if (!up_flag) { +handle_sysrq (kbd_sysrq_xlate[keycode], + kbd_pt_regs, kbd, tty); + } + +if (sysrq_state ==UP_AND_WAITING ) { + sysrq_state =UP_AND_CLEAR ; + }else { + sysrq_state =DOWN_AND_DONE ; + } + +/* consume the key event */ + goto out; + + +case DOWN_AND_PASS : +case UP_AND_CLEAR : +/* pass the key event through */ +break ; + } + }else { + sysrq_state =UP_AND_CLEAR ; }#endif
drivers/char/sysrq.c +16 -4
@@ -32,12 +32,24 @@#include <asm/ptrace.h> +/* for the SYSRQ_KEY definition */ +#include <asm/keyboard.h> +extern void reset_vc (unsigned int );extern struct list_head super_blocks;/* Whether we react on sysrq keys or just ignore them */ -int sysrq_enabled =1 ; +struct sysrq_ctls_struct sysrq_ctls = { +/* Whether we react on sysrq keys or just ignore them */ + enabled:1 , + +/* The keycode for the magic key, referred to as sysrq */ + keycode:SYSRQ_KEY , +/* is the sysrq key 'sticky'? */ + sticky:0 , +}; +/* Machine specific power off function */ void (*sysrq_power_off)(void );
@@ -231,7 +243,7 @@static void sysrq_handle_mountro (int key,struct pt_regs *pt_regs,struct kbd_struct *kbd,struct tty_struct *tty) { emergency_sync_scheduled =EMERG_REMOUNT ; -wakeup_bdflush (0 ); +wakeup_bdflush (); }static struct sysrq_key_op sysrq_mountro_op = { handler: sysrq_handle_mountro,
@@ -433,7 +445,7 @@void handle_sysrq (int key,struct pt_regs *pt_regs,struct kbd_struct *kbd,struct tty_struct *tty) { -if (!sysrq_enabled) +if (!sysrq_ctls.enabled)return ;__sysrq_lock_table ();
@@ -453,7 +465,7 @@int orig_log_level;int i, j; -if (!sysrq_enabled) +if (!sysrq_ctls.enabled)return ; orig_log_level = console_loglevel;
include/linux/sysctl.h +1 -1
@@ -106,7 +106,7 @@KERN_MSGMAX =35 ,/* int: Maximum size of a messege */ KERN_MSGMNB =36 ,/* int: Maximum message queue size */ KERN_MSGPOOL =37 ,/* int: Maximum system message pool size */ -KERN_SYSRQ =38 ,/* int: Sysreq enable */ +KERN_SYSRQ =38 ,/* struct: Sysreq enable, keycode, sticky */ KERN_MAX_THREADS =39 ,/* int: Maximum nr of threads in the system */ KERN_RANDOM =40 ,/* Random driver */ KERN_SHMALL=41, /* int: Maximum size of shared memory */
include/linux/sysrq.h +7 -0
@@ -26,6 +26,13 @@#ifdef CONFIG_MAGIC_SYSRQ +/* sysrq_ctls - controls aspects of the SYSRQ magic key hack*/ +struct sysrq_ctls_struct { +int enabled; +int keycode; +int sticky; +}; +/* Generic SysRq interface -- you may call it from any device driver, supplying * ASCII code of the key, pointer to registers and kbd/tty structs (if they * are available -- else NULL's).
kernel/sysctl.c +6 -2
@@ -46,7 +46,7 @@extern int sysctl_overcommit_memory;extern int max_threads;extern int nr_queued_signals, max_queued_signals; -extern int sysrq_enabled; +extern struct sysrq_ctls_struct sysrq_ctls;extern int core_uses_pid;extern int cad_pid;
@@ -233,7 +233,11 @@ 0644, NULL, &proc_dointvec}, #endif #ifdef CONFIG_MAGIC_SYSRQ - {KERN_SYSRQ, "sysrq", &sysrq_enabled, sizeof (int), + {KERN_SYSRQ, "sysrq", &sysrq_ctls.enabled, sizeof (int), + 0644, NULL, &proc_dointvec}, + {KERN_SYSRQ, "sysrq-key", &sysrq_ctls.keycode, sizeof (sysrq_ctls.keycode), + 0644, NULL, &proc_dointvec}, + {KERN_SYSRQ, "sysrq-sticky", &sysrq_ctls.sticky, sizeof (sysrq_ctls.sticky), 0644, NULL, &proc_dointvec}, #endif {KERN_CADPID, "cad_pid", &cad_pid, sizeof (int),