svn commit: r224126 - in head/sys: dev/adb dev/atkbdc dev/kbd dev/kbdmux dev/syscons dev/uart dev/usb/input dev/vkbd i386/ibcs2 pc98/cbus sys

Ed Schouten ed at FreeBSD.org
Sun Jul 17 08:19:20 UTC 2011


Author: ed
Date: Sun Jul 17 08:19:19 2011
New Revision: 224126
URL: http://svn.freebsd.org/changeset/base/224126

Log:
  Restore binary compatibility for GIO_KEYMAP and PIO_KEYMAP.
  
  Back in 2009 I changed the ABI of the GIO_KEYMAP and PIO_KEYMAP ioctls
  to support wide characters. I created a patch to add ABI compatibility
  for the old calls, but I didn't get any feedback to that.
  
  It seems now people are upgrading from 8 to 9 they experience this
  issue, so add it anyway.

Modified:
  head/sys/dev/adb/adb_kbd.c
  head/sys/dev/atkbdc/atkbd.c
  head/sys/dev/kbd/kbd.c
  head/sys/dev/kbdmux/kbdmux.c
  head/sys/dev/syscons/syscons.c
  head/sys/dev/uart/uart_kbd_sun.c
  head/sys/dev/usb/input/ukbd.c
  head/sys/dev/vkbd/vkbd.c
  head/sys/i386/ibcs2/ibcs2_ioctl.c
  head/sys/pc98/cbus/pckbd.c
  head/sys/sys/kbio.h

Modified: head/sys/dev/adb/adb_kbd.c
==============================================================================
--- head/sys/dev/adb/adb_kbd.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/adb/adb_kbd.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -747,6 +747,7 @@ static int akbd_ioctl(keyboard_t *kbd, u
 		break;
 
 	case PIO_KEYMAP:
+	case OPIO_KEYMAP:
 	case PIO_KEYMAPENT:
 	case PIO_DEADKEYMAP:
 	default:

Modified: head/sys/dev/atkbdc/atkbd.c
==============================================================================
--- head/sys/dev/atkbdc/atkbd.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/atkbdc/atkbd.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -982,6 +982,7 @@ atkbd_ioctl(keyboard_t *kbd, u_long cmd,
 		return error;
 
 	case PIO_KEYMAP:	/* set keyboard translation table */
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case PIO_KEYMAPENT:	/* set keyboard translation table entry */
 	case PIO_DEADKEYMAP:	/* set accent key translation table */
 		state->ks_accents = 0;

Modified: head/sys/dev/kbd/kbd.c
==============================================================================
--- head/sys/dev/kbd/kbd.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/kbd/kbd.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -837,13 +837,12 @@ static int fkey_change_ok(fkeytab_t *, f
 int
 genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 {
-#ifndef KBD_DISABLE_KEYMAP_LOAD
 	keymap_t *mapp;
-#endif
+	okeymap_t *omapp;
 	keyarg_t *keyp;
 	fkeyarg_t *fkeyp;
 	int s;
-	int i;
+	int i, j;
 	int error;
 
 	s = spltty();
@@ -874,14 +873,39 @@ genkbd_commonioctl(keyboard_t *kbd, u_lo
 		    sizeof(keymap_t));
 		splx(s);
 		return (error);
+	case OGIO_KEYMAP:	/* get keyboard translation table (compat) */
+		mapp = kbd->kb_keymap;
+		omapp = (okeymap_t *)arg;
+		omapp->n_keys = mapp->n_keys;
+		for (i = 0; i < NUM_KEYS; i++) {
+			for (j = 0; j < NUM_STATES; j++)
+				omapp->key[i].map[j] =
+				    mapp->key[i].map[j];
+			omapp->key[i].spcl = mapp->key[i].spcl;
+			omapp->key[i].flgs = mapp->key[i].flgs;
+		}
+		return (0);
 	case PIO_KEYMAP:	/* set keyboard translation table */
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 #ifndef KBD_DISABLE_KEYMAP_LOAD
 		mapp = malloc(sizeof *mapp, M_TEMP, M_NOWAIT);
-		error = copyin(*(void **)arg, mapp, sizeof *mapp);
-		if (error != 0) {
-			splx(s);
-			free(mapp, M_TEMP);
-			return (error);
+		if (cmd == OPIO_KEYMAP) {
+			omapp = (okeymap_t *)arg;
+			mapp->n_keys = omapp->n_keys;
+			for (i = 0; i < NUM_KEYS; i++) {
+				for (j = 0; j < NUM_STATES; j++)
+					mapp->key[i].map[j] =
+					    omapp->key[i].map[j];
+				mapp->key[i].spcl = omapp->key[i].spcl;
+				mapp->key[i].flgs = omapp->key[i].flgs;
+			}
+		} else {
+			error = copyin(*(void **)arg, mapp, sizeof *mapp);
+			if (error != 0) {
+				splx(s);
+				free(mapp, M_TEMP);
+				return (error);
+			}
 		}
 
 		error = keymap_change_ok(kbd->kb_keymap, mapp, curthread);

Modified: head/sys/dev/kbdmux/kbdmux.c
==============================================================================
--- head/sys/dev/kbdmux/kbdmux.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/kbdmux/kbdmux.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -1198,6 +1198,7 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd
 		break;
 
 	case PIO_KEYMAP:	/* set keyboard translation table */
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case PIO_KEYMAPENT:	/* set keyboard translation table entry */
 	case PIO_DEADKEYMAP:	/* set accent key translation table */
 		KBDMUX_LOCK(state);

Modified: head/sys/dev/syscons/syscons.c
==============================================================================
--- head/sys/dev/syscons/syscons.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/syscons/syscons.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -1450,6 +1450,8 @@ sctty_ioctl(struct tty *tp, u_long cmd, 
 
     case GIO_KEYMAP:		/* get keyboard translation table */
     case PIO_KEYMAP:		/* set keyboard translation table */
+    case OGIO_KEYMAP:		/* get keyboard translation table (compat) */
+    case OPIO_KEYMAP:		/* set keyboard translation table (compat) */
     case GIO_DEADKEYMAP:	/* get accent key translation table */
     case PIO_DEADKEYMAP:	/* set accent key translation table */
     case GETFKEY:		/* get function key string */

Modified: head/sys/dev/uart/uart_kbd_sun.c
==============================================================================
--- head/sys/dev/uart/uart_kbd_sun.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/uart/uart_kbd_sun.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -739,6 +739,7 @@ sunkbd_ioctl(keyboard_t *kbd, u_long cmd
 	case KDSETRAD:
 		break;
 	case PIO_KEYMAP:
+	case OPIO_KEYMAP:
 	case PIO_KEYMAPENT:
 	case PIO_DEADKEYMAP:
 	default:

Modified: head/sys/dev/usb/input/ukbd.c
==============================================================================
--- head/sys/dev/usb/input/ukbd.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/usb/input/ukbd.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -1929,6 +1929,8 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, 
 		return (ukbd_set_typematic(kbd, *(int *)arg));
 
 	case PIO_KEYMAP:		/* set keyboard translation table */
+	case OPIO_KEYMAP:		/* set keyboard translation table
+					 * (compat) */
 	case PIO_KEYMAPENT:		/* set keyboard translation table
 					 * entry */
 	case PIO_DEADKEYMAP:		/* set accent key translation table */

Modified: head/sys/dev/vkbd/vkbd.c
==============================================================================
--- head/sys/dev/vkbd/vkbd.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/dev/vkbd/vkbd.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -1208,6 +1208,7 @@ vkbd_ioctl(keyboard_t *kbd, u_long cmd, 
 		break;
 
 	case PIO_KEYMAP:	/* set keyboard translation table */
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case PIO_KEYMAPENT:	/* set keyboard translation table entry */
 	case PIO_DEADKEYMAP:	/* set accent key translation table */
 		state->ks_accents = 0;

Modified: head/sys/i386/ibcs2/ibcs2_ioctl.c
==============================================================================
--- head/sys/i386/ibcs2/ibcs2_ioctl.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/i386/ibcs2/ibcs2_ioctl.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -654,12 +654,12 @@ ibcs2_ioctl(td, uap)
 		break;
 
 	case IBCS2_GIO_KEYMAP:      /* Get keyboard map table */
-	        uap->cmd = GIO_KEYMAP;
+	        uap->cmd = OGIO_KEYMAP;
 	        error = ioctl(td, (struct ioctl_args *)uap);
 		break;
 
 	case IBCS2_PIO_KEYMAP:      /* Set keyboard map table */
-	        uap->cmd = PIO_KEYMAP;
+	        uap->cmd = OPIO_KEYMAP;
 	        error = ioctl(td, (struct ioctl_args *)uap);
 		break;
 

Modified: head/sys/pc98/cbus/pckbd.c
==============================================================================
--- head/sys/pc98/cbus/pckbd.c	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/pc98/cbus/pckbd.c	Sun Jul 17 08:19:19 2011	(r224126)
@@ -799,6 +799,7 @@ pckbd_ioctl(keyboard_t *kbd, u_long cmd,
 		break;
 
 	case PIO_KEYMAP:	/* set keyboard translation table */
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case PIO_KEYMAPENT:	/* set keyboard translation table entry */
 	case PIO_DEADKEYMAP:	/* set accent key translation table */
 		state->ks_accents = 0;

Modified: head/sys/sys/kbio.h
==============================================================================
--- head/sys/sys/kbio.h	Sun Jul 17 06:20:47 2011	(r224125)
+++ head/sys/sys/kbio.h	Sun Jul 17 08:19:19 2011	(r224126)
@@ -120,6 +120,20 @@ struct keymap {
 };
 typedef struct keymap keymap_t;
 
+#ifdef _KERNEL
+struct okeyent_t {
+	u_char		map[NUM_STATES];
+	u_char		spcl;
+	u_char		flgs;
+};
+
+struct okeymap {
+	u_short		n_keys;
+	struct okeyent_t key[NUM_KEYS];
+};
+typedef struct okeymap okeymap_t;
+#endif /* _KERNEL */
+
 #endif /* !_KEYMAP_DECLARED */
 
 /* defines for "special" keys (spcl bit set in keymap) */
@@ -223,6 +237,10 @@ typedef struct fkeyarg	fkeyarg_t;
 /* XXX: Should have keymap_t as an argument, but that's too big for ioctl()! */
 #define GIO_KEYMAP 	 _IO('k', 6)
 #define PIO_KEYMAP 	 _IO('k', 7)
+#ifdef _KERNEL
+#define OGIO_KEYMAP 	_IOR('k', 6, okeymap_t)
+#define OPIO_KEYMAP 	_IOW('k', 7, okeymap_t)
+#endif /* _KERNEL */
 #define GIO_DEADKEYMAP 	_IOR('k', 8, accentmap_t)
 #define PIO_DEADKEYMAP 	_IOW('k', 9, accentmap_t)
 #define GIO_KEYMAPENT 	_IOWR('k', 10, keyarg_t)


More information about the svn-src-all mailing list