Posts

Series about bringing up my NVidia video card on the RISC-V board (SiFive Unmatched)

The project of bringing up my GK-208 video card at the early boot stages turned out to be much bigger than originally envisioned — and the approach for accomplishing the goal had to change completely mid-course. I want to document that journey in detail, and since it is not directly related to QSOE, I will be posting an 8-part series, which I'm calling gk208-videobios , to my "legacy" blog at r-tty.blogspot.com . After those posts I will continue documenting here the exciting new things that are directly related to QSOE and mr-bml: how these two talk to the text-mode video controller, how the console (video + keyboard!) is organized, what the devc-vidcon resource manager will look like, how HDMI audio on the GK-208 depends on the active video mode of the controller, and other interesting things!

What I'm working on right now

Since 2024 I've wanted one specific thing: a RISC-V board that feels like a real personal computer. Not a serial console scrolling kernel logs over a USB cable — an actual screen that lights up at power-on, a boot menu, an operating system coming up on it. Power button, video BIOS, mr-bml's menu, QSOE booting on the display. That's the picture I've carried around for two years, and with Claude Code I've finally started attacking it for real. The board is my SiFive HiFive Unmatched (FU740). The display comes from an NVIDIA GK208, a "Kepler" (nv50) card, sitting in its PCIe slot. The catch is that the card's brain is an x86 Video BIOS: 16-bit real-mode code that expects an x86 host to POST it. The Unmatched is RISC-V. So the runner I'm building, gk208-vbios-runner , executes that x86 VBIOS inside an emulator on the RISC-V host — the SciTech/U-Boot bios_emulator engine — and bridges its register and memory accesses out to the real card. The goal i...

A free QNX-like operating system (2003)

I came across an old post of mine on the comp.os.qnx newsgroup, dated August 7, 2003. The subject line was "A free QNX-like operating system," and under it I announced RadiOS — a hobby effort to build a free, QNX-compatible microkernel OS for x86, with the microkernel and task manager written entirely in NASM assembly. About 70% of the required system calls were in place by then, along with parts of libc, a console resource manager, and an ATA/IDE driver; there was no filesystem manager yet. The post asked whether anyone wanted to help hack on it, and signed off with "73!". The thread is here: https://groups.google.com/g/comp.os.qnx/c/srdvVoik37M The fuller picture survives on the old SourceForge page, still up at radios.sf.net . RadiOS targeted system-call compatibility with QNX Neutrino 6.1; its Task Manager mirrored the QNX process-manager message format, and its libc was derived from QNX 6.1 code. By mid-2004 it ran to roughly 45,000 lines, almost all NASM, w...

QSOE project v0.1 released

The first QSOE release, v0.1, is out. It bundles both kernel variants, the boot loader, the userspace, and libc into a single numbered drop, and consists of the following components: QSOE/N v0.17 , with the custom "Skimmer" kernel. QSOE/L v0.14 , which works together with seL4 version 15. mr-bml v0.5.1 , a GRUB-derived boot loader with support for Multiboot 3, RISC-V Linux-style kernels, and kernels with an EFI stub. quser v0.5 , offering an mksh-based shell (qsh). libc v0.6 . The two variants share the same userspace above the seam: quser, qsh, and libc are identical, with only taskman and libc.so differing per kernel. That shared userspace is the whole point — one QNX-compatible environment over two very different microkernels. The milestone behind this release is on the QSOE/L side: it now boots from NVMe storage to an interactive login shell on the SiFive Unmatched (FU740). Spawning the first program off a mounted disk had exposed a pair of deadlocks — taskman blocked ...

QSOE/L: The first spawn from real storage

The last post ended with QSOE/L still in the emulator, and the next job named in plain words: carry the image across to the Unmatched and find out which of my QEMU assumptions were lies. The image went across. It got further than I'd have guessed — far enough to bring up the PCIe root, raise devb-nvme over real DesignWare MSI, spin up the Samsung NVMe, and mount an on-disk filesystem off it — and then it wedged. This post is the lie it found, which turned out to be a foundational one. Not in seL4, not in the userspace, but in the seam between them. Where v0.13 stood By v0.13, QSOE/L had a storage stack. On the board the boot reached this and meant every word of it: [init] mounting /dev/nvme0n1p8 at /usr... fs-qrv: qrvfs v2, 4096 blocks, 128 inodes fs-qrv: mounted qrvfs at /usr (dev=/dev/nvme0n1p8) And then nothing. No panic, no fault report, no login prompt — a clean wedge exactly one line after a mount that had plainly worked. Three facts framed the hunt, and all three turne...

QSOE/L: the same userspace, on seL4

The three QSOE/N posts ended with a promise — the other half of the umbrella, QSOE/L, the same userspace running on seL4. This is that post. It is also, in a sense, the first post, because QSOE/L is where the whole thing began. Tomorrow is one month to the day since I started the real QSOE, and the first thing that booted was an seL4 image. QSOE/N, the from-scratch-kernel variant I wrote about first, is the younger sibling. I led with it because the milestone there was loud: a microkernel I wrote myself taking its first breath on real silicon. QSOE/L's story is quieter and, for the shared userspace, more foundational. Everything that runs on Skimmer today was made to run on seL4 first. No kernel to write On seL4 there is no kernel to write, and that is the entire point. seL4 is a verified, capability-based microkernel; the job was never to build a kernel but to build a QNX-Neutrino-shape operating system on top of one. seL4 has opinions, and the strongest of them is about IPC. It...

QSOE/N, part 3: first boot on the HiFive Unmatched

Part 2 left QSOE/N as a working operating system that had only ever run in QEMU. This post is the jump to real silicon — a SiFive HiFive Unmatched (FU740) on my desk — and the five obstacles between "boots fine in the emulator" and an interactive shell on real hardware. The recurring theme is that QEMU is generous in ways the FU740 is not. Every fix below is a thing the emulator either did for me silently or didn't model at all. Two of them I had already paid for once, on the same board, during the QRV port; the commits cite the QRV fixes by hash. That's the value of having ported QNX to RISC-V first: the bring-up obstacles on this board are not a surprise, they're a checklist. 1. The image won't load: boot-image header U-Boot's booti refused the flat binary outright — Bad Linux RISCV Image magic! . The same first obstacle QRV hit on the same board. RISC-V's Image protocol wants a specific header at the front of the kernel: a code0 that jumps over...