Commit Graph

332 Commits

Author SHA1 Message Date
vasilito 2362ea80f1 redbear-power: fix modal clear scope, graph time labels, cmdline toggle
- KillDialog: only clear dialog area, not entire screen (fixes black-screen UX)
- NiceEdit: removed redundant full-screen Clear from main.rs
- All graphs now show x-axis time labels: '-60s' on left, 'now' on right
- Fixed BrailleGraph x-axis label rendering (was truncating to 1 char, now uses set_string)
- Process panel: press 'C' to toggle between comm name and full command line args
- ProcessInfo.cmdline field added (reads /proc/[pid]/cmdline)
- Help text and keybar updated with C keybinding
2026-07-07 02:08:30 +03:00
vasilito f10f3b15b6 redbear-power: CPU frequency color coding in per-CPU table
Freq column now color-graded based on P-state range:
  dark gray  at lowest P-state (<=15% of range)
  default    mid-range
  yellow     >=50% of range
  red+bold   >=85% of range (turbo/high)
2026-07-07 01:50:10 +03:00
vasilito 79e897a628 redbear-power: show process count in tab bar
Tab bar now displays 'Process (42)' with live process count,
giving at-a-glance visibility into how many processes are tracked.
2026-07-07 01:48:00 +03:00
vasilito 59c9ec8ed8 redbear-power: add nord, gruvbox, solarized-dark themes (6 total)
New theme presets selectable via --theme:
  nord           cyan borders, light-blue governor
  gruvbox        green borders, yellow governor
  solarized-dark blue borders, magenta governor

Help text updated with all 6 theme names.
2026-07-07 01:44:06 +03:00
vasilito 763b7110c5 redbear-power: fix process header alignment for MEM% column 2026-07-07 01:41:46 +03:00
vasilito 0285960a56 redbear-power: process state coloring + MEM% display
- STATE column color-coded: R=green, D=red, Z=dark gray, T=yellow (htop-style)
- RSS column now shows memory percentage alongside absolute value: '1.2G (3.4%)'
- Process row spans refactored for per-column styling
2026-07-07 01:40:28 +03:00
vasilito e729e4daec redbear-power: nice value coloring + filter match highlighting
- NI column: green for negative (high priority), yellow for positive (low priority)
- Process filter: matching characters in COMM highlighted BOLD|REVERSED
  when filter is active (bottom/htop-style incremental search visual)
2026-07-07 01:36:00 +03:00
vasilito f9ace4a956 redbear-power: CPU% color grading + context-sensitive keybar
- Process rows: CPU% now color-graded (green <10%, yellow 10-50%, red 50-90%, bright red >90%)
  using styled spans instead of monolithic format string
- Keybar shows context-aware hints: process-specific keys (k/N/l/o/i/F/y) on Process tab,
  power-specific keys (p/P/m/M/t) on other tabs
- [EXPANDED] indicator added to keybar alongside [FROZEN]
2026-07-07 01:30:47 +03:00
vasilito 2061609f62 redbear-power: live graph labels, sort indicator, toast for governor/throttle
- Graph titles now show live values: 'CPU 45%', 'Temp 62°C', 'Pwr 8.3W', etc.
- Process panel shows sort direction arrow (▲ ascending / ▼ descending)
- Governor cycle and throttle mode now trigger flash_toast (floating box)
  instead of flash_status (keybar only)
- BrailleGraph.title changed from &str to String for dynamic titles
2026-07-07 01:26:56 +03:00
vasilito b48410cbf5 redbear-power: stage event.rs deletion + process.rs whitespace cleanup 2026-07-07 01:06:15 +03:00
vasilito d5c8498ac3 redbear-power: add nice editor (N), open files (l), remove dead event.rs, bench auto-stop toast
- nice_edit.rs: modal dialog for adjusting process nice (-20..19), slider visualization
- open_files.rs: reads /proc/[pid]/fd, classifies file descriptors by type
- Removed dead event.rs module (never wired, unused Event enum)
- Benchmark auto-completion: detects elapsed >= duration, calls stop(), flashes toast
- PROCHOT toast trigger wired in app.rs
- Help text updated with N and l keybindings
- 217 tests pass, 0 warnings, 4.1 MB LTO release binary
2026-07-07 01:00:13 +03:00
vasilito f99738d2fb userutils: bump submodule (login diagnostics) + redbear-power/tlc WIP
userutils: commits login/getty diagnostic logging.
redbear-power: toast notification storage + set_nice syscall helper + render WIP.
tlc: cmdline tab-completion improvements.
2026-07-07 00:44:31 +03:00
vasilito af282ee049 redbear-power: add flash_toast API (toast notification storage + active_toast accessor)
Implements the App side of T5 (toast notifications from the bottom/tlc
synthesis). render_toast() overlay can be wired in a follow-up pass.

- App.toast: Option<String> field
- App.toast_expires: Option<Instant> field
- App.flash_toast(msg): sets toast with 3s auto-dismiss
- App.active_toast(): returns &str if not expired

Key bindings: scrollable help dialog (j/k/PgUp/PgDn/Home/G) wired in
the previous round. dim_backdrop/render_nice_edit/render_open_files
helpers lost to repeated reverts — will be re-added in a clean follow-up.
2026-07-07 00:44:30 +03:00
vasilito 95fdc37e52 redbear-power: add set_nice() syscall helper for nice/renice editor 2026-07-07 00:44:29 +03:00
vasilito 3e8ad78299 redbear-power: sync version 0.2.5 → 0.3.0 2026-07-06 21:52:02 +03:00
vasilito ab3685cd17 redbear-power: premium --help text — all v1.44 controls documented 2026-07-06 21:44:52 +03:00
vasilito 64325790de redbear-power v1.44: bottom borrow — braille graphs, themes, kill dialog, stability fixes
Borrowed from bottom v0.11.2 comparison assessment (17 implementation passes):

New modules:
- src/graph.rs: BrailleGraph widget (Canvas + Marker::Braille) for
  time-series rendering; RingHistory buffer with display_max() for
  stable y-axis scaling (nice rounding: 1,2,5,10,20,50,100...)
- src/kill.rs: process kill dialog with signal selection,
  Cell<usize> interior mutability pattern, 2s auto-close timer
- src/event.rs: typed Event enum (Key, Mouse, Tick, Resize, Terminate)

New features:
- Braille graphs: 5 widgets across 4 tabs (CPU%, Temp°C, PkgW,
  Net KiB/s, Disk KiB/s) with y-axis labels and reserved margin
- Theme system: dark/light/high-contrast presets, --theme CLI flag
  with validation, wired into panel_border(), BrailleGraph,
  header governor, cursor highlight
- Widget expansion (e key): full-screen tab toggle with hint bar
- Data freeze (f key): pause data updates with [FROZEN] indicator
- Process kill dialog (k key): SIGTERM/SIGKILL/SIGINT/SIGHUP
- --once mode: now renders 3 braille graphs + all text panels
- Double-refresh at startup for ≥2 graph data points
- Startup diagnostic to stderr (cores, governor, MSR, DMI name)

Stability fixes:
- MSR per-CPU failure cache (Mutex<Vec<bool>>) — avoids repeated
  doomed /dev/cpu/*/msr opens; auto-clears every ~30s (60 refreshes)
- skip_refresh guard: if refresh >200ms, skip next cycle to
  prevent refresh pile-up on slow MSR reads
- collector.rs: removed Barrier — threads start work immediately
  instead of waiting for all threads to spawn
- panic hook: restores terminal on panic
- IsTerminal check: clear error message before entering raw mode

Bug fixes:
- 4 key shadowing bugs found and fixed:
  'g' (governor vs. move-to-top) — removed unreachable arm
  'T' (tab-cycle vs. tree-toggle) — changed tree to 'y'
  'f' (freeze vs. process-filter) — changed filter to 'F'
- Key::Esc ordering: kill dialog → PID detail → quit
- process panel header updated ('y' for tree, 'F' for filter)

Build:
- Cargo.toml: [profile.release] lto=true, opt-level=3, codegen-units=1
  → 4.1 MB binary (was 6.1 MB, -33%)
- libc 0.2 dep for Linux kill() in kill dialog
- cargo fmt applied project-wide

Tests: 217 passed (was 198, +19 new)
- graph: 5 tests (RingHistory, display_max, 3 render smoke tests)
- kill: 6 tests (dialog lifecycle, selection wrap, auto-close, render)
- app: 8 integration tests (CPU detection, graph population, governor,
  temp source, expand toggle, freeze, skip-refresh)

Docs:
- local/docs/RATATUI-APP-PATTERNS.md updated to v1.44+ status:
  §13.14 current feature table, §15 braille graph pattern,
  §16 modal dialog pattern, §17 key audit pattern,
  §14 line counts updated (13,091 LoC, 27 modules, 217 tests),
  summary expanded to 13 rules
2026-07-06 10:09:31 +03:00
vasilito ec101f9d4b submodules: update Cat 2 fork pointers to local path deps and +rb0.2.5
- relibc: variadic sem_open and local fork path deps
- base: already at latest RedBear-OS submodule/base
- bootloader/kernel/libredox/userutils: pushed local path-dep fixes
- installer/redoxfs: diverged from remote submodule/*; local commits saved,
  divergence to be resolved after build
- driver-manager: add syscall path dependency
- AGENTS.md: document +rb build metadata and no-patches-for-local-forks rule
- remove dead patch symlinks from recipes/core/relibc (path-source local fork)
2026-07-05 23:58:20 +03:00
vasilito b8aac3c9bc D7: editor multi-cursor support
Add secondary_cursors field to Editor with insert_char_multi,
delete_back_multi, delete_forward_multi methods. Right-to-left
processing ensures position shifts don't corrupt earlier insertions.

7 new tests: add/clear, all_positions, insert, delete_back,
delete_forward, unicode, duplicate-add.
2026-07-05 22:29:19 +03:00
vasilito d7273ce5cf fix: document and implement local fork version sync policy
Add comprehensive policy documentation in AGENTS.md covering:
- local/ fork always takes precedence over recipes/ paths
- build system must ensure local fork is at latest available version
- all Red Bear patches must be applied cleanly on top of latest version
- automatic version bump + patch reapplication via bump-fork.sh

Create local/scripts/bump-fork.sh that implements automatic version bumping:
- Detects current local version vs required version from Cargo.lock
- Fetches upstream source at required version
- Applies all Red Bear patches atomically
- Updates version field and replaces local fork contents

Fix driver-manager Cargo.toml lockfile collision:
- Remove redundant syscall dependency (transitive via pcid_interface)
- Update all driver recipes to use local/sources/syscall and libredox paths
- This eliminates the redox_syscall lockfile collision between
  local/sources/syscall and recipes/core/base/syscall (same dir, different paths)

relibc: fix unsafe call for Rust 2024 edition compatibility
2026-07-04 04:23:34 +03:00
vasilito eb53e8190a redbear-power: multi-threaded collector + Tier 1/2 display enhancements
Tier 1 (display Phase 0 infrastructure):
- sched.rs: read /scheme/sys/stat and /scheme/sys/sched for per-CPU
  scheduler stats (switches, steals, queue_depth, IRQs)
- msr.rs: HWP capabilities/requests, RAPL domain energy readings
- process.rs: derive_sched_policy() for SCHED column
- render.rs: System tab shows RAPL power, scheduler stats; Per-CPU
  table has IRQs/steals columns; HWP expansion rows
- acpi.rs: ACPI throttle status reading

Multi-threaded collector (exercises Phase 0 threading):
- collector.rs: parallel collect() using thread::scope + Barrier,
  exercises pthread_create, futex barriers, sched_setaffinity
- app.rs: sequential per-CPU loop replaced with parallel collector
- render.rs: System tab shows Collector stats (threads, pinned, barrier)

Tier 2 kernel wiring (submodule pointer updates):
- kernel: per-CPU sched stats (/scheme/sys/sched), NUMA-aware
  scheduling, numa::init_default() at boot
- relibc: robust mutex cleanup in exit_current_thread()
2026-07-02 21:41:25 +03:00
vasilito 6d13dee2a6 redbear-power(0.2.5): fix missing hwp field in CpuRow initializer
Pre-existing bug: CpuRow struct gained an hwp field but the initializer
at line 319 was not updated.
2026-07-02 19:22:19 +03:00
vasilito 7902864a32 version(0.2.5): bump project version to 0.2.5
- Cookbook Cargo.toml: 0.1.0 → 0.2.5
- All 61 in-house crate Cargo.toml versions: 0.2.4 → 0.2.5
- os-release.in: fix URLs from github.com to gitea.redbearos.org
- sync-versions.sh --check passes with zero drift

The OS version is derived from the git branch name at build time.
Building on branch 0.2.5 produces os-release with VERSION_ID=0.2.5.
2026-07-02 15:36:28 +03:00
vasilito 9d5a6319f8 quirks: add Dell / HP / Lenovo catch-all DMI entries (Phase I broader OEM)
Phase I (broader OEM coverage): extend the redbear-quirks
DMI table with catch-all entries for the three other major
PC OEMs:

* Dell Inc. (covers Dell XPS 13 Plus, Latitude 7440, Inspiron
  14 Plus, etc.) — same i8042 / atkbd quirks as LG.
* HP (covers HP Spectre x360 14, EliteBook 840 G10, Pavilion
  Aero 13, etc.).
* LENOVO (covers ThinkPad X1 Carbon Gen 12, Yoga Slim 7,
  IdeaPad Slim 7i, etc.).

All three apply the same minimal-quirk set:
  kbd_deactivate_fixup (Linux atkbd.c matches on sys_vendor)
  acpi_irq1_skip_override (Linux acpi/resource.c
  irq1_level_low_skip_override[] applies to most major OEMs)

The 'no_legacy_pm1b' flag is left off (it was an LG-specific
quirk — most OEMs implement PM1b_CNT properly). The
'force_s2idle' flag is left off (it depends on the firmware
Modern Standby vs traditional S3 support — vendor and
model-specific).

Hardware-agnostic: the catch-all entries apply the
Linux-derived universal quirks to the entire OEM product
line, not just the LG Gram 2025. The same approach used
in Linux 7.1 reference: drivers/input/keyboard/atkbd.c
matches on 'LG Electronics' (sys_vendor only); the parallel
Red Bear OS entry matches on the equivalent generic key
quirk set.

Verification: redbear-mini.iso (512 MB) builds
successfully with the new entries.
2026-07-01 15:18:52 +03:00
vasilito 4d270bab29 quirks: add ACPI IRQ1, kbd_deactivate, no_legacy_pm1b flags for LG Gram 16 (2025)
Phase I (a): redbear-quirks enrichment. Each flag is ported
from the Linux 7.1 reference tree and applied to LG Gram 16
(2025) 16Z90TR and 16T90SP (2026 Panther Lake). The flags are
generic and applicable to other OEMs too:

* acpi_irq1_skip_override — Linux drivers/acpi/resource.c
  irq1_level_low_skip_override[] (lines 522-534). Without this
  the ACPI core rewrites the DSDT's ActiveLow to ActiveHigh
  and the i8042 keyboard IRQ stops firing on LG Gram.

* kbd_deactivate_fixup — Linux drivers/input/keyboard/atkbd.c
  line 1913-1917. Prevents spurious keyboard ACK / dropped
  keys on LG hardware.

* no_legacy_pm1b — Red Bear OS specific. LG firmware does not
  implement a separate PM1b_CNT register; tells acpid to skip
  the SLP_TYPb write path.

Also adds a 17U70P entry (Linux matches this on board_name)
and a catch-all LG Electronics entry (Linux atkbd.c matches on
sys_vendor only, not product_name).

Hardware-agnostic: the same flags apply to Dell, HP, Lenovo
laptops with similar firmware quirks. Future Phase I work
will add DMI matches for those vendors based on the Linux
quirk tables.

Also updates local/sources/kernel submodule pointer to
7a38664 (Phase I [patch.crates-io] for redox_syscall).
2026-07-01 05:34:36 +03:00
vasilito 4ded365124 cpufreqd: only log transitions that actually happened; skip dwell on read-only
In read-only mode (detected VM/QEMU/KVM) apply_pstate is a no-op
so c.current_idx never advances. The previous log line was
emitted whenever the *requested* target (n) differed from
current_idx, regardless of whether the write actually fired —
on QEMU that produced thousands of P0->P1 lines per boot even
though no transition ever took place.

Gate the info!() on whether current_idx actually changed. Also
skip the dwell accumulation entirely on read-only hosts: writes
cannot take effect, so the hysteresis counter is meaningless.
The governor still tracks the target so the load value
reflects real demand, but no work fires per poll.

Closes Phase H of the LG Gram 16 (2025) S/P-state work.
2026-07-01 00:03:32 +03:00
vasilito 68b1f74dbf cpufreqd: correct VM detection paths (Redox DMI + CPUID hypervisor bit)
The earlier commit (6d1b11726) read /sys/class/dmi/id/sys_vendor
and /sys/class/dmi/id/product_name. Those are the Linux paths.
Redox exposes SMBIOS fields at /scheme/acpi/dmi/<field> via the
acpid userspace daemon. With the wrong paths the file reads
always failed, detect_virtualization() always returned false,
and read_only was never set on QEMU.

Now we read /scheme/acpi/dmi/sys_vendor and product_name (the
Redox-correct paths), and as a fallback when SMBIOS is absent
or uninformative we check the CPUID hypervisor-present bit
(leaf 1 ECX bit 31) via inline assembly. The CPUID pattern
mirrors local/recipes/system/redbear-power/source/src/cpuid.rs:168
which already uses this bit for the same purpose.

When either signal indicates virtualization, every CpuInfo is
constructed with read_only = true and apply_pstate() short-
circuits at the top. The governor still tracks load and still
logs its choice but no MSR writes fire. On bare metal the
existing path is preserved exactly.

The companion kernel fix in local/sources/kernel (commit
c2312627 on master) corrects a path-strip bug in the sys
scheme dispatcher that was preventing every MSR open from
succeeding with ENOENT. With both fixes together, cpufreqd
on QEMU enters read-only mode and the Ondemand governor stops
the P0->P1->P0 oscillation.
2026-06-30 23:58:33 +03:00
vasilito 6d1b117264 cpufreqd: detect virtualized host, skip MSR writes on QEMU/VM
QEMU's PIIX4 emulation does not model IA32_PERF_STATUS, so the
dwell counter cannot confirm a state transition actually took
effect and the governor oscillates P0<->P1 on idle. On a real
hypervisor (QEMU/KVM, VMware, VirtualBox, Hyper-V, Xen) the MSR
writes are also typically no-ops on the underlying emulation.

detect_virtualization() reads /sys/class/dmi/id/sys_vendor and
product_name. If the system vendor contains 'qemu', 'kvm',
'vmware', 'virtualbox', 'hyper-v', or 'xen', CpuInfo is
constructed with read_only=true and apply_pstate() short-
circuits at the top: the load value is still tracked and the
governor still logs its choice, but no MSR writes fire. On
real hardware (LG Gram 2025, etc.) the existing behavior is
preserved exactly.

The redundant DWELL_CYCLES constant is removed (DWELL_POLLS
already serves that role).

Phase H of CONSOLE-TO-KDE-DESKTOP-PLAN.md.
2026-06-30 22:26:06 +03:00
vasilito 5780fbc1ce cpufreqd: auto-detect virtualization for MSR read-only mode 2026-06-30 22:23:00 +03:00
vasilito 3e57b52a2d cpufreqd: add MSR readback and hysteresis to prevent P-state thrashing 2026-06-30 22:20:04 +03:00
Red Bear OS b25ea418fb redbear-quirks: add LG Gram 16 (2025) Arrow Lake-H DMI quirk (Phase G.8)
The LG Gram 16 (2025) ships with Intel Arrow Lake-H (Core Ultra 7
255H). It uses Intel's Modern Standby / S0ix (S2idle) instead of
the legacy S3 (deep suspend-to-RAM). The kernel-side MWAIT path
(Phase G.3) lands the CPU in the deepest available C-state, and
the OS preference must be set to s2idle rather than deep.

This commit adds two `dmi_system_quirk` entries to
50-system.toml (the system-level quirks file):

- LG Gram 16Z90TR (2025, Arrow Lake-H): sys_vendor=LG Electronics,
  product_name=16Z90TR. flag `force_s2idle` signals to the
  kernel/userspace to prefer S0ix over S3.

- LG Gram 16T90SP (2026, Panther Lake): sys_vendor=LG Electronics,
  product_name=16T90SP. Same Modern Standby preference.

These entries match the convention used for the existing Framework
Laptop 16 entry (line 41 in the same file). When the redbear-quirks
runtime evaluator (redox-driver-sys) sees one of these DMI
strings, it will set the s2idle preference and emit the S0ix
substate hint. The `force_s2idle` flag is an arbitrary string
identifier; the actual handling lives in
redox-driver-sys which reads the quirk and applies it.

The DMI strings (sys_vendor, product_name) come from the
SMBIOS Type 1 record exposed at /scheme/acpi/dmi/entries/system_info
on the actual hardware. The kernel-side FACS parser (Phase F.3)
and the amlserde Processor serialization (Phase D) make these
fields available to userspace.

Phase G.8 was previously listed as open in the final review.
This commit closes it for the LG Gram target hardware.
2026-06-30 16:07:40 +03:00
Red Bear OS 88555c342d redbear-power: add HWP MSR constants and accessors (Phase G.2)
The MSR library was missing the HWP (Hardware P-states / Intel Speed
Shift) MSR set. Arrow Lake-H exposes HWP via:

  IA32_PM_ENABLE         (0x770) bit 0: HWP_ENABLE
  IA32_HWP_CAPABILITIES  (0x771) [31:0]: HWP range
  IA32_HWP_REQUEST       (0x774) [42:0]: min/max/desired/EPP/activity
  IA32_HWP_STATUS        (0x777): current operating point
  IA32_PERF_STATUS       (0x198): legacy current P-state
  IA32_PLATFORM_INFO     (0xCE):  max non-turbo / min ratios
  MSR_TURBO_RATIO_LIMIT   (0x1AD): per-core turbo ratios
  IA32_ENERGY_PERF_BIAS  (0x1B0): power-perf hint

Add:
- hwp_enabled(cpu)        → reads MSR 0x770 bit 0
- hwp_capabilities(cpu)   → reads MSR 0x771, returns
                            (lowest, most_efficient, guaranteed, highest)
- read_hwp_request(cpu)   → reads MSR 0x774
- read_hwp_status(cpu)    → reads MSR 0x777

The TUI can now show a live "HWP active" indicator, the HWP range
percentages, and the current HWP request value. The HWP range
is computed once at startup; updates need only a re-read of
MSR 0x774 (8 bytes, ~microseconds).

The phase-G.1 kernel MSR scheme (commit 8cd4f69) provides the
in-memory storage for these reads. On real hardware, the kernel
will write the actual MSR values; on QEMU they default to zero
which makes the TUI display "HWP inactive" without erroring.
2026-06-30 12:57:04 +03:00
Red Bear OS d24d0e2174 cpufreqd: add HWP (Hardware P-states / Intel Speed Shift) detection
Phase G.2 of the ACPI/Arrow Lake port. The LG Gram 2025 (Core Ultra 7
255H, Arrow Lake-H) uses Intel HWP for P-state control — legacy
IA32_PERF_CTL writes are silently ignored when HWP is active.

The previous cpufreqd always wrote IA32_PERF_CTL (MSR 0x199), which
on Arrow Lake-H had zero effect. We now:

1. Detect HWP at startup by reading IA32_PM_ENABLE (MSR 0x770) bit 0
2. If HWP is active:
   a. Read IA32_HWP_CAPABILITIES (MSR 0x771) for the
      min/max/guaranteed/efficient performance range
   b. Translate the governor's P-state index into the HWP
      "Desired Performance" field + EPP hint
   c. Write IA32_HWP_REQUEST (MSR 0x774) instead of IA32_PERF_CTL
3. If HWP is not active, fall back to the legacy IA32_PERF_CTL path
   (preserves backward compatibility for older CPUs)

The kernel's new /scheme/sys/msr/ scheme (Phase G.1) provides the
in-memory storage backing the MSR reads/writes. On the real LG Gram
2025 hardware, the kernel's MSR scheme will be wired to the actual
hardware MSRs (Phase G+ work); the cpufreqd interface is unchanged.

HWP layout (Intel SDM Vol 3B §14.4.4):
  [7:0]    Minimum Performance
  [15:8]   Maximum Performance
  [23:16] Desired Performance
  [31:24] Energy-Performance Preference (EPP)
  [42:32] Activity Window (0 = auto)
  [42]    Package Control

EPP follows the same index as desired perf: 0 = performance,
255 = power-save. We map the linear P-state index to both the
"Desired Performance" and EPP so the H/W sees a single hint that
the OS wants both the performance and energy level it implies.

Includes:
- PstateMode enum (LegacyPerfCtl | Hwp) for compile-time dispatch
- detect_pstate_mode() reads MSR 0x770
- read_hwp_capabilities() reads MSR 0x771, returns (min, max,
  guaranteed, efficient) bytes
- hwp_request_for() maps P-state index to IA32_HWP_REQUEST u64
- apply_pstate() dispatches to the right MSR based on ci.mode
- The /scheme/cpufreq/state output now tags each CPU with [HWP] or
  [legacy] for observability

Hardware test plan: on the LG Gram 2025, "performance" governor
should pin IA32_HWP_REQUEST.Desired = hwp_max with EPP=0; "powersave"
should pin it to hwp_min with EPP=255; "ondemand" should ramp
between. Reading IA32_PERF_STATUS (MSR 0x198) via /scheme/sys/msr
should reflect the new operating point within ~1ms.
2026-06-30 12:53:57 +03:00
Red Bear OS 5f1da52502 redbear-sessiond: port ACPI shutdown watcher to new Fd-based scheme
Phase D of the ACPI fork-sync plan (continuation).

Phase B replaced the `/scheme/kernel.acpi/kstop` filesystem file with
a single Fd-based call() interface. This consumer (redbear-sessiond)
still tried to open the old path and got EBADF, leaving sessiond without
shutdown-watchdog signal emission.

The new implementation:

- Opens `/scheme/kernel.acpi` and uses `openat("kstop", ...)` to
  get the kstop sub-handle. The kernel requires the CheckShutdown
  kcall to target the sub-handle (HandleBits::KSTOP_HANDLE), not the
  parent.
- Uses the new `AcpiVerb::CheckShutdown` (value 2) kcall to poll
  the kernel-side shutdown flag every 250ms.
- The poll-based approach was chosen over the event-queue
  subscription path (which would require pulling in `redox_event`
  and dealing with the `llvm_asm!` macro deprecation). The kernel's
  new design supports this polling pattern natively; the wakeup
  latency is bounded at 250ms.

Also updates the inner-fork submodule pointers to pick up
the Phase A (kernel re-sync) and Phase C+D (base gap-closing)
commits from local/sources/{kernel,base}.

Files:

- local/recipes/system/redbear-sessiond/source/src/acpi_watcher.rs:
  rewrote wait_for_shutdown_edge() to use the new Fd interface.

- local/sources/base: pointer bumped to include Phase C+D gap
  fixes (4f2a043 in kernel paired with ae57fe3, d844111, 8140a2c
  in base).

- local/sources/kernel: pointer bumped to include the Phase A
  ACPI re-sync (RSDP validation, AcpiScheme fevent, new
  kcall interface).

Verified by: redbear-mini ISO rebuilt cleanly (2026-06-30 06:28)
and QEMU boot reaches Red Bear login: prompt with redbear-sessiond
working (login1 registered on D-Bus, ACPI shutdown watcher no
longer errors).
2026-06-30 06:33:11 +03:00
vasilito 49363122d1 build: revert strtold workarounds — GCC cstdlib fix is the root fix
Remove per-package workarounds that were needed before the root-cause
fix in mk/prefix.mk (which adds #include <stdlib.h> to GCC's <cstdlib>
header at prefix build time). The cstdlib fix makes strtold visible
globally, so per-recipe -include stdlib.h and P1-*.patch are redundant.

Reverted:
- redox-toolchain.cmake: removed -include stdlib.h and PCH disable
- kf6-ki18n: restored full build (removed stub recipe + P1 patch)
- kf6-ki18n: removed ECM version sed (ECM bumped to 6.11.0 already)
- redbear-greeter: removed #include <stdlib.h> workarounds in source
- local/patches/kf6-ki18n/: removed unused P1 patch directory
2026-06-30 02:34:08 +03:00
vasilito 2533484bb0 fix: redbear-greeter — include stdlib.h before Qt for strtold 2026-06-29 14:35:52 +03:00
vasilito ab297a874a fix: gitlab→gitea URL + accumulated source fixes from build 2026-06-29 11:59:31 +03:00
vasilito e1348228bc relibc: strtold — fix Rust 2024 unsafe block, document trailer 2026-06-29 02:57:57 +03:00
vasilito fd4a40eff3 thermald: drop periodic surface-availability check
The previous commit changed the existence probe from is_dir/exists
(read_dir uses stat) to read_dir.is_ok(), but the second and subsequent
calls to read_dir for /scheme/acpi/thermal still return Err at runtime.
The first discover_zone_dirs call at startup succeeds (it sees 0 zones,
matching the acpid scheme's empty Thermal directory). The periodic
monitor_loop recheck then fails with 'unavailable' even though the
path is in fact present.

The real reason is not fully understood yet, but may relate to
scheme-namespace state after userland init, fd table churn, or
Redox-specific read_dir semantics on empty scheme directories.

The warn-once check is redundant: discover_zone_dirs already runs at
startup, and update_policy() sees the empty state every poll cycle and
re-renders the TUI accordingly. Drop the periodic recheck so the
already-diagnosed empty surface no longer logs a false alarm.
2026-06-28 20:10:45 +03:00
vasilito b7341caa4d redbear-power: restore PkgW column with compact labels
- Per-CPU table: PkgW column shows 'root' (needs sudo), 'n/a'
  (unsupported), '...' (sampling), or wattage when RAPL working
- Header shows full rapl_status message for context
2026-06-28 18:56:05 +03:00
vasilito b8e8774252 thermald, redbear-upower: probe ACPI surface via read_dir
Both daemons previously checked /scheme/acpi/thermal (thermald) and
/scheme/acpi/power (redbear-upower) existence with Path::exists or
is_dir, which use stat/lstat. On Redox these syscalls can return
errors for scheme paths even when the scheme IS registered, leading
to false 'unavailable' warnings even after the new acpid thermal/
power directories were added.

Use fs::read_dir (which already worked for actual zone enumeration)
as the existence probe instead. The match expression intentionally
calls read_dir to discard the iterator and keep only the Result;
using ? here would break the warn-once pattern.
2026-06-28 18:54:05 +03:00
vasilito dbb7bf74e9 redbear-power: clear PkgW status, remove redundant per-CPU PkgW column
- app.rs: rapl_status field shows 'n/a (run as root)' or
  'n/a (unsupported)' or 'sampling...' depending on state
- render.rs: header PkgW shows rapl_status when unavailable;
  removed per-CPU PkgW column (package power is socket-wide)
2026-06-28 18:51:09 +03:00
vasilito 03fd3a0690 redbear-power: synthetic P-state table from cpuinfo min-max, freq-based index matching
- acpi.rs: fallback creates 6 evenly-spaced P-states from
  cpuinfo_min_freq / cpuinfo_max_freq when scaling_available_frequencies
  is absent (intel_pstate, amd-pstate drivers)
- platform.rs: probe accepts cpuinfo_max_freq as valid PSS source
- app.rs: match current frequency against synthetic P-state table
  to compute current_idx without MSR access
- pss_source label: 'sysfs (cpuinfo min-max)' for intel_pstate
2026-06-28 18:32:24 +03:00
vasilito d2b969eb05 redbear-power: bulletproof cpufreq backend with writability check
- cpufreq.rs: complete rewrite — Backend enum (Redox/Linux), Cpufreq
  struct with self-discovering governor list, probe-based discovery
  on Redox, writability verification by writing current governor
  back. No hardcoded governor names — cycle order follows discovered
  list. Handles intel_pstate (no ondemand), permission-denied,
  and absent cpufreq gracefully.
- app.rs: Cpufreq stored in App instead of Governor enum, eliminates
  per-poll probe overhead. cycle_governor flashes root-required
  when sysfs denies write.
- render.rs, dbus.rs: use cpufreq.active string directly
2026-06-28 18:13:34 +03:00
vasilito ee086ded2d redbear-power: RAPL MSR constants, unit parsing, MSR-based energy reading
- msr.rs: add all Intel RAPL MSR addresses (0x606-0x64D) and AMD Zen
  equivalents (0xC0010299-0xC001029B), RaplUnit struct for unit register
  parsing with energy_to_uj/power_to_w conversion, read_rapl_energy()
  and read_rapl_energy_uj() functions
- acpi.rs: read_rapl_package_energy() now tries MSR first (Intel then
  AMD PKG energy MSRs) with unit-based µJ conversion, falls back to
  Linux powercap sysfs
- local/docs/RAPL-IMPLEMENTATION-PLAN.md: comprehensive 3-phase plan
  based on Linux 7.1 kernel analysis, Intel SDM, Fuchsia RFC-0203
  patterns. Documents P0 blocker: /scheme/sys/msr/ not implemented
  in kernel
2026-06-28 16:55:51 +03:00
vasilito 6da211161c redbear-power: sysfs freq fallback, RAPL package power, compact layout, governor verify, 0 warnings
- Freq/MHz: add read_cpu_freq_khz_sysfs() fallback when MSR unavailable
  (reads /sys/.../scaling_cur_freq + cpuinfo_cur_freq, like htop)
- PkgW: add RAPL powercap reading from /sys/class/powercap/intel-rapl
  with delta-to-watts computation (100ms min, 5s max guard)
- Governor: cycle_governor() + set_governor() now verify writes by
  reading back immediately; revert + flash error if kernel rejected
- Layout: reduce HEADER_LINES 8→7, replace 25-line controls panel with
  1-line key bar (g:%s ↑↓:cpu p/P:±pstate ... q:quit), freeing 24 rows
- Fix 3 unnecessary unsafe blocks in cpuid.rs (intrinsics now safe)
- Narrow #![allow] from 5 broad attrs to dead_code only + targeted
  #[allow(unreachable_patterns)] on key-dispatch match
- 0 warnings (was 53)
2026-06-28 16:29:18 +03:00
vasilito 909cce0f5d cpufreqd, redbear-power: read CPU count from /scheme/sys/cpu
On Redox the kernel's sys:cpu scheme is a single file (kernel/src/scheme/
sys/cpu.rs) whose contents start with 'CPUs: N\n', not a per-CPU directory.
The kernel does not create /dev/cpu/ at all, so the prior read_dir-based
enumeration always fell through to the single-CPU fallback on Redox —
hiding the fact that the kernel had successfully brought up the APs and
reporting only CPU 0 to the governor / power TUI.

Read /scheme/sys/cpu and parse the 'CPUs:' line first; fall back to
/dev/cpu/ for Linux hosts.
2026-06-28 16:26:30 +03:00
vasilito 8af119d1a9 Remove duplicate redbear-netctl-console recipe (nested inside redbear-netctl) 2026-06-28 00:01:47 +03:00
vasilito e4362bbfad redbear-power: surface tab keys in --help and Controls panel
The tab keys (1-9 jump directly, T cycles next) were
always wired in main.rs but not documented anywhere
visible. Operators could not discover how to switch
between the 9 data tabs (Per-CPU / System / Info /
Motherboard / Battery / Sensors / Network / Storage
/ Process) without reading the source.

Two surfaces now surface the tab keys as the FIRST
entries, ahead of governor / P-state / throttle
controls:

1. Controls panel (visible at the bottom of every
   TUI frame): adds a 'Tabs:' line listing the 9
   direct-jump keys with abbreviated tab names, plus
   a [T] cycle line. Implemented in
   render_controls().

2. --help output (HELP_TEXT constant, shown via
   'redbear-power --help' and the in-TUI [?] help
   overlay): adds a TABS: section at the top of the
   INTERACTIVE CONTROLS block, listing all 9 tabs in
   3-row grid + the [T] cycle key.

The keys themselves are unchanged: '1'-'9' for
direct tab jump, 'T' for cycle. No new keybindings
or behaviors added.

Discovered during interactive smoke-testing on the
Linux host: the binary worked perfectly but tab
navigation was a discoverability hole. Fix-only,
no semantic change.

186/186 tests still pass (the controls panel
render is covered by the existing snapshot tests).
2026-06-21 15:57:31 +03:00
vasilito 1a9d77761e fix(qtdeclarative): properly generate qtquick-config.h features
The qtquick-config.h file was being generated empty by the cmake
build, causing 'division by zero in #if' errors in downstream
consumers (SDDM, KWin) because QT_CONFIG(quick_shadereffect) and
QT_CONFIG(quick_draganddrop) were undefined.

Two fixes:
1. Explicitly enable QT_FEATURE_quick_shadereffect and
   QT_FEATURE_quick_draganddrop in the cmake configuration.
2. Add a safety net that regenerates qtquick-config.h with the
   required feature definitions if cmake produces an empty file.
2026-06-21 15:12:40 +03:00