Hi,

On Debian GNU/Hurd 0.9 (gnumach 1.8+git20230410-1,
hurd 1:0.9.git20230520-7), Xorg's kbd_drv.so cannot bring up the
console keyboard because the gnumach console translator at
/dev/cons/kbd (/hurd/chrdev 156 33685736) returns EBADF for the
Linux-style set-event-mode ioctl that kbd_drv.so issues.

User impact: no native Xorg on real hardware, even with the kbd
input driver that hurd-amd64 does package.  evdev and libinput are
not packaged for hurd-amd64 (filed in parallel on debian-hurd as
"[debian-hurd] no evdev / libinput on hurd-amd64; native Xorg
blocked on kbd_drv.so + /dev/cons ioctl gap"), so kbd_drv.so is
the only available path, and it dies on this exact ioctl.

Trace excerpt from a startx attempt with Driver "dummy":

  [295.286] (II) Using input driver 'mouse' for '<default pointer>'
  [295.286] (II) <default pointer>: Setting Device option to "/dev/mouse"
  [295.286] (II) XINPUT: Adding extended input device "<default pointer>"
                  (type: MOUSE, id 6)
  [295.287] (II) Using input driver 'kbd' for '<default keyboard>'
  [295.287] (II) XINPUT: Adding extended input device "<default keyboard>"
                  (type: KEYBOARD, id 7)
  [295.287] (EE)
  Fatal server error:
  [295.288] (EE) Cannot set event mode on keyboard (Bad file descriptor)

Xwrapper.config is allowed_users=anybody, so this is not a
permissions failure; the chrdev rejects the ioctl because it has
no handler.

Request: two options.

Option 1 (smaller change, existing kbd_drv.so works unmodified):
teach the gnumach console translator to honour the KDGKBMODE and
KDSKBMODE ioctl family that kbd_drv.so issues.

  --- gnumach: i386/i386at/kd.c  (console keyboard driver)
  +++ gnumach: i386/i386at/kd.c
  @@ kd_ioctl (...)
  +    case KDGKBMODE:
  +      *(int *)data = current_kb_mode;
  +      /* K_RAW | K_XLATE | K_MEDIUMRAW | K_UNICODE */
  +      return 0;
  +    case KDSKBMODE:
  +      if (*(int *)data not in
  +          { K_RAW, K_XLATE, K_MEDIUMRAW, K_UNICODE })
  +        return EINVAL;
  +      current_kb_mode = *(int *)data;
  +      /* tell the rest of the driver to stop translating
  +         scancodes when K_RAW / K_MEDIUMRAW is selected, which
  +         is what kbd_drv.so wants so X.org can do its own
  +         keymap. */
  +      return 0;

Option 2 (larger, but cleaner long-term): expose a Hurd-native
/dev/input/event0 surface that returns struct input_event records,
so evdev can be ported unchanged across Linux and Hurd.

Reproduction: same as the debian-hurd filing (subject
"[debian-hurd] no evdev / libinput on hurd-amd64; native Xorg
blocked on kbd_drv.so + /dev/cons ioctl gap").  Steps 1 through 5
reproduce the EBADF; step 6 confirms the driver inventory; step 7
confirms the absent /dev/input/ tree.

No patch attached.  Happy to test once a draft lands.

Alternative filing channel if a tracker entry is preferred:
https://savannah.gnu.org/bugs/?group=hurd

Thanks,
Borja Tarraso
[email protected]

Reply via email to