Date: Mon, 22 Sep 1997 10:16:30 +0200
From: Roman Hodek <rnhodek@faui22c.informatik.uni-erlangen.de>
To: linux-m68k@phil.uni-sb.de
Subject: L68K: fwd: [rnhodek@linux24.linux.bis.uni-oldenburg.de: SysRq cleanup and little atafb patch]
Sender: owner-linux-m68k@phil.uni-sb.de
Reply-To: linux-m68k@phil.uni-sb.de


Can't tell now whether this mail really has made it to the list, so I
send it again...

------- Start of forwarded message -------
Received: from linux.bis.uni-oldenburg.de by immd2.informatik.uni-erlangen.de  with SMTP (5.64+/7.3h-FAU)
	id AA27913; Sun, 21 Sep 97 15:49:17 +0200
From: rnhodek@linux24.linux.bis.uni-oldenburg.de (Roman Hodek)
Received: by linux24.linux.bis.uni-oldenburg.de
	id m0xCmJ3-000ErMC
	for rnhodek@faui2pc5.informatik.uni-erlangen.de
	(Debian Smail-3.2 1996-Jul-4 #2); Sun, 21 Sep 1997 15:44:13 +0200 (CEST)
Message-Id: <m0xCmJ3-000ErMC@linux24.linux.bis.uni-oldenburg.de>
Date: Sun, 21 Sep 1997 15:44:13 +0200 (CEST)
To: linux-m68k@phil.uni-sb.de
Subject: SysRq cleanup and little atafb patch
Reply-To: Roman.Hodek@informatik.uni-erlangen.de


The patch below makes the SysRq key work again and also implements
modifiers for it. Currently it's Alt+Help on Atari and Alt+Shift+Help
on Amiga, but that could be easily changed.

Another little fix is that atafb.c couldn't be compiled without
16pixel support, a #ifdef was missing.

Roman

- ------------------------------------------------------------------------------
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/arch/m68k/amiga/config.c linux-2.1.55/arch/m68k/amiga/config.c
- --- linux-2.1.55.orig/arch/m68k/amiga/config.c	Sun Sep 14 22:47:00 1997
+++ linux-2.1.55/arch/m68k/amiga/config.c	Sun Sep 21 14:36:03 1997
@@ -89,23 +89,15 @@
 };
 
 #ifdef CONFIG_MAGIC_SYSRQ
- -static int amiga_sysrq_keys[] = {
- -	0x13, /* R */
- -	0x20, /* A */
- -	0x35, /* B */
- -	0x25, /* H */
- -	0x18, /* O */
- -	0x21, /* S */
- -	0x16, /* U */
- -	0x19, /* P */
- -	0x14, /* T */
- -	0x37, /* M */
- -	0x01, /* 1 */
- -	0x0A, /* 0 */
- -	0x12, /* E */
- -	0x27, /* K */
- -	0x28, /* L */
- -	-1
+static char amiga_sysrq_xlate[128] =
+	"\0001234567890-=\\\000\000"					/* 0x00 - 0x0f */
+	"qwertyuiop[]\000123"							/* 0x10 - 0x1f */
+	"asdfghjkl;'\000\000456"						/* 0x20 - 0x2f */
+	"\000zxcvbnm,./\000+789"						/* 0x30 - 0x3f */
+	" \177\t\r\r\000\177\000\000\000-\000\000\000\000\000"	/* 0x40 - 0x4f */
+	"\000\201\202\203\204\205\206\207\210\211()/*+\000"	/* 0x50 - 0x5f */
+	"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"	/* 0x60 - 0x6f */
+	"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";	/* 0x70 - 0x7f */
 };
 #endif
 
@@ -365,8 +357,10 @@
   conswitchp           = &fb_con;
   kd_mksound           = amiga_mksound;
 #ifdef CONFIG_MAGIC_SYSRQ
- -  mach_sysrq_key = 0x5f;	/* HELP */
- -  mach_sysrq_keys = amiga_sysrq_keys;
+  mach_sysrq_key = 0x5f;	     /* HELP */
+  mach_sysrq_shift_state = 0x09; /* SHIFT+ALT */
+  mach_sysrq_shift_mask = 0xff;  /* all modifiers except CapsLock */
+  mach_sysrq_xlate = amiga_sysrq_xlate;
 #endif
 
   /* Fill in the clock values (based on the 700 kHz E-Clock) */
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/arch/m68k/atari/config.c linux-2.1.55/arch/m68k/atari/config.c
- --- linux-2.1.55.orig/arch/m68k/atari/config.c	Sun Sep 14 22:47:03 1997
+++ linux-2.1.55/arch/m68k/atari/config.c	Sun Sep 21 14:35:55 1997
@@ -92,24 +92,15 @@
 int atari_SCC_reset_done = 0;
 
 #ifdef CONFIG_MAGIC_SYSRQ
- -static int atari_sysrq_keys[] = {
- -	19, /* R */
- -	30, /* A */
- -	48, /* B */
- -	35, /* H */
- -	24, /* O */
- -	31, /* S */
- -	22, /* U */
- -	25, /* P */
- -	20, /* T */
- -	50, /* M */
- -	2,  /* 1 */
- -	11, /* 0 */
- -	18, /* E */
- -	37, /* K */
- -	38, /* L */
- -	-1
- -};
+static char atari_sysrq_xlate[128] =
+	"\000\0331234567890-=\177\t"					/* 0x00 - 0x0f */
+	"qwertyuiop[]\r\000as"							/* 0x10 - 0x1f */
+	"dfghjkl;'`\000\\zxcv"							/* 0x20 - 0x2f */
+	"bnm,./\000\000\000 \000\201\202\203\204\205"	/* 0x30 - 0x3f */
+	"\206\207\210\211\212\000\000\000\000\000-\000\000\000+\000"/* 0x40 - 0x4f */
+	"\000\000\000\177\000\000\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
+	"\000\000\000()/*789456123"						/* 0x60 - 0x6f */
+	"0.\r\000\000\000\000\000\000\000\000\000\000\000\000\000";	/* 0x70 - 0x7f */
 #endif
 
 extern void (*kd_mksound)(unsigned int, unsigned int);
@@ -290,8 +281,10 @@
     mach_max_dma_address = 0xffffff;
     kd_mksound		 = atari_mksound;
 #ifdef CONFIG_MAGIC_SYSRQ
- -	mach_sysrq_key = 98; /* HELP */
- -	mach_sysrq_keys = atari_sysrq_keys;
+	mach_sysrq_key = 98;          /* HELP */
+	mach_sysrq_shift_state = 8;   /* Alt */
+	mach_sysrq_shift_mask = 0xff; /* all modifiers except CapsLock */
+	mach_sysrq_xlate = atari_sysrq_xlate;
 #endif
 
     /* ++bjoern: 
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/arch/m68k/kernel/setup.c linux-2.1.55/arch/m68k/kernel/setup.c
- --- linux-2.1.55.orig/arch/m68k/kernel/setup.c	Sun Sep 14 22:47:11 1997
+++ linux-2.1.55/arch/m68k/kernel/setup.c	Sun Sep 21 14:35:47 1997
@@ -84,7 +84,9 @@
 
 #ifdef CONFIG_MAGIC_SYSRQ
 int mach_sysrq_key = -1;
- -int *mach_sysrq_keys = NULL;
+int mach_sysrq_shift_state = 0;
+int mach_sysrq_shift_mask = 0;
+char *mach_sysrq_xlate = NULL;
 #endif
 
 extern int amiga_parse_bootinfo(const struct bi_record *);
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/drivers/char/keyboard.c linux-2.1.55/drivers/char/keyboard.c
- --- linux-2.1.55.orig/drivers/char/keyboard.c	Fri Sep  5 18:23:12 1997
+++ linux-2.1.55/drivers/char/keyboard.c	Sun Sep 21 14:51:37 1997
@@ -237,7 +237,13 @@
 		sysrq_pressed = !up_flag;
 		return;
 	} else if (sysrq_pressed) {
- -		if (!up_flag)
+		/* ++roman: Still process modifier keys to be able to trigger SysRq
+		 * mode with modifiers */
+		u_short keysym = U(plain_map[keycode]);
+		u_char type = KTYP(keysym);
+		if (type == KT_SHIFT)
+			(*key_handler[type])(keysym & 0xff, up_flag);
+		else if (!up_flag)
 			handle_sysrq(kbd_sysrq_xlate[keycode], kbd_pt_regs, kbd, tty);
 		return;
 	}
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/drivers/char/pc_keyb.c linux-2.1.55/drivers/char/pc_keyb.c
- --- linux-2.1.55.orig/drivers/char/pc_keyb.c	Fri Sep  5 18:23:17 1997
+++ linux-2.1.55/drivers/char/pc_keyb.c	Sat Sep 20 14:08:01 1997
@@ -591,7 +578,6 @@
 	-1
 };
 	
- -#define SYSRQ_KEY 0x54
 int pckbd_is_sysrq(unsigned char keycode)
 {
 	return( keycode == SYSRQ_KEY );
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/drivers/char/sysrq.c linux-2.1.55/drivers/char/sysrq.c
- --- linux-2.1.55.orig/drivers/char/sysrq.c	Fri Sep  5 18:23:19 1997
+++ linux-2.1.55/drivers/char/sysrq.c	Sun Sep 21 14:51:49 1997
@@ -19,7 +19,6 @@
 #include <linux/reboot.h>
 #include <linux/sysrq.h>
 #include <linux/kbd_kern.h>
- -#include <linux/sysrq.h>
 #include <asm/ptrace.h>
 #include <asm/smp_lock.h>
 #include <asm/keyboard.h>
@@ -61,93 +60,80 @@
 		  struct kbd_struct *kbd, struct tty_struct *tty)
 {
 	int orig_log_level = console_loglevel;
- -	int *p;
 
- -	/* ++roman: translate machine-specific keycodes to abstract numbers */
- -	if (!kbd_sysrq_keys)
- -		return;
- -	for( p = kbd_sysrq_keys; *p != -1; ++p )
- -		if (key == *p) {
- -			key = p - kbd_sysrq_keys;
- -			break;
- -		}
- -	if (*p == -1)
- -		key = SYSRQ_HELP;
- -	
 	console_loglevel = 7;
 	printk(KERN_INFO "SysRq: ");
 	switch (key) {
- -	case SYSRQ_RAWMODE:				    /* R -- Reset raw mode */
+	case 'r':					    /* R -- Reset raw mode */
 		if (kbd) {
 			kbd->kbdmode = VC_XLATE;
 			printk("Keyboard mode set to XLATE\n");
 		}
 		break;
- -	case SYSRQ_SAK:					    /* A -- SAK */
+	case 'a':					    /* A -- SAK */
 		printk("SAK\n");
 		if (tty)
 			do_SAK(tty);
 		reset_vc(fg_console);
 		break;
- -	case SYSRQ_BOOT:				    /* B -- boot immediately */
+	case 'b':					    /* B -- boot immediately */
 		printk("Resetting\n");
 		machine_restart(NULL);
 		break;
 #ifdef __sparc__
- -	case SYSRQ_HALT:				    /* H -- halt immediately */
+	case 'h':					    /* H -- halt immediately */
 		printk("Halting\n");
 		halt_now();
 		break;
 #endif
 #ifdef CONFIG_APM
- -	case SYSRQ_PWROFF:				    /* O -- power off */
+	case 'o':					    /* O -- power off */
 		printk("Power off\n");
 		apm_set_power_state(APM_STATE_OFF);
 		break;
 #endif
- -	case SYSRQ_SYNC:				    /* S -- emergency sync */
+	case 's':					    /* S -- emergency sync */
 		printk("Emergency Sync\n");
 		emergency_sync_scheduled = EMERG_SYNC;
 		wakeup_bdflush(0);
 		break;
- -	case SYSRQ_MNTRO:				    /* U -- emergency remount R/O */
+	case 'u':					    /* U -- emergency remount R/O */
 		printk("Emergency Remount R/O\n");
 		emergency_sync_scheduled = EMERG_REMOUNT;
 		wakeup_bdflush(0);
 		break;
- -	case SYSRQ_REGS:				    /* P -- show PC */
+	case 'p':					    /* P -- show PC */
 		printk("Show Regs\n");
 		if (pt_regs)
 			show_regs(pt_regs);
 		break;
- -	case SYSRQ_STATE:				    /* T -- show task info */
+	case 't':					    /* T -- show task info */
 		printk("Show State\n");
 		show_state();
 		break;
- -	case SYSRQ_MEMORY:				    /* M -- show memory info */
+	case 'm':					    /* M -- show memory info */
 		printk("Show Memory\n");
 		show_mem();
 		break;
- -	case SYSRQ_NUM1 ... SYSRQ_NUM0:			    /* 0-9 -- set console logging level */
+	case '0' ... '9':				    /* 0-9 -- set console logging level */
 		orig_log_level = key - '0';
 		printk("Log level set to %d\n", orig_log_level);
 		break;
- -	case SYSRQ_TERM:				    /* E -- terminate all user processes */
+	case 'e':					    /* E -- terminate all user processes */
 		printk("Terminate All Tasks\n");
 		send_sig_all(SIGTERM, 0);
 		orig_log_level = 8;			    /* We probably have killed syslogd */
 		break;
- -	case SYSRQ_KILL:				    /* K -- kill all user processes */
+	case 'k':					    /* K -- kill all user processes */
 		printk("Kill All Tasks\n");
 		send_sig_all(SIGKILL, 0);
 		orig_log_level = 8;
 		break;
- -	case SYSRQ_KILLALL:				    /* L -- kill all processes including init */
+	case 'l':					    /* L -- kill all processes including init */
 		printk("Kill ALL Tasks (even init)\n");
 		send_sig_all(SIGKILL, 1);
 		orig_log_level = 8;
 		break;
- -	case SYSRQ_HELP:
 	default:					    /* Unknown: help */
 		printk("unRaw sAk Boot "
 #ifdef __sparc__
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/drivers/video/atafb.c linux-2.1.55/drivers/video/atafb.c
- --- linux-2.1.55.orig/drivers/video/atafb.c	Sat Sep 20 13:43:56 1997
+++ linux-2.1.55/drivers/video/atafb.c	Sun Sep 21 14:04:31 1997
@@ -1680,7 +1680,9 @@
 			(((red & 0xe) >> 1) | ((red & 1) << 3) << 8) |
 			(((green & 0xe) >> 1) | ((green & 1) << 3) << 4) |
 			((blue & 0xe) >> 1) | ((blue & 1) << 3);
+#ifdef CONFIG_FBCON_CFB16
 		packed16_cmap[regno] = (red << 11) | (green << 5) | blue;
+#endif
 	}
 	return 0;
 }
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/include/asm-alpha/keyboard.h linux-2.1.55/include/asm-alpha/keyboard.h
- --- linux-2.1.55.orig/include/asm-alpha/keyboard.h	Fri Sep  5 18:23:40 1997
+++ linux-2.1.55/include/asm-alpha/keyboard.h	Sun Sep 21 12:32:22 1997
@@ -34,9 +34,8 @@
 #define kbd_translate		pckbd_translate
 #define kbd_unexpected_up	pckbd_unexpected_up
 #define kbd_leds		pckbd_leds
- -#define kbd_is_sysrq		pckbd_is_sysrq
- -#define kbd_sysrq_keys		pckbd_sysrq_keys
 #define kbd_init_hw		pckbd_init_hw
+#define kbd_is_sysrq		pckbd_is_sysrq
 #define kbd_sysrq_xlate		pckbd_sysrq_xlate
 
 #define INIT_KBD
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/include/asm-i386/keyboard.h linux-2.1.55/include/asm-i386/keyboard.h
- --- linux-2.1.55.orig/include/asm-i386/keyboard.h	Fri Sep  5 18:23:42 1997
+++ linux-2.1.55/include/asm-i386/keyboard.h	Sun Sep 21 12:32:11 1997
@@ -33,9 +33,8 @@
 #define kbd_translate		pckbd_translate
 #define kbd_unexpected_up	pckbd_unexpected_up
 #define kbd_leds		pckbd_leds
- -#define kbd_is_sysrq		pckbd_is_sysrq
- -#define kbd_sysrq_keys		pckbd_sysrq_keys
 #define kbd_init_hw		pckbd_init_hw
+#define kbd_is_sysrq		pckbd_is_sysrq
 #define kbd_sysrq_xlate		pckbd_sysrq_xlate
 
 #define SYSRQ_KEY 0x54
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/include/asm-m68k/keyboard.h linux-2.1.55/include/asm-m68k/keyboard.h
- --- linux-2.1.55.orig/include/asm-m68k/keyboard.h	Sat Sep 20 13:49:10 1997
+++ linux-2.1.55/include/asm-m68k/keyboard.h	Sun Sep 21 14:35:36 1997
@@ -50,11 +50,11 @@
 }
 
 #ifdef CONFIG_MAGIC_SYSRQ
- -static __inline__ int kbd_is_sysrq(unsigned char keycode)
- -{
- -    return( keycode == mach_sysrq_key );
- -}
- -#define kbd_sysrq_keys	mach_sysrq_keys
+#define kbd_is_sysrq(keycode)	((keycode) == mach_sysrq_key && \
+								 (up_flag || \
+								  (shift_state & mach_sysrq_shift_mask) == \
+								  mach_sysrq_shift_state))
+#define kbd_sysrq_xlate			mach_sysrq_xlate
 #endif
 
 #define kbd_init_hw	mach_keyb_init
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/include/asm-m68k/machdep.h linux-2.1.55/include/asm-m68k/machdep.h
- --- linux-2.1.55.orig/include/asm-m68k/machdep.h	Sun Sep 14 22:47:24 1997
+++ linux-2.1.55/include/asm-m68k/machdep.h	Sun Sep 21 14:35:26 1997
@@ -36,6 +36,8 @@
 extern void (*mach_floppy_setup)(char *, int *);
 extern void (*mach_floppy_eject)(void);
 extern int mach_sysrq_key;
- -extern int *mach_sysrq_keys;
+extern int mach_sysrq_shift_state;
+extern int mach_sysrq_shift_mask;
+extern char *mach_sysrq_xlate;
 
 #endif /* _M68K_MACHDEP_H */
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/include/asm-mips/keyboard.h linux-2.1.55/include/asm-mips/keyboard.h
- --- linux-2.1.55.orig/include/asm-mips/keyboard.h	Wed Sep 10 21:17:08 1997
+++ linux-2.1.55/include/asm-mips/keyboard.h	Sun Sep 21 12:32:49 1997
@@ -35,9 +35,8 @@
 #define kbd_translate		pckbd_translate
 #define kbd_unexpected_up	pckbd_unexpected_up
 #define kbd_leds		pckbd_leds
- -#define kbd_is_sysrq		pckbd_is_sysrq
- -#define kbd_sysrq_keys		pckbd_sysrq_keys
 #define kbd_init_hw		pckbd_init_hw
+#define kbd_is_sysrq		pckbd_is_sysrq
 #define kbd_sysrq_xlate         pckbd_sysrq_xlate
 
 #define SYSRQ_KEY 0x54
diff -u --recursive --exclude-from=diff-excludes --new-file linux-2.1.55.orig/include/linux/sysrq.h linux-2.1.55/include/linux/sysrq.h
- --- linux-2.1.55.orig/include/linux/sysrq.h	Sat Sep 20 13:32:21 1997
+++ linux-2.1.55/include/linux/sysrq.h	Sun Sep 21 13:44:23 1997
@@ -22,8 +22,6 @@
 
 /* Deferred actions */
 
- -#ifdef __KERNEL__
- -
 extern int emergency_sync_scheduled;
 
 #define EMERG_SYNC 1
@@ -38,22 +36,3 @@
 #else
 #define CHECK_EMERGENCY_SYNC
 #endif
- -
- -#define SYSRQ_RAWMODE	0	/* R */
- -#define SYSRQ_SAK	1	/* A */
- -#define SYSRQ_BOOT	2	/* B */
- -#define SYSRQ_HALT	3	/* H */
- -#define SYSRQ_PWROFF	4	/* O */
- -#define SYSRQ_SYNC	5	/* S */
- -#define SYSRQ_MNTRO	6	/* U */
- -#define SYSRQ_REGS	7	/* P */
- -#define SYSRQ_STATE	8	/* T */
- -#define SYSRQ_MEMORY	9	/* M */
- -#define SYSRQ_NUM1	10	/* 1 */
- -#define SYSRQ_NUM0	11	/* 0 */
- -#define SYSRQ_TERM	12	/* E */
- -#define SYSRQ_KILL	13	/* K */
- -#define SYSRQ_KILLALL	14	/* L */
- -#define SYSRQ_HELP	99	/* any other key */
- -
- -#endif /* __KERNEL__ */
------- End of forwarded message -------
