Date: Sun, 17 Jul 2011 08:19:19 +0000 (UTC) From: Ed Schouten <ed@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: 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 Message-ID: <201107170819.p6H8JJYM064855@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107170819.p6H8JJYM064855>