feat(kernel): screen=boot keeps the console on the screen until login -- for watching a PC boot

KernelArgs gains screen_boot; cmdline.c parses screen=boot (with or without --; any other value:
off). With it, the v4 boot keeps the console mirrored to the framebuffer after POST, with the TTF
font, and says 'Screen: the console stays on until login (screen=boot)'; login and logout work as
without it, and nothing can be typed without Zuse. Without it, unchanged. For the SER5, which has
no known serial port (ruled 2026-10-28). BRINGUP.md: the smoke test's stick and starforth.cfg.

Tests: screen_boot (new) failed on amd64 and aarch64 before, passes on all three ISAs after;
screen_dark_until_login, screen_dark_after_logout, zuse pass. Acceptance: amd64, aarch64, riscv64 to
[zuse@Hera] ok>, POST 538/538, dict_hash 0xfec8c47cfc6f437f; v4 suite and test-32 0 failures.

Plan: docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md, Task 5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rajames
2026-10-28 17:50:10 -04:00
co-authored by Claude Opus 5.5
parent 1e8a6fed34
commit 954b4d5f70
27 changed files with 1784 additions and 4 deletions
+15 -1
View File
@@ -58,6 +58,9 @@ the stick's, plan 2026-10-26-stick-1-screen-and-keyboard.md):
artemis_unsigned the Zuse stick with its Artemis signature zeroed: "signature is bad -- not
used", nothing attached, headless
raw_ident Zuse's raw identity image, no GPT: "not this system's stick -- not used", headless
screen_boot KERNEL_ARGS=screen=boot, no drive: "Screen: the console stays on until login
(screen=boot)"; 30 s after POST the screen is not black; no ok> (plan
2026-10-27-stick-4-one-disk.md, Task 5)
stick_v3 --target qemu-stick, system=v3 in the stick's starforth.cfg: "Boot disk: a StarshipOS
stick", the refusal, then v4's POST; no v3 (plan 2026-10-27-stick-4-one-disk.md, Task 3)
entropy after "System: StarForth v4", the entropy backend -- rdrand on amd64 (qemu and
@@ -85,7 +88,7 @@ NO_ZUSE_MODES = {"gpt_zuse", "gpt_hotplug", "gpt_foreign", "gpt_bad_crc", "gpt_b
"gpt_read_error", "headless", "hotplug", "midpull", "waitpull", "typeahead", "emergency",
"alttab_after_logout", "alttab_before_pull", "emergency_pull",
"screen_dark_until_login", "screen_console_after_login", "screen_dark_after_logout",
"kbd_typeahead", "stick_boot", "stick_v3", "stick_zuse"}
"kbd_typeahead", "stick_boot", "stick_v3", "stick_zuse", "screen_boot"}
label = a.label or f"{a.mode}-{a.arch}"
work = os.path.join(ROOT, "build", "qemu-session", label)
shutil.rmtree(work, ignore_errors=True)
@@ -121,6 +124,8 @@ make_args = ["make", "-f", "kernel/Makefile", f"ARCH={a.arch}", "clean", a.targe
f"ZUSEDISK={zdrive if attach_zuse else ''}"] + shlex.split(a.make)
if a.mode in ("v3_keys", "stick_v3"):
make_args.append("KERNEL_ARGS=system=v3")
if a.mode == "screen_boot":
make_args.append("KERNEL_ARGS=screen=boot")
if a.mode == "stick_zuse":
make_args.append(f"STICK_PAIR={work}") # the PC stick with this session's copy of the pair
start = time.time()
@@ -496,6 +501,15 @@ elif m == "screen_dark_until_login":
w, h, lit, _ = screen()
check(f"the screen ({w}x{h}) is all black before login ({lit} lit)", lit == 0)
elif m == "screen_boot":
check("Screen: the console stays on until login (screen=boot)",
wait_for(r"Screen: the console stays on until login \(screen=boot\)", 60))
time.sleep(30)
w, h, lit, _ = screen()
check(f"the screen ({w}x{h}) shows the console before login ({lit} lit)", lit >= 500)
check("no ok> (no one is logged in)", not wait_for(ANYPROMPT, 5))
check("no fault", count(r"EXCEPTION|PANIC|panic") == 0)
elif m in ("screen_console_after_login", "screen_dark_after_logout"):
add_zuse(1)
check("[zuse@Hera] ok> after attach", wait_for(PROMPT, 120))