Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Feb 2023 13:15:57 GMT
From:      =?utf-8?Q?Stefan=20E=C3=9Fer?= <se@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: f20058955c9d - main - sys/kbio.h: make pre-unicode keymap support optional
Message-ID:  <202302141315.31EDFvN2044413@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by se:

URL: https://cgit.FreeBSD.org/src/commit/?id=f20058955c9d1041a5a09cd02a27babda7e34dc8

commit f20058955c9d1041a5a09cd02a27babda7e34dc8
Author:     Stefan Eßer <se@FreeBSD.org>
AuthorDate: 2023-02-14 13:03:28 +0000
Commit:     Stefan Eßer <se@FreeBSD.org>
CommitDate: 2023-02-14 13:03:28 +0000

    sys/kbio.h: make pre-unicode keymap support optional
    
    FreeBSD-9 had introduced support for the full set of Unicode
    characters to the parsing and processing of keymap character tables.
    
    This support has been extended to cover the table for accented
    characters that are reached via dead key combinations in FreeBSD-13.2.
    
    New ioctls have been introduced to support both the pre-Unicode and
    the Unicode formats and keyboard drivers have been extended to support
    those ioctls.
    
    This commit makes the ABI compatibility functions in the kernel
    optional and dependent on COMPAT_FREEBSD13 in -CURRENT.
    
    The kbdcontrol command in -CURRENT and 13-STABLE (before 13.2) has
    been made ABI compatible with old kernels to allow a new world to be
    run on an old kernel (that does not have full Unicode support for
    keymaps).
    
    This commit is not to merged back to 12-STABLE or 13-STABLE. It is
    part of review D38465, which has been split into 3 separate commits
    due to different MFC and life-time requirements of either commit.
    
    Approved by:    imp
    Differential Revision:  https://reviews.freebsd.org/D38465
---
 sys/dev/adb/adb_kbd.c         |  4 +++-
 sys/dev/atkbdc/atkbd.c        |  4 +++-
 sys/dev/gpio/gpiokeys.c       |  9 ++++++---
 sys/dev/hid/hkbd.c            |  9 ++++++---
 sys/dev/hyperv/input/hv_kbd.c |  4 +++-
 sys/dev/kbd/kbd.c             | 27 ++++++++++++++++++++++-----
 sys/dev/kbdmux/kbdmux.c       |  6 ++++--
 sys/dev/syscons/syscons.c     |  6 ++++--
 sys/dev/usb/input/ukbd.c      |  9 ++++++---
 sys/dev/vkbd/vkbd.c           |  4 +++-
 sys/dev/vt/vt_core.c          |  4 +++-
 sys/sys/kbio.h                | 16 ++++++++--------
 12 files changed, 71 insertions(+), 31 deletions(-)

diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c
index 86d3865473bb..614d89c30447 100644
--- a/sys/dev/adb/adb_kbd.c
+++ b/sys/dev/adb/adb_kbd.c
@@ -795,10 +795,12 @@ static int akbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data)
 		break;
 
 	case PIO_KEYMAP:
-	case OPIO_KEYMAP:
 	case PIO_KEYMAPENT:
 	case PIO_DEADKEYMAP:
+#ifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:
 	case OPIO_DEADKEYMAP:
+#endif /* COMPAT_FREEBSD13 */
 	default:
 		return (genkbd_commonioctl(kbd, cmd, data));
 	}
diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c
index 08266cf4bf51..0c6dadca43aa 100644
--- a/sys/dev/atkbdc/atkbd.c
+++ b/sys/dev/atkbdc/atkbd.c
@@ -1088,10 +1088,12 @@ atkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		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 */
+äifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case OPIO_DEADKEYMAP:	/* set accent key translation table (compat) */
+#endif /* COMPAT_FREEBSD13 */
 		state->ks_accents = 0;
 		/* FALLTHROUGH */
 	default:
diff --git a/sys/dev/gpio/gpiokeys.c b/sys/dev/gpio/gpiokeys.c
index 655fd2f4e154..86f684535be9 100644
--- a/sys/dev/gpio/gpiokeys.c
+++ b/sys/dev/gpio/gpiokeys.c
@@ -894,12 +894,15 @@ gpiokeys_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		return (gpiokeys_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 */
-	case OPIO_DEADKEYMAP:		/* set accent key translation table (compat) */
+#ifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:		/* set keyboard translation table
+					 * (compat) */
+	case OPIO_DEADKEYMAP:		/* set accent key translation table
+					 * (compat) */
+#endif /* COMPAT_FREEBSD13 */
 		sc->sc_accents = 0;
 		/* FALLTHROUGH */
 	default:
diff --git a/sys/dev/hid/hkbd.c b/sys/dev/hid/hkbd.c
index a938ae70787b..e233ccd5b6dd 100644
--- a/sys/dev/hid/hkbd.c
+++ b/sys/dev/hid/hkbd.c
@@ -1635,12 +1635,15 @@ hkbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		return (hkbd_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 */
-	case OPIO_DEADKEYMAP:		/* set accent key translation table (compat) */
+#ifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:		/* set keyboard translation table
+					 * (compat) */
+	case OPIO_DEADKEYMAP:		/* set accent key translation table
+					 * (compat) */
+#endif /* COMPAT_FREEBSD13 */
 		sc->sc_accents = 0;
 		/* FALLTHROUGH */
 	default:
diff --git a/sys/dev/hyperv/input/hv_kbd.c b/sys/dev/hyperv/input/hv_kbd.c
index 2e313b06ca7e..721178a9f3f2 100644
--- a/sys/dev/hyperv/input/hv_kbd.c
+++ b/sys/dev/hyperv/input/hv_kbd.c
@@ -663,10 +663,12 @@ hvkbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		KBD_LED_VAL(kbd) = *(int *)arg;
 		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 */
+#ifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case OPIO_DEADKEYMAP:	/* set accent key translation table (compat) */
+#endif /* COMPAT_FREEBSD13 */
 		sc->sc_accents = 0;
 		/* FALLTHROUGH */
 	default:
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c
index 41d6fd5666d8..205d76639e0f 100644
--- a/sys/dev/kbd/kbd.c
+++ b/sys/dev/kbd/kbd.c
@@ -789,13 +789,16 @@ int
 genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 {
 	keymap_t *mapp;
-	okeymap_t *omapp;
 	accentmap_t *accentmapp;
-	oaccentmap_t *oaccentmapp;
 	keyarg_t *keyp;
 	fkeyarg_t *fkeyp;
-	int i, j;
 	int error;
+	int i;
+#ifdef COMPAT_FREEBSD13
+	int j;
+	okeymap_t *omapp;
+	oaccentmap_t *oaccentmapp;
+#endif /* COMPAT_FREEBSD13 */
 
 	GIANT_REQUIRED;
 	switch (cmd) {
@@ -824,6 +827,7 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		error = copyout(kbd->kb_keymap, *(void **)arg,
 		    sizeof(keymap_t));
 		return (error);
+#ifdef COMPAT_FREEBSD13
 	case OGIO_KEYMAP:	/* get keyboard translation table (compat) */
 		mapp = kbd->kb_keymap;
 		omapp = (okeymap_t *)arg;
@@ -836,10 +840,14 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 			omapp->key[i].flgs = mapp->key[i].flgs;
 		}
 		break;
+#endif /* COMPAT_FREEBSD13 */
 	case PIO_KEYMAP:	/* set keyboard translation table */
+#ifdef COMPAT_FREEBSD13
 	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
+#endif /* COMPAT_FREEBSD13 */
 #ifndef KBD_DISABLE_KEYMAP_LOAD
 		mapp = malloc(sizeof *mapp, M_TEMP, M_WAITOK);
+#ifdef COMPAT_FREEBSD13
 		if (cmd == OPIO_KEYMAP) {
 			omapp = (okeymap_t *)arg;
 			mapp->n_keys = omapp->n_keys;
@@ -850,7 +858,9 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 				mapp->key[i].spcl = omapp->key[i].spcl;
 				mapp->key[i].flgs = omapp->key[i].flgs;
 			}
-		} else {
+		} else
+#endif /* COMPAT_FREEBSD13 */
+		{
 			error = copyin(*(void **)arg, mapp, sizeof *mapp);
 			if (error != 0) {
 				free(mapp, M_TEMP);
@@ -904,6 +914,7 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		    sizeof(accentmap_t));
 		return (error);
 		break;
+#ifdef COMPAT_FREEBSD13
 	case OGIO_DEADKEYMAP:	/* get accent key translation table (compat) */
 		accentmapp = kbd->kb_accentmap;
 		oaccentmapp = (oaccentmap_t *)arg;
@@ -919,11 +930,15 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 			}
 		}
 		break;
+#endif /* COMPAT_FREEBSD13 */
 
 	case PIO_DEADKEYMAP:	/* set accent key translation table */
+#ifdef COMPAT_FREEBSD13
 	case OPIO_DEADKEYMAP:	/* set accent key translation table (compat) */
+#endif /* COMPAT_FREEBSD13 */
 #ifndef KBD_DISABLE_KEYMAP_LOAD
 		accentmapp = malloc(sizeof(*accentmapp), M_TEMP, M_WAITOK);
+#ifdef COMPAT_FREEBSD13
 		if (cmd == OPIO_DEADKEYMAP) {
 			oaccentmapp = (oaccentmap_t *)arg;
 			accentmapp->n_accs = oaccentmapp->n_accs;
@@ -937,7 +952,9 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 					    oaccentmapp->acc[i].accchar;
 				}
 			}
-		} else {
+		} else
+#endif /* COMPAT_FREEBSD13 */
+		{
 			error = copyin(*(void **)arg, accentmapp, sizeof(*accentmapp));
 			if (error != 0) {
 				free(accentmapp, M_TEMP);
diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c
index 1545022bec2a..2590eb5e69c1 100644
--- a/sys/dev/kbdmux/kbdmux.c
+++ b/sys/dev/kbdmux/kbdmux.c
@@ -1240,12 +1240,14 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		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 */
+#ifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case OPIO_DEADKEYMAP:	/* set accent key translation table (compat) */
 		KBDMUX_LOCK(state);
-                state->ks_accents = 0;
+		state->ks_accents = 0;
+#endif /* COMPAT_FREEBSD13 */
 
 		/* perform command on all slave keyboards */
 		SLIST_FOREACH(k, &state->ks_kbds, next)
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index c456be43d8a4..defd0b8380bb 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -1594,12 +1594,14 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
 
 	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 */
+#ifdef COMPAT_FREEBSD13
+	case OGIO_KEYMAP: /* get keyboard translation table (compat) */
+	case OPIO_KEYMAP: /* set keyboard translation table (compat) */
 	case OGIO_DEADKEYMAP: /* get accent key translation table (compat) */
 	case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
+#endif /* COMPAT_FREEBSD13 */
 	case GETFKEY: /* get function key string */
 	case SETFKEY: /* set function key string */
 		error = kbdd_ioctl(sc->kbd, cmd, data);
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index e4ee63f59720..97d649ca13ac 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -1857,12 +1857,15 @@ ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		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 */
-	case OPIO_DEADKEYMAP:		/* set accent key translation table (compat) */
+#ifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:		/* set keyboard translation table
+					 * (compat) */
+	case OPIO_DEADKEYMAP:		/* set accent key translation table
+					 * (compat) */
+#endif /* COMPAT_FREEBSD13 */
 		sc->sc_accents = 0;
 		/* FALLTHROUGH */
 	default:
diff --git a/sys/dev/vkbd/vkbd.c b/sys/dev/vkbd/vkbd.c
index 27cf4549f3db..19f52a591126 100644
--- a/sys/dev/vkbd/vkbd.c
+++ b/sys/dev/vkbd/vkbd.c
@@ -1204,10 +1204,12 @@ vkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
 		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 */
+#ifdef COMPAT_FREEBSD13
+	case OPIO_KEYMAP:	/* set keyboard translation table (compat) */
 	case OPIO_DEADKEYMAP:	/* set accent key translation table (compat) */
+#endif /* COMPAT_FREEBSD13 */
 		state->ks_accents = 0;
 		/* FALLTHROUGH */
 
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
index a47343340b0a..267dd7bf2489 100644
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -2403,9 +2403,11 @@ skip_thunk:
 	case GIO_KEYMAP:
 	case PIO_KEYMAP:
 	case GIO_DEADKEYMAP:
-	case OGIO_DEADKEYMAP:
 	case PIO_DEADKEYMAP:
+#ifdef COMPAT_FREEBSD13
+	case OGIO_DEADKEYMAP:
 	case OPIO_DEADKEYMAP:
+#endif /* COMPAT_FREEBSD13 */
 	case GETFKEY:
 	case SETFKEY:
 	case KDGKBINFO:
diff --git a/sys/sys/kbio.h b/sys/sys/kbio.h
index a129556d1ada..80a58bf8e51e 100644
--- a/sys/sys/kbio.h
+++ b/sys/sys/kbio.h
@@ -120,7 +120,7 @@ struct keymap {
 };
 typedef struct keymap keymap_t;
 
-#ifdef _KERNEL
+#ifdef COMPAT_FREEBSD13
 struct okeyent_t {
 	u_char		map[NUM_STATES];
 	u_char		spcl;
@@ -132,7 +132,7 @@ struct okeymap {
 	struct okeyent_t key[NUM_KEYS];
 };
 typedef struct okeymap okeymap_t;
-#endif /* _KERNEL */
+#endif /* COMPAT_FREEBSD13 */
 
 #endif /* !_KEYMAP_DECLARED */
 
@@ -209,7 +209,7 @@ struct accentmap {
 };
 typedef struct accentmap accentmap_t;
 
-//#ifdef _KERNEL
+#ifdef COMPAT_FREEBSD13
 struct oacc_t {
 	u_char		accchar;
 	u_char		map[NUM_ACCENTCHARS][2];
@@ -220,7 +220,7 @@ struct oaccentmap {
 	struct oacc_t	acc[NUM_DEADKEYS];
 };
 typedef struct oaccentmap oaccentmap_t;
-//#endif /* _KERNEL */
+#endif /* COMPAT_FREEBSD13 */
 
 struct keyarg {
 	u_short		keynum;
@@ -250,17 +250,17 @@ 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
+#ifdef COMPAT_FREEBSD13
 #define OGIO_KEYMAP 	_IOR('k', 6, okeymap_t)
 #define OPIO_KEYMAP 	_IOW('k', 7, okeymap_t)
-#endif /* _KERNEL */
+#endif /* COMPAT_FREEBSD13 */
 /* XXX: Should have accentmap_t as an argument, but that's too big for ioctl()! */
 #define GIO_DEADKEYMAP 	 _IO('k', 8)
 #define PIO_DEADKEYMAP 	 _IO('k', 9)
-//#ifdef _KERNEL
+#ifdef COMPAT_FREEBSD13
 #define OGIO_DEADKEYMAP	_IOR('k', 8, oaccentmap_t)
 #define OPIO_DEADKEYMAP	_IOW('k', 9, oaccentmap_t)
-//#endif /* _KERNEL */
+#endif /* COMPAT_FREEBSD13 */
 #define GIO_KEYMAPENT 	_IOWR('k', 10, keyarg_t)
 #define PIO_KEYMAPENT 	_IOW('k', 11, keyarg_t)
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202302141315.31EDFvN2044413>