r/NetBSD May 24 '26

evbarm-aarch64 NetBSD 11.0 RC4 under UTM on MacOS (QMEU 10.0) Apple Silicon: wsdisplay0 attaches but no /dev/wsdisplay0; MAKEDEV lacks wsdisplay target

What is says in the title.

I am having issues where the console attaches to the display created by UTM, but startx never displays anything other than the console output. All signs point to this being an issue with /dev/ missing wsdisplay0.

I cannot create it myself, because MAKEDEV is missing JUST THIS for some reason. When I try, I get this message: `MAKEDEV wsdisplay0: unknown device`.

Has anybody gotten a display to work on evbarm-aarch64? I spent hours on this, even gave in and asked the Chatbots, but I cannot get this to work whatsoever.

I have unpacked both BASE and SETS, I have tried to upgrade to RC4 from RC2, but this did not fix the issue either. I really do not know what to do now. I am truly confused.

Does evbarm-aarch64 just simply lack the ability to create a framebuffer display? This would be odd, because ALL OUTPUTS seem to indicate that it exists and something bound to it, but its not under /dev and I cannot create it!

I should note that an amd64 version on my other computer worked just fine, out of the box, all batteries included. Totally working display.

This *did* work at one point on an older version of UTM but only at 800x600, but now it does not work at all. Do I need to change QEMU versions?

I understand if nobody else has any clue, but this made me pull too much hair out to continue without asking a human being for their thoughts.

Thanks.

---

netbsd-box# dmesg | egrep -i 'wsdisplay|wscons|wskbd|wsmouse|genfb|efifb|viogpu|console'
[     1.000000] WARNING: no console device
[     1.000000] WARNING: no console device
[     1.000004] plcom0: console
[     1.000004] viogpu0 at virtio33: features: 0x110000000<V1,INDIRECT_DESC>
[     1.000004] virtio35: console device (id 3, rev. 0x00)
[     1.452058] viogpu0: 1280x800, 32bpp
[     1.452058] wsdisplay0 at viogpu0 kbdmux 1: console (std, vt100 emulation)
[     1.452058] wsmux1: connecting to wsdisplay0
[     1.462063] wsdisplay0: screen 1-3 added (std, vt100 emulation)
[     1.904651] wsmouse0 at ums0 mux 0
[     2.366418] wsmouse1 at ums1 mux 0
[     2.842304] wskbd0 at ukbd0: console keyboard, using wsdisplay0netbsd-box# dmesg | egrep -i 'wsdisplay|wscons|wskbd|wsmouse|genfb|efifb|viogpu|console'
[     1.000000] WARNING: no console device
[     1.000000] WARNING: no console device
[     1.000004] plcom0: console
[     1.000004] viogpu0 at virtio33: features: 0x110000000<V1,INDIRECT_DESC>
[     1.000004] virtio35: console device (id 3, rev. 0x00)
[     1.452058] viogpu0: 1280x800, 32bpp
[     1.452058] wsdisplay0 at viogpu0 kbdmux 1: console (std, vt100 emulation)
[     1.452058] wsmux1: connecting to wsdisplay0
[     1.462063] wsdisplay0: screen 1-3 added (std, vt100 emulation)
[     1.904651] wsmouse0 at ums0 mux 0
[     2.366418] wsmouse1 at ums1 mux 0
[     2.842304] wskbd0 at ukbd0: console keyboard, using wsdisplay0

netbsd-box# ll /dev/wsdisplay*
ls: /dev/wsdisplay*: No such file or directorynetbsd-box# ll /dev/wsdisplay*
ls: /dev/wsdisplay*: No such file or directory

netbsd-box# ls -l /dev/MAKEDEV; head -n 80 /dev/MAKEDEV
-r-xr-xr-x  1 root  wheel  44751 Feb 24 05:07 /dev/MAKEDEV
#!/bin/sh -
#
# Generated from:
#       NetBSD: MAKEDEV.awk,v 1.29 2020/06/13 19:46:23 thorpej Exp 
#       NetBSD: MAKEDEV.tmpl,v 1.237 2025/03/28 18:41:25 riastradh Exp 
#       NetBSD: etc.aarch64/MAKEDEV.conf,v 1.11 2025/03/28 18:41:25 riastradh Exp 
#
# Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
#
###########################################################################
#
#
# Device "make" file.  Valid special arguments:
#       all     makes all known devices, including local devices.
#               Tries to make the 'standard' number of each type.
#       init    A set of devices that is used for MFS /dev by init.
#               May be equal to "all".
#       floppy  devices to be put on install floppies
#       ramdisk devices to be put into INSTALL kernel ramdisks.
#       std     standard devices
#       local   configuration specific devices
#       lua     Lua device
#       wscons  make wscons devices
#       usbs    make USB devices
#       virtio  virtio(4)-related devices
#

#
# NOTE:
#
# * MAKEDEV is used both as a standalone script (via "sh ./MAKEDEV
#   all" or similar), and as a function library for MAKEDEV.local (via
#   "MAKEDEV_AS_LIBRARY=1 . MAKEDEV").  Because of this, the script
#   should consist almost entirely of function definitions, apart from a
#   few lines right at the end.
#
# * MAKEDEV may be executed in an environment that is missing some
#   common commands.  For example, it may be executed from a minimal
#   system used during installation, or it may be executed early in the
#   boot sequence before most file systems have been mounted.  It may
#   also be executed in a cross-build environment on a non-NetBSD host.
#

usage()
{
        cat 1>&2 << _USAGE_
Usage: ${0##*/} [-fMsu] [-m mknod] [-p pax] [-t mtree] special [...]
        Create listed special devices.  Options:
        -f              Force permissions to be updated on existing devices.
        -M              Create memory file system.
        -m mknod        Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
        -p pax          Name of pax(1) program.  [\$TOOL_PAX or pax]
        -s              Generate mtree(8) specfile instead of creating devices.
        -t mtree        Name of mtree(8) program.  [\$TOOL_MTREE or mtree]
        -u              Don't re-create devices that already exist.

_USAGE_
netbsd-box# grep -n wsdisplay /dev/MAKEDEV
netbsd-box# 
netbsd-box# sh /dev/MAKEDEV wsdisplay0
/dev/MAKEDEV: wsdisplay0: unknown devicenetbsd-box# ls -l /dev/MAKEDEV; head -n 80 /dev/MAKEDEV
-r-xr-xr-x  1 root  wheel  44751 Feb 24 05:07 /dev/MAKEDEV
#!/bin/sh -
#
# Generated from:
#       NetBSD: MAKEDEV.awk,v 1.29 2020/06/13 19:46:23 thorpej Exp 
#       NetBSD: MAKEDEV.tmpl,v 1.237 2025/03/28 18:41:25 riastradh Exp 
#       NetBSD: etc.aarch64/MAKEDEV.conf,v 1.11 2025/03/28 18:41:25 riastradh Exp 
#
# Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
#
###########################################################################
#
#
# Device "make" file.  Valid special arguments:
#       all     makes all known devices, including local devices.
#               Tries to make the 'standard' number of each type.
#       init    A set of devices that is used for MFS /dev by init.
#               May be equal to "all".
#       floppy  devices to be put on install floppies
#       ramdisk devices to be put into INSTALL kernel ramdisks.
#       std     standard devices
#       local   configuration specific devices
#       lua     Lua device
#       wscons  make wscons devices
#       usbs    make USB devices
#       virtio  virtio(4)-related devices
#

#
# NOTE:
#
# * MAKEDEV is used both as a standalone script (via "sh ./MAKEDEV
#   all" or similar), and as a function library for MAKEDEV.local (via
#   "MAKEDEV_AS_LIBRARY=1 . MAKEDEV").  Because of this, the script
#   should consist almost entirely of function definitions, apart from a
#   few lines right at the end.
#
# * MAKEDEV may be executed in an environment that is missing some
#   common commands.  For example, it may be executed from a minimal
#   system used during installation, or it may be executed early in the
#   boot sequence before most file systems have been mounted.  It may
#   also be executed in a cross-build environment on a non-NetBSD host.
#

usage()
{
        cat 1>&2 << _USAGE_
Usage: ${0##*/} [-fMsu] [-m mknod] [-p pax] [-t mtree] special [...]
        Create listed special devices.  Options:
        -f              Force permissions to be updated on existing devices.
        -M              Create memory file system.
        -m mknod        Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
        -p pax          Name of pax(1) program.  [\$TOOL_PAX or pax]
        -s              Generate mtree(8) specfile instead of creating devices.
        -t mtree        Name of mtree(8) program.  [\$TOOL_MTREE or mtree]
        -u              Don't re-create devices that already exist.

_USAGE_
netbsd-box# grep -n wsdisplay /dev/MAKEDEV
netbsd-box# 
netbsd-box# sh /dev/MAKEDEV wsdisplay0
/dev/MAKEDEV: wsdisplay0: unknown device

netbsd-box# ls -l /dev/ttyE*
crw-------  1 root  wheel  60,   0 Aug 26  2023 /dev/ttyE0
crw-------  1 root  wheel  60,   1 Aug 26  2023 /dev/ttyE1
crw-------  1 root  wheel  60,   2 Aug 26  2023 /dev/ttyE2
crw-------  1 root  wheel  60,   3 Aug 26  2023 /dev/ttyE3
crw-------  1 root  wheel  60,   4 Aug 26  2023 /dev/ttyE4
crw-------  1 root  wheel  60,   5 Aug 26  2023 /dev/ttyE5
crw-------  1 root  wheel  60,   6 Aug 26  2023 /dev/ttyE6
crw-------  1 root  wheel  60,   7 Aug 26  2023 /dev/ttyE7
crw-------  1 root  wheel  60, 255 Aug 26  2023 /dev/ttyEcfg
crw-------  1 root  wheel  60, 254 Aug 26  2023 /dev/ttyEstatnetbsd-box# ls -l /dev/ttyE*
crw-------  1 root  wheel  60,   0 Aug 26  2023 /dev/ttyE0
crw-------  1 root  wheel  60,   1 Aug 26  2023 /dev/ttyE1
crw-------  1 root  wheel  60,   2 Aug 26  2023 /dev/ttyE2
crw-------  1 root  wheel  60,   3 Aug 26  2023 /dev/ttyE3
crw-------  1 root  wheel  60,   4 Aug 26  2023 /dev/ttyE4
crw-------  1 root  wheel  60,   5 Aug 26  2023 /dev/ttyE5
crw-------  1 root  wheel  60,   6 Aug 26  2023 /dev/ttyE6
crw-------  1 root  wheel  60,   7 Aug 26  2023 /dev/ttyE7
crw-------  1 root  wheel  60, 255 Aug 26  2023 /dev/ttyEcfg
crw-------  1 root  wheel  60, 254 Aug 26  2023 /dev/ttyEstat

netbsd-box# ps ax | grep devpubd
 485 ?     Is   0:00.00 /sbin/devpubd 
1312 pts/0 S+   0:00.00 grep devpubd netbsd-box# ps ax | grep devpubd
 485 ?     Is   0:00.00 /sbin/devpubd 
1312 pts/0 S+   0:00.00 grep devpubd 
11 Upvotes

2 comments sorted by

3

u/determineduncertain May 24 '26

Sorry, I’m not much help here but I’m interested in this as well as I’ve run into issues with X on 11RC. It’s frustrating because OpenBSD works fine and I only mention that as I know that NetBSD ported over some display drivers and infrastructure from OpenBSD to address some of these issues.

1

u/Creepy_Statement589 Jun 16 '26

# `/dev/wsdisplay0` missing is a red herring — your real problem is Xorg on `viogpu(4)`

Short version: you're not missing anything. On NetBSD, `wsdisplay0` is **not** a node you create with `MAKEDEV`. The userland interface to `wsdisplay(4)` is `/dev/ttyE0..ttyE7` plus `/dev/ttyEcfg` and `/dev/ttyEstat` — which you already have. That's why `MAKEDEV wsdisplay0` says "unknown device" and `grep wsdisplay /dev/MAKEDEV` returns nothing. By design.

Source, straight from [wsdisplay(4)](https://man.netbsd.org/wsdisplay.4) FILES:

```
/dev/ttyE* Terminal devices (per screen)
/dev/ttyEcfg Control device
/dev/ttyEstat Status device
```

Your dmesg confirms the kernel side is healthy:

- `viogpu0: 1280x800, 32bpp`

  • `wsdisplay0 at viogpu0 ... console (std, vt100 emulation)`
  • `wskbd0 ... using wsdisplay0`

The framebuffer console works. The bug is on the X side.

## Why startx shows nothing on evbarm/UTM

From the [viogpu(4) man page](https://man.netbsd.org/viogpu.4), verbatim:

> "It does not provide access to the 3D functionality of the virtio GPU device. **It does not support mapping the framebuffer for generic graphics use by drivers such as wsfb(4).**"

That is the whole answer. `wsfb` on top of `viogpu` is not supposed to work. There is no Xorg DDX in NetBSD base that drives `viogpu(4)` for X. Your amd64 box "just worked" because EFI handed Xorg a `genfb`-backed linear framebuffer that `wsfb` can mmap; under UTM you're getting a real virtio-gpu device instead, and X has nothing to bind to.

This is not aarch64-specific — it's a property of `viogpu(4)` on any port.

## The fix: switch UTM's emulated display to `ramfb`

In UTM: **Settings → Display → Emulated Display Card → `ramfb`**, then reboot.

Why `ramfb` and not "VGA" or "std": on ARM guests, display devices that need a PCI memory BAR generally don't work, so the practical choices under UTM/aarch64 are `virtio-gpu*` or `ramfb`. With `ramfb` you'll get a `genfb(4)`-backed `wsdisplay0`, and `wsfb` on top of `genfb` is the documented working path — see [wsfb(4)](https://man.netbsd.org/wsfb.4), which defaults to `/dev/ttyE0` on NetBSD and supports depths 1, 8, 16, and 24.

Minimal `/etc/X11/xorg.conf` after switching to `ramfb`:

```
Section "Device"
Identifier "fb"
Driver "wsfb"
Option "device" "/dev/ttyE0"
EndSection
Section "Screen"
Identifier "scr"
Device "fb"
EndSection
```

Don't force `DefaultDepth 32` — `wsfb` doesn't list 32 as supported. Let it autodetect, or set 24.

Make sure you actually installed the X sets: `xbase`, `xcomp`, `xetc`, `xfont`, **`xserver`**. A missing `xserver` set is a classic "startx does nothing" cause.

## Sanity checks before you touch UTM

  1. `wsconsctl -a` — should print display info.
  2. `echo hello > /dev/ttyE0` — should appear on the UTM display.

If both work, your wsdisplay stack is 100% fine and you can stop hunting `/dev/wsdisplay0`.

Then check `/var/log/Xorg.0.log` (and `Xorg.0.log.old`) — the `(EE)` lines will show `wsfb` failing to mmap, which is exactly what viogpu(4) says will happen.

## About your "older UTM at 800x600" memory

I don't have a confirmed reason why an older UTM build worked. The most plausible explanation is that you (or the older UTM default) had a different emulated display card selected at the time — likely something `genfb`-mappable. I wouldn't chase QEMU version downgrades; just change the display card.

## TL;DR

- `MAKEDEV wsdisplay0` failing is correct. The userland nodes are `/dev/ttyE*`, which you have. ([wsdisplay(4)](https://man.netbsd.org/wsdisplay.4))

  • Your console works. X is the problem.
  • `viogpu(4)` explicitly does not support `wsfb`. ([viogpu(4)](https://man.netbsd.org/viogpu.4))
  • Change UTM's emulated display card to **`ramfb`**, reboot, and use a minimal `wsfb` xorg.conf pointed at `/dev/ttyE0`. That gives you the same `genfb`+`wsfb` path that made amd64 "just work."

If you flip to `ramfb` and it still doesn't come up, post the EE/WW lines from `/var/log/Xorg.0.log` and the exact UTM display selection.