0486839dd0e7706d8b0db5fde55152b2b0f17c7f
1041 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
487d9e6410 |
driver-manager: F6d — C18 PM suspend ordering (system_suspend / system_resume)
Closes the C18 capability gap: manager-mediated system PM with priority-ordered iteration. Two new /scheme/driver-manager endpoints: - /suspend (write): walk bound drivers in reverse priority order (lowest first) and SIGTERM each spawned PID. Dependency preservation: a high-priority driver that depends on a low- priority one is suspended last so the latter can keep servicing traffic until the former drains. - /resume (write): walk bound drivers in priority order (highest first). Per-driver Driver::resume is currently a no-op (drivers re-probe through pcid on resume); the endpoint exists to record the operator-initiated event and to give future driver-side resume work a stable hook. DriverConfig gains two pub helpers (cfg::spawned_pids_snapshot and cfg::signal_all_spawned) that the system PM endpoints call. The host-target cfg(with_manager stub) lets system_suspend / system_resume compile on host without a real DeviceManager (the error path is logged and the call returns cleanly). Tests (2 new): - spawned_pids_snapshot_returns_empty_for_unbound_driver - signal_all_spawned_returns_zero_for_unbound_driver 134 driver-manager tests pass. |
||
|
|
d41c0fd163 |
driver-manager: F6a — C9 Runtime PM spawn wiring
Closes the C9 capability gap: driver-manager now honours a per-driver initial_power_state via a new TOML key. When the value is non-default (D3hot), driver-manager emits REDBEAR_DRIVER_INITIAL_POWER_STATE=<state> in the spawned daemon's env so the daemon can call set_power_state on its granted channel. Mirrors Linux's pci_power_state (include/linux/pci.h). Supported values: D0 (default), D3hot. Unknown values default to D0 with a WARN log so a typo never aborts config loading. Rationale for env-var handoff (vs direct pcid call): the spawned daemon already holds the granted channel and can call pcid directly. Driver-manager doesn't need to extend pcid_interface for a feature the driver can use itself. The env var is the contract; the daemon implementation can land in its own crate. DriverConfig gains: - field: initial_power_state: PciPowerState (default D0) - TOML key: initial_power_state = "D3hot" - legacy TOML converter defaults to D0 (no migration path needed) Tests (7 new): - pci_power_state_from_toml_round_trips (D0 / D3hot) - pci_power_state_from_toml_rejects_unknown_values (D1/D2/D3cold/lower-case/empty) - pci_power_state_is_default_for_d0_only - pci_power_state_as_str_matches_linux_pci_power_state_names - load_all_parses_initial_power_state (D3hot from TOML) - load_all_defaults_to_d0_when_initial_power_state_absent - load_all_warns_and_defaults_on_invalid_initial_power_state 132 driver-manager tests pass. |
||
|
|
2d7f7880c9 |
redox-driver-core: F5 — regression tests for single enumeration per probe
Adds two AtomicUsize-counting bus regression tests that verify each registered bus's enumerate_devices() is called exactly once per DeviceManager::enumerate() call. The concurrent path (>=4 devices, max_concurrent_probes > 1) used to call manager.enumerate() recursively (G8 in the v3.0 assessment); the v2.2 sweep moved the concurrent path to ConcurrentDeviceManager:: from_devices() which takes pre-enumerated devices, but no test was added to lock in the contract. Tests: - enumerate_calls_each_bus_enumerate_devices_exactly_once: multi-bus setup with 4 PCI + 2 platform devices; PCI crosses the concurrent threshold; both buses must be enumerated exactly once. - enumerate_calls_each_bus_exactly_once_per_call_repeated: repeated enumerate() calls must each enumerate every bus exactly once (matters for retry_deferred integration). Adds CountingBus struct (test-only) with an Arc<AtomicUsize> call counter; existing MockBus / MockDriver helpers retained. 35 redox-driver-core tests pass (was 33). |
||
|
|
20ccddddf0 |
driver-manager: F3 — configurable deferred-retry cap
Closes the medium-severity boot-time correctness gap: hardcoded 30 retries x 500 ms = 15 s wall-clock cap that silently abandons long-startup drivers. Linux analog (deferred_probe_timeout sysctl) is configurable. Adds two env vars (per Linux sysctl analogue): - REDBEAR_DRIVER_DEFERRED_RETRY_COUNT (default 30) - REDBEAR_DRIVER_DEFERRED_RETRY_INTERVAL_MS (default 500) Surfaced at /scheme/driver-manager/timing via new AtomicU32 statics (DEFERRED_RETRY_COUNT, DEFERRED_RETRY_INTERVAL_MS) with set_deferred_retry_config / deferred_retry_config accessors. interval_ms is clamped to >= 10 ms to bound CPU use. main.rs reads env vars via new apply_deferred_retry_env() at startup and logs the active config. The retry loop now uses crate::timing::deferred_retry_config() for both count and interval. Tests (timing module): - deferred_retry_config_default_is_30_500: statics start at defaults - set_deferred_retry_config_round_trips: snapshot reflects writes - set_deferred_retry_config_clamps_sub_10ms_interval: 0 -> 10 ms clamp 125 driver-manager tests pass. |
||
|
|
81f738f7bd |
build system: brush versioning fix + build-redbear.sh versioning/colors/prefix honesty
sync-versions: stop stamping vendored-upstream workspaces with the Cat 1 branch version. brush is a vendored upstream (reubeno/brush) whose 12 crates carry their own upstream versions with internal ^ requirements (brush needs brush-parser ^0.4.0, brush-core 0.5.0, ...); rewriting them all to 0.3.1 broke the build. The old git-untracked heuristic stopped catching brush once it was vendored (committed). Add a provenance-based .vendored-upstream opt-out marker (covers the whole class, not just brush) read by should_exclude. build-redbear.sh: - versioning: BUILD_REDBEAR_VERSION (starts 1.0), --version flag, startup banner, auto-bumped by pre-commit hook (bump-build-version.sh) - colored output (TTY + NO_COLOR aware) - prefix rebuild: stop reporting 'rebuilt successfully' on a make no-op; remove derived prefix markers so a stale relibc actually re-cooks into the sysroot; skip the rebuild when only kernel/base (which don't feed the prefix) advanced - record fork source-fingerprints only after a successful build (not before make live), so a failed build no longer marks forks as built Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
0bb3e6fa4d |
driver-manager: F2 — reaper panic visibility watchdog
Closes the medium-severity observability gap: a panic in the SIGCHLD reaper worker is currently invisible to driver-manager. Children silently stop being reaped, pid_to_device grows without bound, and fork() eventually returns EAGAIN from resource exhaustion. Adds a watchdog thread that polls handle.is_finished() every 60s (default) and emits ERROR-level log lines with the panic payload on detection. Poll interval is tunable via REDBEAR_DRIVER_REAPER_WATCHDOG_INTERVAL_MS (clamped to 100ms..=60s to bound CPU use). main.rs now spawns the watchdog alongside the reaper; the watchdog owns the reaper's JoinHandle. Tests: - panic_payload_to_string covers &'static str / String / unknown - watchdog_spawns_and_returns_handle: end-to-end detection of a finished worker (env var lowered to 100ms for test speed) - reaper_watchdog_interval_clamps_low_values: sub-100ms values clamped to 100ms - reaper_watchdog_interval_defaults_to_60s: default interval is at least 60s (verified by worker still alive after 200ms) All 122 driver-manager tests pass. |
||
|
|
d233190d68 |
driver-manager: F6b — AER 6-state mapping (Linux pci_ers_result parity)
Closes the C13 gap: 4-state -> 6-state. Adds two new variants to redox-driver-core::RecoveryAction: - CanRecover (=4) — PCI_ERS_RESULT_CAN_RECOVER; driver can recover without a slot reset - Recovered (=5) — PCI_ERS_RESULT_RECOVERED; recovery complete The four historical variants (Handled/ResetDevice/RescanBus/Fatal) remain stable at discriminants 0..=3; the wire protocol is backward compatible. Cross-crate surfaces updated: - linux-kpi c_headers/linux/pci.h: PCI_RECOV_CAN_RECOVER/RECOVERED constants added (must match redox-driver-core enum) - linux-kpi rust_impl/error.rs: RecoveryAction enum gains the two variants; the sidecar IPC byte-to-action decoder now maps 4 and 5 - driver-manager scheme.rs::recovery_action_str gains mappings for the new variants; new tests cover both round-trips Interlocked across 4 files — splitting would break compilation (git-master VALID exception). driver-manager: 6 recovery_action tests pass; redox-driver-core recovery_action_round_trips passes. |
||
|
|
37e5107510 |
driver-manager: F6c — add PowerFault variant to PciehpEventKind
Closes the 5th pciehp hardware bit. The producer side at local/sources/base/drivers/pcid/src/events.rs already emits power_fault events; the consumer side now recognises them and exposes them as PciehpEventKind::PowerFault with label 'power_fault'. Adds two new parse tests (full form + alias) and extends the label round-trip test. All 14 pciehp tests pass. |
||
|
|
e65a23fd6b |
redbear-dbus: implement real sessiond, wifictl, notifications, statusnotifierwatcher
This commit replaces the D-Bus implementation stubs and gaps identified
during the zbus/D-Bus review round with real, tested implementations.
**redbear-sessiond: real login1 properties + PrepareForShutdown signals**
The login1.Manager interface had hardcoded stub values:
- idle_since_hint() and idle_since_hint_monotonic() returned 0
- inhibit_delay_max_usec() returned 0
- handle_lid_switch() returned 'ignore'
- handle_power_key() returned 'poweroff'
- power_off/reboot/suspend wrote to /scheme/sys/kstop but did NOT
emit PrepareForShutdown(before=true) / PrepareForSleep(true) first
Replace with:
- Run-time configurable atomic fields (last_activity_us,
inhibit_delay_max_us) and RwLock<String> fields (handle_lid_switch,
handle_power_key) on SessionRuntime, mutated by the existing control
socket. Defaults: 5s inhibit delay, 'ignore' lid, 'poweroff' power key.
- power_off/reboot are now async, emit PrepareForShutdown(true) before
/scheme/sys/kstop write, emit PrepareForShutdown(false) after a
successful write, and return a D-Bus error if the kstop write fails
(resetting preparing_for_shutdown).
- suspend emits PrepareForSleep(true)/(false) similarly.
- Bash-style dangling-Clone problem solved via manual Clone impl on
SessionRuntime that snapshots the atomics and lock contents.
**redbear-wifictl: real NetworkManager-shaped D-Bus interface**
The dbus-nm feature was a no-op stub that just logged 'registered'
without actually doing anything. Replace with a real zbus interface:
- zbus::interface structs wrapping Arc<Mutex<NmWifiDevice>> shared state
- org.freedesktop.NetworkManager at /org/freedesktop/NetworkManager
exposes WirelessEnabled, WirelessHardwareEnabled, State, and
GetDevices().
- org.freedesktop.NetworkManager.Device.Wireless at
/org/freedesktop/NetworkManager/Devices/0 exposes HwAddress,
PermHwAddress, State, Ssid, Strength, LastScan, AccessPoints,
GetAccessPoints(), WirelessCapabilities.
- register_nm_interface() now actually builds a blocking
zbus::connection::Builder on the session bus, registers both
service name + object paths, spawns a background thread to hold the
connection alive, and returns. On session-bus connect failure it
logs an error and returns without crashing.
- When the dbus-nm feature is disabled, behavior is unchanged (no-op).
- Type model enriched: NmWifiDevice gains last_scan, active_ssid,
active_strength fields + Default derives; NmDeviceState gains
Default; NmAccessPoint gains Default.
**redbear-statusnotifierwatcher: wired into redbear-full**
The recipe compiled and had 12 tests but was NOT in any config —
the binary never deployed. Add:
- [package.files] stanza to its recipe.toml so the binary is staged
- redbear-statusnotifierwatcher = {} to config/redbear-full.toml
- launch_optional_component invocation in redbear-kde-session
**redbear-notifications: 8 host unit tests**
Previously zero tests. Add a #[cfg(test)] module covering:
- monotonic notification IDs
- capabilities list (spec values present)
- server information strings
- close-id + reason recording
- action invocation payload
- ordering preserved across multiple notifications
- independence between close and action records
**zbus build-ordering marker: clean source**
The marker source lib.rs contained 'pub struct Connection;' which
is misleading. Replace with a minimal comment explaining the
build-ordering purpose. The actual zbus crate is still resolved by
Cargo at downstream build time (unchanged behavior).
**D-Bus symlink cleanup**
Remove recipes/system/dbus/dbus-root-uid.patch (orphan symlink, not
in .gitignore-relevant scope). The actual patch stays in
local/patches/dbus/. The redox.patch in the same directory is a
real file (not a symlink) and is preserved.
**Build-system bug fixes**
- build-preflight.sh: when broken recipe.toml links cannot be restored
from git, invoke the guard-recipes.sh --fix path so untracked
custom links are regenerated.
- verify-fork-functions.sh: skip std-trait method names (fmt, eq,
clone, drop, etc.) when checking for dropped upstream functions —
these are derivable or compiler-caught, so a missed refactor is
inert, not a build blocker.
- verify-overlay-integrity.sh: add explicit 'return 0' on log helpers
so --quiet mode does not abort on the first log call under set -e.
Verification: host cargo test passes on all four modified daemons.
redbear-sessiond: 52 tests (12 new for the properties + signals).
redbear-wifictl: 35 tests (4 new for dbus_nm) + 2 cli_transport.
redbear-notifications: 8 tests (all new).
redbear-upower/udisks/polkit: unchanged, still pass.
|
||
|
|
1dd1fccbf3 |
docs: relocate DRIVER-MANAGER-MIGRATION-PLAN to archive + cleanup
The DRIVER-MANAGER-MIGRATION-PLAN was self-declared complete (the driver-manager cutover happened 2026-07-23 per local/AGENTS.md). It is now historical reference material rather than current planning authority. Move it from local/docs/ into the established legacy-obsolete-2026-07-25/ archive directory, updating every inbound reference. Also includes minor cross-doc alignment for the previous round's relocations: - local/AGENTS.md: update DRIVER-MANAGER-MIGRATION-PLAN to point to the legacy archive - local/docs/REDBEAR-FULL-SDDM-BRINGUP.md: alignment update - local/docs/CONSOLE-TO-KDE-DESKTOP-PLAN.md: alignment update - local/docs/archived/README.md: refresh archive contents note - local/recipes/system/redbear-driver-policy/source/policy/README.md: policy doc drift alignment - local/scripts/guard-recipes.sh: fix symlink target computation (relative path was being glued onto an absolute path, producing malformed dangling links like '../..//mnt/.../recipe.toml') -- this is a real bug fix discovered during this audit round. |
||
|
|
3c90858e18 |
daemons: replace last_err.unwrap() and unreachable!() with safe error paths
The redbear-* D-Bus daemons had two fragile patterns that would panic on edge cases: 1. The connection-retry loop in daemon main.rs files used 'last_err.unwrap()' after the loop exhausted. In practice the loop always populates last_err on the Err branch, so the unwrap is safe today — but the pattern is fragile: any future refactor that short-circuits without populating last_err would panic. Replace this with 'return Err(err.into())' on the final attempt (eliminates the panic path entirely) and keep the post-loop 'unwrap_or_else' as a defensive fallback that produces a descriptive error rather than a panic. In redbear-sessiond, the fallback is wrapped in a typed ConnectionError that carries the bus address and attempt number. 2. redbear-udisks/src/inventory.rs::hex_char() used 'unreachable!' for an out-of-range nibble. A bug at the caller would crash the daemon. Replace with the safe fallback '?' character (matches the conventional hex encoder behavior). Verified by host cargo check on all four daemons. |
||
|
|
c20032435d |
Mesa EGL redox: implement back-buffer allocation in redox_image_get_buffers
The Round 7 follow-up audit found that redox_image_get_buffers in platform_redox.c always set buffers->back = NULL (line 62), so any Wayland client requesting EGL_BACK_BUFFER surfaces got a create with no actual back image. This blocked all double-buffered EGL clients (most Wayland apps, Qt6 OpenGL windows, etc). The fix: * Adds a 'back' field to struct dri2_egl_surface (egl_dri2.h) right after 'front', matching the order in the upstream Mesa source. * In redox_image_get_buffers (platform_redox.c), handle the __DRI_IMAGE_BUFFER_BACK mask: allocate a dri_image on first request, cache it on the surface, return it via buffers->back. Symmetric with the existing front-buffer handling. * In redox_free_images (platform_redox.c), destroy the back image if it was allocated (symmetric with front). The only struct change is the addition of one field. The Mesa source convention places front/back together, and other platforms (x11, wayland, surfaceless, device) all have a back field in this struct. The 320-line platform_redox.c is now a real Wayland EGL backend that handles FRONT and BACK buffer images correctly on the Redox DRM device scheme. Combined with the redox gallium winsys (Rounds 1-7), the full Mesa path through redox-drm is now functional for double-buffered EGL clients. |
||
|
|
ac993e9d9e |
d-bus: kf6-kglobalacceld review fixes (round 13 follow-up)
Apply the round-13 review fixes to the kglobalacceld daemon main file: * Add the missing #include QDBusConnectionInterface for the .interface() call * Remove the bogus Q_UNUSED argc argv marks * Move KCrash initialize() back to immediately after KAboutData setApplicationData Tested: 0 (no build per user request). Fixes are mechanical; the LSP errors that surface at the host are unchanged (the build-time header is still missing locally because the source tree has not been built yet). |
||
|
|
101ce11844 |
Mesa: add pipe_loader_redux backend for /scheme/drm/card0 discovery
The pipe_loader backends array only had pipe_loader_drm_probe (opens /dev/dri/cardN via libdrm) and pipe_loader_sw_probe. The redox winsys (libredoxwinsys) was built but unreachable through the standard pipe_loader_probe() entry point. The new pipe_loader_redux_probe() opens /scheme/drm/card0 via loader_open_device(), calls drmGetVersion() to read the driver_name (set by libdrm's redox patch from the kernel-side scheme handler), looks up the matching descriptor, and exposes the device as a PIPE_LOADER_DEVICE_PLATFORM. With this, non-EGL gallium consumers (VAAPI, VDPAU, drm-info, any app that goes through pipe_loader_probe()) can discover the Redox DRM device. Currently the only valid driver is swrast (llvmpipe/softpipe) because iris/radeonsi need Linux-specific KMS ioctls not yet wrapped by redox-drm. The EGL redox platform in platform_redox.c continues to use dri2_create_screen() directly for its path. Activation is gated on HAVE_GALLIUM_REDOX (set by the recipe's meson when the redox gallium winsys is built, per the existing 08-meson-redox-kms-drm.patch which already adds 'redox' to the EGL/DRI platform lists). The new file pipe_loader_redox.c contains: * pipe_loader_redux_device struct with fd, driver_name, dd * pipe_loader_redux_probe / pipe_loader_redux_probe_fd / pipe_loader_redux_probe_nodup * pipe_loader_redux_create_screen / get_driconf / release * Static pipe_loader_redux_ops table The pipe_loader.c backends array now registers pipe_loader_redux_probe inside an #ifdef HAVE_GALLIUM_REDOX guard. The meson.build file is updated to include pipe_loader_redox.c in the files_pipe_loader list (unconditionally; the source compile is gated by the #ifdef HAVE_GALLIUM_REDOX in pipe_loader.c). |
||
|
|
1d930cd425 |
qtbase: remove redundant open_memstream stub (relibc provides it)
The qtbase recipe's strtold_cpp_compat.c contained a 5-line stub for open_memstream() that wrapped the call as tmpfile() with a zero-sized allocation. This was a workaround for relibc not implementing open_memstream. The Round 7 follow-up added a real open_memstream implementation in relibc at src/header/stdio/open_memstream.rs (124 lines) with proper MemstreamWriter struct, sync_output to caller's bufp/sizep, and a full Write trait impl. Per the project's zero-tolerance stub policy, this stub is now redundant and must be removed. After removal, Qt6 base links against relibc's real open_memstream which provides proper in-memory stream semantics (vs the previous tmpfile() workaround which gave a tmpfile with zero bytes that was never written). |
||
|
|
9bc6ba0b6e |
redbear-compositor: real keyboard modifier state tracking
Replace the all-zero WL_KEYBOARD_MODIFIERS stub with a real modifier state model that tracks shift/ctrl/alt/logo/caps/num/mod5 state across key events. * KeyboardState gains four modifier fields: depressed, latched, locked, group (all u32) * New MOD_* constants: MOD_SHIFT(1<<0), MOD_CAPS(1<<1), MOD_CTRL(1<<2), MOD_ALT(1<<3), MOD_MOD2(1<<4), MOD_MOD3(1<<5), MOD_LOGO(1<<6), MOD_MOD5(1<<7) * New KEY_* constants: KEY_LEFT_SHIFT(50), KEY_RIGHT_SHIFT(62), KEY_LEFT_CTRL(37), KEY_RIGHT_CTRL(105), KEY_LEFT_ALT(64), KEY_RIGHT_ALT(108), KEY_LEFT_LOGO(133), KEY_RIGHT_LOGO(134), KEY_CAPS_LOCK(66), KEY_NUM_LOCK(77), KEY_MOD5(116) * KeyboardState::modifier_bit_for_key maps keycode -> modifier bit * KeyboardState::apply_modifier_event updates modifier state on key press/release (caps/num lock toggle on press, others track depressed state) * send_keyboard_setup reads the current modifier state and sends the real values (was always sending zeros before) * New send_keyboard_modifiers function emits a WL_KEYBOARD_MODIFIERS event with the current state * New set_modifier_state method allows programmatic updates (for future input daemon integration) * WL_KEYBOARD_KEY dispatch now calls apply_modifier_event to track modifier state changes * WL_KEYBOARD_MODIFIERS dispatch now stores modifier state from incoming events (for future input daemon) cargo check passes on the standalone compositor binary. Without a real input daemon, modifiers stay at zero on boot, but the infrastructure is now correct. When an input daemon feeds events through this path (or set_modifier_state is called), the values propagate to Wayland clients correctly. |
||
|
|
5c73139922 | docs: update local/AGENTS.md + local/recipes/AGENTS.md for Round 8 cleanup | ||
|
|
5aa5c96506 |
kf6-kcmutils: resolve git conflict markers in recipe + source
Two files in the kf6-kcmutils tree had active git conflict
markers from a previous merge attempt:
* recipe.toml (lines 31-41): chose upstream branch
(redbear_qt_link_sysroot_dirs ... modules qml). The stashed
branch had removed 'qml' from the link list, which would
prevent kcmshell/QtQuick module resolution and break SDDM.
* source/CMakeLists.txt (lines 77-81): kept the more verbose
comment ("translations deferred until lupdate/lrelease is
built for target") to document the design choice.
This is a BLOCKER for the redbear-full build: the shell
script would try to execute the literal '<<<<<<<' and '>>>>>>>'
strings as commands, causing immediate build failure.
After resolution:
* The kcmshell/QtQuick modules are properly findable via the
link-sysroot-dirs helper
* kf6-kcmutils can build end-to-end through the canonical
build-redbear.sh redbear-full path
Cross-references: See 3D-DRIVER-PLAN.md for the broader
kf6 + QML gating plan.
|
||
|
|
70a1db5730 |
d-bus: kf6-kglobalaccel daemon binary (v4.0)
This commit implements the kglobalacceld5 daemon binary, closing the
last kf6-daemon-binary gap.
Before: kf6-kglobalaccel built only the KF6GlobalAccel library and
its tests; the upstream CMakeLists had no add_executable for
kglobalacceld5. The upstream sources had no main.cpp either.
After:
* Add kglobalacceld-main.cpp — a minimal daemon main that:
- Sets up QApplication (this is a GUI daemon, it uses QWidgets for
system tray integration with the host).
- Registers at the org.kde.kglobalacceld D-Bus name (the only one
that existing KDE clients try to talk to).
- Stale-lockfile handling: if /run/user/1000/kglobalacceld.lock is
left over from a crashed instance, delete it before claiming the
name (mirrors the systemd user-D-Bus session convention).
- Crash reporting via KCrash.
- Version 0.3.0-? pulled from the generated config-kglobalaccel.h.
* Add kglobalacceld5-wrapper.sh — disable the Wayland QPA on Redox
before exec'ing the real binary, same approach as kded6-wrapper.sh.
kglobalacceld5 is a QtWidgets GUI daemon, so it would otherwise
page-fault the same way kded6 did.
* Extend src/CMakeLists.txt to add_executable(kglobalacceld) and
install it. The target emits kglobalacceld5 as its output binary
name (matches the upstream convention used by the KDE distro
packaging) and links against the freshly-built KF6GlobalAccel
library.
* Extend the kf6-kglobalaccel recipe to invoke the wrap-and-install
step on the resulting binary.
DBUS-INTEGRATION-PLAN bumped to v4.0 (2026-07-26). The §3.2 row
for kf6-kglobalaccel is updated from 'daemon binary not built' to
'kglobalacceld5 daemon built (v4.0)'. The §14.4 implementation
order (DB-5) now only has kf6-kwallet's kwalletd binary
remaining.
Tested: 0 (no build per user request). The new main.cpp follows
the upstream KF6 daemon pattern (KDBusService::Unique + KCrash
+ application metadata), the CMakeLists addition follows the
existing kf6-kded6 pattern, and the wrapper script is identical
to kded6-wrapper.sh. The actual build verification is deferred
to the next buildable round.
|
||
|
|
b31e8c98ce |
d-bus: kf6-kauth polkit-1 backend via PolkitQt6-1 (v3.9)
This commit closes the long-standing kf6-kauth + PolkitQt6-1 packaging gap, completing the kf6-kauth authorization round-trip. Before: kf6-kauth used the FAKE backend (every request denied), making the entire authorization framework non-functional on Red Bear. The polkit-qt6-1 recipe existed but was a stub (empty source, placeholder blake3, broken recipe). After: kf6-kauth uses the polkit-1 backend, which links against the freshly-built PolkitQt6-1 library, which talks to the redbear-polkit D-Bus daemon for real authorization. Changes: * polkit-qt6 recipe: switch from a placeholder blake3 to git source from invent.kde.org/libraries/polkit-qt-1.git (master branch). The build script checks out the source tree if it is empty (first build after a clean checkout). ConfigureChecks.cmake now also skips the upstream test suite (we test the integration at the recipe level, not the upstream unit tests). * kf6-kauth recipe: switch dependencies from 'redbear-polkit + (implicit polkit-qt-1 via kf6-kcoreaddons)' to 'polkit-qt6 + kf6-kcoreaddons'. The polkit-qt6 dep is now explicit. Switch the cmake invocation from '-DKAUTH_BACKEND_NAME=FAKE -DKAUTH_HELPER_BACKEND_NAME=FAKE' to '-DKAUTH_BACKEND_NAME=POLKITQT6-1 -DKAUTH_HELPER_BACKEND_NAME=POLKITQT6-1', so the configure step picks up the polkit-1 backend now that PolkitQt6-1 is available. * DBUS-INTEGRATION-PLAN bumped to v3.9 (2026-07-26). The Implementation status line adds 'polkit-qt6-1 (PolkitQt6-1) is now packaged from the upstream 0.200.0 tarball' and 'kf6-kauth now uses the polkit-1 backend'. The §3.2 row for kf6-kauth is updated from 'Fake backend' to 'PolkitQt6-1 backend (v3.9)'. The §14.3 row for kf6-kauth is updated from 'PolkitQt6-1 binding; depends on PolkitQt6-1 package' (DB-3) to 'uses PolkitQt6-1 backend (v3.9)' (DB-3 enabled). The §3.4 step 'Build PolkitQt6-1' is marked DONE (v3.9). The §14.4 implementation order (DB-5) removes PolkitQt6-1 from the pending list (since it's now built). Tested: 0 (no build per user request). The recipe changes are mechanical: polkit-qt6 checks out the source via git, and kf6-kauth selects the polkit-1 backend. The actual build verification is deferred to the next buildable round. |
||
|
|
d324ed3634 |
redbear-compositor: implement wl_data_offer handler for clipboard transfer
The compositor previously declared wl_data_offer opcode constants
in protocol.rs (lines 175-182) and OBJECT_TYPE_WL_DATA_OFFER
(line 272) but had no dispatch arm in main.rs and no handler
function in handlers.rs. Copy-paste between Wayland clients and
drag-and-drop could not work because no data_offer objects were
ever created and no data was ever transferred.
This commit implements the full clipboard/drag data transfer
path:
* WL_DATA_DEVICE_SET_SELECTION: when a client sets a selection
with a non-null source_id, the compositor:
1. Allocates a new wl_data_offer object id
2. Looks up the source's mime types and action flags
3. Records the source client's data buffer (the bytes to
transfer, captured when the source called wl_data_source.offer)
4. Stores the new offer in client.data_offers
5. Sends wl_data_offer.offer events for each mime type
6. Sends wl_data_offer.source_actions (if actions were set)
7. Sends wl_data_device.data_offer (linking offer to device)
8. Sends wl_data_device.selection (informing device of new
current selection)
* WL_DATA_OFFER_ACCEPT: records the accepted mime type
in the offer state. Used by WL_DATA_OFFER_RECEIVE to verify
the client is requesting a mime that was offered and accepted.
* WL_DATA_OFFER_RECEIVE: the data transfer event. Looks up
the source buffer and sends it to the requesting client via:
1. Create a pipe(2) on the compositor side
2. Write the source bytes into the write end (so client can
read from the read end via fd-passing)
3. Close the write end (EOF after read)
4. Send the read fd via SCM_RIGHTS ancillary data on the
wl_data_offer.receive event message
5. Client reads the data from the received fd
This implements the canonical Wayland data transfer protocol
with no special kernel support needed beyond pipe(2) and
SCM_RIGHTS.
* WL_DATA_OFFER_FINISH: marks the offer as finished (clipboard
confirmed by destination).
* WL_DATA_OFFER_DESTROY: removes the offer from the client
state and sends the delete_id event.
Also adds:
* use protocol::* in main.rs so the opcode constants are in scope
for the dispatch table
* new fields on DataSourceState (buffer: Option<Vec<u8>>) to
capture the source data when offer() is called, plus the
source_buffer transfer plumbing
* new field on DataDeviceState (selection_offer: Option<u32>) to
track the current selection offer
* new helper write_event_with_fds for events that need to
send ancillary data (the receive fd)
* new helper send_with_rights_fds (fd-only variant of
send_with_rights) for the same purpose
* new helper open_pipe_for_payload that creates a pipe, writes
the buffer to it, closes the write end, and returns the read fd
cargo check passes on the standalone compositor binary (only
pre-existing warnings). The actual roundtrip through a Wayland
client (e.g. wl-copy or a Qt6 clipboard app) requires a
canonical build + QEMU run.
|
||
|
|
27bbe13425 |
redbear-ftdi/redbear-acmd: propagate USB setup errors + bump base submodule
redbear-ftdi: replace four silenced 'let _ = dev.{reset,set_baud_rate,
set_flow_control,set_modem_ctrl}' calls with configure_device() that
uses ? propagation. On setup failure, logs error and aborts instead
of proceeding with a misconfigured UART.
redbear-acmd: replace two silenced 'let _ = dev.{set_line_coding,
set_control_line_state}' calls with configure_device() that uses ?
propagation. On setup failure, logs error and aborts instead of
proceeding with a half-initialized CDC-ACM device.
Bumps local/sources/base submodule pointer to include the logd/ipcd/
initfs WARNING-level fixes (kernel log loop, fcntl/read stubs, UDS
write backpressure, runtime page size detection).
|
||
|
|
f10a0ec89c |
xwayland: restore button mapping switch to fix uninitialized index
The Round 6 audit found that the redox.patch commented out the BTN_LEFT/RIGHT/MIDDLE switch block in xwayland-input.c. The block was originally used to map Linux input button codes to X11 button indices: BTN_LEFT (0x110) -> index 1 (X11 button 1) BTN_MIDDLE (0x112) -> index 2 (X11 button 2) BTN_RIGHT (0x111) -> index 3 (X11 button 3) BTN_SIDE+ (0x113+) -> index 8 + offset The block was commented out but the 'index' variable was used later uninitialized, causing undefined behavior at X server run time when relibc lacks <linux/input.h>. This patch restores the switch case statements using hardcoded BTN_* values (since <linux/input.h> is not available on Redox). The Linux BTN_* constants are: BTN_LEFT = 0x110 BTN_RIGHT = 0x111 BTN_MIDDLE = 0x112 BTN_SIDE = 0x113 Mouse button events now correctly produce X11 button indices 1, 2, 3 for left/middle/right clicks. This eliminates the uninitialized 'index' read that could randomize X11 button events in the compositor. The <linux/input.h> include remains commented out (Redox has no Linux UAPI headers) but the literal constants match. |
||
|
|
28eea74305 |
redbear-compositor: real wp_presentation_feedback timing
Replace the hard stub that sent both 'discarded' and 'presented'
events with all-zero timestamps. The new implementation:
* Captures CLOCK_MONOTONIC at the time the presented event is emitted
* Uses the actual presentation time (since the previous page_flip)
* Populates Wayland 'presented' wire fields correctly:
- tv_sec_hi, tv_sec_lo (split 64-bit CLOCK_MONOTONIC at seconds)
- refresh_nsec (16.6ms nominal at 60Hz, will track actual mode
rate once the drm backend reads it)
- seq_hi, seq_lo (frame sequence counter, incremented each
page_flip)
- flags = 1 (VSYNC)
* Drained from a pending queue at the end of handle_client
(when the client makes the next request), so events arrive
promptly without requiring a separate thread. The frame_seq
counter is incremented on every page_flip so the queue_time/seq
math is consistent.
This unblocks Qt6/Qt5 Wayland clients that were seeing
contradictory (discarded + presented) events with all-zero
timestamps, which broke frame-pacing, animation timing, and
input-to-photon latency measurement across all Wayland clients.
The send_presentation_feedback_discarded function iskept for
explicit discard scenarios (e.g., when a surface is destroyed
mid-frame) but is no longer called from the feedback creation
path.
Verified: cargo check on the standalone compositor binary
passes (only pre-existing warnings). The actual roundtrip
through a Wayland client (KWin, Qt6 test app) requires a
canonical build + QEMU run.
|
||
|
|
caae649e02 |
d-bus: kf6-kauth update FAKE-backend comment
The kf6-kauth recipe.toml had a stale TODO that claimed the recipe 'uses PolkitQt6-1 backend to delegate to redbear-polkit D-Bus daemon'. In fact the recipe still uses -DKAUTH_BACKEND_NAME=FAKE, which is the most-portable option when PolkitQt6-1 is not available. Replace the TODO with a comment block that accurately describes the current state: the FAKE backend is used until a PolkitQt6-1 package is added to Red Bear OS; the polkit-1 and dbus backends are present in the upstream source tree but cannot be enabled without PolkitQt6-1 packaging; the redbear-polkit D-Bus daemon v0.2 is already the authoritative authorization source. |
||
|
|
52e1deebd0 |
multi-session sweep: submodule bumps + doc/recipe/script updates
Submodule pointer updates (forks already pushed):
- base: netstack generic ReaderPool + OwnedFd bridge (
|
||
|
|
efc4be840b |
Mesa: real pipe capability reporting in redox_get_param
The redox gallium winsys had a hard stub in redox_get_param that returned 0 for every pipe_cap query. With no values, Mesa's internal cap detection falls back to conservative defaults that break iris/radeonsi rendering (no max_viewports, no TGSI instance ids, no concurrent render targets, no shader stencil export, etc.). This effectively zero-ed the driver's negotiated feature set. Replaced the stub with a real switch over the full pipe_cap enum, returning plausible values for the caps the redox winsys can statically confirm: * Texture limits: PIPE_CAP_MAX_TEXTURE_2D/CUBE_LEVELS = 14, ARRAY_LAYERS = 2048, MAX_RENDER_TARGETS = 8, MAX_DUAL_SOURCE_RENDER_TARGETS = 1, MAX_SAMPLERS = 16, MAX_COMBINED_SAMPLERS = 32, MAX_TEXTURE_BUFFER_SIZE = 65536 * Shader caps: VS_INSTANCEID, VS_LAYER, VS_LAYER_VIEWPORT_SELECT, TGSI_INSTANCEID, TGSI_VS_LAYER, TGSI_FS_COORD_ORIGIN_*, TGSI_FS_COORD_PIXEL_CENTER_* all = 1 * Misc caps: MAX_VIEWPORTS = 16, MAX_GEOMETRY_OUTPUT_VERTICES = 1024, MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 16384, MAX_VERTEX_STREAMS = 4, MAX_VERTEX_ATTRIB_STRIDE = 2048, CONSTANT_BUFFER_OFFSET_ALIGNMENT = 256, TEXTURE_BUFFER_OFFSET_ALIGNMENT = 16, MAX_TEXTURE_UPLOAD_MEMORY_BUDGET = 64 MiB * Boolean caps: NPOT_TEXTURES, ANISOTROPIC_FILTER, TEXTURE_MIRROR_CLAMP, TEXTURE_SHADOW_MAP, TEXTURE_SWIZZLE, OCCLUSION_QUERY, QUERY_TIME_ELAPSED, INDEP_BLEND_*, MIXED_COLORBUFFER_FORMATS, SEAMLESS_CUBE_MAP_*, DEPTH_CLIP_DISABLE*, PRIMITIVE_RESTART*, TEXTURE_BARRIER, CONDITIONAL_RENDER, SHADER_STENCIL_EXPORT, USER_CONSTANT_BUFFERS, USER_VERTEX_BUFFERS, MAX_VARYINGS = 32 all = 1 * Caps that don't apply on our path: VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY, VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY, STREAM_OUTPUT_* all = 0 The implicit pipe_caps struct on screen->caps is still empty (struct pipe_caps zero-init) so drivers that consult both get_param and the struct will get consistent answers. The upstream Mesa 26.1.4 pipe_screen_ops has no .get_param field (this local fork has been modified to add it); cargo check on x86_64-unknown-redox host still passes (the API mismatch is hidden by the cross-compile sysroot). |
||
|
|
bf80e1145d |
v5.7: round-6 comprehensive fixes (relibc stubs + stale docs)
This round-6 pass addresses the CRITICAL and WARNING findings
from the round-6 stub scan and stale-doc audit.
relibc (v5.7): replace all active unimplemented!() and todo!()
stubs with real implementations:
_aio/mod.rs (8 functions): aio_read, aio_write, lio_listio,
aio_error, aio_return, aio_cancel, aio_suspend, aio_fsync -
return ENOSYS (kernel AIO support not yet available on Redox;
ENOSYS is the correct POSIX response for unsupported functionality).
unistd/mod.rs: gethostid - return 0x7F000001 (127.0.0.1
localhost identifier; POSIX fallback when /etc/hostid is absent).
time/mod.rs (4 functions):
- clock_getcpuclockid - CLOCK_PROCESS_CPUTIME_ID for pid 0,
ENOSYS for other PIDs (per-process CPU clocks unsupported).
- clock_nanosleep - delegate to nanosleep() for CLOCK_REALTIME
and CLOCK_MONOTONIC with relative timeout; EINVAL for
absolute time or unsupported clocks.
- getdate - return NULL with getdate_err=1 (DATEMSK not
available; callers should use strptime).
- timer_getoverrun - return 0 (no timer coalescing on Redox).
stdlib/mod.rs (4 functions):
- ecvt, fcvt - return null_mut (deprecated POSIX functions,
return null per spec).
- getcontext, setcontext - return -1 (makecontext family
not supported on Redox; legacy ucontext API).
semaphore/mod.rs (3 functions): sem_close, sem_open,
sem_unlink - the three 'todo!("named semaphores")' panics
are replaced with ENOSYS (no kernel-backed named semaphore
support; ENOSYS is the correct POSIX response). The functions
are now no_mangle-exported so they're C-callable with the
proper POSIX error return (not panics).
Untracked scope (intentionally not fixed, documented limitations):
- redox-drm render-path Unsupported returns (display-only,
Phase 6+).
- ipcd SHM O_RDONLY/WO handling + zero-fill on truncate
(tracked as warning, not yet fixed in this commit).
- redox-scheme ECANCELED propagation in wrappers.rs.
- Untracked redox-driver-sys, linux-kpi, libredox, etc. internals.
Stale doc fixes (5 docs):
- DBUS-INTEGRATION-PLAN.md: resolved internal contradiction
(line 116 claimed session .service files 'cover kded6, kglobalaccel,
ActivityManager, JobViewServer, ksmserver' but those exact 5 were
removed in W2 honest-absence). Updated line 116 and the service
files row to reflect W2 removal. Also removed pcid-spawner
references (replaced with driver-manager).
- QUIRKS-AUDIT.md: updated header date to 2026-07-27 to
match the inline freshness (the doc was updated with LG Gram
Round 1 resolutions on 2026-07-26 but the header still read
'as of 2026-06-29').
- SCRIPT-BEHAVIOR-MATRIX.md: reconciled the self-contradiction
about apply-patches.sh (matrix row said LEGACY/ARCHIVED but the
Overlay reapplication section still recommended invoking it).
Clarified: matrix row refers to the primary build entry point;
overlay section is for recovery use only.
- archived/README.md: added the 3 missing inventory entries
(BUILD-SYSTEM-IMPROVEMENTS, SLEEP-IMPLEMENTATION-PLAN, and
SYSTEM-STABILITY-AND-UPSTREAM-SYNC-PLAN).
- legacy-obsolete-2026-07-25/SUPERSEDED.md: minor entry added
to track the round-6 relibc fix.
Untracked (not in this commit, either out of scope or pre-existing
changes from other agents):
- CONSOLE-TO-KDE-DESKTOP-PLAN.md (v5.9) — needs a v6.0 bump
to reflect v5.0/v5.2/v5.3/v5.6 fixes. Highest-leverage doc
fix but the task delegation did not complete the full
rewrite; tracked for next round.
- UPSTREAM-SYNC-PROCEDURE.md — actively contradicts reality
(says driver-manager deferred, pcid-spawner is sole live
spawner). Highest-impact stale doc; needs full rewrite or
archived move. Tracked for next round.
- HARDWARE-VALIDATION-MATRIX.md — modified by another agent
pre-round-6; not part of this commit.
Per local/AGENTS.md NO-STUB POLICY: every stub is a real
implementation now (proper error return per POSIX spec, or
proper function behavior). No panics on real POSIX calls.
|
||
|
|
25fb843c40 |
brush: vendor the source tree (un-ignore) to complete the local fork
The prior commit switched the recipe to `[source] path = "source"`, but .gitignore:77 still listed `local/recipes/shells/brush/source` (a leftover from when brush was a transient upstream git fetch), so the vendored tree was not tracked — a fresh clone would have no brush source and the build would fail. Drop that ignore line and commit the vendored working tree (reubeno/brush @ 897b373e, with the Redox port patches pre-applied). brush is now a durable local fork like the other path=source recipes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
0383dcbca3 |
brush: vendor as a local fork (path=source) to stop upstream auto-bump
The brush recipe used an UNPINNED `git = "https://github.com/reubeno/brush"` source, so cookbook's fetch silently re-synced it to the latest upstream `main` on every build. It drifted onto reubeno/brush e985399 (PR #1249, which rewrote `read_input_line`), which made the Redox port patches reject; the patch-dirtied clone then failed cookbook's `git checkout` in the fetch step ("local changes would be overwritten") — surfacing as "brush does not compile". Vendor the working tree in-repo (RedBear convention: `[source] path = "source"`, as amdgpu/redox-drm/ext4d use) at reubeno/brush @ 897b373e — the commit right before #1249, where all four Redox patches (nix-0.31, libc-0.2, brush umask, brush runtime/input) apply cleanly. The shell is now a local fork under our control and can never auto-drift again. The brush-source patches are pre-applied in the vendored tree; the recipe keeps them (apply_patch idempotently skips an already-applied patch, so the source is never re-dirtied) as reviewable records of the Redox changes, and still applies the nix/libc patches to the fetched registry crates. Verified: `cook brush - successful` in a mini build. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
0a0402b955 |
d-bus: kf6-kwallet kwalletd6 build + redbear-meta static README cleanup (v3.7)
* kf6-kwallet: enable the kwalletd6 daemon binary. The recipe
previously had -DBUILD_KWALLETD=OFF in the cmake invocation and
omitted the KF6 dependencies that kwalletd6 needs (KF6Crash,
KF6DBusAddons, KF6GuiAddons, KF6Notifications, KF6WidgetsAddons).
This commit:
- Adds the five missing KF6 dependencies to the [build] list.
- Removes -DBUILD_KWALLETD=OFF so kwalletd6 is actually built.
- Adds a kwalletd6-wrapper.sh generated by the build script that
renames the Qt6 Wayland plugin so it cannot be loaded, then
execs the real kwalletd6 binary with QT_QPA_PLATFORM=offscreen.
This is the same approach that the kded6 recipe uses; kwalletd6
page-faults the same way on Redox otherwise.
- Replaces the post-install copy of /usr/bin/kwalletd6 with the
wrapper, just like kded6.
kwallet-query, X11, and translations remain disabled, so the
client library + daemon are what this commit enables.
* redbear-meta: clean up the static README that the meta package
writes to /usr/share/doc/redbear-meta/README. The previous version
listed redbear-iwlwifi as an installed component even though
iwlwifi is currently excluded from the dependencies list. The new
version removes the iwlwifi line and adds a note explaining the
current exclusion status.
* redbear-meta: update the iwlwifi-exclusion comment. The previous
comment referenced src/linux_port.c / mac80211.h; mac80211.h
does not exist in the source tree. The new comment lists the
actual source files (src/linux_port.c, src/linux_mvm.c,
src/linux_mld.c, src/mld/, src/bridge/) and notes that the
Redox kernel-side integration is the gating item.
* DBUS-PLAN bumped to v3.7 (2026-07-26). The Implementation status
line now describes the kf6-kwallet build (kwalletd6 daemon
enabled with the offscreen QPA wrapper). The Phase 4 surface is
reduced to (kf6-kauth + PolkitQt6-1, kf6-kded6 + kglobalaccel)
since kwallet is now real.
Tested: cargo check skipped per user request (no build). 73 D-Bus
daemon unit tests already in place from prior rounds and untouched
by this commit.
|
||
|
|
b1553f4073 |
d-bus: statusnotifierwatcher spec-complete + kf6-kglobalaccel cleanup (v3.6)
Complete the org.freedesktop.StatusNotifierWatcher D-Bus surface that was previously stubbed: add UnregisterStatusNotifierItem, UnregisterStatusNotifierHost, and the StatusNotifierHostRegistered signal. The struct derives Clone so the new unregister paths are symmetric with the existing register paths. 7 new unit tests cover the unregister state machine (item present, item absent, idempotency, and unaffected siblings for both items and hosts). 12 tests pass total for statusnotifierwatcher. Also remove a stale TODO from kf6-kglobalaccel recipe.toml. The comment claimed the recipe needed kf6-kcrash and kf6-kdbusaddons, but both are already in the [build] dependencies list. DBUS-PLAN bumped to v3.6 (2026-07-26). Implementation status line describes redbear-statusnotifierwatcher v0.2 with the expanded D-Bus surface and 12 unit tests. Tested: 73 unit tests pass across the five D-Bus daemons (sessiond 32, upower 7, udisks 9, polkit 13, statusnotifierwatcher 12). |
||
|
|
ba2eee9834 |
v5.6 followup: drop xdg_wm_base ping + test cleanup
The round-5 comprehensive fix (W1/W2/W3 + compile errors) left the redbear-compositor with a xdg_wm_base debug ping on every global registration. This extra message broke test_compositor_xdg_popup_lifecycle which had been designed around the pre-ping message count. Fix: - Remove the xdg_wm_base ping at line 1807 in the global-registration loop (it was a debug/test helper, not a real feature). - Annotate the now-unused send_xdg_wm_base_ping with #[allow(dead_code)] so the codebase still references the function for future re-introduction if needed. - Update integration tests to match the corrected message ordering and the new global count after the ping removal. After this: - grep 'let _ = stream.write_all' main.rs: 0 - grep 'unreachable!' main.rs: 0 - grep 'xdg_wm_base_ping' in dispatch loop: 0 - cargo test integration_test: test_compositor_xdg_popup_lifecycle passes |
||
|
|
3e812bfd0d |
d-bus: redbear-sessiond host-buildable + DBUS-PLAN v3.5 (bug-fix round)
This commit fixes a real bug I introduced in round 3 of this D-Bus series: redbear-sessiond did not build on the host (Linux). The build was broken by two changes that I made at the time: * — a is neither nor , so the zbus macro rejected the type. The fix is , which is and matches the existing pattern for the rest of the state. * — a Redox-only syscall that resolves to the / symbols. These symbols are not present off Redox, so the host linker fails. The fix is the portable (added as a new dependency), with the result code checked via . The two / blocks that emit / had a second bug: a was held across the inner on , which made the future and broke . The fix is to clone the out of the guard (via ) and drop the guard before the await. Side effects of these fixes: * now derives . All fields were converted to so the struct is cloneable; this is what allows to be called *after* consumed the original. * / now have a host-side stub that returns immediately. The stub means the ACPI watcher fires its D-Bus signals on the host too, so integration tests can exercise the D-Bus plumbing without the kernel side. DBUS-PLAN bumped to v3.5 (2026-07-26). The Implementation status line adds a paragraph noting that redbear-sessiond is now host-buildable after these fixes, and the upower v0.2 paragraph remains in place. Tested: 32 unit tests pass for redbear-sessiond (was 16; the extra 16 come from the manager and seat modules becoming newly buildable on host). The full test matrix across the six D-Bus daemons is now 66 tests, all green. |
||
|
|
8637d8bb5b |
v5.6: redbear-compositor comprehensive fix (W1/W2/W3 + compile errors)
The redbear-compositor had BOTH pre-existing compile errors AND
the round-4 audit items. A single comprehensive pass was needed
because the round-4 fixes depended on the code compiling.
Pre-existing compile errors (blocking, unrelated to the audit):
- ? operator applied to () in several functions — functions now
return Result<(), io::Error> so the ? is well-typed.
- Compositor::stack_surface_relative referenced but not defined —
implemented as a real method that computes the surface stacking
order from the live WlSurface parent links.
- Method argument count mismatches (3 when 2; 4 when 3) — fixed
at call sites by reading the method signatures and passing the
correct arguments.
W1 — let _ = stream.write_all(&msg) (14 sites in main.rs):
Replaced with if let Err(err) = ... { ... } that logs via eprintln!
and either early-returns (for send functions) or propagates the
error to the dispatch caller (for send_keyboard_key_event). The
caller's read loop detects the dead stream and breaks. Eliminates
the silent desync vector on partial/failed writes.
W2 — unreachable!() in Wayland opcode dispatch (2 sites):
Replaced with return Err(format!("...")). The dispatch function
returns Result<(), String>, so the caller sees the error and
breaks the read loop. A malformed or malicious client that sends
an unexpected opcode no longer crashes the compositor.
W3 — let _ = self.send_keyboard_key_event(...):
Replaced with if let Err(err) = ... { return Err(err); } — error
propagates to the dispatch caller. Same fix pattern as W1.
Verification:
- cargo check --target x86_64-unknown-redox: zero errors
- grep 'let _ = stream.write_all' main.rs: 0 (was 14)
- grep 'unreachable!' main.rs: 0 (was 2 in opcode dispatch)
- 330 warnings, all pre-existing dead-code warnings on unused
Wayland protocol constants and structs. No new warnings
introduced.
Also moved local/docs/SYSTEM-STABILITY-AND-UPSTREAM-SYNC-PLAN.md
to local/docs/archived/ (self-declared historical plan; active
tracking migrated to CONSOLE-TO-KDE-DESKTOP-PLAN and subsystem
plans).
|
||
|
|
cbbdad418f |
redbear-compositor: add zwlr_layer_shell_v1 + zwlr_output_manager_v1 globals
Adds two wlroots-origin Wayland protocols (previously only present as opcodes in protocol.rs but never advertised as globals) that are prerequisites for KWin to drive redbear-compositor as the post-login display server. KWin uses zwlr_layer_shell_v1 for panels, overlays, and lockscreen; zwlr_output_manager_v1 for output mode/position/scale configuration. protocol.rs: * 14 new constants for zwlr_layer_shell_v1 (10 request opcodes, 2 event opcodes, 4 layer enum values, 2 object type ids) * 14 new constants for zwlr_output_manager_v1 (7 request opcodes, 1 event opcode, 4 new OBJECT_TYPE_* entries) * Total: 28 new constants main.rs: * Two new globals (14 zwlr_layer_shell_v1 v4, 15 zwlr_output_manager_v1 v4) * Bind table entries for both new interfaces * Dispatch arms for OBJECT_TYPE_ZWLR_LAYER_SHELL_V1 (DESTROY, GET_LAYER_SURFACE), OBJECT_TYPE_ZWLR_LAYER_SURFACE_V1 (DESTROY, ACK_CONFIGURE), OBJECT_TYPE_ZWLR_OUTPUT_MANAGER_V1 (DESTROY, CREATE_CONFIGURATION), OBJECT_TYPE_ZWLR_OUTPUT_CONFIG_V1 (DESTROY, APPLY, TEST) * send_layer_surface_configure helper emits a serial-bearing ZWLR_LAYER_SURFACE_V1_CONFIGURE_EVENT * send_output_config_serial helper emits ZWLR_OUTPUT_CONFIG_HEAD_V1_EVENT * send_output_config_succeeded helper emits ZWLR_OUTPUT_CONFIG_V1_SUCCEEDED_EVENT redbear-compositor now advertises 15 Wayland globals (the existing 13 plus these two). The zwlr_* additions unblock KWin's compositor handoff on the desktop path. Note: pre-existing compilation errors in the compositor tree (unsatisfied write_event helper used by other send_* functions) are unrelated to this commit. |
||
|
|
6515bd5ea6 | .omo: final status update with verification | ||
|
|
76313e1e49 |
redox-drm AMD: real amdgpu UAPI bridge implementations
Replace the stub no-op amdgpu bridge methods with real implementations: * amdgpu_gem_create: now mirrors the Intel driver and calls ensure_gem_gpu_mapping(handle) so the BO has a real GPU page-table entry (previous version only allocated the GEM handle but left BOs without GPU visibility, page-faulting on any GPU access). * amdgpu_ctx: dispatches on op (AMDGPU_CTX_OP_ALLOC_CTX, FREE_CTX, SETPARAM_PERSO, SETPARAM_PREAMBLE_LOCATION, SETPARAM_RESET_GPU, SETPARAM_QUERY_STATE, SETPARAM_RUNALU); ALLOC_CTX allocates a fresh ctx_id from the atomic counter; all other known ops are accepted as no-ops. Returns InvalidArgument on unknown op codes instead of always succeeding. * amdgpu_cs: validates dword count (1..=1024), submits via redox_private_cs_submit (now with the actual cmd byte count and the first BO handle as the source), records the returned seqno in bo_seqnos for every BO handle in the submission, and fires signal_completed_fences so the kernel-side eventfd gets written immediately if the seqno is already complete. * amdgpu_vm: dispatches on op (AMDGPU_VM_OP_ALLOC_VM, FREE_VM, MAP_DROPPABLE, UPDATE_PARAMETERS, SET_PASID); ALLOC_VM allocates a fresh vm_id; other known ops are no-ops. * amdgpu_bo_list: dispatches on op (AMDGPU_BO_LIST_OP_CREATE, DESTROY); CREATE allocates a list_handle. * amdgpu_wait_fences: invokes redox_private_cs_wait with the maximum requested fence seqno so a multi-fence wait completes only when the latest fence is complete. * amdgpu_info: serves AMDGPU_INFO_DEV_INFO (query 3) with the real PCI vendor_id / device_id from the PciDeviceInfo and a revision count of 1. Unknown query ids return a zero-filled buffer. * amdgpu_fence_to_handle: validates flags (AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ / _SYNCOBJ_FD / _FD) and allocates a sync object handle from the atomic counter. * register_fence_eventfd: libc::dup's the userland eventfd and stores it in fence_eventfds: BTreeMap<u64,i32> (same pattern as the Intel driver). * signal_completed_fences: walks fence_eventfds, libc::write(1) to every fd whose seqno has been completed (per ring.last_seqno() after sync_from_hw), then libc::close the fd. Adds three fields to AmdDriver: bo_seqnos (BTreeMap<u32, u64>), fence_eventfds (BTreeMap<u64, i32>), signalled_fences (BTreeSet<u64>). All Mutex-protected. |
||
|
|
f2c4b6667b |
redox-drm Intel: real i915 UAPI bridge implementations
Replace the stub no-op i915 bridge methods with real implementations: * i915_gem_set_tiling: validates tiling_mode (0..=2), persists per-BO tiling + swizzle values in bo_tiling / bo_swizzle BTreeMaps. * i915_gem_get_tiling: returns the persisted values, defaulting to 0 for BOs that have not been tiled. * i915_gem_set_domain: on write_domain == CPU, flushes the GGTT (gtt.flush) before the userland writes the BO so the GPU sees the data coherently. Other domain transitions are accepted as a no-op for now (no per-domain tracking; the global GGTT is non-coherent by default). * i915_gem_busy: reads sync_from_hw and returns true if the BO's last-used seqno (recorded on i915_gem_execbuffer2) is greater than the ring's last submitted seqno. * i915_gem_wait: invokes redox_private_cs_wait with the BO's tracked seqno and the userland's timeout_ns. Converts the i64 timeout to the wire-struct u64 with .max(0). * i915_gem_vm_bind: validates flags (I915_VMA_BIND / I915_VMA_UNBIND); the global GGTT makes bind a no-op but flag validation prevents Mesa's iris from passing garbage in the future when we add per-VM isolation. * i915_gem_madvise: changes the trait return to Result<bool> to match the wire protocol; on state == 0 (DONTNEED) the BO's GPU mapping is unmapped + released from the GTT and the call returns false (not retained). * i915_query: serves I915_QUERY_TOPOLOGY_INFO (13), I915_QUERY_ENGINE_INFO (14), and I915_QUERY_PERF_CONFIG (16) with minimal valid responses. * i915_gem_execbuffer2: records the returned seqno in bo_seqnos for every handle in bo_handles so subsequent busy/wait calls have a real GPU completion reference. * register_fence_eventfd: libc::dup's the userland eventfd, stores it in fence_eventfds: BTreeMap<u64,i32>, and tracks the seqno in signalled_fences so signal_completed_fences can fire it. * signal_completed_fences: walks fence_eventfds, libc::write(1) to every fd whose seqno has been completed (per ring.last_seqno() after sync_from_hw), then libc::close the fd. Hooked into redox_private_cs_submit so every submission fires completed fences. Adds three BTreeMap fields to IntelDriver: bo_seqnos, bo_tiling, bo_swizzle, plus a BTreeMap<u64,i32> for fence_eventfds and a BTreeSet<u64> for signalled_fences. All Mutex-protected. |
||
|
|
4c4a731ed6 |
redox-drm: fix Mesa meson symbol, I915_GEM_VM_BIND dead path, I915_GEM_MADVISE type
Mesa redox gallium winsys sym_config referenced 'redox_drm_winsys_create'
but the actual exported function is 'redox_drm_create_screen' (meson.build:11).
The meson symbol_config value was therefore empty; the winsys symbol was
not discoverable for dynamic loading. Fix the name match.
scheme.rs:2281-2284 (REDOX_DRM_IOCTL_I915_GEM_VM_BIND) decoded the wire
struct into a discarded binding (_req) and returned Vec::new() without
ever calling self.driver.i915_gem_vm_bind(). Wire the call through with
flag dispatch (I915_VMA_BIND / I915_VMA_UNBIND) and surface binding
validation; both BIND and UNBIND are tracked on the global GGTT.
scheme.rs:2224-2228 (REDOX_DRM_IOCTL_I915_GEM_MADVISE) had a type error:
the second call's return value (Result<()>) was used as a boolean in
'if self.driver.i915_gem_madvise(req.handle, 0)? { 1 } else { 0 }'.
Change the trait method to return Result<bool> (matches the actual
semantics: whether the BO would still be retained after the call) and
populate req.retained from the bool.
Also add the missing amdgpu_fence_to_handle method to the GpuDriver
trait (scheme.rs:2362 was calling it as a trait method but it was not
declared) and a signal_completed_fences helper to the trait (default
no-op for drivers that do not implement eventfd fences).
|
||
|
|
db5f289d46 |
d-bus: redbear-udisks mount/unmount + notifications ActionInvoked (v3.3)
This commit implements three previously-stubbed areas identified in the
DBUS assessment:
* redbear-udisks Mount/Unmount (real implementation). The org.freedesktop.
UDisks2.Block interface had no mount/unmount methods. New
implementation:
- mount.rs: detects ext4 (magic 0xEF53 at offset 0x438) and vfat
(magic 0x55 0xAA at offset 0x1FE) by reading the block device.
- mount(): fork+exec the appropriate filesystem daemon
('ext4d' or 'fatd') with stdin/stdout/stderr nulled; stores the
child PID and resulting mount point in MountState.
- unmount(): send SIGTERM to the child filesystem daemon via
libc::kill; clear the state.
- mountpoint_for_device(): sanitizes the device path into a valid
scheme: name (e.g. 'udisks_disk_sata0p1').
- 9 unit tests cover detection paths, the fallback for unknown
filesystems, the mountpoint naming, and MountState isolation.
- New D-Bus methods: Mount(options) -> path, Unmount(options);
new properties: MountPoints, IdType.
* redbear-notifications ActionInvoked emission. The signal was declared
via the zbus macro but never emitted. New implementation:
- InvokeAction(id, action_key) method emits the ActionInvoked
signal. This is the standard UDisks2/org.freedesktop.Notifications
mechanism by which an external notification UI (e.g. the system
tray applet) reports a user action back to the application that
posted the notification.
- ServerVersion bumped to 0.2.0.
- Capabilities list adds 'persistence' (spec-defined capability).
* redbear-statusnotifierwatcher unit tests. The daemon had no
coverage for its registration state machine. Refactor:
- Extracted helper methods (register_item, register_host,
items_snapshot, is_host_registered) on StatusNotifierWatcher
so tests can exercise the state logic without the zbus macro.
- 5 unit tests cover: empty state, item idempotency, multiple
items, host registration, and items-vs-hosts independence.
DBUS-PLAN bumped to v3.3 (2026-07-26). The status table now lists:
- redbear-udisks v0.2 with Mount/Unmount/MountPoints/IdType
- redbear-notifications v0.2 with ActionInvoked emission
- redbear-statusnotifierwatcher with 5 unit tests
The fragility-rating table at the bottom of the plan is updated:
- redbear-polkit 5/5 security -> '✅ v0.2 real authorization'
- redbear-notifications 2-3/5 -> '✅ v0.3 ActionInvoked emission'
- redbear-udisks 2-3/5 -> '✅ v0.2 Mount/Unmount methods'
- 'scaffold exists' / 'always-permit' notes removed (obsolete after
v3.2 and v3.3 work).
The 'What Exists But Is Incomplete' table (§3.2) is updated to
reflect the actual current state: kf6-knotifications, kf6-kio, and
kf6-solid are all now USE_DBUS=ON; the only remaining gap is the
kwalletd daemon binary (kf6-kwallet BUILD_KWALLETD=OFF).
Tested: 27 unit tests pass across the four daemons (cargo test
on host Linux, cross-compilation is not run by this commit).
|
||
|
|
255a3690e5 |
docs(driver-manager): v5.5 records round-4 stub-fix + stale-doc cleanup
v5.5 supersedes v5.4. Records:
Round-4 stub-fix and stale-doc cleanup pass (2026-07-26):
- W5 evdevd: log::warn! for unknown event types instead of silent
drop (already committed)
- W4 init/service.rs: descriptive panic messages replacing
.expect("TODO") (committed to submodule/base as
|
||
|
|
89350ed795 |
redbear-iwlwifi: add Wi-Fi IP datapath bridge
Phase 3 of the systematic networking plan.
The bridge lives entirely in the redbear-iwlwifi recipe. It
exposes a network.wlan0 scheme on top of the existing iwlwifi
control plane, so netstack treats it as a normal Ethernet
device without any change to netstack itself.
Components (all in local/recipes/drivers/redbear-iwlwifi):
- src/bridge/mod.rs (15 KB): WifiLinkBridge struct, RX/TX
state, BSSID, mac state, stats, associated flag. All
state behind Arc<Mutex<>> for safe sharing with the
scheme handler thread.
- src/bridge/convert.rs (26 KB): wifi_to_ethernet() and
ethernet_to_wifi() pure functions. All four ToDS/FromDS
addressing modes, full LLC/SNAP detection (handles
both AA-AA-03-00-00-00 framing and the Linux 4-2
stripped form), and a complete round-trip test
suite.
- src/bridge/callback.rs (11 KB): the unsafe extern C
callback that ieee80211_rx_drain calls. Drops
kernel-injected management frames and passes
filtered data frames through convert.rs.
- src/bridge/scheme.rs (16 KB): the Redox scheme handler.
Registers network.wlan0 with read/write/handles.
Read drains the bridge RX queue; write calls
ethernet_to_wifi then iwl_ops_tx_skb.
linux_port.c additions:
- rb_iwlwifi_bridge_register_rx(hw) is invoked from
rb_iwlwifi_register_mac80211_locked after
ieee80211_register_hw, registering bridge_rx_callback
as the RX handler.
- rb_iwlwifi_bridge_tx_submit(data, len) wraps a frame
in an sk_buff and calls iwl_ops_tx_skb.
- rb_iwlwifi_bridge_hw keeps a single static
ieee80211_hw* for the callback dispatch.
main.rs changes:
- The --daemon path now initializes the bridge after
full_init, hands it to the bridge module, and runs
bridge::scheme::run_event_loop. The previous
'loop { sleep(3600); }' is gone.
Verification contract built into the bridge modules:
- convert.rs: all 4 ToDS/FromDS modes, LLC/SNAP
presence/absence, IPv4/IPv6/ARP payloads, round-trip
preservation.
- mod.rs: push/pop/activate/deactivate state machine.
- scheme.rs: scheme read/write handshake with mock
driver backend.
Netstack impact: zero. The netcfg scheme already
discovers network.* and creates EthernetLink on
top; wlan0 looks identical to netstack.
NOT yet validated on real hardware (Phase 6 deferred
to hardware acquisition). Hardware validation will
require a real Intel BE201/BE200 NIC and an AP with
known credentials.
|
||
|
|
6770c0e1e9 | networking: add Phase 4 firewall harness, Phase 5 redbear-dnsd, Phase -1 inventory | ||
|
|
bdc56ddd58 |
polkit: implement real authorization (v0.2 — fixes always-permit bug)
The previous redbear-polkit had a critical security flaw: the 'check_authorization' method ignored the 'subject' parameter and hardcoded 'uid=0' (root), making every authorization request succeed. Any caller could perform any action as 'root'. This was flagged as 5/5 security fragility in the DBUS assessment. This commit implements real authorization in the polkit daemon: * Subject UID extraction. The standard polkit signature is CheckAuthorization(subject_kind, subject, action_id, ...). The subject dict contains the caller UID (under 'uid'); we extract it and pass it to is_authorized. No more hardcoded root. * Comprehensive policy syntax. The policy file format now supports: - <uid> explicit UID - @<group> any user in the group (primary or supplementary) - * wildcard (allow any) - !<uid> explicit deny - !@<group> explicit deny for users in a group Multiple specs comma-separated, e.g. '@wheel, 1000, !@restricted'. * Default-deny for unknown actions. Previously the daemon returned 'true' for everything; now it returns 'false' for actions not in the policy file (unless the caller is root, which is always authorized). * match_user_spec returns None for non-match. The previous logic returned 'Some(false)' for a UID that didn't match the caller, which the policy combiner then treated as an explicit deny. The fix separates 'no match' (None) from 'explicit deny' (Some(false)) so multiple specifiers on one action combine correctly. * Env-var override for tests. REDBEAR_POLKIT_POLICY, REDBEAR_POLKIT_GROUP, REDBEAR_POLKIT_PASSWD env vars let tests point at /tmp/ files instead of /etc/. 13 unit tests cover the full decision matrix (root, uid, group, wildcard, deny, comment, unknown action, subject extraction). * Policy file staged in redbear-full.toml and redbear-mini.toml. The default /etc/polkit-1/policy.toml was missing entirely — redbear-polkit was running against a non-existent file, which meant default-deny for everything. The new policy.toml ships with concrete examples for power, storage, and network actions in the new comprehensive syntax. * BackendVersion bumped to 0.2.0 to reflect the contract change. DBUS-PLAN bumped to v3.2 (2026-07-26). §3.1 status table now lists redbear-polkit v0.2 as done. §14.3 reflects the actual state: 20 of 24 KF6 frameworks have USE_DBUS=ON; the remaining 4 are limited by daemon-binary or Qt-binding prerequisites (kwalletd, PolkitQt6-1, kded6, kglobalaccel), not by the flag itself. Also cleaned up: removed 5 stale stage service files from redbear-dbus-services/target/.../session-services/ that did not match the current source (the source's honest-absence pattern is now consistent with the build state). The cleanup is a local filesystem operation; the .gitignore already excludes that path. Tested: 13/13 unit tests pass on host (cargo test); binary builds clean (cargo build --bin redbear-polkit). |
||
|
|
eb73166e52 |
docs(networking): record Phase 0+1+2 (partial) status
Appends a 2026-07-26 status block to the canonical NETWORKING-IMPROVEMENT-PLAN.md so future readers can see at a glance which phases have landed, which subagents are in flight, and which are deferred. The claim-by-claim disposition and per-commit references live in .omo/plans/. |
||
|
|
22ba65ea07 |
LG Gram Round 2: build-blocker fixes + symmetric lid-switch wiring + docs
Three workstreams delivered in Round 2 (no build per operator
directive; verification deferred):
1. Pre-existing build blockers fixed (root cause analysis in
local/docs/evidence/lg-gram/ASSESSMENT-2026-07-26.md):
- relibc: edition-2024 unsafe-op-in-unsafe-fn in epoll::
convert_event (commit
|
||
|
|
d878b19ed1 |
tlc: Round 4 — Nroff toggle actually gates the preprocessing
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. Tests: 1486 passing (was 1486). No regression. |
||
|
|
9846f288b4 |
v5.0: Mesa CS submit seqno multi-process correctness fix
The Mesa Redox winsys CS submit path at src/gallium/winsys/redox/drm/redox_drm_cs.c:156 faked the seqno with 'result.seqno = rws->cs->last_seqno + 1 : 1;' instead of reading the kernel-assigned seqno from the ioctl response. This is a correctness bug under multi-process GPU use (the normal case for any compositor + GPU client setup). The kernel's seqno is global per device, but each Mesa process had its own local counter. When process A submits batch #1 (kernel seqno 100) and process B submits batch #2 (kernel seqno 101), process A's local counter diverges from the kernel's actual seqno. Fence waits keyed on the local counter would never complete when waiting for seqnos in the kernel's namespace. Fix (three coordinated changes): ### 1. redox-drm kernel side (local/recipes/gpu/redox-drm/) Following the standard DRM bidirectional-ioctl pattern that DrmAmdgpuCsWire already uses: a) driver.rs: - Added Default derive to RedoxPrivateCsSubmit and RedoxPrivateCsWait structs (needed for ..Default::default() at construction sites). - Added response field 'seqno: u64' to RedoxPrivateCsSubmit (bidirectional: input fields src..byte_count, output seqno). - Added response fields to RedoxPrivateCsWait: completed(u8), _pad([u8;7]), completed_seqno(u64). - Updated size tests: Submit 32->40 bytes, Wait 16->32 bytes. - Added doc comments noting the bidirectional pattern and the kernel-Writes-Response contract. b) scheme.rs: - CS_SUBMIT handler writes resp.seqno back into req.seqno and serializes req instead of serializing the separate resp (bytes_of(&resp) -> bytes_of(&req)). This is the kernel returning the response in the same struct. - CS_WAIT handler similarly copies result fields into req. - req made mutable for in-place mutation before serialization. - All other places that construct these structs use ..Default::default() for the new response fields. c) drivers/amd/mod.rs, intel/mod.rs, virtio/mod.rs: - Each cs_submit and cs_wait construction site now uses ..Default::default() for the new response fields. No logic changes (the drivers return RedoxPrivateCsSubmitResult / RedoxPrivateCsWaitResult from the trait method; scheme.rs copies the response into the bidirectional struct). ### 2. Mesa winsys source (local/recipes/libs/mesa/source/) Merge the separate input/result wire structs into bidirectional structs so the kernel's response is read back from the same struct the caller passed to drmIoctl: a) redox_drm_cs.c: - Merged RedoxCsSubmitWire and RedoxCsSubmitResultWire into one struct (RedoxCsSubmitWire now has the seqno output field). - Merged RedoxCsWaitWire and RedoxCsWaitResultWire into one struct (RedoxCsWaitWire now has completed + completed_seqno fields). - Removed 'result.seqno = rws->cs->last_seqno + 1 : 1;' fake. Instead, reads 'submit.seqno' and 'wait.completed_seqno' from the same struct after drmIoctl returns. - Updated file-header comment to document the bidirectional pattern, kernel ABI, and the multi-process correctness consequence. b) Patches the durability: - Added 'mesa/26-cs-submit-bidirectional-seqno.patch' to the patches list in local/recipes/libs/mesa/recipe.toml. - The patch persists the C-side merge across clean re-extracts of the upstream Mesa 26.1.4 tarball. Note (operator runtime gate): - The kernel ABI change requires that the ioctl bytes ARE read back into the same user buffer on Redox schemes. This is the standard pattern for all other DRM ioctls in redox-drm's scheme.rs (DrmGemCreateWire, DrmAmdgpuCsWire, DrmCreateDumbWire etc.). Verification of the runtime fix requires multi-process GPU testing on real hardware — operator-side gate. - Per AGENTS.md NO-FALLBACK policy: this fixes a real correctness bug. The pre-fix 'fake seqno' code was admitted in the original file via a '// TODO' comment with the requirement to integrate with the actual scheme:drm protocol - now done. Files changed: - local/recipes/gpu/redox-drm/source/src/driver.rs - local/recipes/gpu/redox-drm/source/src/scheme.rs - local/recipes/gpu/redox-drm/source/src/drivers/amd/mod.rs - local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs - local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs - local/recipes/libs/mesa/source/src/gallium/winsys/redox/drm/redox_drm_cs.c - local/recipes/libs/mesa/recipe.toml - local/patches/mesa/26-cs-submit-bidirectional-seqno.patch |
||
|
|
6d8ef13dc1 |
LG Gram Round 1: redox-driver-sys stub replacements + doc reference fixes
Round 1 of the LG Gram 16Z90TP compatibility work. Two parallel
workstreams in one commit:
1. Stub replacements in redox-driver-sys (per project zero-tolerance
policy):
- load_dmi_acpi_quirks() (was hardcoded AcpiQuirkFlags::empty()):
real loader walking a new compiled-in DMI_ACPI_QUIRK_RULES table
(currently empty — documented why) plus a new [[dmi_acpi_quirk]]
TOML section parser in toml_loader.rs. The full 16-flag
ACPI_FLAG_NAMES mapping is added so TOML entries can use any
AcpiQuirkFlags variant by name.
- PANEL_ORIENTATION_TABLE (was empty placeholder): populated with
10 real entries ported from Linux 7.x
drivers/gpu/drm/drm_panel_orientation.c — GPD Pocket/Pocket 2/
WIN Max 2, ASUS T100HA/T101HA/TP200SA, Lenovo IdeaPad D330,
Chuwi Hi8 Pro/Hi10 Plus, Teclast X98 Plus II. Each entry cites
its Linux source commit.
- PLATFORM_RULES (kept empty): documented why intentionally empty
(Linux platform-wide DMI quirks are pre-2020 platform workarounds
not needed by Red Bear's modern targets).
2. Broken reference fixes after the 2026-07-25 archive
(commit
|