# Xorg 1.19.7 framebuffer fallback: test package (rev 18)

**Status: test candidate. The VM runtime matrix has passed.**

This is a corrected test build of the OpenIndiana Hipster X server, Xorg 1.19.7.
It replaces the withdrawn `xorg-autodetect-20261020` kit. It changes one narrow
decision: when the console is the illumos bitmap framebuffer, Xorg uses the
generic `illumosfb` driver instead of `vesa` **only** when the machine has no legacy video BIOS.

You install it into a **new boot environment (BE)** that is a copy of the system
you are running now. You switch to that BE deliberately, and you switch back
deliberately. Nothing in this guide relies on a reset or a reboot to return you
to your original system.

- Pull request: [OpenIndiana/oi-userland#27965](https://github.com/OpenIndiana/oi-userland/pull/27965)
- Related report: [illumos Redmine #18500](https://www.illumos.org/issues/18500) (HP EliteBook 820 G2)
- Source commit: `81ec8fb4df9d0b28f3e6b4a398ad64013f908f87`
- Patch: `37-illumosfb-autoconfig.patch`

## If you tried the earlier kit

The `xorg-autodetect-20261020` package (revision 17) was withdrawn. It could
pick `modesetting` on machines where the Intel driver had worked, and its guide
wrongly promised that a reboot would return you to your original BE.

**Do not use this kit to repair a machine that has revision 17 installed.** Keep
both of your BEs; do not delete either. Please comment on the pull request and
you will get instructions for your specific machine. You do not need to retry or
reinstall anything.

## What changed

Hipster revision 15 started treating the illumos bitmap console (`illumos_fb`)
as proof that `vesa` cannot work. On that console Xorg dropped `vesa` and fell
back to `illumosfb`. But the bitmap console appears with a legacy BIOS (VBE) as
well as with pure UEFI (GOP). Many machines still have a legacy video BIOS, and
on those `vesa` works. `illumosfb` cannot change modes and stays at the
resolution the firmware chose.

This build keeps the normal Xorg order and changes only that fallback:

1. **PCI-matched drivers come first, as before.** For example, a legacy Intel
   machine still tries `intel`, then `vesa`.
2. **Only on an `illumos_fb` console**, Xorg checks for a legacy video BIOS:
   - **present:** `vesa` stays;
   - **cannot tell:** `vesa` stays;
   - **definitely absent:** `vesa` is replaced by `illumosfb`.
3. **Nothing else changes.** This build does not pick `modesetting`
   automatically. A `Device` section that names a driver, including the
   `10-vesa.conf` workaround, still takes precedence and bypasses all of this.

The Xorg log now names the console whenever it can read the console
identifier, so you can tell whether your machine is affected at all.

Keyboard symptoms reported alongside the display problem have no known
connection to this change. This build does not touch keyboard handling. Your
before-and-after observations help work out whether they are related.

## Who this test is for

Look at your current Xorg log:

```sh
grep 'console driver' /var/log/Xorg.0.log
```

- **`console driver: illumos_fb`, and no KMS driver active**: you are the
  target. In particular machines that boot with BIOS, or with UEFI and a
  compatibility BIOS (CSM), and the HP EliteBook 820 G2 from Redmine #18500.
  Pure UEFI machines on `illumos_fb` are wanted too, as a check that they still
  get `illumosfb`.
- **An active KMS driver**, regardless of the console line: optional, as
  regression coverage only. You should
  see the same driver as before.
- **`console driver: illumos_text`**: this build does not change your driver
  choice. Thanks, but you do not need to test.
- **No such line, with an explicit driver configuration such as `10-vesa.conf`**:
  autodetection is bypassed, so this is expected. Record that configuration and
  leave it in place for the initial trial. If the other preconditions hold,
  you may continue; Step 8 offers a separate, controlled comparison.
- **No such line and no known explicit driver configuration**: include that in
  a short comment on the pull request. Please do not start the test.

**Do not install this** if you run the newer Xorg 21.1 stack. Stay on 21.1; do not
downgrade. This kit does not select or switch any DRM driver stack.

The packages are built for current Hipster OS packages. If the dry run in
step 4 shows that your system is too old, **stop and report it**. Do not
update or downgrade your OS to make this test fit.

## What has been tested so far

The full candidate-list checks pass, including a legacy Intel KMS device that
has connectors but no dumb-buffer support. The old KMS shortcut fails that
same check. Native builds and package verification pass. An isolated stock IPS
image also passed the exact two-package upgrade from revision 16 to 18.

| Configuration | Driver and desktop | Input check | Result |
| --- | --- | --- | --- |
| SeaBIOS VM, Xorg 1.19.7 | Automatic vesa, 1920×1200; same with `10-vesa.conf` | US; Y types y in both phases | PASS, job 82 |
| OVMF UEFI VM, Xorg 1.19.7 | Automatic illumosfb, 1024×768; same when explicitly selected | US; Y types y in both phases | PASS, job 83 |
| Native bhyve VM, Xorg 1.19.7 | Automatic illumosfb, 1024×768; same when explicitly selected | US; Y types y in both phases | PASS, job 84 |
| X230 KMS, separate Xorg 21.1 companion | Configured modesetting; both displays unchanged | US map unchanged; synthetic Y types y | PASS; con18 restored as the default |

The X230 check used a matching 21.1 companion package. This download is for
1.19.7. Physical BIOS/CSM machines without a KMS driver are still wanted,
especially the HP EliteBook 820 G2 case. The keyboard-layout report remains
an open question; these checks do not establish its cause.

## Download

From <https://dlc.openindiana.org/isos/hipster/test/xorg-autodetect-rev18-20261021/>

| File | Purpose |
| --- | --- |
| `xorg-autodetect-1.19.7-rev18-20261021.p5p` | The package archive |
| `xorg-autodetect-1.19.7-rev18-20261021.p5p.sha256sum` | Its SHA-256 checksum |
| `README.md` | This guide as plain text |

The archive contains exactly two packages for the standard `openindiana.org`
publisher, so you do not need to add a publisher:

- `x11/server/xorg@1.19.7,5.11-2026.0.0.18:20261021T173619Z`
- `x11/server/xserver-common@1.19.7,5.11-2026.0.0.18:20261021T173621Z`

Both are Xorg userland packages. There are no kernel, driver or OS packages.
`xserver-common` also ships Xorg's `mdb` debugging module, which is not part of
this test.

## Before you start

- Plan for about 45 minutes and two or three reboots. Back up anything you
  cannot lose.
- You need a root shell for steps marked **as root**: for example `sudo -s` on a
  default installation. Steps marked **as your user** run in a terminal **inside
  your desktop session on the machine itself**, not over SSH.
- Run one block at a time. **If a command prints an error, stop there** and
  report what you saw. Do not improvise around it.
- Keep a piece of paper handy for two names: your **original BE** and the
  **test BE**.
- Know how to reach your boot menu. Both GRUB and the illumos loader let you
  choose a BE at boot, and that menu works even without a desktop.

## Step 1: record the system as it is now

**As your user**, in a terminal in your desktop session:

```sh
echo "$DISPLAY"
```

This should print something like `:0`. If it prints nothing, or a name with a
host such as `localhost:10.0`, you are not in the local desktop. The display
queries below would then come out empty or describe the wrong screen.

```sh
D=~/xorg-test/before
mkdir -p "$D"
cd "$D"
echo "DISPLAY=$DISPLAY" > display.txt
xrandr --current > xrandr.txt 2>&1
setxkbmap -query > setxkbmap.txt 2>&1
svcprop -p keymap/layout system/keymap:default > console-keymap.txt 2>&1
pkg list -v x11/server/xorg x11/server/xserver-common > pkg.txt 2>&1
uname -v > uname.txt
prtconf -d | grep -i display > display-hw.txt 2>&1
ls -l /etc/X11/xorg.conf /etc/X11/xorg.conf.d /dev/dri > config.txt 2>&1
grep -i driver /etc/X11/xorg.conf /etc/X11/xorg.conf.d/*.conf > drivers.txt 2>&1
cp /var/log/Xorg.0.log .
grep -E 'console driver|illumos framebuffer|autoconfigured driver' Xorg.0.log
```

"Not found" lines in `config.txt` or `drivers.txt` are normal and useful.

Check `pkg.txt`. The version of both packages should start with `1.19.7` and
contain `2026.0.0.16`. **Stop** if either shows `21.1`, or `2026.0.0.17` or later.

Then write down, in your own words:

- the resolution you see now, and the resolution you expect;
- the size of each screen, and if there is more than one, which are on and how
  they are arranged;
- your physical keyboard layout (the language printed on the keys);
- what appears when you press the **Y** and **Z** keys in a text field, and
  whether punctuation, AltGr characters and copy-and-paste behave normally.

On a default installation your home directory is shared by every BE, so
`~/xorg-test` stays available after a reboot. If you are not sure that is true
for you, copy it to a USB stick before each reboot.

## Step 2: download and verify

**As your user:**

```sh
mkdir -p /var/tmp/xorg-rev18 && cd /var/tmp/xorg-rev18
curl -fLO https://dlc.openindiana.org/isos/hipster/test/xorg-autodetect-rev18-20261021/xorg-autodetect-1.19.7-rev18-20261021.p5p
curl -fLO https://dlc.openindiana.org/isos/hipster/test/xorg-autodetect-rev18-20261021/xorg-autodetect-1.19.7-rev18-20261021.p5p.sha256sum
F=xorg-autodetect-1.19.7-rev18-20261021.p5p
digest -a sha256 "$F"
cat "$F.sha256sum"
PACKAGE_SHA=$(digest -a sha256 "$F") &&
EXPECTED_SHA=$(awk 'NR == 1 {print $1}' "$F.sha256sum") &&
[ "${#PACKAGE_SHA}" -eq 64 ] &&
[ "$PACKAGE_SHA" = "$EXPECTED_SHA" ] && echo CHECKSUM OK
```

The two hashes must be identical and the last line must print `CHECKSUM OK`.
If not, stop.

## Step 3: check your boot environments and create the test BE

**As root.** Open one root shell and keep it open until the reboot in step 6. The
commands use shell variables that exist only in that shell.

```sh
beadm list
```

Read the `Active` column. **Continue only if** exactly one BE is marked `NR`
(running now **and** the default for the next boot), no other BE carries `N`,
`R` or `T`, and that BE is the one you were happy with. Write its name on your
paper as the **original BE**. **Stop** if the markers are split across BEs or
if any `T` appears.

Type the original BE's name exactly as `beadm list` shows it, then choose a name
for the new test BE that does not exist yet (for example `xorg-rev18-test`):

```sh
printf 'Original BE (marked NR): '; read ORIG
printf 'New test BE name: '; read TESTBE
beadm list "$ORIG"
```

That last command must show one row, marked `NR`. If it does not, set `ORIG`
again. Write the test BE name on your paper too.

Create the test BE as a copy of the running original BE, and mount it:

```sh
M=/mnt/xorg-rev18-test
mkdir "$M" &&
beadm create "$TESTBE" &&
beadm mount "$TESTBE" "$M" &&
echo "READY: $TESTBE mounted at $M"
```

If you do not see `READY`, stop. Do not reuse an existing directory or BE name.

## Step 4: dry run in the test BE

**As root**, same shell. Everything here acts on the mounted test BE (`-R "$M"`).
Your running system is not changed.

The Xorg packages are version-locked. Preview unlocking them in the test BE
only:

```sh
pkg -R "$M" change-facet -nv --deny-new-be --no-backup-be --no-be-activate \
    facet.version-lock.x11/server/xorg=false \
    facet.version-lock.x11/server/xserver-common=false
```

The preview should list only the two facet changes and no package changes. If
it does, apply it:

```sh
pkg -R "$M" change-facet -v --deny-new-be --no-backup-be --no-be-activate \
    facet.version-lock.x11/server/xorg=false \
    facet.version-lock.x11/server/xserver-common=false
```

Now preview the install. The dry run installs nothing:

```sh
pkg -R "$M" install -nv --deny-new-be --no-backup-be --no-be-activate \
    -g /var/tmp/xorg-rev18/xorg-autodetect-1.19.7-rev18-20261021.p5p \
    'pkg://openindiana.org/x11/server/xorg@1.19.7,5.11-2026.0.0.18:20261021T173619Z' \
    'pkg://openindiana.org/x11/server/xserver-common@1.19.7,5.11-2026.0.0.18:20261021T173621Z'
```

Read the plan carefully. It must show **exactly two changed packages**,
`x11/server/xorg` and `x11/server/xserver-common`, each going from a
`2026.0.0.16` version to a `2026.0.0.18` version. It must not create a boot environment.
**Stop** if the plan:

- installs, removes or updates any other package, such as kernel, driver,
  `system/…` or other OS packages;
- reports an error or conflict, or says a dependency, constraint or
  incorporation cannot be satisfied (this is what "OS too old" looks like);
- says there is nothing to do.

In that case, do not try `pkg update`, `--reject`, other facets or publishers,
and do not update or downgrade the OS. Save the output for your report, then
unmount the test BE and leave it inactive:

```sh
beadm unmount "$TESTBE"
```

## Step 5: install into the test BE

**As root**, only if the dry run looked right. Use the same command without `-n`:

```sh
pkg -R "$M" install -v --deny-new-be --no-backup-be --no-be-activate \
    -g /var/tmp/xorg-rev18/xorg-autodetect-1.19.7-rev18-20261021.p5p \
    'pkg://openindiana.org/x11/server/xorg@1.19.7,5.11-2026.0.0.18:20261021T173619Z' \
    'pkg://openindiana.org/x11/server/xserver-common@1.19.7,5.11-2026.0.0.18:20261021T173621Z'
pkg -R "$M" list -v x11/server/xorg x11/server/xserver-common
```

Both packages must now show a `2026.0.0.18` version.

Leave your Xorg configuration as it is, **including `10-vesa.conf`** if you use
it. The first test boot checks that your current setup still works. Step 8
offers an optional, separate comparison without it.

Unmount the test BE:

```sh
beadm unmount "$TESTBE"
```

## Step 6: switch to the test BE

**As root**, same shell. This makes the test BE the **default** for the next boot. It is a
normal, permanent activation. Nothing will switch you back on its own. Step 9
switches you back.

```sh
beadm activate "$TESTBE"
echo "beadm exit status: $?"
beadm list
```

Continue only if **both** of these are true:

1. `beadm activate` printed no error and the exit status is `0`;
2. `beadm list` shows the original BE as `N` (running now) and the test BE as
   `R` (default next boot).

**If `beadm activate` printed any error, or the status is not `0`, stop here and
do not reboot, even if the markers look right.** Report the output. If the
markers are anything other than described, do not reboot either.

Save your work, then reboot through the firmware and the boot menu:

```sh
reboot -p
```

## Step 7: record the system in the test BE

Log in as usual. **As root**, check where you are:

```sh
beadm list
```

The test BE should be `NR`, and your original BE should still be listed. Note
the output for your report.

Then, **as your user**, in a terminal in your desktop session, run the step 1
block again with a new directory. Change only the first line:

```sh
D=~/xorg-test/after
```

This time `pkg.txt` should show `2026.0.0.18` for both packages; the stop rule
from step 1 does not apply here.

The last `grep` in that block shows the new console line. On an `illumos_fb`
console, it is followed by one of:

```
illumos framebuffer: legacy video BIOS present; retaining vesa
illumos framebuffer: legacy video BIOS unknown; retaining vesa
illumos framebuffer: legacy video BIOS absent; using illumosfb fallback
```

If a configuration file names a driver, such as `10-vesa.conf`, Xorg skips
autodetection and none of these lines appears. That is expected.

Write down the resolution, screen sizes and arrangement, and keyboard
behaviour (the **Y** and **Z** keys again) in the same words as before.

## Step 8 (optional): try without `10-vesa.conf`

Only if `drivers.txt` showed that you use `/etc/X11/xorg.conf.d/10-vesa.conf`,
you are **running the test BE** (`N` on the test BE), and you can get to a root
shell without the desktop: a text console or SSH from another machine. If you
cannot, skip this step.

**As root**, in the running test BE. This ends your desktop session, so save your work first:

```sh
test ! -e /etc/X11/10-vesa.conf.parked &&
mv /etc/X11/xorg.conf.d/10-vesa.conf /etc/X11/10-vesa.conf.parked &&
echo PARKED
```

Continue only if you see `PARKED`. Then restart the login screen:

```sh
svcadm restart lightdm
```

Log in and run the step 1 block once more with `D=~/xorg-test/no-vesa-conf`.

Afterwards, put the file back, **as root**, whether or not the desktop came up:

```sh
test ! -e /etc/X11/xorg.conf.d/10-vesa.conf &&
mv /etc/X11/10-vesa.conf.parked /etc/X11/xorg.conf.d/10-vesa.conf &&
echo RESTORED
```

```sh
svcadm restart lightdm
```

If no login screen appears after parking, use your text console or SSH to run
the two restore commands. This change exists only in the test BE. Your original
BE is untouched.

## Step 9: switch back to your original BE

**As root.** Open a new root shell (the variables from step 3 are gone). Look at
the list and set `ORIG` again from your paper:

```sh
beadm list
printf 'Original BE (from your paper): '; read ORIG
beadm list "$ORIG"
```

The last command must show exactly that BE. Then make it the default again:

```sh
beadm activate "$ORIG"
echo "beadm exit status: $?"
beadm list
```

Continue only if **both** are true:

1. `beadm activate` printed no error and the exit status is `0`;
2. the original BE is marked `R`, and the test BE `N` (the one running now).

**If `beadm activate` printed any error or the status is not `0`, stop. Do not
reboot**, even if `R` looks right. Report the output. While you wait, you are
still in a working test BE, and the boot menu can still start your original BE.

If both are true, reboot:

```sh
reboot -p
```

Afterwards, `beadm list` **as root** should show your original BE as `NR`.

**Keep both BEs.** Please do not delete the test BE yet. It helps with
follow-up questions.

## If the test BE does not start properly

For example a black screen, no login screen, or a hang:

1. Reboot or power-cycle the machine. It will **start the test BE again**,
   because that is now the default.
2. In the boot menu, **choose your original BE** by name. In the illumos loader
   that is under *Boot Environments*; in GRUB it is an entry with the BE name.
   The menu is on the console and needs no desktop.
3. Once the original BE is running, open a root shell and run **both blocks of
   step 9, but not `reboot -p`**. Here the second check in step 9 differs:
   because you are already running the original BE, expect it to show `NR`,
   and no marker on the test BE. The exit-status rule is unchanged. No
   further reboot is needed.

The same rule applies here: **if `beadm activate` reports any error or a non-zero
status, stop and report it**, even if the markers look right.

Never delete either BE as part of recovery, and do not use temporary
activation (`beadm activate -t` or `-T`) at any point in this test.

## Reporting

Please comment on
[oi-userland#27965](https://github.com/OpenIndiana/oi-userland/pull/27965).
If you have the HP EliteBook 820 G2, please also add your results to
[Redmine #18500](https://www.illumos.org/issues/18500).

Include:

- [ ] Machine model, graphics hardware (`display-hw.txt`) and firmware mode:
      BIOS, UEFI with CSM, or pure UEFI
- [ ] The `console driver:` and `illumos framebuffer:` lines **before** and
      **after**, or that there were none
- [ ] Driver chosen and resolution, before and after (`Xorg.0.log`, `xrandr.txt`)
- [ ] Screen sizes and output layout in your own words, before and after
- [ ] Your physical keyboard layout, `setxkbmap.txt`, `console-keymap.txt`, and
      what the **Y** and **Z** keys typed, before and after
- [ ] `drivers.txt`, and whether you ran the optional step 8
- [ ] `beadm list` output from steps 3, 6, 7 and 9
- [ ] The dry-run output from step 4, if it did not look as described
- [ ] The `before/` and `after/` directories (and `no-vesa-conf/`), attached
      or linked. The Xorg logs are the most useful part.

"Nothing changed, everything works" is a useful report too, especially from
pure UEFI and KMS machines.

Thank you for testing.
