multi-session sweep: submodule bumps + doc/recipe/script updates

Submodule pointer updates (forks already pushed):
- base: netstack generic ReaderPool + OwnedFd bridge (36dddf23)
- bootloader, installer, userutils: upstream-tracking commits

Parallel agent work swept:
- kf6-kcmutils: recipe + CMakeLists + initial migration patch
- redbear-iwlwifi: Cargo.toml update
- tlc: MC-PARITY-AUDIT + README updates
- xwayland recipe+patch removed (stale)
- scripts: verify-patch-content.py, lint-config-paths.sh
- docs: CONSOLE-TO-KDE-DESKTOP-PLAN, DBUS-INTEGRATION-PLAN,
  HARDWARE-VALIDATION-MATRIX, REDBEAR-FULL-SDDM-BRINGUP,
  UPSTREAM-SYNC-PROCEDURE, README
This commit is contained in:
2026-07-27 06:17:58 +09:00
parent 462ee7e9b4
commit 52e1deebd0
29 changed files with 389 additions and 369 deletions
@@ -0,0 +1,10 @@
{
"sessionID": "ses_061020438ffeaWk2vcj6fbC3MX",
"updatedAt": "2026-07-26T15:44:16.607Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T15:44:16.607Z"
}
}
}
@@ -0,0 +1,10 @@
{
"sessionID": "ses_0613206b9ffeL2Zgq8QaDXLZ6x",
"updatedAt": "2026-07-26T15:49:53.341Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T15:49:53.341Z"
}
}
}
@@ -0,0 +1,10 @@
{
"sessionID": "ses_061323608ffe9tJAGD2FM1niil",
"updatedAt": "2026-07-26T15:58:30.318Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T15:58:30.318Z"
}
}
}
@@ -0,0 +1,10 @@
{
"sessionID": "ses_0613257a7ffeO6akF2DonB477w",
"updatedAt": "2026-07-26T15:45:45.348Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T15:45:45.348Z"
}
}
}
@@ -1,10 +1,11 @@
{
"sessionID": "ses_06284e1edffebztmq6Uvq8VtsC",
"updatedAt": "2026-07-26T13:12:50.831Z",
"updatedAt": "2026-07-26T21:13:51.569Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T13:12:50.831Z"
"state": "active",
"reason": "3 background task(s) active",
"updatedAt": "2026-07-26T21:13:51.569Z"
}
}
}
@@ -1,10 +1,10 @@
{
"sessionID": "ses_062d778b0ffeVfC0wQ1uIPzpVL",
"updatedAt": "2026-07-26T14:27:52.477Z",
"updatedAt": "2026-07-26T15:59:45.254Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T14:27:52.477Z"
"updatedAt": "2026-07-26T15:59:45.254Z"
}
}
}
@@ -1,10 +1,10 @@
{
"sessionID": "ses_0645b4ea1ffeKq8EVY58m1lH6k",
"updatedAt": "2026-07-26T14:28:51.241Z",
"updatedAt": "2026-07-26T21:14:51.613Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T14:28:51.241Z"
"updatedAt": "2026-07-26T21:14:51.613Z"
}
}
}
@@ -1,10 +1,10 @@
{
"sessionID": "ses_0646f2ab9ffeXVzQOTZvz6k9P6",
"updatedAt": "2026-07-26T13:55:17.019Z",
"updatedAt": "2026-07-26T18:21:08.974Z",
"sources": {
"background-task": {
"state": "idle",
"updatedAt": "2026-07-26T13:55:17.019Z"
"updatedAt": "2026-07-26T18:21:08.974Z"
}
}
}
@@ -1,11 +1,10 @@
{
"sessionID": "ses_06694b995ffewJACilklGlbtw7",
"updatedAt": "2026-07-26T14:31:12.088Z",
"updatedAt": "2026-07-26T16:03:46.189Z",
"sources": {
"background-task": {
"state": "active",
"reason": "3 background task(s) active",
"updatedAt": "2026-07-26T14:31:12.088Z"
"state": "idle",
"updatedAt": "2026-07-26T16:03:46.189Z"
}
}
}
+1 -1
View File
@@ -198,7 +198,7 @@ Red Bear OS operates under strict discipline. Full policies: [`local/AGENTS.md`]
## Documentation
- [Desktop Path Plan](local/docs/CONSOLE-TO-KDE-DESKTOP-PLAN.md) — Canonical plan v5.9 (2026-07-21): kernel → DRM → Mesa → Wayland → KDE
- [Desktop Path Plan](local/docs/CONSOLE-TO-KDE-DESKTOP-PLAN.md) — Canonical plan v6.0 (2026-07-26): kernel → DRM → Mesa → Wayland → KDE
- [Implementation Plan](docs/07-RED-BEAR-OS-IMPLEMENTATION-PLAN.md) — Roadmap and execution model
- [cub Package Manager](local/docs/CUB-PACKAGE-MANAGER.md) — AUR → recipe pipeline, CLI reference, architecture
- [tlc File Manager](local/recipes/tui/tlc/README.md) — Pure-Rust Midnight Commander replacement
+48 -22
View File
@@ -1,7 +1,7 @@
# Red Bear OS: Console → Hardware-Accelerated KDE Plasma Desktop
**Version:** 5.9 (2026-07-21)
**Replaces:** v5.8 (2026-06-21)
**Version:** 6.0 (2026-07-26)
**Replaces:** v5.9 (2026-07-21)
**Replaces:** v5.7 (2026-06-20)
**Replaces:** v5.6 (2026-06-20)
**Replaces:** v4.7 (2026-06-20)
@@ -11,12 +11,28 @@
**Replaces:** v3.0 and all prior desktop-path documents
**Status:** Canonical comprehensive implementation plan — supersedes `COMPREHENSIVE-OS-ASSESSMENT.md`, `DESKTOP-STACK-CURRENT-STATUS.md`, and all layer-specific plans.
### What Changed in v6.0 (2026-07-26)
v5.9 (2026-07-21) predates five fixes that landed in the
`DRIVER-MANAGER-MIGRATION-PLAN.md` v5.x program. v6.0 realigns this canonical
desktop plan with that ground truth. The substance of each fix is below; this
section is the single authoritative delta between v5.9 and v6.0.
| Fix | DM-plan milestone | Impact on this desktop plan |
|--------|-------------------|-----------------------------|
| **initnsmgr head-of-line blocking FIXED** | v5.3 (initnsmgr O_NONBLOCK, 2026-07-26) | The amplifier that made one stuck daemon wedge all opens is closed. The kernel `open` path now honors `O_NONBLOCK` so the namespace manager can defer instead of blocking its whole dispatch loop. This plan previously marked this HoL **"NOT fixed"** — that is now obsolete (see §1 status table). Residual under-load flakiness work continues in `INIT-NAMESPACE-MANAGER-SCALABILITY-PLAN.md`. |
| **Mesa Redox winsys CS submit seqno fix** | v5.0/v5.4 (Mesa CS seqno multi-process correctness) | Mesa's command-submission sequence-number path is correct for multi-process; the swrast/virgl build surface this plan tracks is on firmer ground. |
| **iwlwifi channel fix (G-A4)** | v5.1/v5.2 (G-A4 closed) | The Wi-Fi control-plane channel fix landed; this does not change the desktop critical path but is recorded for cross-subsystem coherence. |
| **redbear-compositor comprehensive fix** | v5.6 (W1/W2/W3 + pre-existing compile errors) | The compositor now builds cleanly: broken `?` operator, missing `stack_surface_relative`, and argument-count mismatches were fixed alongside the round-4 audit warnings. The Wayland compositor proof is on a firmer build foundation. |
| **Qt6 Wayland null+8 guards COMMITTED** | README + v5.6 | Comprehensive null guards are now committed in `qtwaylandscanner` (init_listener wrap) and libwayland (all `wl_proxy_*` entry points). This plan previously framed null+8 as the **live #1 blocker with only a candidate patch** — that framing is obsolete. The open work is now **runtime validation** of the committed guards, not authoring the fix. |
| **KWin now builds successfully** | README + v5.6 | KWin cooks successfully (`redox-drm` + Qt6 Wayland). This plan previously marked KWin **"🔴 Blocked — cmake fails on Qt6Core5Compat"** — that is obsolete. Runtime is still gated on the null+8 runtime validation above. |
### What Changed in v5.9 (2026-07-21)
| Change | Impact |
|--------|--------|
| **`redbear-mini` reaches a working `brush` login — dominant blocker fixed** | The console-login floor of this whole plan now holds on mini: framebuffer ground truth shows `Red Bear login: user` → MOTD → `user@redbear: $``echo RB=$((21*2))=OK``RB=42=OK`, fast (login ~12s, brush ~16s in QEMU q35/KVM). Root cause was an **acpid AML-mutex self-deadlock** (timeout treated as seconds not ms; no owner/recursion → nested acquire self-deadlocks), triggered by cpufreqd reading `/scheme/acpi/processor/CPUn/pss`. Fixed in `local/sources/base` `d78fd44a`; verified against `local/reference/linux-7.1` ACPICA. **This supersedes 16+ sessions of pty/spawn/tokio theories** — the shell never spawned because the whole open path was frozen, not because of anything in login/brush/pty. |
| **Root-caused the amplifier: `initnsmgr` head-of-line blocking (NOT fixed)** | Why one stuck daemon froze the entire system: the init namespace manager (`local/sources/base/bootstrap/src/initnsmgr.rs`) is single-threaded and does a **blocking `openat` inside its dispatch loop**, and every restricted-namespace path resolution proxies through it. So any provider that is briefly not servicing its socket wedges *all* opens (login, getty, init spawn, console). Residual under-load flakiness now wedges at the fbcond→vesad handoff (`display.vesa:v2/2`) via the same mechanism — vesad is a victim, not a bug. Kernel corollary: `open` ignores `O_NONBLOCK` and always blocks (`kernel/src/scheme/user.rs` `call_inner`), so the manager cannot even defer. Full analysis + execution plan (worker-offload / deferred-open / kernel `O_NONBLOCK`-on-open) in **`local/docs/INIT-NAMESPACE-MANAGER-SCALABILITY-PLAN.md`**. |
| **Root-caused the amplifier: `initnsmgr` head-of-line blocking — FIXED (v6.0 / DM-plan v5.3, 2026-07-26)** | Why one stuck daemon froze the entire system: the init namespace manager (`local/sources/base/bootstrap/src/initnsmgr.rs`) is single-threaded and does a **blocking `openat` inside its dispatch loop**, and every restricted-namespace path resolution proxies through it. So any provider that is briefly not servicing its socket wedges *all* opens (login, getty, init spawn, console). Residual under-load flakiness now wedges at the fbcond→vesad handoff (`display.vesa:v2/2`) via the same mechanism — vesad is a victim, not a bug. Kernel corollary: `open` ignored `O_NONBLOCK` and always blocked (`kernel/src/scheme/user.rs` `call_inner`), so the manager could not even defer. **FIXED in v6.0:** the kernel `open` path now honors `O_NONBLOCK` (DM-plan v5.3), closing the head-of-line block. Full analysis + remaining scalability work (worker-offload / deferred-open) in **`local/docs/INIT-NAMESPACE-MANAGER-SCALABILITY-PLAN.md`**. |
### What Changed in v5.8 (2026-06-21)
@@ -102,8 +118,8 @@ and what must happen, in what order, to reach a usable KDE Plasma desktop with h
| **Greeter / Login** | 🟡 SDDM wired, boots to text login | SDDM v0.21.0 + pam-redbear in `redbear-full.toml`; ISO boots to login prompt | Qt6 Wayland null+8 crash blocks graphical SDDM |
| **D-Bus** | 🟢 System bus wired | Build + recipe-level meson fix (2026-06-19) | Session bus |
| **Qt6** | 🟢 Builds | Build (Core+Gui+DBus+Wayland+QML interpreter) | Wayland `null+8` crash blocks runtime |
| **KF6 Frameworks** | 🟡 36/48 build | Build | 12 blocked (Wayland null+8 crash, NOT QML gate) |
| **KDE Plasma** | 🔴 Blocked | Stub + partial builds | Qt6 Wayland null+8 crash, KWin real build |
| **KF6 Frameworks** | 🟡 40/40 build (v6.0) | All frameworks build; KWin cooks successfully | Runtime still gated on Qt6 Wayland null+8 runtime validation (guards committed) |
| **KDE Plasma** | 🟡 Un-deferred, builds (v6.0) | All KF6 frameworks + KWin + plasma-framework + plasma-workspace + plasma-desktop un-deferred in `redbear-full.toml`; KWin builds successfully | Runtime blocked on Qt6 Wayland null+8 runtime validation (guards committed, not yet runtime-proven) |
| **SDDM** | 🟢 Wired (build) | `sddm = {}`, `pam-redbear = {}` in `redbear-full.toml`; `21_sddm.service` init; binaries staged | Qt6 Wayland null+8 crash (QML greeter runtime) |
| **Hardware GPU** | 🔴 Not validated | Source (CS ioctl exists) | Hardware + Mesa HW cross-compile |
| **Wi-Fi / Bluetooth** | 🔴 Host-tested | Source + host tests | Hardware + native stack |
@@ -244,7 +260,7 @@ correct QEMU device.
| libwayland 1.24.0 | 🟢 Builds | Wayland protocol library (target: 1.25.0) |
| wayland-protocols | 🟢 Builds | Protocol XML definitions |
| redbear-compositor | 🟡 Bounded proof | 788-line Rust compositor; 3/3 tests; zero warnings |
| kwin | 🔴 Blocked — cmake fails on Qt6Core5Compat; real build gated on QML/Qt6Quick resolution |
| kwin | 🟡 Builds successfully (v6.0) | Real cmake build now succeeds (`redox-drm` + Qt6 Wayland); previously blocked on a Qt6Core5Compat cmake failure — **resolved**. Runtime still gated on Qt6 Wayland null+8 runtime validation (see §3.1). |
**Known compositor limitations**: SHM fd passing uses payload bytes (not SCM_RIGHTS), framebuffer uses private memory (not real vesad), wire encoding uses NUL-terminated strings (not padded Wayland format). **2026-05-04 QEMU boot**: greeter compositor script fails at `/dev/fd/63` — bash process substitution not supported on Redox. Framebuffer console login prompt works as fallback.
@@ -254,10 +270,15 @@ clients crash with a null+8 segfault in `wl_proxy_add_listener()`. The root caus
without null-checking `proxy` first. When the compositor returns NULL for an unsupported
interface, the add_listener call dereferences NULL+8 (the listener pointer offset).
**Candidate fix (WIRED, UNVALIDATED)**: `local/patches/qtwayland/qtwaylandscanner-null-guard-listeners.patch`
modifies `qtwaylandscanner` to emit `if (proxy) wl_*_add_listener(...)` guards. This patch
IS in qtwayland's `recipe.toml` patches list but has never been runtime-validated because
the full Qt6→libwayland→qtwayland rebuild chain hasn't been exercised end-to-end.
**Fix — comprehensive guards COMMITTED (v6.0), runtime validation open**: As of v6.0
the null guards are no longer a "candidate" — comprehensive null guards are committed in
both `qtwaylandscanner` (init_listener wrap, emitting `if (proxy) wl_*_add_listener(...)`
guards) and libwayland (all `wl_proxy_*` entry points). This matches the README status
("✅ Comprehensive null guards ... committed") and `DRIVER-MANAGER-MIGRATION-PLAN.md` v5.6.
What remains open is **runtime validation**: the full Qt6→libwayland→qtwayland rebuild chain
must be exercised end-to-end and a QML window must render under redbear-compositor to prove
the guards actually fire at the right place. The root cause of why the proxy is ever NULL is
still open (see `QT6-WAYLAND-NULL8-DIAGNOSIS.md` §7 runbook).
**Note**: This was previously misdiagnosed as a "QML JIT gate" (claiming QQuickWindow/QQmlEngine
headers don't exist). That diagnosis was **factually wrong**: 86 QtQuick headers, 83 QtQml
@@ -1883,10 +1904,10 @@ on Redox where the bus becomes available quickly after daemon start.
| Component | Status |
|-----------|--------|
| kwin | 🔴 Blocked — real cmake build requires working Qt6 Wayland runtime (null+8 crash); redbear-compositor provides the kwin_wayland binary as a separate package |
| kwin real build | 🔄 Attempted — gated on Qt6 Wayland null+8 crash resolution |
| plasma-workspace | 🔴 Blocked |
| plasma-desktop | 🔴 Blocked (transitive) |
| kwin | 🟡 Builds successfully (v6.0) — real cmake build now succeeds (`redox-drm` + Qt6 Wayland); runtime gated on Qt6 Wayland null+8 runtime validation. redbear-compositor provides the kwin_wayland binary as a separate package |
| kwin real build | ✅ Builds (v6.0) — previously gated on a Qt6Core5Compat cmake failure, now resolved |
| plasma-workspace | 🟡 Builds, runtime gated — un-deferred in `redbear-full.toml` |
| plasma-desktop | 🟡 Builds, runtime gated — un-deferred in `redbear-full.toml` (transitive) |
| Full Plasma session | 🔴 Not functional |
**CORRECTION — The "QML JIT gate" was FALSE (v5.0, 2026-06-20)**:
@@ -1954,13 +1975,18 @@ User mandate: "kde, qt, wayland - all must be latest versions!"
## 5. Honest Blocker Map
### Critical Path (ordered)
### Critical Path (ordered) — v6.0
> v6.0 note: items [0] (SDDM wiring), [3] (Real KWin build) and the initnsmgr
> HoL amplifier are **DONE**. The comprehensive Qt6 Wayland null+8 guards are
> **COMMITTED**; the live #1 desktop blocker is now their **runtime validation**,
> not authoring the fix.
```
[0] Wire SDDM + pam-redbear into config → login prompt target
[1] Qt6 Wayland null+8 crash resolution unblocks ALL Qt6 Wayland clients
[0] Wire SDDM + pam-redbear into config → DONE (login prompt target)
[1] Qt6 Wayland null+8 RUNTIME VALIDATIONguards committed; prove a QML window renders
[2] SDDM greeter renders under compositor → SDDM login prompt in QEMU
[3] Real KWin build → unblocks plasma-workspace → plasma-desktop
[3] Real KWin build → DONE (v6.0); KWin cooks successfully
[4] Mesa virgl runtime wiring + QEMU -virtio-vga-gl → GPU-accelerated SDDM
[5] Hardware GPU validation → unblocks Mesa HW renderers
[6] ACPI shutdown robustness → release-grade ACPI
@@ -1971,12 +1997,12 @@ User mandate: "kde, qt, wayland - all must be latest versions!"
| # | Blocker | What's needed | Estimated effort | Hardware required |
|---|---------|---------------|-----------------|-------------------|
| 0 | SDDM config wiring | Add sddm + pam-redbear to redbear-full.toml; create init service; configure SDDM compositor path | 2-3 days | No |
| 1 | Qt6 Wayland null+8 crash | Rebuild libwayland→qtbase→qtdeclarative→qtwayland with null-guard patch; validate QML window renders under redbear-compositor | 1-2 weeks | No |
| 0 | SDDM config wiring | Add sddm + pam-redbear to redbear-full.toml; create init service; configure SDDM compositor path | ✅ DONE | No |
| 1 | Qt6 Wayland null+8 runtime validation | Null guards are COMMITTED (qtwaylandscanner + libwayland `wl_proxy_*`). Remaining: rebuild libwayland→qtbase→qtdeclarative→qtwayland end-to-end and validate a QML window renders under redbear-compositor; root-cause why proxy is ever NULL | 1-2 weeks | No |
| 2 | SDDM greeter runtime | SDDM greeter (QML) launches as Wayland client of redbear-compositor; user sees login prompt | 1 week | No |
| 3 | Mesa virgl runtime | Wire missing patches into recipe.toml; test with `-device virtio-vga-gl` | 3-5 days | No (QEMU) |
| 4 | KWin real build | Real cmake build of KWin; requires Qt6 Wayland runtime working | 2-4 weeks | No |
| 5 | Plasma session | plasma-workspace + plasma-desktop cmake builds; requires kirigami + kwin | 2-4 weeks | No |
| 4 | KWin real build | Real cmake build of KWin | ✅ DONE (v6.0) — KWin cooks successfully | No |
| 5 | Plasma session | plasma-workspace + plasma-desktop runtime; packages already build, runtime requires working Qt6 Wayland session | 2-4 weeks | No |
| 6 | HW GPU backend | CS ioctl implementation → Mesa HW renderer cross-compile | 12-20 weeks | Yes — AMD/Intel GPU |
| 7 | ACPI shutdown | Remove panic paths, deterministic `_S5` | 2-4 weeks | No |
| 8 | Bare-metal proof | Real AMD/Intel hardware validation for all layers | 4-8 weeks | Yes — AMD + Intel machines |
+3 -3
View File
@@ -2,9 +2,9 @@
**Implementation status (2026-07-26):** All DBUS plan code artifacts are build-verified. Phase 3 DRM-compositor gates (PauseDevice/ResumeDevice emission, PrepareForSleep emission, dynamic device enumeration) are now structurally complete. **Phase 4 re-enablement progress:** 20/24 KF6 frameworks have USE_DBUS=ON. **redbear-polkit v0.2** now implements real authorization (subject UID extraction, `*` / `@group` / `!uid` / `!@group` policy syntax, default-deny for unknown actions). **redbear-udisks v0.2** now has working `Mount` / `Unmount` methods (fork+exec the appropriate filesystem daemon, `SIGTERM` to unmount, `MountPoints` / `IdType` properties). **redbear-notifications v0.2** now emits the `ActionInvoked` signal via the new `InvokeAction` method. **redbear-upower v0.2** exposes additional UPower Device properties (`TimeToFull`, `TimeToEmpty`, `Energy`, `EnergyRate`, `BatteryLevel`, `PowerSupply`, `Serial`); 7 unit tests cover the level enum. **redbear-statusnotifierwatcher v0.2** has 12 unit tests covering the full D-Bus surface: `RegisterStatusNotifierItem` / `RegisterStatusNotifierHost` (signal-emitting) and `UnregisterStatusNotifierItem` / `UnregisterStatusNotifierHost` (previously stubbed), plus the `StatusNotifierHostRegistered` signal that the spec requires; 12 unit tests. **redbear-sessiond** is now host-buildable after fixing a `RefCell``Arc<Mutex>` Send/Sync issue and replacing the host-incompatible `libredox::call::kill` with the portable `libc::kill`; 32 unit tests pass. **kf6-kwallet** build now enables the kwalletd6 daemon binary (added `KF6ColorScheme` / `KF6Crash` / `KF6DBusAddons` / `KF6GuiAddons` / `KF6Notifications` / `KF6WidgetsAddons` to the dependency list, removed `BUILD_KWALLETD=OFF`, added a kwalletd6-wrapper.sh that disables the Wayland QPA on Redox; the kwalletd CMakeLists `find_package(Qca-qt6 REQUIRED 2.3.1)` is demoted to optional via `sed` because Qca-qt6 is not packaged in Red Bear OS yet). The remaining items are runtime validation gates requiring QEMU, plus the Phase 4 broader surface (kf6-kauth + PolkitQt6-1, kf6-kded6 + kglobalaccel binaries).
**Version:** 3.8 — 2026-07-26
**Status:** Active plan aligned with desktop path v5.9 (2026-07-21)
**Status:** Active plan aligned with desktop path v6.0 (2026-07-26)
**Scope:** Full D-Bus infrastructure for KDE Plasma 6 on Wayland, tightly integrated with Redox scheme IPC
**Parent plan:** `local/docs/CONSOLE-TO-KDE-DESKTOP-PLAN.md` (v5.9, 2026-07-21)
**Parent plan:** `local/docs/CONSOLE-TO-KDE-DESKTOP-PLAN.md` (v6.0, 2026-07-26)
---
@@ -605,7 +605,7 @@ APIs, which relibc provides.
## 8. Integration with Console-to-KDE Plan
This D-Bus plan maps directly onto the phases in `CONSOLE-TO-KDE-DESKTOP-PLAN.md` v5.9 (2026-07-21):
This D-Bus plan maps directly onto the phases in `CONSOLE-TO-KDE-DESKTOP-PLAN.md` v6.0 (2026-07-26):
| Desktop Plan Phase | D-Bus Plan Phase | What D-Bus delivers |
|---|---|---|
+75 -48
View File
@@ -1,55 +1,82 @@
# Hardware Validation Matrix — Red Bear OS
| Component | QEMU | Bare Metal | Notes |
|-----------|------|------------|-------|
| **Storage** | | | |
| AHCI SATA | ✅ | 🔲 | NCQ structure present, not runtime-validated |
| NVMe | 🔲 | 🔲 | Basic driver, no multiqueue |
| virtio-blk | ✅ | N/A | QEMU only |
| **Network** | | | |
| e1000 | 🔲 | 🔲 | ITR structure present, no offload validation |
| rtl8168 | 🔲 | 🔲 | PHY config present, not runtime-tested |
| virtio-net | | N/A | QEMU only |
| **Audio** | | | |
| Intel HDA | 🔲 | 🔲 | Codec detection + jack sense added, not validated |
| AC97 | 🔲 | 🔲 | Basic driver |
| **Input** | | | |
| PS/2 | ✅ | 🔲 | QEMU keyboard/mouse work |
| USB HID | | 🔲 | Keyboard/mouse autospawn via test-usb-qemu.sh (P1 hardening); not validated on real HW |
| **USB** | | | |
| xHCI host controller | ✅ | 🔲 | Interrupt-driven mode proven (test-xhci-irq-qemu.sh); 51-flag quirk table + HCCPARAMS2 gating (P2-A/B); 36-code error recovery (P2-C); not HW-validated |
| EHCI/UHCI/OHCI controllers | 🔲 | 🔲 | Compile clean; runtime enumeration proofs planned (P8-B) |
| USB storage (BOT) | ✅ | 🔲 | usbscsid autospawn + bounded sector readback proven (test-usb-storage-qemu.sh); guest-side write verify open |
| USB hub (non-root) | ✅ | 🔲 | Hub + hub-child enumeration proven in QEMU (test-usb-hub-qemu.sh): hub descriptor/EP1/scan/debounce/reset→enable, and usb-kbd behind hub enumerates to HID subdriver (class 3.1 keyboard); "reactor race" root-caused to startup latency under load (not a deadlock) |
| **GPU/Display** | | | |
| VESA | ✅ | 🔲 | QEMU framebuffer works |
| virtio-gpu | | N/A | 2D only, QEMU |
| **CPU/Power** | | | |
| cpufreqd | 🔲 | 🔲 | Governors implemented, not HW-validated |
| thermald | 🔲 | 🔲 | ACPI thermal zones, not HW-validated |
| **SMP** | | | |
| x2APIC/SMP | ✅ | ✅ | Multi-core works |
| **Driver Manager (driver-manager vs pcid-spawner)** | | | |
| D1 P0 capabilities (C1 dynids + C2 remove + C3 enable + C4 BAR) | ✅ | 🔲 | Code complete; 52 tests pass; see `local/docs/evidence/driver-manager/D5-AUDIT.md` |
| D1 P1 SpawnDecision + format coexistence + policy blacklist | ✅ | 🔲 | `spawn_decision_gate()` consults env/CLI/blacklist; `convert_legacy` reads legacy pcid.d format |
| D1 P1 PciQuirkFlags wired into spawn | | 🔲 | `driver-manager/src/quirks.rs` consumes `redox-driver-sys`; NEED_FIRMWARE defers probe; NO_MSIX/NO_MSI/FORCE_LEGACY_IRQ signal intx-fallback via env; DISABLE_ACCEL signals accel-disable |
| D1 P1 `/etc/driver-manager.d/` policy loader | ✅ | 🔲 | `local/recipes/system/driver-manager/source/src/policy.rs`; reads TOML blacklist; consulted at probe |
| D2 SMP concurrent probe (worker pool over `std::thread::scope`) | ✅ | 🔲 | `redox-driver-core/src/concurrent.rs` with `CountingSemaphore`; tested on host; opt-in via `--concurrent=N` |
| D2 PM hooks (Driver::suspend/resume + signal_then_collect) | ✅ | 🔲 | Real SIGTERM/SIGKILL in `DriverConfig`; needs iommu/pcid SetPowerState wiring for actual D3 |
| D2 AER foundation (Driver::on_error + ErrorSeverity + RecoveryAction) | ✅ | 🔲 | Trait API complete; needs pcid AER wake source |
| D2 C-state / P-state / IOMMU / MSI-X / NUMA helpers | ✅ Library | 🔲 HW | `redox-driver-core/src/modern_technology.rs` concrete implementations; no driver-manager wrapper (orchestrator removed at v1.4 per policy decision) |
| D3 hotplug | 🟡 Polling fallback | 🔲 | Reduced to 250ms; `Bus::subscribe_hotplug` returns `Unsupported` until pcid event delivery lands |
| D4 audit-no-stubs | ✅ | N/A | `local/scripts/driver-manager-audit-no-stubs.py` scans 38 files; **0 violations** at v1.7 |
| D4 SIGHUP reload worker | ✅ | N/A | `driver-manager/src/sighup.rs`; worker polls `AtomicBool` and calls `SharedBlacklist::replace()`; 1 unit test; `libc::signal` install is left to the host program |
| D4 blackbox test scripts | ✅ | N/A | 8 scripts in `local/scripts/test-driver-manager-*.sh` |
| D4 heartbeat publisher | ✅ | N/A | `driver-manager/src/heartbeat.rs`; writes JSON to `/var/run/driver-manager.heartbeat.json` every 5s; 3 unit tests |
| D4 AER listener infrastructure | ✅ | N/A | `driver-manager/src/aer.rs`; polls `/scheme/acpi/aer`; 7 unit tests; falls back to log-and-no-op when scheme is absent |
| C0 dormant service files | | N/A | Committed in `local/sources/base` submodule (commit `0407d9cc`); both `ConditionPathExists`-gated |
| D5 feature-complete gate | ✅ Code | 🔲 HW | All code + tests pass; awaiting real-hardware validation on AMD Threadripper + Intel Alder Lake |
| Component | QEMU | Bare Metal | Hardware | Notes |
|-----------|------|------------|----------|-------|
| **Storage** | | | | |
| AHCI SATA | ✅ | 🔲 | [MISSING] | NCQ structure present, not runtime-validated. No AHCI-capable SATA controller inventoried for bare-metal testing. |
| NVMe | 🔲 | 🔲 | [AVAILABLE] (LG Gram: SK Hynix [1c5c:1959]) | Basic driver, no multiqueue. NVMe is class-matched (`class=1 subclass=8`), initfs-capable. The LG Gram's NVMe is available for Phase 1 BM validation. |
| virtio-blk | ✅ | N/A | N/A | QEMU only |
| **Network** | | | | |
| e1000d (Intel Gigabit) | ✅ (e1000e emul.) | 🔲 | [MISSING] | ITR structure present, no offload validation. QEMU `-device e1000e` emulates 82574L `8086:10d3` — proven bounded (DHCP+ping). Physical e1000/e1000e NIC not identified in any inventoried bench. Modern I219/I225 NOT supported. |
| rtl8168d (Realtek Gigabit) | 🔲 (no QEMU emul.) | 🔲 | [MISSING] | PHY config present. QEMU has no rtl8168 model — must be tested bare metal. No physical RTL8168/8169 NIC identified in any bench. |
| rtl8139d (Realtek Fast Eth.) | 🔲 (QEMU avail., not proven) | 🔲 | [DEFERRED] | Legacy 10/100 NIC. QEMU `-device rtl8139` available but not runtime-proven. Physical RTL8139: legacy PCI, deprioritized vs. gigabit.+ |
| ixgbed (Intel 10GbE) | 🔲 (no QEMU emul.) | 🔲 | [MISSING] | Port of ixy.rs, <1000 LoC, MSI-X. 40 PCI IDs supported (82599 family). No physical 10GbE NIC (X520/X540/X550) inventoried. |
| virtio-netd (VirtIO) | ✅ (MSI-X proven) | N/A | N/A | QEMU only. MSI-X + bounded VM networking baseline proven. |
| redbear-iwlwifi (Intel Wi-Fi) | 🔲 (VFIO only) | 🔲 | [AVAILABLE] (LG Gram BE201 [8086:7740]) | MVM candidates: AX210/AX211/AX201/9462 (all [MISSING] hardware). MLD candidates: BE201 [8086:7740] (only MLD device — [AVAILABLE] in LG Gram). VFIO/passthrough framework exists; no emulated Wi-Fi in QEMU. Firmware pre-staged for BE201 c101c106. MLD Rust layer code-complete (23 tests), never HW-validated. See `HARDWARE-NETWORKING-INVENTORY.md` §2.6. |
| redbear-ecmd (USB CDC ECM) | 🔲 (not tested) | 🔲 | [MISSING] | USB CDC ECM/NCM driver for USB-Ethernet dongles. No dongle inventoried. **Critical: only viable interim network for LG Gram (no wired NIC).** |
| **Audio** | | | | |
| Intel HDA | 🔲 | 🔲 | [AVAILABLE] (LG Gram: cAVS/SOF [8086:7728]) | Codec detection + jack sense added, not validated. LG Gram HDA is cAVS/DSP-based legacy HDA cannot reach ALC298 codec behind DSP; needs SOF port. |
| AC97 | 🔲 | 🔲 | [MISSING] | Basic driver. No AC97 hardware inventoried. |
| **Input** | | | | |
| PS/2 | ✅ | 🔲 | [AVAILABLE] (LG Gram: i8042 keyboard, AUX disabled) | QEMU keyboard/mouse work. LG Gram has PS/2 keyboard (AUX port disabled — handled by ps2d). |
| USB HID | ✅ | 🔲 | [AVAILABLE] (LG Gram: USB keyboard/mouse attachable) | Keyboard/mouse autospawn via test-usb-qemu.sh (P1 hardening); not validated on real HW. |
| I2C-HID Touchpad | 🔲 | 🔲 | [AVAILABLE] (LG Gram: 04CA:00CC on LPSS DesignWare I2C) | Full I2C chain code-complete (dw-i2c engine, LPSS PCI bring-up, i2c-hidd with multitouch parser). Runtime proof pending Phase 1 boot. |
| **USB** | | | | |
| xHCI host controller | ✅ | 🔲 | [AVAILABLE] (LG Gram: 2× xHCI [8086:7ec0, 8086:777d]) | Interrupt-driven mode proven (test-xhci-irq-qemu.sh); 51-flag quirk table + HCCPARAMS2 gating (P2-A/B); 36-code error recovery (P2-C); not HW-validated. LG Gram quirks decoded (SPURIOUS_SUCCESS, INTEL_HOST, AVOID_BEI, LPM_SUPPORT). |
| EHCI/UHCI/OHCI controllers | 🔲 | 🔲 | [MISSING] | Compile clean; runtime enumeration proofs planned (P8-B). No EHCI/UHCI/OHCI hardware identified in inventoried benches. |
| USB storage (BOT) | ✅ | 🔲 | [AVAILABLE] (any USB mass-storage device) | usbscsid autospawn + bounded sector readback proven (test-usb-storage-qemu.sh); guest-side write verify open. |
| USB hub (non-root) | | 🔲 | [MISSING] | Hub + hub-child enumeration proven in QEMU (test-usb-hub-qemu.sh): hub descriptor/EP1/scan/debounce/reset→enable, and usb-kbd behind hub enumerates to HID subdriver (class 3.1 keyboard); "reactor race" root-caused to startup latency under load (not a deadlock). No physical hub inventoried. |
| **GPU/Display** | | | | |
| VESA | ✅ | 🔲 | [AVAILABLE] (LG Gram: GOP framebuffer) | QEMU framebuffer works. LG Gram VESA via GOP framebuffer — vesad fix for bare metal landed (2026-06-19). |
| virtio-gpu | ✅ | N/A | N/A | 2D only, QEMU |
| redox-drm (Intel MTL iGPU) | 🔲 | 🔲 | [AVAILABLE] (LG Gram: MTL [8086:7d51]) | 0x7D51 in INTEL_GEN12_MTL_IDS. DMC load, GMBUS EDID, CPU PWM backlight, GuC/HuC/GSC manifest — all code-complete (2026-07-22). Display init assumes Gen8-era reg layout. No HW validation. |
| **CPU/Power** | | | | |
| cpufreqd | 🔲 | 🟡 (BM MSR path fixed) | [AVAILABLE] (LG Gram: Arrow Lake-H HWP) | Governors implemented, MSR path fixed (2026-06-19). Bare-metal boot verified with HWP on Intel laptop. Not yet validated on LG Gram specifically. |
| thermald | 🔲 | 🔲 | [AVAILABLE] (LG Gram: TZ00 + MSR-based) | ACPI thermal zones, not HW-validated. MSR fallback path exists. |
| **SMP** | | | | |
| x2APIC/SMP | ✅ | ✅ | [AVAILABLE] (Threadripper 128-thread + LG Gram 16-core hybrid) | Multi-core works. AMD Threadripper 128-thread bare-metal proven. Intel Arrow Lake-H 16-core hybrid (P/E/LP-E) expected. |
| **Driver Manager (driver-manager vs pcid-spawner)** | | | | |
| D1 P0 capabilities (C1 dynids + C2 remove + C3 enable + C4 BAR) | ✅ | 🔲 | N/A (code) | Code complete; 52 tests pass; see `local/docs/evidence/driver-manager/D5-AUDIT.md` |
| D1 P1 SpawnDecision + format coexistence + policy blacklist | ✅ | 🔲 | N/A (code) | `spawn_decision_gate()` consults env/CLI/blacklist; `convert_legacy` reads legacy pcid.d format |
| D1 P1 PciQuirkFlags wired into spawn | ✅ | 🔲 | N/A (code) | `driver-manager/src/quirks.rs` consumes `redox-driver-sys`; NEED_FIRMWARE defers probe; NO_MSIX/NO_MSI/FORCE_LEGACY_IRQ signal intx-fallback via env; DISABLE_ACCEL signals accel-disable |
| D1 P1 `/etc/driver-manager.d/` policy loader | ✅ | 🔲 | N/A (code) | `local/recipes/system/driver-manager/source/src/policy.rs`; reads TOML blacklist; consulted at probe |
| D2 SMP concurrent probe (worker pool over `std::thread::scope`) | ✅ | 🔲 | N/A (code) | `redox-driver-core/src/concurrent.rs` with `CountingSemaphore`; tested on host; opt-in via `--concurrent=N` |
| D2 PM hooks (Driver::suspend/resume + signal_then_collect) | ✅ | 🔲 | N/A (code) | Real SIGTERM/SIGKILL in `DriverConfig`; needs iommu/pcid SetPowerState wiring for actual D3 |
| D2 AER foundation (Driver::on_error + ErrorSeverity + RecoveryAction) | ✅ | 🔲 | N/A (code) | Trait API complete; needs pcid AER wake source |
| D2 C-state / P-state / IOMMU / MSI-X / NUMA helpers | ✅ Library | 🔲 HW | N/A (code) | `redox-driver-core/src/modern_technology.rs` — concrete implementations; no driver-manager wrapper (orchestrator removed at v1.4 per policy decision) |
| D3 hotplug | 🟡 Polling fallback | 🔲 | N/A (code) | Reduced to 250ms; `Bus::subscribe_hotplug` returns `Unsupported` until pcid event delivery lands |
| D4 audit-no-stubs | ✅ | N/A | N/A (code) | `local/scripts/driver-manager-audit-no-stubs.py` scans 38 files; **0 violations** at v1.7 |
| D4 SIGHUP reload worker | ✅ | N/A | N/A (code) | `driver-manager/src/sighup.rs`; worker polls `AtomicBool` and calls `SharedBlacklist::replace()`; 1 unit test; `libc::signal` install is left to the host program |
| D4 blackbox test scripts | ✅ | N/A | N/A (code) | 8 scripts in `local/scripts/test-driver-manager-*.sh` |
| D4 heartbeat publisher | ✅ | N/A | N/A (code) | `driver-manager/src/heartbeat.rs`; writes JSON to `/var/run/driver-manager.heartbeat.json` every 5s; 3 unit tests |
| D4 AER listener infrastructure | ✅ | N/A | N/A (code) | `driver-manager/src/aer.rs`; polls `/scheme/acpi/aer`; 7 unit tests; falls back to log-and-no-op when scheme is absent |
| C0 dormant service files | ✅ | N/A | N/A (code) | Committed in `local/sources/base` submodule (commit `0407d9cc`); both `ConditionPathExists`-gated |
| D5 feature-complete gate | ✅ Code | 🔲 HW | [AVAILABLE] (Threadripper AMD + LG Gram Intel Alder Lake class) | All code + tests pass; awaiting real-hardware validation on AMD Threadripper + LG Gram Arrow Lake-H. |
✅ = validated 🔲 = implemented, not validated N/A = not applicable
✅ = validated 🔲 = implemented, not validated 🟡 = partial N/A = not applicable
### Status note (2026-07-20)
### Hardware Status Codes (new, 2026-07-26)
| Code | Meaning |
|------|---------|
| `[AVAILABLE]` | Physical hardware present and accessible to operator |
| `[MISSING]` | Hardware not present / not acquired — blocks bare-metal validation for this component |
| `[DEFERRED]` | Hardware present or acquirable but not yet integrated into the test bench |
| `N/A` | Not applicable: component is virtual (e.g. virtio), code-only, or has no hardware dependency |
See `local/docs/HARDWARE-NETWORKING-INVENTORY.md` for full hardware bench inventory,
per-driver PCI ID tables, Wi-Fi AP/card/firmware details, peer system specs, and
acquisition recommendations. That document is the canonical hardware inventory for
this validation matrix.
### Status note (2026-07-26)
- **Hardware inventory created:** `local/docs/HARDWARE-NETWORKING-INVENTORY.md` is the new Phase -1 gate. It enumerates all known hardware, marks missing items, and lists acquisition priorities.
- **Critical networking gaps:** (1) Threadripper build host NIC inventory never collected — operator must check. (2) No USB-Ethernet dongle for LG Gram interim networking. (3) No dedicated Wi-Fi AP for bounded validation. (4) No physical Intel/Realtek NIC cards for bare-metal Ethernet validation.
- **LG Gram hardware available:** Intel BE201 [8086:7740] Wi-Fi, NVMe SK Hynix, 2× xHCI, Intel MTL iGPU [8086:7d51], I2C-HID touchpad, PS/2 keyboard, Arrow Lake-H HWP — all mapped to drivers in this matrix. Phase 1 BM boot is the gate.
- **Network matrix expanded from 3 rows to 8 rows** (added: rtl8139d, ixgbed, redbear-iwlwifi, redbear-ecmd) — per the systematic networking fix plan, all network drivers must be tracked individually with hardware availability.
### Prior Status note (2026-07-20)
- The login-based QEMU proofs (PS/2 + serio, monotonic timer, IOMMU first-use, USB storage BOT)
now run through `local/scripts/qemu-login-expect.py` (stdlib python) instead of the host
+16 -7
View File
@@ -20,12 +20,21 @@ Every greeter-critical component now compiles and produces a pkgar:
**`redbear-compositor`**, **`redbear-greeter`**. (The greeter runs on
redbear-compositor, NOT KWin — KWin is post-login and deferred.)
**Sole remaining ISO blocker: `driver-manager`**fails with `Arc does not
implement Copy` (main.rs:390) because it compiles against the operator's
in-progress **redox-driver-sys** (`unified_events`/`redox_driver_core`, dirty
working tree). It is boot-critical (spawns redox-drm → `/scheme/drm/card0` for
the display) so cannot be excluded. When it compiles, `make live` assembles the
ISO. Left untouched — operator's active WIP.
**Sole remaining ISO blocker (2026-07-25 snapshot): `driver-manager`**at
the time of this milestone it failed with `Arc does not implement Copy`
(main.rs:390) because it compiled against the operator's in-progress
**redox-driver-sys** (`unified_events`/`redox_driver_core`, dirty working
tree). It is boot-critical (spawns redox-drm → `/scheme/drm/card0` for the
display) so cannot be excluded.
> **STATUS UPDATE (2026-07-26): RESOLVED.** The `Arc`/`Copy` move-bug was fixed
> (commits `2a65fb760d`, `4822c85e5c` — clone `Arc` for the listener closures)
> and the driver-manager cutover completed (operator-ratified, 2026-07-23/24):
> `driver-manager` is the sole PCI match/claim/spawn daemon in every
> `redbear-*` config and compiles cleanly. `pcid-spawner` is fully retired.
> See `local/docs/DRIVER-MANAGER-MIGRATION-PLAN.md` (v5.6). The ISO now
> assembles via `make live`; the open work is **runtime display validation in
> QEMU** (seeing the SDDM/greeter prompt on the framebuffer), not compilation.
**Post-login desktop deferred** (kwin/plasma/kirigami/konsole/kf6-ksvg/… — 42
packages outside the greeter closure) via `# GREETER-DEFER` comments in
@@ -65,7 +74,7 @@ guard, kf6-kwindowsystem Wayland-plugin disable, mesa patch-path linking, stale
| 2 | **VirGL determinism:** redox-drm wins virtio-gpu bind (priority-61 vendor 0x1AF4) so KWin gets a real `card0` instead of virtio-gpud's VT scanout | **DONE** `a00c13e5` |
| R | Rust components compile-verified: `redox-drm` ✓, `redbear-compositor` ✓ (x86_64-redox) | **DONE** |
| 3 | Full build campaign: mesa → libdrm → qt6 → kf6 → kwin → sddm; fix each compile failure | **TODO** (needs cook) |
| 4 | Qt6 Wayland `null+8`: candidate patch wired (`qtwaylandscanner-null-guard-listeners.patch`) but NOT runtime-validated in isolation; root cause (why proxy NULL) open — see `QT6-WAYLAND-NULL8-DIAGNOSIS.md` §7 runbook | **TODO** (runtime) |
| 4 | Qt6 Wayland `null+8`: comprehensive null guards committed in qtwaylandscanner (init_listener wrap) and libwayland (all `wl_proxy_*` entry points) per README + `DRIVER-MANAGER-MIGRATION-PLAN.md` v5.6; **runtime not yet validated** in isolation (root cause of why the proxy is ever NULL still open — see `QT6-WAYLAND-NULL8-DIAGNOSIS.md` §7 runbook) | **GUARDS COMMITTED, RUNTIME OPEN** |
| 5 | Boot redbear-full (QEMU virtio-gpu, `-m 4G`) → observe SDDM greeter on framebuffer | **TODO** |
## Upstream cherry-pick candidates (enabling, not required yet)
@@ -1,5 +1,21 @@
# Upstream Sync Procedure for Local Forks
> **SUPERSEDED (2026-07-26):** The PCI-driver-spawner sections below were
> written during the 2026-07-20 consolidation, when PCI driver spawning was
> consolidated on `pcid-spawner`. **That model is obsolete.**
> `pcid-spawner` was **retired and removed** on 2026-07-24;
> `driver-manager` (`local/recipes/system/driver-manager/`) is now the sole
> live PCI match/claim/spawn daemon in every `redbear-*` config
> (operator-ratified cutover, 2026-07-23/24). The canonical current authority
> is `local/docs/DRIVER-MANAGER-MIGRATION-PLAN.md` (v5.6).
>
> **This document is kept as historical reference for the upstream-sync
> *procedure* only.** The general procedure (Steps 112, the package-specific
> notes, the keep-vs-drop decision matrix, and the rollback procedure) is still
> valid. The two PCI-architecture sections at the end ("driver-manager:
> Deferred" and "pcid + pcid-spawner Architecture") describe the *pre-cutover*
> state and are annotated in-place below; do not act on them as current.
**Created:** 2026-06-18
**Scope:** relibc, kernel, bootloader, installer, redoxfs, userutils, base
**Baseline:** Red Bear OS 0.1.0 release archive (legacy); current development is on the 0.3.1 branch with sources from local/sources/ forks
@@ -717,36 +733,46 @@ This applies to:
- Build system patches and scripts
- Any file under `local/` or `config/redbear-*`
### driver-manager: Deferred (consolidated onto pcid-spawner, 2026-07-20)
### driver-manager: LIVE (operator-ratified cutover, 2026-07-23/24)
**Status:** Red Bear internal project, currently **deferred**. Upstream Redox
does NOT have an equivalent.
> **HISTORICAL NOTE (2026-07-26):** This section previously described
> `driver-manager` as "Deferred (consolidated onto pcid-spawner,
> 2026-07-20)". **That was the pre-cutover state and is now obsolete.** The
> text below has been updated to the current ground truth. See
> `local/docs/DRIVER-MANAGER-MIGRATION-PLAN.md` (v5.6) for the canonical
> authority.
**Status:** Red Bear internal project, **LIVE**. Upstream Redox does NOT have
an equivalent.
`driver-manager` (`local/recipes/system/driver-manager/`) is a combined PCI
enumeration + driver matching + hotplug daemon intended to eventually replace
the upstream `pcid + pcid-spawner` pair. It was developed because upstream's
PCI driver launching was not ready for Red Bear's needs (advanced driver
matching via `/lib/drivers.d/*.toml`, ACPI device enumeration, hotplug event
handling).
enumeration + driver matching + hotplug daemon that replaces the upstream
`pcid + pcid-spawner` pair. It was developed because upstream's PCI driver
launching was not ready for Red Bear's needs (advanced driver matching via
`/lib/drivers.d/*.toml`, ACPI device enumeration, hotplug event handling).
**As of 2026-07-20 (Task 3 consolidation), PCI driver spawning is consolidated
on `pcid-spawner`.** The driver-manager migration was stalled: it was written
and packaged, but never actually wired in — its `00_driver-manager.service`
ran `cmd="pcid-spawner"` (the legacy binary), while the base recipe's
`00_pcid-spawner.service` (`oneshot_async`) was the live spawner. Both
services launched `pcid-spawner` asynchronously, so `pcid-spawner` started
TWICE and raced to spawn the same drivers. The consolidation dropped the
unused `driver-manager = {}` package and the duplicate
`00_driver-manager.service`, and pointed `13_driver-params.service`
`requires_weak` at `00_pcid-spawner.service`. The driver-manager recipe
source is kept for the future migration.
**As of the 2026-07-23/24 cutover (operator-ratified), driver-manager owns the
boot-time PCI match/claim/spawn path in every `redbear-*` config,
unconditionally.** `pcid-spawner` was **fully retired and removed** from
configs, services, build wiring, and the tree (its source is preserved in git
history). The earlier 2026-07-20 "consolidation onto pcid-spawner" was a
transient intermediate state that has since been superseded by the completed
driver-manager migration.
Key cutover facts (per `DRIVER-MANAGER-MIGRATION-PLAN.md` v5.6):
- claim-via-channel collapse (`ENOLCK` exclusivity — the former pcid-spawner
model) is the live claim path;
- spawned-mode `pci_register_driver` in linux-kpi honors `PCID_CLIENT_CHANNEL`,
with driver-manager the single owner of match-claim-spawn for both native
and Linux-port daemons;
- the QEMU runtime gate passed (initfs ahcid bind, switchroot, rootfs e1000d
concurrent bind, scheme live, resident hotplug loop).
**Upstream may provide its own solution in the future.** If and when upstream
Redox offers a concrete, working replacement that matches or exceeds
driver-manager's capabilities — or when Red Bear completes the driver-manager
migration — notify the user for a route decision. Until then, `pcid-spawner`
(the base recipe's `00_pcid-spawner.service`, `oneshot_async`) is the sole
PCI driver spawner.
driver-manager's capabilities, notify the user for a route decision. Until
then, `driver-manager` (its `00_driver-manager.service`) is the sole PCI
driver spawner.
### Systemic Sync Flaw (2026-06 Incident)
@@ -771,20 +797,31 @@ were silently dropped because upstream doesn't have them.
must NEVER be removed.
5. Any removal must be explicitly approved by the user.
### pcid + pcid-spawner Architecture
### PCI Driver Spawning Architecture (current: driver-manager)
**Upstream model:**
> **HISTORICAL NOTE (2026-07-26):** This section previously described the
> `pcid + pcid-spawner` pair as the live spawner ("Red Bear model (current,
> since the 2026-07-20 consolidation)"). **That is obsolete.** The text below
> has been updated to the current ground truth. See
> `local/docs/DRIVER-MANAGER-MIGRATION-PLAN.md` (v5.6) for the canonical
> authority.
**Upstream model (historical reference):**
1. `pcid` creates `/scheme/pci` (PCI bus enumeration)
2. `pcid-spawner` reads `/scheme/pci` and launches drivers per `pcid.d/*.toml`
**Red Bear model (current, since the 2026-07-20 consolidation):**
**Red Bear model (current, since the 2026-07-23/24 cutover):**
1. `pcid` creates `/scheme/pci` (initfs service `35_pcid.service`)
2. `pcid-spawner --initfs` launches critical boot drivers (initfs)
3. `pcid-spawner` (the base recipe's `00_pcid-spawner.service`,
`oneshot_async`) is the sole PCI driver spawner on the rootfs side
2. `driver-manager` is the sole PCI match/claim/spawn daemon on both initfs
and rootfs. It owns the boot-time PCI device match/claim/spawn path for
native Redox daemons and Linux-port drivers (via `PCID_CLIENT_CHANNEL` /
spawned-mode `pci_register_driver` in linux-kpi).
3. `pcid-spawner` has been **retired and removed** (2026-07-24); its source is
preserved in git history only.
**Key learning:** Without `35_pcid.service` in initfs, `/scheme/pci` is never
created, and BOTH `pcid-spawner` (initfs and rootfs) fail with ENODEV. This
was masked in 0.2.3 because driver-manager did its own PCI enumeration via
`redox_driver_pci` and didn't depend on `/scheme/pci`. driver-manager is now
deferred (see above); the live path is `pcid` + `pcid-spawner`.
**Key learning (still valid):** Without `35_pcid.service` in initfs,
`/scheme/pci` is never created, and driver-manager's rootfs spawner fails with
ENODEV. This was masked in 0.2.3 because driver-manager (then deferred) did its
own PCI enumeration via `redox_driver_pci` and didn't depend on `/scheme/pci`.
After the cutover, driver-manager consumes `/scheme/pci` like the rest of the
stack, so `35_pcid.service` is a hard boot dependency.
@@ -16,7 +16,7 @@
--- ./CMakeLists.txt
+++ ./CMakeLists.txt
@@ -76,5 +76,5 @@
add_definitions(-DTRANSLATION_DOMAIN="kcmutils6")
add_definitions(-DTRANSLATION_DOMAIN=\"kcmutils6\")
-ki18n_install(po)
+#ki18n_install(po) # translations deferred
add_subdirectory(src)
@@ -16,6 +16,8 @@ linux-kpi = { path = "../../linux-kpi/source" }
[target.'cfg(target_os = "redox")'.dependencies]
redox-driver-sys = { path = "../../redox-driver-sys/source", features = ["redox"] }
pcid_interface = { path = "../../../../sources/base/drivers/pcid", package = "pcid" }
libredox = { path = "../../../../../local/sources/libredox" }
syscall = { package = "redox_syscall", path = "../../../../../local/sources/syscall", features = ["std"] }
[patch.crates-io]
redox-driver-sys = { path = "../../redox-driver-sys/source" }
@@ -28,8 +28,17 @@ DYNAMIC_INIT
HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build"
<<<<<<< Updated upstream
redbear_qt_link_sysroot_dirs "${COOKBOOK_SYSROOT}" plugins mkspecs metatypes modules qml
=======
redbear_qt_link_sysroot_dirs "${COOKBOOK_SYSROOT}" plugins mkspecs metatypes modules
# The local source tree is now at upstream 6.27.0 with QML/Quick/kcmshell
# restored. Only poqm translations remain disabled (lupdate/lrelease not yet
# built for target). The Red Bear-specific changes live as a durable external
# patch in local/patches/kf6-kcmutils/.
>>>>>>> Stashed changes
REDBEAR_PATCHES_DIR="${REDBEAR_PATCHES_DIR:-$(cd "$(dirname "${COOKBOOK_RECIPE}")/../../../.." && pwd)}/local/patches/kf6-kcmutils"
cookbook_apply_patches "${REDBEAR_PATCHES_DIR}"
@@ -74,7 +74,11 @@ ecm_set_disabled_deprecation_versions(
ecm_find_qmlmodule(org.kde.kirigami REQUIRED)
add_definitions(-DTRANSLATION_DOMAIN=\"kcmutils6\")
<<<<<<< Updated upstream
#ki18n_install(po) # translations deferred
=======
#ki18n_install(po) # translations deferred until lupdate/lrelease is built for target
>>>>>>> Stashed changes
add_subdirectory(src)
add_subdirectory(tools)
if(BUILD_TESTING)
+99
View File
@@ -2375,3 +2375,102 @@ cooperation that TLC does not currently have:
- **File listing** dialog (F9→Command→File listing): requires an
archive-format implementation in `ops/info.rs` that is out of
scope for MC parity.
---
## 13. Round 4 Progress (2026-07-26)
Round 4 closed the remaining "not yet wired" stubs in dispatch paths
and removed obsolete docs.
### 13.1 Macro replay consumption (handlers.rs)
Previously EditorCmd::MacroRepeat loaded the buffer into a
`MacroReplayEngine` and stored it in `self.macro_replay`, but
`handle_key` never drained it. Round 4 wires the consumption:
each call to `handle_key` pops the next replay key from the
engine, recursively dispatches it through `handle_key` (matching
MC's pacing — the editor redraws between steps), and keeps the
engine running until all queued steps are exhausted. The Ctrl-P
handler still plays the macro synchronously via the existing
for-loop, so the existing `macro_replay` field is a parallel path
that EditorCmd::MacroRepeat loads but does not consume.
### 13.2 Window operations (dispatch.rs)
Replaces the "window manager control not yet wired" stubs with real
behavior. WindowMove enters a move mode where arrow keys emit
CSI-windowManipulation sequences to the parent terminal (the
parent terminal or window manager decides how to handle them).
WindowResize enters a resize mode with CSI-windowResize sequences.
WindowFullscreen emits the xterm OSC 1049 sequence (`\x1b[?1049h`)
to the parent terminal. Esc cancels an active move/resize mode.
The move/resize modes are wired in `handle_key` (`handlers.rs:128`)
to intercept arrow keys and emit the right escape sequence based
on direction. The editor buffer is unchanged during a move/resize
session.
WindowNext/Prev/List retain their existing no-op status messages
since TLC is single-window; they describe the MC semantics so the
user knows the keys are recognised.
New `Editor` fields: `window_move_mode`, `window_resize_mode`.
### 13.3 Nroff toggle gate (text.rs)
The viewer ToggleNroff command toggled `v.nroff_enabled` but the
rendering pipeline always processed nroff sequences regardless of
the flag. Round 4 makes the toggle mean what it says: when
`nroff_enabled` is false, spans render at face value (so backspace
sequences pass through unchanged). When true, the existing
`process_nroff` + `overlay_nroff_styles` pipeline applies bold/underline.
The processing code (`nroff.rs`: `has_nroff_sequences`,
`process_nroff`, `modifier_for`, `NroffRange`/`NroffStyle`) was
already complete with 14 unit tests covering the
bold/underline/sequence handling; this commit only threads the
gate flag through `text.rs:298`.
### 13.4 Stale doc archive
Two previous planning docs have been archived to
`legacy-superseded-2026-07-25/`:
- `IMPROVEMENT-PLAN.md` (2026-06-18, claimed ~65% parity at 698
tests) — archived with a `SUPERSEDED.md` audit log entry. Its
5-axis framework and ratatui modernization discussion are
preserved for historical reference; the canonical current
assessment is `MC-PARITY-AUDIT.md`.
- `PLAN.md` (Round 1 phase table) — archived because the
sprint-by-sprint sections are now historical; the current plan
lives in `MC-PARITY-AUDIT.md` Round 1-4 status sections.
The recipe root is now: `README.md`, `MC-PARITY-AUDIT.md`,
`recipe.toml`, `source/`, `target/`, `dist/`,
`legacy-superseded-2026-07-25/`. README.md and SUPERSEDED.md
were updated to reflect both archives.
### 13.5 Verification
| Surface | Tests | Status |
|---|---|---|
| TLC unit tests | 1486 | ✅ all pass |
| Cookbook unit tests | 43 | ✅ all pass |
| Cargo build (workspace) | clean | ✅ |
### 13.6 Remaining gaps (carried forward from §11.5)
These items are unchanged from Round 3 and still require external
cooperation that TLC does not currently have:
- **Nroff backspace-overstrike** in the new "false" branch: spans
render at face value, so backspace sequences pass through
unchanged. Round 4 only added the gate flag; the actual
preprocessing pipeline was already complete with 14 unit tests.
- **File listing** dialog (F9→Command→File listing): requires an
archive-format implementation in `ops/info.rs` that is out of
scope for MC parity. Round 4 audit showed that this is a
placeholder item that doesn't actually exist in MC's Command
menu — it's a derived feature specific to the audit document.
+1 -17
View File
@@ -183,20 +183,4 @@ A complete cross-reference of every visible UI element in TLC against MC 4.8.33
(Midnight Commander) lives in **[MC-PARITY-AUDIT.md](MC-PARITY-AUDIT.md)**. That audit
identifies ~70% per-surface parity on the displayed-info layer (panel header, file
rows, mini-status, F-key bar, sort indicator, dialog content) and lays out a 6-phase
fix plan to reach 100% on every screen and menu.
## Stale documents
Two previous planning docs have been archived to
`legacy-superseded-2026-07-25/`:
- `IMPROVEMENT-PLAN.md` (2026-06-18, claimed ~65% parity at 698 tests)
— archived with a `SUPERSEDED.md` audit log entry. Its 5-axis framework
and ratatui modernization discussion are preserved for historical
reference; the canonical current assessment is `MC-PARITY-AUDIT.md`.
- `PLAN.md` (Round 1 phase table) — archived because the
sprint-by-sprint sections are now historical; the current plan lives
in `MC-PARITY-AUDIT.md` Round 1-4 status sections.
The recipe root is now: `README.md`, `MC-PARITY-AUDIT.md`, `recipe.toml`,
`source/`, `target/`, `dist/`, `legacy-superseded-2026-07-25/`.
fix plan to reach 100% on every screen and menu.
+1 -1
View File
@@ -253,7 +253,7 @@ def main():
return 0
print(' ACTION REQUIRED: orphaned patches must be applied to fork HEAD')
print(' See: local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md')
print(' See: local/docs/legacy-obsolete-2026-07-25/PATCH-PRESERVATION-AUDIT-2026-07-12.md')
print(' Helper: re-run local/scripts/apply-patches.sh and re-absorb')
if args.strict:
return 1
-59
View File
@@ -1,59 +0,0 @@
[package]
name = "xwayland"
version = "24.1.8"
#TODO: complete runtime validation. The recipe builds with the
#current patch set, but the following remain open:
# 1. Run a live X client under Xwayland on the Red Bear Wayland
# compositor; verify that the X11 forwarding creates and surfaces
# windows correctly via wl_shm + the X11 window protocol.
# 2. Verify XInput2 input forwarding (pointer + keyboard) through
# the libinput path on Red Bear.
# 3. Validate Xrender + Xshm extensions against the Mesa-backed
# xshmfence path (we already include libxshmfence in deps).
# 4. Capture an Xwayland-launched X11 client screenshot from
# inside the Red Bear Wayland session.
# 5. The current recipe has -Ddrm=false, -Dglamor=false, -Dglx=false
# which means it's a pure software rasterizer. A real
# acceleration path needs the upstream glamor/GLX
# integration and a working libdrm-amdgpu-or-intel userland
# driver. For now, Xwayland is a CPU-rendered X server; that
# is sufficient for headless validation but not for a full
# KDE-on-X11 fallback.
[source]
tar = "https://www.x.org/releases/individual/xserver/xwayland-24.1.8.tar.xz"
patches = [
"redox.patch"
]
[build]
template = "meson"
dependencies = [
"libpthread-stubs",
"libepoxy",
"libxkbfile",
"libxfont2",
"libffi",
"libpng",
"pixman",
"x11proto",
"xtrans",
"libxau",
"libx11",
"libxcb",
"openssl1",
"freetype2",
"libwayland",
"libfontenc",
"wayland-protocols",
"zlib",
"libxcvt",
"libxdmcp",
"libxshmfence",
]
mesonflags = [
"-Ddrm=false",
"-Dglamor=false",
"-Dglx=false",
"-Dsecure-rpc=false",
"-Dmitshm=false",
]
-158
View File
@@ -1,158 +0,0 @@
diff -ruwN source/hw/xwayland/meson.build source-new/hw/xwayland/meson.build
--- source/hw/xwayland/meson.build 2024-01-16 16:38:49.000000000 +0700
+++ source-new/hw/xwayland/meson.build 2025-10-01 07:51:14.456575515 +0700
@@ -30,8 +30,7 @@
'../../mi/miinitext.h',
]
-scanner_dep = dependency('wayland-scanner', native: true)
-scanner = find_program(scanner_dep.get_pkgconfig_variable('wayland_scanner'))
+scanner = find_program('wayland-scanner', native: true)
protocols_dep = dependency('wayland-protocols', version: wayland_protocols_req)
protodir = protocols_dep.get_pkgconfig_variable('pkgdatadir')
@@ -55,11 +54,7 @@
arguments : ['client-header', '@INPUT@', '@OUTPUT@']
)
-if scanner_dep.version().version_compare('>= 1.14.91')
scanner_argument = 'private-code'
-else
- scanner_argument = 'code'
-endif
code = generator(scanner,
output : '@BASENAME@-protocol.c',
diff -ruwN source/hw/xwayland/xwayland-glamor.h source-new/hw/xwayland/xwayland-glamor.h
--- source/hw/xwayland/xwayland-glamor.h 2024-01-16 16:38:49.000000000 +0700
+++ source-new/hw/xwayland/xwayland-glamor.h 2025-10-01 08:01:01.409102814 +0700
@@ -31,7 +31,7 @@
#include <sys/types.h>
#include <wayland-client.h>
-#include <xf86drm.h>
+// #include <xf86drm.h>
#include "xwayland-types.h"
@@ -103,7 +103,7 @@
/* Called to get the DRM device of the primary GPU that this backend
* is set up on.
*/
- drmDevice *(*get_main_device)(struct xwl_screen *xwl_screen);
+ // drmDevice *(*get_main_device)(struct xwl_screen *xwl_screen);
/* Direct hook to create the backing pixmap for a window */
PixmapPtr (*create_pixmap_for_window)(struct xwl_window *xwl_window);
diff -ruwN source/hw/xwayland/xwayland-input.c source-new/hw/xwayland/xwayland-input.c
--- source/hw/xwayland/xwayland-input.c 2024-01-16 16:38:49.000000000 +0700
+++ source-new/hw/xwayland/xwayland-input.c 2025-10-01 08:02:59.681082380 +0700
@@ -26,7 +26,7 @@
#include <xwayland-config.h>
-#include <linux/input.h>
+// #include <linux/input.h>
#include <sys/mman.h>
#include <inputstr.h>
@@ -758,6 +758,7 @@
xwl_seat->xwl_screen->serial = serial;
switch (button) {
+/*
case BTN_LEFT:
index = 1;
break;
@@ -768,10 +769,9 @@
index = 3;
break;
default:
- /* Skip indexes 4-7: they are used for vertical and horizontal scroll.
- The rest of the buttons go in order: BTN_SIDE becomes 8, etc. */
index = 8 + button - BTN_SIDE;
break;
+*/
}
valuator_mask_zero(&mask);
@@ -1057,7 +1057,7 @@
state_rec = xwl_seat->keyboard->key->xkbInfo->state;
xkb_state = (XkbStateFieldFromRec(&state_rec) & 0xff);
-
+ /*
if (((key == KEY_LEFTSHIFT || key == KEY_RIGHTSHIFT) && (xkb_state & ControlMask)) ||
((key == KEY_LEFTCTRL || key == KEY_RIGHTCTRL) && (xkb_state & ShiftMask))) {
@@ -1072,6 +1072,7 @@
if (xwl_window)
xwl_window_rootful_update_title(xwl_window);
}
+ */
}
static void
diff -ruwN source/hw/xwayland/xwayland-window.c source-new/hw/xwayland/xwayland-window.c
--- source/hw/xwayland/xwayland-window.c 2024-01-16 16:38:49.000000000 +0700
+++ source-new/hw/xwayland/xwayland-window.c 2025-10-01 08:00:07.858324820 +0700
@@ -1102,7 +1102,7 @@
for (int j = 0; j < dev_formats->num_formats; j++)
free(dev_formats->formats[j].modifiers);
free(dev_formats->formats);
- drmFreeDevice(&dev_formats->drm_dev);
+ // drmFreeDevice(&dev_formats->drm_dev);
}
void
diff -ruwN source/hw/xwayland/xwayland-window.h source-new/hw/xwayland/xwayland-window.h
--- source/hw/xwayland/xwayland-window.h 2024-01-16 16:38:49.000000000 +0700
+++ source-new/hw/xwayland/xwayland-window.h 2025-10-01 08:00:40.464798537 +0700
@@ -38,7 +38,7 @@
#include <propertyst.h>
#include <validate.h>
#include <wayland-util.h>
-#include <xf86drm.h>
+// #include <xf86drm.h>
#include "xwayland-types.h"
@@ -55,7 +55,7 @@
};
struct xwl_device_formats {
- drmDevice *drm_dev;
+ // drmDevice *drm_dev;
int supports_scanout;
uint32_t num_formats;
struct xwl_format *formats;
@@ -75,7 +75,7 @@
struct xwl_dmabuf_feedback {
struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback;
struct xwl_format_table format_table;
- drmDevice *main_dev;
+ // drmDevice *main_dev;
/*
* This will be filled in during wl events and copied to
* dev_formats on dmabuf_feedback.tranche_done
diff -ruwN source/os/access.c source-new/os/access.c
--- source/os/access.c 2024-01-16 16:38:49.000000000 +0700
+++ source-new/os/access.c 2025-10-01 07:22:43.931644468 +0700
@@ -446,7 +446,7 @@
int family;
register HOST *host;
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__redox__)
struct utsname name;
#else
struct {
@@ -477,7 +477,7 @@
* uname() lets me access to the whole string (it smashes release, you
* see), whereas gethostname() kindly truncates it for me.
*/
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__redox__)
uname(&name);
#else
gethostname(name.nodename, sizeof(name.nodename));
+1 -1
View File
@@ -73,7 +73,7 @@ done
if [ $violations -gt 0 ]; then
echo "FAILED: $violations init service path violation(s) found." >&2
echo "Config [[files]] entries must use /etc/init.d/ not /usr/lib/init.d/" >&2
echo "See: local/docs/BUILD-SYSTEM-HARDENING-PLAN.md Phase 1" >&2
echo "See: local/docs/legacy-obsolete-2026-07-25/BUILD-SYSTEM-HARDENING-PLAN.md Phase 1" >&2
exit 1
else
echo "OK: No init service path violations in config files."