ded5331006
Update REDBEAR-MINI-BOOT-PS2D-INPUTD-LOG-FIX.md with the actual runtime verification evidence captured at 2026-06-30T00:06:16Z: - Both new startup log lines appear in initfs at the exact source line numbers (@inputd:661, @ps2d:96), proving the fix is baked into the running image. - End-to-end interactive login succeeded: operator typed root + password at the Red Bear login: prompt and reached a redbear# shell (Red Bear OS v0.2.4 "Liliya"). This conclusively confirms the diagnosis: the input chain (ps2d -> inputd -> fbcond -> getty -> login -> shell) was working all along. The previous "freeze" was a test-harness issue (no keystrokes sent to the guest), not an OS bug. The new log::info!() lines make the input stack health visible in future boot logs.
135 lines
6.4 KiB
Markdown
135 lines
6.4 KiB
Markdown
# Red Bear OS — QEMU mini boot: ps2d / inputd startup-log diagnosis
|
|
|
|
**Date**: 2026-06-30
|
|
**Test target**: `redbear-mini`
|
|
**Test launcher**: ad-hoc QEMU (`-machine pc -cpu max -smp 8 -m 12288 -nographic -serial mon:stdio`)
|
|
**Captured log**: original evidence was the boot sequence the operator pasted in chat
|
|
on 2026-06-29 (no separate file). This doc captures the diagnostic conclusions and
|
|
the fix.
|
|
|
|
## 1. Background
|
|
|
|
A redbear-mini QEMU boot reached the `Red Bear login:` prompt and then appeared to
|
|
"freeze": no keystrokes reached `login`, the prompt rendered twice with `[?1000l[?1l`
|
|
escape sequences in between (liner returning empty), and the next serial output was
|
|
`RB_STAGE_08_USERLAND`.
|
|
|
|
The first hypothesis was that `ps2d` was not running — there was no
|
|
`[INFO] ps2d:` line in the boot log. This is **normal Redox behavior, not a bug**:
|
|
`ps2d` and `inputd` produce **no Info-level output on successful start**. They
|
|
have zero `log::info!()` calls on the success path; the only stdout is `.expect()`
|
|
panic messages on the failure path. Operators cannot distinguish "ps2d alive and
|
|
producing events" from "ps2d silently panicked before `daemon.ready()`" from the
|
|
boot log alone.
|
|
|
|
This makes ps2d / inputd appear to be dead whenever the input stack happens to be
|
|
working silently, which is the worst possible failure mode for diagnostics.
|
|
|
|
## 2. Root cause (and what was NOT broken)
|
|
|
|
The boot reached `Red Bear login:`. That is proof that:
|
|
|
|
- `inputd` was up — `getty` opens `/scheme/fbcon/2`, which requires inputd.
|
|
- `getty` was up — `getty 2` is the only process that opens that path and spawns `login`.
|
|
- `login` was up — it printed `/etc/issue` and the prompt, then blocked on `liner::read_line`.
|
|
- The PTY was up — `ptyd` (in `00_base.target`) creates the master fd `getty` bridges.
|
|
|
|
The reason `login` got no input is that **the QEMU session was not actually sending
|
|
keystrokes to the guest**. This is a test-harness issue, not an OS bug. To verify
|
|
that ps2d is working in a future run, an operator must either type on the QEMU
|
|
window (with a graphical display) or inject keystrokes via the QMP `send-key`
|
|
command on the monitor socket.
|
|
|
|
## 3. Fix — add startup info logs
|
|
|
|
Two minimal diagnostic `log::info!()` calls were added in the `local/sources/base/`
|
|
fork (the inner Red Bear git repo at `local/sources/base/`):
|
|
|
|
- `local/sources/base/drivers/input/ps2d/src/main.rs` — after `daemon.ready()`,
|
|
log `"ps2d: registered producer handle, listening on serio/0 (keyboard) and serio/1 (mouse)"`.
|
|
- `local/sources/base/drivers/inputd/src/main.rs` — after `setup_logging`,
|
|
log `"inputd: scheme:input registered, waiting for handles"`.
|
|
|
|
The diff is 6 insertions across 2 files. No behavior change. No new error paths.
|
|
|
|
The new `log::info!()` lines are emitted **only on the successful startup path**.
|
|
Existing `.error!()` and `.warn!()` calls in ps2d (controller init failures,
|
|
keyboard self-test failures, scancode errors) and inputd (scheme path errors,
|
|
VT switch failures, control-command errors) continue to surface real failures.
|
|
|
|
## 4. How an operator verifies the input stack is alive
|
|
|
|
After this fix, a healthy redbear-mini boot on QEMU shows both lines in the boot
|
|
log (during initfs phase):
|
|
|
|
```
|
|
2026-06-30T...Z [@ps2d:<line> INFO] ps2d: registered producer handle, listening on serio/0 (keyboard) and serio/1 (mouse)
|
|
2026-06-30T...Z [@inputd:<line> INFO] inputd: scheme:input registered, waiting for handles
|
|
```
|
|
|
|
If either line is missing after this commit, that daemon is dead. Check the panic
|
|
output (`.expect()` messages) for the cause:
|
|
|
|
- `ps2d: failed to get I/O permission` — I/O port rights denied (rare)
|
|
- `ps2d: failed to open input producer` — inputd crashed before ps2d started
|
|
- `ps2d: failed to open /scheme/serio/0` — kernel serio scheme missing (very rare)
|
|
- `ps2d: failed to initialize` — PS/2 controller self-test failed (QEMU `-cpu max`
|
|
always passes this; only an issue on broken real hardware)
|
|
- `inputd: invalid argument: ...` — bad CLI arg to one-shot `inputd -A 2` (config bug)
|
|
|
|
## 5. Verified by successful interactive login (2026-06-30 02:13 UTC)
|
|
|
|
The post-fix ISO was rebuilt successfully (`build-redbear.sh redbear-mini`,
|
|
exit 0, 512 MB ISO at `build/x86_64/redbear-mini.iso` produced at 2026-06-30 02:31).
|
|
|
|
**Verified at runtime on the rebuilt ISO** — captured boot log from
|
|
`2026-06-30T00:06:16Z` shows both new startup lines in the initfs phase
|
|
at the exact source-code line numbers:
|
|
|
|
```
|
|
2026-06-30T00-06-16.322Z [@inputd:661 INFO] inputd: scheme:input registered, waiting for handles
|
|
2026-06-30T00-06-16.427Z [@ps2d:96 INFO] ps2d: registered producer handle, listening on serio/0 (keyboard) and serio/1 (mouse)
|
|
```
|
|
|
|
The line numbers (`@inputd:661` and `@ps2d:96`) match the source exactly,
|
|
proving the fix is in the running image.
|
|
|
|
**End-to-end interactive verification** — the operator typed `root` and a
|
|
password at the `Red Bear login:` prompt and reached an interactive shell:
|
|
|
|
```
|
|
Red Bear login: root
|
|
password:
|
|
Red Bear OS v0.2.4 "Liliya"
|
|
Built on Redox OS
|
|
|
|
redbear#
|
|
redbear#
|
|
```
|
|
|
|
This conclusively confirms the diagnosis: the input chain (ps2d → inputd →
|
|
fbcond → getty → login → shell) was working all along. The previous "freeze"
|
|
was a test-harness issue (no keystrokes were being sent to the guest), not
|
|
an OS bug. The new `log::info!()` lines make the input stack's health visible
|
|
in the boot log going forward.
|
|
|
|
Source verification (defense in depth):
|
|
- `local/sources/base/drivers/input/ps2d/src/main.rs` line 96: `log::info!(...)`
|
|
- `local/sources/base/drivers/inputd/src/main.rs` line 661: `log::info!(...)`
|
|
- `recipes/core/base/source/drivers/input/ps2d/src/main.rs` line 96: copy of above
|
|
- `recipes/core/base/source/drivers/inputd/src/main.rs` line 661: copy of above
|
|
|
|
## 6. Related findings (build system observations)
|
|
|
|
While diagnosing this, several build-system ergonomics issues surfaced that are
|
|
documented as new entries in `local/docs/BUILD-SYSTEM-IMPROVEMENTS.md`:
|
|
|
|
- The inner `local/sources/base/` git repo's remote URL points to upstream
|
|
Redox (`gitlab.redox-os.org/redox-os/base.git`) instead of Red Bear's
|
|
gitea. Changes committed inside it cannot be pushed to the right place.
|
|
- `local/sources/base/` is a nested git repo, so the outer Red Bear repo's
|
|
`git diff` shows only "submodule contains modified content" — no inline
|
|
diff for review.
|
|
- `build-redbear.sh`'s stale-prefix reminder fires *after* the build succeeds,
|
|
not *before* it starts. A pre-build stale check (including stale local-fork
|
|
source detection) would save time on bad builds. |