Index: sys/dev/atkbdc/atkbd.c =================================================================== --- sys/dev/atkbdc/atkbd.c +++ sys/dev/atkbdc/atkbd.c @@ -682,6 +682,9 @@ evdev_sync(state->ks_evdev); } } + + if (state->ks_evdev != NULL && evdev_is_grabbed(state->ks_evdev)) + return (NOKEY); #endif /* return the byte as is for the K_RAW mode */ Index: sys/dev/atkbdc/psm.c =================================================================== --- sys/dev/atkbdc/psm.c +++ sys/dev/atkbdc/psm.c @@ -5134,6 +5134,10 @@ break; } + /* Store last packet for reinjection if it has not been set already */ + if (timevalisset(&sc->idletimeout) && sc->idlepacket.inputbytes == 0) + sc->idlepacket = *pb; + #ifdef EVDEV_SUPPORT if (evdev_rcpt_mask & EVDEV_RCPT_HW_MOUSE && sc->hw.model != MOUSE_MODEL_ELANTECH && @@ -5167,6 +5171,10 @@ evdev_push_mouse_btn(sc->evdev_r, ms.button); evdev_sync(sc->evdev_r); } + + if ((sc->evdev_a != NULL && evdev_is_grabbed(sc->evdev_a)) || + (sc->evdev_r != NULL && evdev_is_grabbed(sc->evdev_r))) + goto next; #endif /* scale values */ @@ -5187,10 +5195,6 @@ } } - /* Store last packet for reinjection if it has not been set already */ - if (timevalisset(&sc->idletimeout) && sc->idlepacket.inputbytes == 0) - sc->idlepacket = *pb; - ms.dx = x; ms.dy = y; ms.dz = z; Index: sys/dev/evdev/evdev.h =================================================================== --- sys/dev/evdev/evdev.h +++ sys/dev/evdev/evdev.h @@ -129,6 +129,7 @@ int evdev_set_report_size(struct evdev_dev *, size_t); void evdev_set_flag(struct evdev_dev *, uint16_t); void *evdev_get_softc(struct evdev_dev *); +bool evdev_is_grabbed(struct evdev_dev *); /* Multitouch related functions: */ int32_t evdev_get_mt_slot_by_tracking_id(struct evdev_dev *, int32_t); Index: sys/dev/evdev/evdev.c =================================================================== --- sys/dev/evdev/evdev.c +++ sys/dev/evdev/evdev.c @@ -76,6 +76,7 @@ int evdev_rcpt_mask = EVDEV_RCPT_HW_MOUSE | EVDEV_RCPT_HW_KBD; #endif int evdev_sysmouse_t_axis = 0; +bool evdev_allow_grab_syscons = true; SYSCTL_NODE(_kern, OID_AUTO, evdev, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, "Evdev args"); @@ -85,6 +86,8 @@ "bit2 - mouse hardware, bit3 - keyboard hardware"); SYSCTL_INT(_kern_evdev, OID_AUTO, sysmouse_t_axis, CTLFLAG_RWTUN, &evdev_sysmouse_t_axis, 0, "Extract T-axis from 0-none, 1-ums, 2-psm"); +SYSCTL_BOOL(_kern_evdev, OID_AUTO, allow_grab_syscons, CTLFLAG_RWTUN, + &evdev_allow_grab_syscons, 0, "Evdev can grab system console input"); #endif SYSCTL_NODE(_kern_evdev, OID_AUTO, input, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Evdev input devices"); @@ -1097,6 +1100,19 @@ return (0); } +bool +evdev_is_grabbed(struct evdev_dev *evdev) +{ + if (kdb_active || SCHEDULER_STOPPED() || !evdev_allow_grab_syscons) + return (false); + /* + * The function is intended to be called from evdev-unrelated parts of + * code like syscons-compatible parts of mouse and keyboard drivers. + * That makes unlocked read-only access acceptable. + */ + return (evdev->ev_grabber != NULL); +} + static void evdev_repeat_callout(void *arg) { Index: sys/dev/gpio/gpiokeys.c =================================================================== --- sys/dev/gpio/gpiokeys.c +++ sys/dev/gpio/gpiokeys.c @@ -194,6 +194,10 @@ evdev_push_key(sc->sc_evdev, key->evcode, pressed); evdev_sync(sc->sc_evdev); } + if (evdev_is_grabbed(sc->sc_evdev)) { + GPIOKEYS_UNLOCK(sc); + return; + } #endif if (key->keycode != GPIOKEY_NONE) { code = key->keycode & SCAN_KEYCODE_MASK; Index: sys/dev/hid/hkbd.c =================================================================== --- sys/dev/hid/hkbd.c +++ sys/dev/hid/hkbd.c @@ -394,6 +394,8 @@ if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD && sc->sc_evdev != NULL) evdev_push_event(sc->sc_evdev, EV_KEY, evdev_hid2key(KEY_INDEX(key)), !(key & KEY_RELEASE)); + if (sc->sc_evdev != NULL && evdev_is_grabbed(sc->sc_evdev)) + return; #endif tail = (sc->sc_inputtail + 1) % HKBD_IN_BUF_SIZE; @@ -561,6 +563,8 @@ #ifdef EVDEV_SUPPORT if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD && sc->sc_evdev != NULL) evdev_sync(sc->sc_evdev); + if (sc->sc_evdev != NULL && evdev_is_grabbed(sc->sc_evdev)) + return; #endif /* wakeup keyboard system */ Index: sys/dev/hyperv/input/hv_kbd.c =================================================================== --- sys/dev/hyperv/input/hv_kbd.c +++ sys/dev/hyperv/input/hv_kbd.c @@ -340,6 +340,8 @@ evdev_sync(sc->ks_evdev); } } + if (sc->ks_evdev != NULL && evdev_is_grabbed(sc->ks_evdev)) + return (NOKEY); #endif ++kbd->kb_count; DEBUG_HVKBD(kbd, "read scan: 0x%x\n", scancode); Index: sys/dev/kbdmux/kbdmux.c =================================================================== --- sys/dev/kbdmux/kbdmux.c +++ sys/dev/kbdmux/kbdmux.c @@ -756,6 +756,9 @@ evdev_sync(state->ks_evdev); } } + + if (state->ks_evdev != NULL && evdev_is_grabbed(state->ks_evdev)) + return (NOKEY); #endif /* return the byte as is for the K_RAW mode */ Index: sys/dev/syscons/sysmouse.c =================================================================== --- sys/dev/syscons/sysmouse.c +++ sys/dev/syscons/sysmouse.c @@ -295,6 +295,8 @@ #ifdef EVDEV_SUPPORT smdev_evdev_write(x, y, z, mouse_status.button); + if (evdev_is_grabbed(sysmouse_evdev)) + goto done; #endif if (!tty_opened(sysmouse_tty)) Index: sys/dev/usb/input/ukbd.c =================================================================== --- sys/dev/usb/input/ukbd.c +++ sys/dev/usb/input/ukbd.c @@ -394,6 +394,8 @@ if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD && sc->sc_evdev != NULL) evdev_push_event(sc->sc_evdev, EV_KEY, evdev_hid2key(KEY_INDEX(key)), !(key & KEY_RELEASE)); + if (sc->sc_evdev != NULL && evdev_is_grabbed(sc->sc_evdev)) + return; #endif if (sc->sc_inputs < UKBD_IN_BUF_SIZE) { @@ -562,6 +564,8 @@ #ifdef EVDEV_SUPPORT if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD && sc->sc_evdev != NULL) evdev_sync(sc->sc_evdev); + if (sc->sc_evdev != NULL && evdev_is_grabbed(sc->sc_evdev)) + return; #endif /* wakeup keyboard system */ Index: sys/dev/usb/input/ums.c =================================================================== --- sys/dev/usb/input/ums.c +++ sys/dev/usb/input/ums.c @@ -875,6 +875,10 @@ { uint8_t buf[8]; +#ifdef EVDEV_SUPPORT + if (evdev_is_grabbed(sc->sc_evdev)) + return; +#endif if (1) { if (dx > 254) dx = 254; Index: sys/dev/vt/vt_sysmouse.c =================================================================== --- sys/dev/vt/vt_sysmouse.c +++ sys/dev/vt/vt_sysmouse.c @@ -249,6 +249,8 @@ #ifdef EVDEV_SUPPORT sysmouse_evdev_store(x, y, z, sysmouse_status.button); + if (evdev_is_grabbed(sysmouse_evdev)) + goto done; #endif /* The first five bytes are compatible with MouseSystems. */