No. 80 / project of 147 on the ladder

BusyBox initramfs on the capable core

introduces — static RV32 musl BusyBox; Linux shell over host TTY; P78 core for Linux userspace

harden statelast run2026-05-05
signoff
  • DRCNOT RUN
  • LVSNOT RUN
  • antennaNOT RUN

P79 proved that Linux userspace can read from /dev/console through SBI console_getchar. P80 moves from the toy no-libc command loop to a real BusyBox shell.

This project also brings along the most capable core we have in-tree. Instead of staying on the P66-derived P79 RTL, P80 uses the P78 RTL with the RV32C fetch/decompressor path and the P70 F/D floating-point subset.

Why not the first BusyBox found?

Nix already had a cached busybox-riscv32-unknown-linux-gnu-1.37.0. That binary is useful as a warning, not as the payload:

ELF32 RISC-V, dynamically linked
interpreter /nix/store/.../ld-linux-riscv32-ilp32d.so.1
arch rv32i_m_a_f_d_c...

Dynamic glibc plus absolute Nix store paths is the wrong fit for our 16 MiB initramfs. P80 instead builds static musl BusyBox for rv32ima/ilp32 via Nix.

Init flow

Linux /init
  -> /bin/busybox-backed shell script
  -> mount proc/sysfs if possible
  -> install BusyBox applet symlinks into /bin
  -> exec console_sh
  -> console_sh feeds /bin/sh -i from host-input MMIO
  -> shell output returns through /dev/console/hvc0

The FIFO smoke queues:

echo P80-BUSYBOX-SMOKE
uname -a
ls /bin
touch /tmp/p80-smoke-file
cat /tmp/p80-smoke-file

The screen smoke starts the PTY bridge, attaches a detached screen session to /tmp/p80-busybox, sends commands with screen -X stuff, and checks that BusyBox prints P80-SCREEN-FILE-OK.

Honest Status

checkstatus
Static RV32 musl BusyBox packagePASS
Initramfs generationPASS
Verilator model buildsPASS
Linux boots to BusyBox /initPASS
BusyBox shell reads host FIFO commandsPASS
BusyBox shell reads commands sent through screenPASS
LibreLane hardeningNOT RUN

What just happened?

BusyBox is the point where “userspace hello” turns into a recognizable Linux environment. The important setup decision is to run it on the newest core path, not the older minimal Linux proof core.