Posts

Showing posts from September, 2026

QSOE audio: Crystal Clear

QSOE's 0.4 milestone has a one-line definition of done: continuous playback is audible on an HDMI audio extractor . Not "the driver loads", not "the counters look right" — audible. The extractor, a small FeinTech box that takes HDMI in and gives optical S/PDIF out, arrived on Tuesday. Two evenings later I have heard QSOE play music on two RISC-V boards, under both of its kernels, and for the first time ever on a system built on seL4. This is the story of those two evenings, because almost nothing went the way the plan said, and every detour taught something. Tuesday: the Unmatched The first board was the SiFive HiFive Unmatched, with an NVIDIA GK208 card in its PCIe slot. The card's HDMI output carries audio through an HD Audio controller that sits beside the GPU; the chain is GPU → HDMI → extractor → TOSLINK → an old JVC receiver. Linux went first, to prove the chain. It was silent. The receiver had not been asked to select its digital input since the...

qfpc: Pascal Compiler for QSOE (FPC-based)

Image
qfpc 0.1 is tagged today. It is an Object Pascal compiler for RISC-V 64 and for QSOE, and for nothing else: one target, one dialect, no other operating system and no other machine. It compiles itself, its run-time library runs on the boards, and its first user, qupkg , runs its whole test cycle on the K3 as a qfpc-built program that QSOE's own linker linked. The first commit is dated 12 September. This post is about the nine days between, and about the decisions, which were the part of the work that was mine.   In layers, in the order the compiler goes through them: layer what it is units lines base types, containers, messages, files, settings, the target 14 5.6 k lex characters to tokens, the directives, conditional compilation 11 4.3 k sym symbols, types, symbol tables, the unit file 33 16.5 k nodes the parse tree, the type check, the first pass 60 28.1 k parse the parser 28 12.8 k cg registers, the calling convention, the allocators, the primitives 24 12.5 k ncg cod...

seL4 for SpacemiT K3

Image
The QSOE 0.3 notes say the K3 is QSOE/N only. That was true of the release set and, for the three days before it, false of the lab: on the evening of 14 September seL4 16.0.0 booted to user space on the SpacemiT K3 — 16 harts, at the first attempt — and by the small hours of the 16th QSOE/L was logged in on it, over the serial line and on the screen, with the NVMe, the USB keyboard and the network attached and, once up, nothing from the kernel on the console at all. The kernel is k3sel4 , version 16.0.0-qsoe-k3-0.2 . This post is about what it took, because seL4 16.0.0 could not have booted on this board: the SoC has none of the things the RISC-V kernel assumes, and one thing it does not expect. seL4 16.0.0 assumes the K3 has k3sel4 does a PLIC no PLIC anywhere: an S-mode APLIC in MSI delivery mode feeding 16 IMSIC interrup files (the RISC-V AIA) a driver for both, behind the kernel’s six-function interrupt-controller contract the SBI v0.1 legacy calls, for everything ...

QSOE 0.3 released

 QSOE 0.3 is out today. In component terms: Component What it is 0.2 0.3 nq QSOE/N — the Skimmer microkernel and its taskman 0.26 0.30 lq QSOE/L — the seL4 taskman and its kernel seam 0.22 0.26 libc the shared C library and crt0 0.15 0.19 quser the shared userspace 0.14 0.18 mr-bml the bootloader, shipped alongside 0.9 1.0 0.2 gave you somewhere to write a file. 0.3 gives you somewhere to keep it. The qrvfs root on the NVMe is read-write on both kernels now, a checker looks it over before every mount and repairs what a lost power supply leaves behind, and a stress that fills the disk to its last block and reads every byte back passes on the boards. That is the spine of the release. The other headline is that QSOE/L stopped being ten times slower than QSOE/N, for a reason that was hiding in plain sight. As always both kernels — QSOE/N on Skimmer, QSOE/L on seL4 — carry one identical userspace, and a good fraction of what follows is bu...

QSOE 0.2 release

Image
The second QSOE release, v0.2, is out . As before it is a single numbered drop of both kernel variants, the boot loader, the shared userspace and libc: QSOE/N v0.26 , with the custom "Skimmer" kernel. QSOE/L v0.22 , which works together with seL4 version 16.0.0. mr-bml v0.9 , the GRUB-derived boot loader. quser v0.14 , the shared userspace: the shell, the drivers, the servers and the utilities. libc v0.15 . 0.1 was a system you watched over a serial cable. 0.2 is one you can sit at. devc-hficon paints a text console on a graphics controller that the firmware hands over — a GK208 on the Unmatched, the SoC display block on the K3 — and devu-xhci enumerates a USB keyboard that types into it, so a login: prompt appears on the monitor and answers. The shell gained pipelines (without fork() , which QSOE deliberately does not have), command substitution, job control, and a Ctrl-C that reaches the command and then the shell; an orthodox two-panel file manager and a full-screen...