Index: src/sys/dev/wscons/wskbd.c =================================================================== RCS file: /cvsroot/src/sys/dev/wscons/wskbd.c,v retrieving revision 1.138 diff -u -p -r1.138 wskbd.c --- src/sys/dev/wscons/wskbd.c 10 Dec 2016 22:36:28 -0000 1.138 +++ src/sys/dev/wscons/wskbd.c 14 Jan 2017 21:47:55 -0000 @@ -135,6 +135,7 @@ __KERNEL_RCSID(0, "$NetBSD: wskbd.c,v 1. #include #include +#include #include #include #include @@ -213,6 +214,10 @@ struct wskbd_softc { /* optional table to translate scancodes in event mode */ int sc_evtrans_len; keysym_t *sc_evtrans; + + /* cn_magic support */ + dev_t cn_magicdev; /* device for cnmagic */ + struct cnm_state ws_cnm_state; }; #define MOD_SHIFT_L (1 << 0) @@ -285,6 +290,7 @@ static int wskbd_mux_close(struct wsevsr static int wskbd_do_open(struct wskbd_softc *, struct wseventvar *); static int wskbd_do_ioctl(device_t, u_long, void *, int, struct lwp *); +static void ws_check_magic(int, int, struct cnm_state *); CFATTACH_DECL_NEW(wskbd, sizeof (struct wskbd_softc), wskbd_match, wskbd_attach, wskbd_detach, wskbd_activate); @@ -456,6 +462,9 @@ wskbd_attach(device_t parent, device_t s if (ap->console) { sc->id = &wskbd_console_data; + sc->cn_magicdev = cn_tab->cn_dev; + cn_init_magic(&sc->ws_cnm_state); + cn_set_magic("\x2\x20\xf4"); /* default magic */ } else { sc->id = malloc(sizeof(struct wskbd_internal), M_DEVBUF, M_WAITOK|M_ZERO); @@ -1613,6 +1622,7 @@ internal_command(struct wskbd_softc *sc, #if defined(DDB) || defined(KGDB) if (ksym == KS_Cmd_Debugger) { +#if 0 if (sc->sc_isconsole) { #ifdef DDB console_debugger(); @@ -1621,6 +1631,7 @@ internal_command(struct wskbd_softc *sc, kgdb_connect(1); #endif } +#endif /* discard this key (ddb discarded command modifiers) */ *type = WSCONS_EVENT_KEY_UP; return (1); @@ -1742,9 +1753,19 @@ wskbd_translate(struct wskbd_internal *i } /* if this key has a command, process it first */ - if (sc != NULL && kp->command != KS_voidSymbol) + if (sc != NULL && kp->command != KS_voidSymbol) { iscommand = internal_command(sc, &type, kp->command, kp->group1[0]); + if (sc->sc_isconsole && iscommand) { + if (kp->command & 0xff) { + ws_check_magic(2, (kp->command & 0xff), + &sc->ws_cnm_state); + } + if ((kp->command >> 8) & 0xff) + ws_check_magic(2, ((kp->command >> 8) & 0xff), + &sc->ws_cnm_state); + } + } /* Now update modifiers */ switch (kp->group1[0]) { @@ -1897,6 +1918,26 @@ wskbd_translate(struct wskbd_internal *i if (id->t_flags & WSKFL_METAESC) { id->t_symbols[0] = KS_Escape; id->t_symbols[1] = res; + if (sc != NULL && sc->sc_isconsole) { + if (res & 0xff) { + ws_check_magic(1, (res & 0xff), + &sc->ws_cnm_state); + } + if ((res >> 8) & 0xff) { + ws_check_magic(1, ((res >> 8) & + 0xff), &sc->ws_cnm_state); + } + if (KS_Escape & 0xff) { + ws_check_magic(1, (KS_Escape & + 0xff), &sc->ws_cnm_state); + } + if ((KS_Escape >> 8) & 0xff) { + ws_check_magic(1, ((KS_Escape + >> 8) & 0xff), + &sc->ws_cnm_state); + } + } + return (2); } else res |= 0x80; @@ -1904,6 +1945,16 @@ wskbd_translate(struct wskbd_internal *i } id->t_symbols[0] = res; + + if (sc != NULL && sc->sc_isconsole) { + if (res & 0xff) + ws_check_magic(1, (res & 0xff), &sc->ws_cnm_state); + if ((res >> 8) & 0xff) { + ws_check_magic(1, ((res >> 8) & 0xff), + &sc->ws_cnm_state); + } + } + return (1); } @@ -1916,3 +1967,24 @@ wskbd_set_evtrans(device_t dev, keysym_t sc->sc_evtrans = tab; } +static void +ws_check_magic(int mode, int command, struct cnm_state *state) +{ + int _v = state->cnm_magic[state->cnm_state]; + int _u = state->cnm_magic[0]; + if (mode == CNS_MAGIC_VAL(_u)) { + if (state->cnm_state == 0) { + state->cnm_state = CNS_MAGIC_NEXT(_v); + _v = state->cnm_magic[state->cnm_state]; + } + if (command == CNS_MAGIC_VAL(_v)) { + state->cnm_state = CNS_MAGIC_NEXT(_v); + if (state->cnm_state == CNS_TERM) { + cn_trap(); + state->cnm_state = 0; + } + } else + state->cnm_state = 0; + } +} + Index: src/share/man/man4/wskbd.4 =================================================================== RCS file: /cvsroot/src/share/man/man4/wskbd.4,v retrieving revision 1.16 diff -u -p -r1.16 wskbd.4 --- src/share/man/man4/wskbd.4 27 May 2012 12:05:40 -0000 1.16 +++ src/share/man/man4/wskbd.4 14 Jan 2017 21:47:55 -0000 @@ -24,7 +24,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd May 27, 2012 +.Dd January 9, 2016 .Dt WSKBD 4 .Os .Sh NAME @@ -152,6 +152,16 @@ if (ioctl(fd, WSKBDIO_SETVERSION, &ver) err(EXIT_FAILURE, "cannot set version"); .Ed .El +.Sh CAVEATS +The +.Xr cnmagic 9 +sysctl variable must be prefixed by \\001 for normal characters and/or control +codes. +Alternatively it can be prefixed by \\002 for wskbd commands. +You cannot mix both types in cnmagic. +.Pp +The default cnmagic is \\002\\040\\0364 which is the wskbd command for +.Xr ddb 4 . .Sh FILES .Bl -item .It @@ -163,9 +173,15 @@ if (ioctl(fd, WSKBDIO_SETVERSION, &ver) .El .Sh SEE ALSO .Xr btkbd 4 , +.Xr ddb 4 , .Xr pckbd 4 , .Xr ukbd 4 , .Xr wscons 4 , .Xr wsmux 4 , +.Xr sysctl 8 , .Xr wsconsctl 8 , +.Xr cnmagic 9 , .Xr wskbd 9 +.Sh HISTORY +Support for cnmagic first appeared in +.Nx 8.0 . Index: src/sys/rump/dev/lib/libwscons/Makefile =================================================================== RCS file: /cvsroot/src/sys/rump/dev/lib/libwscons/Makefile,v retrieving revision 1.7 diff -u -p -r1.7 Makefile --- src/sys/rump/dev/lib/libwscons/Makefile 26 Jan 2016 23:12:17 -0000 1.7 +++ src/sys/rump/dev/lib/libwscons/Makefile 14 Jan 2017 21:47:55 -0000 @@ -1,6 +1,8 @@ # $NetBSD: Makefile,v 1.7 2016/01/26 23:12:17 pooka Exp $ # +.PATH: ${.CURDIR}/../../../../dev +.PATH: ${.CURDIR}/../../../../kern .PATH: ${.CURDIR}/../../../../dev/wscons LIB= rumpdev_wscons @@ -10,7 +12,7 @@ IOCONF= WSCONS.ioconf SRCS= wsevent.c wskbd.c wskbdutil.c wsmouse.c -SRCS+= wscons_component.c +SRCS+= wscons_component.c cons.c cnmagic.c .include .include --- /dev/null 2017-01-15 08:49:56.000000000 +1100 +++ src/sys/rump/dev/lib/libwscons/nullcons.h 2017-01-14 09:43:05.000000000 +1100 @@ -0,0 +1,3 @@ +/* $NetBSD$ */ + +#define NNULLCONS 0