Messages in this thread Patch in this message | | | Date | Fri, 4 Apr 1997 17:58:40 +0200 | From | Pavel Machek <> | Subject | Emergency keyboard combinations - patch |
| |
Hi!
This patch allows you to recover system from very strange situations (crashed X, keyboard in raw mode, crashed kernel etc.) with hard-coded combinations. These are life-savers, not recommended for normal use, but when something crashes next time, you'll probably like them.
Do not enable this for 'safe' machines - anyone who can access keyboard may to really strange things... Pavel
diff -ur linux.backup/drivers/char/Makefile linux/drivers/char/Makefile --- linux.backup/drivers/char/Makefile Fri Jan 3 19:04:02 1997 +++ linux/drivers/char/Makefile Mon Mar 31 20:32:54 1997 @@ -22,7 +22,7 @@ M_OBJS := L_OBJS := tty_io.o n_tty.o console.o \ tty_ioctl.o pty.o vt.o mem.o vc_screen.o random.o \ - consolemap.o selection.o + consolemap.o selection.o keyboard.o ifeq ($(CONFIG_SERIAL),y) ifndef CONFIG_SUN_SERIAL diff -ur linux.backup/drivers/char/keyboard.c linux/drivers/char/keyboard.c --- linux.backup/drivers/char/keyboard.c Tue Mar 11 21:03:12 1997 +++ linux/drivers/char/keyboard.c Mon Mar 31 21:22:44 1997 @@ -14,8 +14,12 @@ * dynamic function/string keys, led setting, Sept 1994 * `Sticky' modifier keys, 951006. * 11-11-96: SAK should now work in the raw mode (Martin Mares) + * 3-31-97: Emergency keyboard combinations (Pavel Machek) + * mj's stuff for SAK in raw mode deleted + * Activate by SysRq + letter, SysRq + h for help */ +#define CONFIG_EMG_KEYS #define KEYBOARD_IRQ 1 #define DISABLE_KBD_DURING_INTERRUPTS 0 @@ -127,10 +130,6 @@ do_ignore, do_ignore, do_ignore }; -/* Key types processed even in raw modes */ - -#define TYPES_ALLOWED_IN_RAW_MODE ((1 << KT_SPEC) | (1 << KT_SHIFT)) - typedef void (*void_fnp)(void); typedef void (void_fn)(void); @@ -146,8 +145,6 @@ decr_console, incr_console, spawn_console, bare_num }; -#define SPECIALS_ALLOWED_IN_RAW_MODE (1 << KVAL(K_SAK)) - /* maximum values each key_handler can handle */ const int max_vals[] = { 255, SIZE(func_table) - 1, SIZE(spec_fn_table) - 1, NR_PAD - 1, @@ -161,6 +158,10 @@ static void put_queue(int); static unsigned char handle_diacr(unsigned char); +#ifdef CONFIG_EMG_KEYS +static void emergency_key(int); +#endif + /* pt_regs - set by keyboard_interrupt(), used by show_ptregs() */ static struct pt_regs * pt_regs; @@ -506,6 +507,11 @@ } else rep = set_bit(keycode, key_down); +#ifdef CONFIG_EMG_KEYS + if (!up_flag && test_bit( E0_PRSCR, key_down ) && (keycode != E0_PRSCR)) + emergency_key( keycode ); +#endif + if (kbd->kbdmode == VC_MEDIUMRAW) { /* soon keycodes will require more than one byte */ put_queue(keycode + up_flag); @@ -541,8 +547,8 @@ if (type >= 0xf0) { type -= 0xf0; - if (raw_mode && ! (TYPES_ALLOWED_IN_RAW_MODE & (1 << type))) - return; + if (raw_mode) + return; if (type == KT_LETTER) { type = KT_LATIN; if (vc_kbd_led(kbd, VC_CAPSLOCK)) { @@ -550,7 +556,7 @@ if (key_map) keysym = key_map[keycode]; } - } + } (*key_handler[type])(keysym & 0xff, up_flag); if (type != KT_SLOCK) kbd->slockstate = 0; @@ -792,8 +798,7 @@ return; if (value >= SIZE(spec_fn_table)) return; - if ((kbd->kbdmode == VC_RAW || kbd->kbdmode == VC_MEDIUMRAW) && - !(SPECIALS_ALLOWED_IN_RAW_MODE & (1 << value))) + if (kbd->kbdmode == VC_RAW || kbd->kbdmode == VC_MEDIUMRAW) return; spec_fn_table[value](); } @@ -1397,3 +1402,90 @@ return (1); } #endif /* INIT_KBD */ + +#ifdef CONFIG_EMG_KEYS + +extern union bdflush_param{ + struct { + int nfract; /* Percentage of buffer cache dirty to + activate bdflush */ + int ndirty; /* Maximum number of dirty blocks to write out per + wake-cycle */ + int nrefill; /* Number of clean buffers to try to obtain + each time we call refill */ + int nref_dirt; /* Dirty buffer threshold for activating bdflush + when trying to refill buffers. */ + int dummy1; /* unused */ + int age_buffer; /* Time for normal buffer to age before + we flush it */ + int age_super; /* Time for superblock to age before we + flush it */ + int dummy2; /* unused */ + int dummy3; /* unused */ + } b_un; + unsigned int data[9]; + } bdf_prm; + +extern int console_loglevel; + +static void +emergency_key( int keycode ) +{ + /* 1..9 */ +if ( (keycode >= 59) && (keycode <= 68) ) { set_console( keycode - 59 ); return; } +printk( KERN_INFO "Emergency " ); +switch( keycode ) { + case 25: /* P: Ptregs */ + printk( "ptregs\n" ); + show_ptregs(); + break; + case 50: /* M: Mem */ + printk( "mem\n" ); + show_mem(); + break; + case 20: /* T: sTate */ + printk( "state\n" ); + show_state(); + break; + case 16: /* U: unraw */ + kbd->kbdmode = VC_XLATE; + printk( "unraw\n" ); + break; + case 30: /* A: Security Attetion Key */ + SAK(); + printk( "SAK\n" ); + break; + case 31: /* S: sync */ + bdf_prm.b_un.nfract = 0; + bdf_prm.b_un.ndirty = 5000; + bdf_prm.b_un.age_buffer = 100; + bdf_prm.b_un.age_super = 100; + printk( "sync\n" ); + printk( KERN_INFO "Strange values had been set for bdflush to emulate SYNC.\n" ); + break; + case 32: /* D: ctrl-alt-Del */ + printk( "ctrl-alt-del emulation\n" ); + boot_it(); + break; + case 17: /* W: poWer off */ + printk( "power off\n" ); + machine_power_off( NULL ); + break; + case 19: /* R: Reset */ + printk( "reset\n" ); + machine_restart( NULL ); + break; + case 47: /* V: make console verbose */ + printk( "verbose\n" ); + console_loglevel = 8; + printk( KERN_INFO "Console is now verbose :-)\n" ); + break; + case 35: /* H: help */ + case 53: /* ? */ + printk( "combinations: Help, F1-F10 set console, Unraw, sAk, Verbose\n" ); + printk( KERN_INFO " Sync, ctrl-alt-Del, poWer off, Reset, Ptregs, Mem, sTate\n" ); + break; + default: + } +} +#endif
| |