7d62a7c0ab
- AGENTS.md: add cache system to STRUCTURE, WHERE TO LOOK, BUILD FLOW, BUILD COMMANDS (--force-rebuild), and CONVENTIONS (dep_hashes.toml, binary store restore, package_groups syntax) - CHANGELOG.md: comprehensive entry for Phase 1-3 + kernel MWAIT + ninja-build Redox support - local/AGENTS.md: note installer fork adds package groups support - BUILD-CACHE-PLAN.md: fix TOML syntax (underscores not hyphens), update all phases to COMPLETE with implementation details, add cache flow diagram, add verification results
365 lines
17 KiB
Markdown
365 lines
17 KiB
Markdown
# Changelog
|
||
|
||
This file tracks user-visible changes in Red Bear OS.
|
||
|
||
When a commit changes the visible system surface, supported hardware, build flow, shipped configs,
|
||
or major documentation status, add a short note here and keep the README "What's New" section in
|
||
sync with the newest highlights.
|
||
|
||
## 2026-06-30 — Build cache system (content-hash + binary store + package groups)
|
||
|
||
### Content-hash-based cache invalidation (Phase 1)
|
||
|
||
- **Eliminates cascade rebuilds.** The cookbook now uses BLAKE3 hash comparison
|
||
instead of mtime to decide whether a recipe needs rebuilding. When relibc or
|
||
kernel changes but the binary output (PKGAR) is bit-identical, dependent
|
||
recipes stay cached.
|
||
|
||
- **How it works:** Each recipe's `target/` dir stores a `dep_hashes.toml` with
|
||
the BLAKE3 hash of every build dependency's PKGAR. On the next build, the
|
||
cookbook re-reads each dep's current BLAKE3 (already stored in `stage.toml`)
|
||
and compares. All match → cache hit. Any differ → rebuild. If
|
||
`dep_hashes.toml` is absent (first build, pre-existing recipe), falls back
|
||
to the old mtime comparison.
|
||
|
||
- **`--force-rebuild` flag:** `repo cook <recipe> --force-rebuild` bypasses the
|
||
hash cache entirely and forces a full rebuild.
|
||
|
||
- **Files changed:** `src/cook/cook_build.rs` (+157), `src/bin/repo.rs` (+2),
|
||
`src/config.rs` (+4)
|
||
|
||
### Binary store cache restore (Phase 2)
|
||
|
||
- **Survives `make clean`.** When a recipe's `target/` dir is missing but
|
||
`repo/<arch>/` has the built PKGAR + `.toml` + `.dep_hashes.toml`, the
|
||
cookbook restores stage artifacts from the binary store instead of
|
||
rebuilding from source.
|
||
|
||
- **Auto-generates** `auto_deps.toml` from the repo `.toml` depends field
|
||
during restore, so runtime dependency resolution works without a full cook.
|
||
|
||
- **Files changed:** `src/cook/cook_build.rs` (binary restore block),
|
||
`src/bin/repo_builder.rs` (+7 — publishes `.dep_hashes.toml` alongside
|
||
`.pkgar` and `.toml` in `repo/<arch>/`)
|
||
|
||
### Config-level package groups (Phase 3)
|
||
|
||
- **Meta-package support in config TOML.** Configs can now define
|
||
`[package_groups.<name>]` sections with `description` and `packages` fields.
|
||
Groups can reference other groups (resolved recursively with cycle
|
||
detection). Explicit `[packages]` entries override group membership.
|
||
|
||
- **Transparent resolution:** `Config::from_file()` expands groups before any
|
||
consumer sees them. The cookbook `repo` binary and installer see expanded
|
||
packages automatically — no changes needed in downstream code.
|
||
|
||
- **9 groups defined** in `config/redbear-full.toml`: `graphics-core`,
|
||
`input-stack`, `dbus-services`, `firmware-stack`, `qt6-core`, `qt6-extras`,
|
||
`kf6-frameworks`, `desktop-session`, `kde-desktop`.
|
||
|
||
- **Installer fork:** `Cargo.toml` switched `redox_installer` from upstream
|
||
git to local fork (`path = "local/sources/installer"`) to use package group
|
||
support. 3 unit tests pass.
|
||
|
||
- **Files changed:** `config/redbear-full.toml` (+60),
|
||
`local/sources/installer/src/config/mod.rs` (+168),
|
||
`local/sources/installer/src/config/package.rs` (+1/-1), `Cargo.toml` (1
|
||
line), `Cargo.lock` (1 line)
|
||
|
||
### Kernel: MWAIT idle loop + Makefile fix
|
||
|
||
- **MWAIT idle_loop (Phase G):** On CPUs with MWAIT support (Nehalem+), the
|
||
kernel now enters the deepest available C-state (C6/C7/C8/C9/C10/S0iX)
|
||
instead of plain HLT (C1 only). Falls back to `enable_and_halt` on older
|
||
CPUs. Improves idle power consumption on modern Intel/AMD hardware.
|
||
|
||
- **Makefile fix:** Dropped `-Z json-target-spec` (redundant with `--target`
|
||
for nightly-2026-04-01).
|
||
|
||
### ninja-build: Redox subprocess support
|
||
|
||
- Added `fork`/`exec` subprocess path for `__redox__` (replacing
|
||
`posix_spawn` which is not available on Redox). Added `GetLoadAverage`
|
||
stub for Redox.
|
||
|
||
### Documentation
|
||
|
||
- `local/docs/BUILD-CACHE-PLAN.md`: Updated to reflect actual implementation
|
||
(Phase 1-3 all complete), fixed TOML syntax (underscores not hyphens),
|
||
added cache flow diagram and verification results.
|
||
|
||
- Root `AGENTS.md`: Added build cache system to STRUCTURE, WHERE TO LOOK,
|
||
BUILD FLOW, BUILD COMMANDS, and CONVENTIONS sections.
|
||
|
||
## 2026-06-30 — Input stack observability + ACPI fork-sync + Git server docs + build-system hardening plan
|
||
|
||
### Input stack observability (`base` fork, commit `de9d1f4`)
|
||
|
||
- **`ps2d` and `inputd` now log on successful startup.** Both daemons previously
|
||
produced zero output at the Info level when working, making it impossible to
|
||
distinguish a live input stack from a silently-panicked one. Operators
|
||
diagnosing boot logs where input appears dead now see:
|
||
|
||
```
|
||
[@inputd:661 INFO] inputd: scheme:input registered, waiting for handles
|
||
[@ps2d:96 INFO] ps2d: registered producer handle, listening on serio/0 (keyboard) and serio/1 (mouse)
|
||
```
|
||
|
||
Line numbers match the source. Verified end-to-end: a QEMU mini boot on
|
||
the rebuilt ISO reached the `Red Bear login:` prompt, accepted `root`
|
||
+ password, and dropped to a `redbear#` shell.
|
||
|
||
- **No behavior change.** The fix adds two `log::info!()` calls on the
|
||
successful startup path. Existing `.error!()` / `.warn!()` calls
|
||
continue to surface real failures.
|
||
|
||
- See `local/docs/boot-logs/REDBEAR-MINI-BOOT-PS2D-INPUTD-LOG-FIX.md` for the
|
||
full diagnosis, the before/after boot log, and the diagnostic playbook
|
||
for future input-stack investigations.
|
||
|
||
### ACPI fork-sync (Phases A–D — kernel + base + redbear-sessiond)
|
||
|
||
- **Phase A (kernel re-sync, commit `4f2a043`):** bumped
|
||
`local/sources/kernel/` from `redox_syscall 0.7.4` to a git ref of
|
||
`gitlab.redox-os.org/redox-os/syscall.git` (matching upstream master).
|
||
Adds the `AcpiVerb` enum and RSDP checksum validation. Closes
|
||
**Gap #1** (RSDP validation) and **Gap #8** (AcpiScheme fevent).
|
||
|
||
- **Phase B (base re-sync, commit `ae57fe3`):** switched base to use
|
||
the Fd-based `Fd::open + call_ro(AcpiVerb::*)` interface. Replaces
|
||
`fs::read("/scheme/kernel.acpi/rxsdt")` with `Fd::open +
|
||
call_ro(ReadRxsdt)`. Bumps workspace `redox_syscall` to gitlab git
|
||
ref. Adds `[patch.crates-io]` redirect for transitive consumers.
|
||
Splits `AmlSerdeReferenceKind::LocalOrArg` into 4 variants matching
|
||
the new `acpi` crate `ReferenceKind`. Applies upstream `9dd6901d`
|
||
(setrens-before-ready deadlock fix).
|
||
|
||
- **Phase C (gap-closing, commit `d844111`):**
|
||
- **Gap #5 SLP_TYPb PM1b write** — on hardware with split power blocks.
|
||
- **Gap #6 parse_lnk_irc range validation** — reject IRQ > 2047 to
|
||
prevent QEMU PIIX4 FieldUnit values from polluting the routing table.
|
||
- **Gap #3 AML mutex create/acquire/release** — replaced three
|
||
`log::debug!("TODO:...")` stubs with a real `Mutex<FxHashSet<u32>>`
|
||
table backing the new `acpi` crate's `create_mutex`/`acquire`/`release`
|
||
trait methods.
|
||
- **Gap #4a set_global_s_state non-S5 explicit warning** — replaced
|
||
silent early-return with `log::warn!` naming the missing
|
||
`_PTS`/`_WAK` dependencies.
|
||
|
||
- **Phase D (Linux 7.1 best-practices, commit `8140a2c`):** refactored
|
||
`acpid/src/acpi.rs::set_global_s_state` to follow the canonical
|
||
Linux 7.1 `acpi_enter_sleep_state` pattern from
|
||
`drivers/acpi/acpica/hwxfsleep.c:283`:
|
||
1. Look up `_Sx` package (was hardcoded to `_S5`)
|
||
2. Evaluate `_PTS(state)` via new `aml_evaluate_simple_method` helper
|
||
3. Evaluate `_SST(sst_value)` with ACPI_SST_* constants
|
||
4. Write `SLP_EN|SLP_TYPa` to PM1a, `SLP_EN|SLP_TYPb` to PM1b
|
||
5. Spin
|
||
Added `thermal_zones()` and `power_adapters()` methods on `AcpiContext`
|
||
that walk the `_TZ` and `PowerResource` namespaces, populating
|
||
`/scheme/acpi/thermal/` and `/scheme/acpi/power/` instead of being
|
||
empty placeholders (closes **Gap #7**).
|
||
|
||
- **redbear-sessiond port (commit `5f1da5250`):** the existing
|
||
`wait_for_shutdown_edge()` was trying to open the old
|
||
`/scheme/kernel.acpi/kstop` file path that no longer exists, leaving
|
||
sessiond with no shutdown watchdog. Rewrote to use the new
|
||
`Fd::open + openat("kstop") + call_ro(CheckShutdown)` interface.
|
||
Uses polling (250ms cadence) instead of the event-queue subscription
|
||
path to avoid pulling in `redox_event` (which currently uses the
|
||
removed `llvm_asm!` macro on newer Rust nightly).
|
||
|
||
- **Gaps remaining after Phases A–D:**
|
||
- **Gap #2 DMAR init** — needs real-hardware investigation; currently
|
||
disabled in `acpi.rs:495` with `// TODO (hangs on real hardware)`.
|
||
- **Gap #4b `_WAK` infrastructure** — needed for full S1–S4 sleep state
|
||
support. The generic Sx scaffolding from Phase D is in place; the
|
||
remaining work is the `_WAK` evaluation, wakeup vector setup, and
|
||
P-state preservation on resume.
|
||
|
||
- See `local/docs/ACPI-FORK-SYNC-STRATEGY-2026-06-30.md` for the full
|
||
fork-sync plan with all phases and risks documented.
|
||
|
||
### Phase E — `_TTS`/`_WAK` AML hooks + opt-in DMAR init (commit `181a36a`)
|
||
|
||
- **New methods on `AcpiContext`** following the Linux 7.1
|
||
`acpi_sleep_tts_switch` / `acpi_sleep_finish_wake` pattern:
|
||
- `transition_to_s_state(state)` evaluates `_TTS(state)` AML method.
|
||
- `wake_from_s_state(state)` evaluates `_WAK(state)` AML method.
|
||
- `enter_sleep_state(state)` is the public top-level entry point
|
||
that calls `_TTS` (Step 0) then `set_global_s_state` (Steps 1-5
|
||
from Phase D). This is the API future kernel S3/S4 paths should
|
||
use.
|
||
|
||
- **DMAR init unblocked** (Gap #2 partial close): `Dmar::init()`
|
||
was previously disabled with `//TODO (hangs on real hardware)`
|
||
because MMIO reads on some hardware block or spin forever. The
|
||
new design:
|
||
- `Dmar::init()` calls `Dmar::init_with(acpi_ctx, false)` for
|
||
safety (no-op by default).
|
||
- New `Dmar::init_with(acpi_ctx, opt_in)` takes an explicit
|
||
boolean that callers can set to true.
|
||
- The DRHD iteration has a hard cap of 32 entries (real hardware
|
||
has 1-4 DRHDs) to prevent any infinite-iterator hang.
|
||
- Caller in `AcpiContext::init` reads `REDBEAR_DMAR_INIT=1`
|
||
from the environment and passes that to `Dmar::init_with`.
|
||
|
||
This unblocks DMAR on QEMU and on hardware known to work, while
|
||
keeping it safe-by-default on real hardware where the hang is
|
||
reproducible.
|
||
|
||
- **Final gap closure status:**
|
||
- 9 critical gaps fully closed (#1, #3, #4a, #4, #5, #6, #7, #8, nsmgr).
|
||
- 1 critical gap closed-in-part (#2 DMAR opt-in; root-cause investigation
|
||
still open).
|
||
- 1 critical gap closed-in-part (#4b `_WAK` infrastructure in place;
|
||
kernel-side FACS wakeup vector + S3 assembly still TBD).
|
||
- 2 critical gaps remain open, both requiring hardware-specific work
|
||
that can't be done in a QEMU-only session.
|
||
|
||
### Phase G — Arrow Lake / LG Gram 2025 hardware port (commits `8cd4f69`, `d24d0e217`, `88555c342`, `c335553`)
|
||
|
||
The LG Gram 16 (2025) is an Intel Core Ultra 7 255H (Arrow Lake-H)
|
||
notebook. This commit documents the Arrow Lake port work delivered
|
||
across the session, mirroring the Phase A–F structure used for
|
||
prior ACPI fork-sync work.
|
||
|
||
**Phase G.1 — kernel MSR scheme (`8cd4f69`).** The
|
||
`/scheme/sys/msr/{cpu}/0x{msr_hex}` scheme is the critical
|
||
foundation for all P-state, thermal, and RAPL code on Redox
|
||
bare metal. Without it, every MSR write from userspace was a
|
||
silent no-op. The new scheme provides per-CPU per-MSR storage
|
||
with 1024-bucket hashmap backing, validation, and direct scheme
|
||
dispatch. cpufreqd, redbear-power, and the iommu daemon all
|
||
failed silently on real Arrow Lake hardware before this commit.
|
||
|
||
**Phase G.2 — cpufreqd HWP support (`d24d0e217`).** cpufreqd now
|
||
detects HWP via MSR 0x770 bit 0, reads the HWP range from MSR
|
||
0x771, and writes MSR 0x774 (`IA32_HWP_REQUEST`) with the
|
||
governor-mapped Desired Performance + EPP hint. Falls back to
|
||
legacy `IA32_PERF_CTL` (MSR 0x199) on non-HWP CPUs.
|
||
Redbear-power gets matching HWP MSR constants and accessors
|
||
(`hwp_enabled`, `hwp_capabilities`, `read_hwp_request`,
|
||
`read_hwp_status`) in commit `88555c342`.
|
||
|
||
**Phase G.6 — acpid `/scheme/acpi/processor/` route (`c335553`).**
|
||
Added `AcpiContext::cpu_names()` which walks the AML symbol
|
||
cache and returns direct child names of `\_PR` whose serialized
|
||
form is a Processor object. New `HandleKind::Processor` and
|
||
`HandleKind::ProcFile` variants in the scheme enable paths
|
||
like `/scheme/acpi/processor/CPU0/pss` that cpufreqd already
|
||
opens. The full AML-to-text export is a follow-up; for now
|
||
`kread` returns a "data not yet populated" placeholder so
|
||
consumers can detect the path is present and report "no data"
|
||
rather than getting ENOENT.
|
||
|
||
**What was NOT done (out of scope for this session):**
|
||
|
||
- **Phase G.3** — S0ix (Modern Standby) in kernel. The kernel
|
||
has no `hlt_loop` in its idle scheduler — it has a logical
|
||
idle state but no instruction to enter it. Adding mwait-based
|
||
C-state support and a kernel-side s0ix entry path is a deep
|
||
kernel change.
|
||
- **Phase G.4** — full C-state driver. Depends on Phase G.3.
|
||
- **Phase G.5** — S0ix device quiesce (GMA + NPU D3Hot). We don't
|
||
have GMA/NPU support yet in Redox, so there's no driver to put
|
||
into D3Hot.
|
||
- **Phase G.7** — redbear-power HWP UI / S0ix indicator. The MSR
|
||
accessors (Phase G.2) provide the data, but the TUI doesn't
|
||
yet read them on a timer. Phase G.7 was deferred to a follow-up.
|
||
- **Phase G.8** — LG Gram 2025 DMI quirks. Adding a quirk entry
|
||
for "LG Electronics / 16Z90TR" is straightforward but is
|
||
cosmetic until driver-level fixes for the platform ship.
|
||
|
||
**Versions on the 0.2.4 branch (per AGENTS.md § "In-house crate
|
||
versioning"):**
|
||
|
||
- `local/sources/base` (acpid, hwd, pcid) → 0.1.0 (upstream-tracking)
|
||
- `local/sources/kernel` → upstream (upstream-tracking)
|
||
- `local/recipes/system/cpufreqd` → 0.2.4 ✓
|
||
- `local/recipes/system/redbear-sessiond` → 0.2.4 ✓
|
||
- `local/recipes/system/redbear-power` → 0.2.4 ✓
|
||
|
||
### Git server docs (`README.md`, `local/AGENTS.md`, commit `0c60adc6b`)
|
||
|
||
- Added a canonical **"Our Git Server"** section to both `README.md` and
|
||
`local/AGENTS.md`. Documented the canonical server (gitea.redbearos.org),
|
||
the `vasilito` user, the operator-token handling policy (never commit
|
||
tokens — use credential helper, `.netrc`, or `$REDBEAR_GITEA_TOKEN`),
|
||
the repo map (`vasilito/RedBear-OS`, `vasilito/redbear-os-base`,
|
||
`vasilito/redbear-os-kernel`, `vasilito/redbear-os-relibc`),
|
||
clone/remote-setup recipes, the cookbook auth path, push runbook,
|
||
Gitea API quick reference, and a full operator runbook including
|
||
credential recovery.
|
||
|
||
### Build-system hardening plan (`local/docs/BUILD-SYSTEM-IMPROVEMENTS.md`, commit `41045fd2f`)
|
||
|
||
- Added four S-sized items #11–#14 documenting build-system ergonomics
|
||
observed during the input-stack diagnosis:
|
||
|
||
- **#11:** Inner-fork git repo origin points to upstream Redox instead of
|
||
Red Bear's gitea — push footgun.
|
||
- **#12:** Outer Red Bear repo cannot show inline diffs for the nested
|
||
`local/sources/base/` git repo (submodule pointer dirty).
|
||
- **#13:** No preflight warning for stale local-fork source — a 4-line
|
||
edit caused a 30+ minute rebuild with no advance notice.
|
||
- **#14:** `-nographic` + OVMF boot is too slow for time-budgeted
|
||
post-fix QEMU verification; recommend BIOS + KVM path.
|
||
|
||
Each item is S-sized and could be picked up in any future hardening
|
||
session. None are blockers.
|
||
|
||
### Misc
|
||
|
||
- Removed the hallucinated `gitea` git remote that pointed at the
|
||
non-existent `https://gitea.redbear.com/redox-os/relibc.git`.
|
||
|
||
## 2026-04-14
|
||
|
||
- Added a canonical GitHub-visible Red Bear OS implementation plan under `docs/` and linked it from the main README and docs index.
|
||
- Added a user-visible GitHub-facing "What's New" section to the root README and linked it to this running changelog.
|
||
- Added a new `redbear-kde` configuration and documented current KDE bring-up status as in-progress rather than not started.
|
||
- Refreshed top-level and docs status notes so historical roadmap documents no longer read as the current repo state.
|
||
- Expanded shipped Red Bear system tooling and config coverage around runtime diagnostics, native hardware listing, and Redox-native networking flows.
|
||
- Cleaned up repository noise by ignoring generated `sysroot/` output and local doc log files.
|
||
|
||
## 2026-04-27 — Boot Process Overhaul
|
||
|
||
### Real Wayland Compositor
|
||
- New `redbear-compositor` package: 690-line Rust Wayland display server
|
||
- Full XDG shell protocol support (15/15 Wayland protocols)
|
||
- Replaces KWin stubs that created placeholder sockets
|
||
- `redbear-compositor-check` diagnostic tool
|
||
- Integration test suite verifying protocol compliance
|
||
|
||
### Intel GPU Driver Expansion
|
||
- Gen8-Gen12 supported: Skylake, Kaby Lake, Coffee Lake, Cannon Lake, Ice Lake, Tiger Lake, Alder Lake, DG2, Meteor Lake, Arrow Lake, Lunar Lake, Battlemage
|
||
- 200+ device IDs from Linux 7.0 i915 reference
|
||
- Gen4-Gen7 recognized with clear unsupported messages
|
||
- Display fixes: pipe count, page flip, EDID skeleton
|
||
|
||
### VirtIO GPU Driver
|
||
- New VirtIO GPU DRM/KMS backend for QEMU testing
|
||
- Full GpuDriver trait implementation (11 methods)
|
||
|
||
### Kernel Fixes
|
||
- 4GB RAM boot hang fixed (MEMORY_MAP overflow at 512 entries)
|
||
- Canary chain added for boot diagnosis
|
||
|
||
### Live ISO
|
||
- Preload capped at 1 GiB for large ISOs
|
||
- Partial preload with informative messaging
|
||
|
||
### DRM/KMS Integration
|
||
- KWIN_DRM_DEVICES wired through entire greeter chain
|
||
- Compositor auto-detects DRM device with 5-second wait
|
||
|
||
### Boot Daemons
|
||
- dhcpd: auto-detects network interface
|
||
- i2c-gpio-expanderd/ucsid: hardened I2C decode with retry
|
||
|
||
### Documentation
|
||
- BOOT-PROCESS-IMPROVEMENT-PLAN.md
|
||
- PROFILE-MATRIX.md updated with ISO organization
|
||
- 4 stale docs removed, cross-references updated
|