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
| check | status |
|---|---|
| Static RV32 musl BusyBox package | PASS |
| Initramfs generation | PASS |
| Verilator model builds | PASS |
Linux boots to BusyBox /init | PASS |
| BusyBox shell reads host FIFO commands | PASS |
BusyBox shell reads commands sent through screen | PASS |
| LibreLane hardening | NOT 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.