evidence · 8.2 KiB

README.md

Committed at docs/evidence/second-core/linux-start-2026-10-12/README.md. This is what grounds the requirements that cite it.

Open raw source

CPU0 started from Linux through remoteproc, 2026-10-12

Coprocessor task 5.1: a fully booted Linux (mainline 7.3.0-rc5 on CPU1, the shell compositor running) loads the echo payload into the CPU0 carveout, writes the CPU0 boot vector and pulses RST_CPU0 through the standard remoteproc state file, then exchanges requests with CPU0 through the shared slot page.

Evidence class: physical board, one serial-console session (host-stamped) plus a native grim capture of the panel’s compositor output. No camera. One run.

Authorization. The operator answered “yeah go for it” on 2026-10-12 to running task 5.1 as a one-off boot of the trial kernel and DT with the installed default unchanged. CPU0 release on the normal card was authorized earlier (“Yes, go”; see ../echo-physical-2026-10-12/README.md).

What ran

ItemValue
Drivernix/patches/mainline/k230_cpu0_rproc.c (this commit): .load copies the raw image to the carveout base and zeroes the rest up to the end of the slot page; .start writes the carveout base to 0x91102100, reads it back, then reset_control_reset() on RST_CPU0; .stop still returns -EOPNOTSUPP (task 5.2). cpu0_echo attribute posts one request and polls its response line (100 ms bound).
Kernel.#kernelMainlineDrmRproc, /nix/store/i29ldf7sl1w9lj1i5ppb85qi8v39l1vf-…-7.3.0-rc5, Image SHA-256 93148fa3f30dc0c98141264ae36cb96c7ce0e031159c92b2b952ae2831fdb5d6
Modulek230_cpu0_rproc.ko.xz SHA-256 f7c3a94d03cdb8967bbd0169e175cf1ac24b425c71345d79f9aaa6e16c880225 (no build warnings for the file)
DT.#deviceTreeMainlineDrmHotplugCpu0, SHA-256 66fa0cdc75c69a5879f3bb39ec94a4566d94d7c2c40cd3582aaadd3f219b54ab. Decompiled and diffed against the installed bundle’s k230-tdisplay.dtb: the only differences are the cpu0-firmware@7000000 no-map node, the remoteproc@91102100 node, phandle renumbering, and the bundle’s embedded chosen/bootargs (U-Boot sets bootargs either way).
Payload/boot/small-core-echo.bin, 224 bytes, SHA-256 2ec68316…46cc (task 3.2)
Rest of bootinstalled default kc3iyr4c… (splash system): its staged bootargs.txt, initrd.uimg, and backup OpenSBI fw_jump

Trial files were copied over SSH to /var/lib/k230/cpu0-trial/ (hashes matched on the board). Command, under the board lock:

flock /tmp/k230-board.lock tools/cpu0-linux-start-session.py --out run-1.txt \
  --stage /var/lib/k230/coherent-boot/kc3iyr4cnjlswa87kkpi81qgc1is6hli-20261012f \
  --bundle /nix/store/kjlnrxv8vdk92lh84w2bkd1v0mx456hy-k230-coherent-shell-boot-files \
  --image <kernel>/Image --dtb <dtb>/k230-tdisplay-mainline-drm-hotplug-cpu0.dtb --hold 45

Excerpt: run-1-serial-excerpt.txt (escape and OSC sequences removed; they carried terminal titles and systemd session identifiers). The full raw transcript stays private.

Result

U-Boot loaded all five files with matching CRC32 (Image cbfe8fd7, DTB 8ecd8d13, initrd c5a9d6cc, fw_jump 99b89787, bootargs 762be152) and booted. Linux logged OF: reserved mem: 0x0000000007000000..0x00000000070fffff (1024 KiB) nomap non-reusable cpu0-firmware@7000000.

Before the start (Linux uptime ~207 s, systemctl is-system-running → running, shell and seatd active, swaymsg -t get_version answered):

Start (echo start > state, kernel 208.058 s):

remoteproc remoteproc0: powering up k230-cpu0
remoteproc remoteproc0: Booting fw image small-core-echo.bin, size 224
remoteproc remoteproc0: CPU0 released at 0x07000000
remoteproc remoteproc0: remote processor k230-cpu0 is now up

start_rc=0, state running, boot_vector 0x07000000, slot_magic 0x4f484345 (echo payload), served 0 — the magic was zeroed by .load, so CPU0 wrote it in this boot.

Echo requests, each a different value, answered by CPU0:

seqvaluersp (value+1)inv (~value)servedlatency µs
10x000000000x000000010xffffffff180
20x123456780x123456790xedcba987285
30xfffffffe0xffffffff0x00000001366
40xffffffff0x000000000x00000000482
50xdeadbeef0xdeadbef00x21524110580
60x000000010x000000020xfffffffe687
70x800000000x800000010x7fffffff776
80x7fffffff0x800000000x80000000889

Then 1000 more requests (values 0–999) in a shell loop: ECHO_BULK ok=1000 of 1000, last seq 1008 value 0x000003e7 rsp 0x000003e8 inv 0xfffffc18 served 1008 OK. Every answer is checked in the driver (rsp == value+1, inv == ~value, rsp_seq == seq); a mismatch or a 100 ms timeout fails the write. Latency is from the req_seq store to the poll that saw rsp_seq, and includes the poll’s usleep_range(10, 50), so it is an upper bound at that granularity.

After the start (immediately, and again after a 45 s hold):

Then reboot. The board returned to the installed default: over SSH, /run/booted-system is kc3iyr4c…, /sys/class/remoteproc does not exist, the DT has no remoteproc node, shell active.

Notes and limits