Commit Graph

302 Commits

Author SHA1 Message Date
vasilito 7c2ea9b5e3 amdgpu/linux-kpi: replace remaining stubs with real implementations
- Implement krealloc in linux-kpi memory.rs with GFP-aware tracker lookup,
  copying, and zeroing of grown regions; add krealloc declaration to slab.h
- Align __GFP_ZERO/__GFP_NOWARN and GFP_* values between linux-kpi/slab.h
  and redox_glue.h; make __GFP_ZERO a meaningful flag bit
- Add missing POSIX/errno base constants (EFBIG, EISDIR, ESPIPE, etc.) to
  linux-kpi linux/errno.h so firmware-size checks and other drivers compile
- Harden linux-kpi bug.h: BUG()/BUG_ON() abort, WARN_ON_ONCE only warns once,
  BUILD_BUG_ON uses _Static_assert
- Harden redox_glue.h: add PCI_COMMAND_* flags, CONFIG_HZ/HZ, jiffies
  conversion macros, once-only WARN_ON_ONCE, _Static_assert BUILD_BUG_ON
- Implement redox_pci_enable_device/redox_pci_set_master with real local state
  and command-bit updates; document pcid-spawner pre-enable
- Remove realloc-only krealloc from redox_stubs.c; it now links from linux-kpi
- Fix wait_for_completion_timeout to interpret timeout as jiffies and convert
  to milliseconds, and update msecs/usecs_to_jiffies to use HZ
- Stage previously completed firmware-loader path deps and constructor fix
- Stage base and relibc submodule pointer updates from prior work
2026-07-10 19:44:39 +03:00
vasilito 8ba00f2880 firmware-loader: use path dependencies for redox forks
Replace version-string deps on redox_syscall, redox-scheme, and
libredox with path dependencies pointing to local/sources/ forks.
This aligns with local/AGENTS.md local-fork-dependency rule and
eliminates the crates.io vs local fork ambiguity that causes
mismatched-type link errors.
2026-07-10 16:27:29 +03:00
vasilito 4685a5deed redbear-power: parse Ngid and TracerPid procfs fields instead of ignoring
Adds ngid and tracer_pid fields to ProcStatus struct. These were
previously silently discarded during /proc/<pid>/status parsing.
2026-07-10 14:20:03 +03:00
vasilito a71b7f8baa compositor+evdevd: eliminate remaining disguised stubs
Compositor:
- XDG_POPUP_GRAB: read serial from payload (was generating fake serial)
- XDG_POPUP_REPOSITION: fix payload parsing, look up positioner state,
  send configure+repositioned events with correct token
- WL_SUBSURFACE_PLACE_ABOVE/BELOW: implement z_index tracking for
  real subsurface stacking order
- Unknown global bind: log warning instead of silent type-0 assignment
- DRM page flip: log ioctl errors instead of silently ignoring
- handlers.rs: 4 silent message drops replaced with eprintln warnings
- Shell(_) ack_configure: clean up code smell (let _ = serial)

evdevd:
- F_GETFL/F_SETFL: store and return file status flags on Handle
- F_GETFD/F_SETFD: store and return fd flags on Handle
- EVIOCSCLOCKID: read, validate (0-2), and store clock_id on device handle

relibc submodule pointer update (dso.rs catch-alls → log+skip).
2026-07-10 13:47:09 +03:00
vasilito 5acd4b4c23 firmware-loader: premium upgrade — BuiltinRegistry, LoadStats, builder API
- BuiltinFirmware + BuiltinRegistry: compile-time embedded firmware
  (Linux 7.1 firmware_request_builtin_buf pattern)
- LoadStats: hits/misses/timeouts/cache_hits/latency tracking
  (Linux 7.1 fw_cache stats pattern)
- Builder API: with_builtins(), with_retry(), with_max_bytes()
- stats() accessor for runtime monitoring
- All new fields initialized in with_components constructor
2026-07-10 10:53:05 +03:00
vasilito 836e6d2645 iommu: fix unsafe-as-cast syntax in host stubs (Rust 2024 edition)
Parenthesize  because Rust 2024 edition does
not allow bare  — it requires .
Affected geteuid/getuid/getegid/getgid host stubs.
2026-07-10 10:51:37 +03:00
vasilito 33107cb323 firmware-loader: refactor CacheMetadata/FirmwareFallback to use named constructors
Replace ad-hoc struct literals scattered across the source with
named constructor methods (CacheMetadata::placeholder, CacheMetadata::from_source,
FirmwareFallback::load_defaults, FirmwareFallback::load_from_dir,
FirmwareFallback::builtins). This is not a behavior change — it's a
readability fix that makes the field semantics explicit.

Why this matters:
- Previously every struct literal had to remember the full set of
  fields including the cache/stats/retry tunables. Adding a new field
  required finding every literal in the source tree.
- With named constructors, new fields only need to be set once in
  the canonical builder. Test/placeholder sites stay minimal.
- Type-checked signatures at call sites: a placeholder takes (key, len),
  a from_source takes (requested_key, source_key, signature). The
  compiler now verifies you pass a SourceSignature when you need one.

Cross-referenced with Linux drivers/base/firmware_loader.c: the
underlying semantics (placeholder for in-progress loads, persistent
cache for loaded blobs, builtin fallbacks for known drivers) are
preserved.
2026-07-10 10:32:32 +03:00
vasilito a838b3be13 iommu: fix unsafe-as-cast syntax in host stubs (Rust 2024 requires parenthesized cast) 2026-07-10 10:19:49 +03:00
vasilito e00f0d7817 firmware-loader: premium upgrade — builtins, stats, retry, limits (Linux 7.1 port)
Additions cross-referenced with Linux 7.1 drivers/base/firmware_loader/:

- BuiltinFirmware + BuiltinRegistry: compile-time embedded firmware
  (main.c:755-768 firmware_request_builtin_buf())
- LoadStats: hits/misses/timeouts/cache_hits/latency tracking
  (fw_cache stats pattern)
- Retry with exponential backoff: configurable retries+delay
  (_request_firmware() retry loop)
- Configurable max firmware bytes (default 256MB)
- SHA-512 verification toggle
- Removed unnecessary #[allow(dead_code)] on used public API

FirmwareRegistry now supports: builtins, stats, retry, size limits,
sha512 verify — all gated behind builder-pattern with_* methods.
2026-07-10 10:17:42 +03:00
vasilito 7f00133337 iommu: replace 31 host-stub ENOSYS returns with real libc implementations
Previously: host_redox_stubs returned ENOSYS for all syscalls except
close/munmap/get_euid/ruid/egid/rgid — silent failures when IOMMU
code was tested on the host.

Now (host only):
- open/read/write/close → real libc file I/O
- mmap → real libc memory allocation (MAP_ANON|MAP_PRIVATE)
- munmap → real libc munmap
- clock_gettime → real libc CLOCK_REALTIME
- fstat → real libc fstat
- fsync/fdatasync/ftruncate → real libc ops
- getpid/getuid/geteuid/getgid/getegid → real libc
- strerror → real libc strerror (not hardcoded message)
- 12 remaining unsupported ops: ENOSYS with same semantics
  (dup, signals, waitpid, namespaces — not needed for IOMMU tests)
2026-07-10 10:06:37 +03:00
vasilito 817b514f42 stubs: disguised-stub sweep — remove shortcuts, restore real code across KDE/Qt/DRM/amdgpu/base
KDE/Qt6 — real backends, no stubs:
- kf6-* (20 recipes): remove .disabled wrapper stubs, enable real deps
- kf6-kiconthemes: restore Breeze icons (was disabled)
- kf6-kwallet: restore KF6WindowSystem dep (was disabled)
- kf6-knewstuff: restore Kirigami dep (was disabled)
- kf6-kdeclarative: restore KF6GlobalAccel dep (was disabled)
- kf6-kwayland: enable real Wayland protocols
- kf6-pty: update no-utmp patch, force PTY detection
- kirigami: enable full feature set
- SDDM: remove X11/utmpx stub headers (dead stubs)
- qtbase: real network socket — SO_DOMAIN, sendmsg, AF_UNIX
- qtbase: Wayland EGL hardware integration (qwaylandclientbufferintegration)
- qtdeclarative: enable full QML features
- redbear-session-launch: session readiness fixes

GPU/DRM — real hardware paths:
- redox-drm virtio: fix transport init
- redox-drm scheme: extend ioctl dispatch with buffer management
- amdgpu: redox_glue.h — add missing KPI compat declarations
- amdgpu: redox_stubs.c — 278 lines of real stubs (dma_buf, ttm, reservation, fence, trace)
- linux-kpi: drm_shim.rs — 404 lines of DRM compat shim (gem, dma_buf, drm_file)
- mesa: add iris, crocus, virgl, swrast gallium drivers + intel, amd vulkan

Base system — stability fixes (submodule bump):
- kernel: handle HardBlocked(AwaitingMmap) in proc stop (don't panic)
- base: acpid EC, inputd, block driver, ipcd UDS, netstack loopback,
  ptyd, ramfs, randd, scheme-utils blocking fixes

Build system:
- cook/fetch.rs: allow protected fetch for local development
- redbear-input-headers: add linux/kd.h, linux/vt.h
- mc: add stdckdint.h compat header, configure fix
- libinput, libxkbcommon, libwayland: updated source tars
- New symlinks: polkit-qt6, openssl3, gperf
2026-07-09 23:56:14 +03:00
vasilito 0ec7bd46bb Phase 3: GPU 3D drivers + Phase 1-2 stability fixes — full rollup
ROLLUP of all Phase 1-3 work on branch 0.3.0, targeting a production-ready
console + full graphical desktop under Intel and Virgl/VirtIO-GPU.

=== Phase 1 — Stability ===
 - fbcond: Enter key handler (scancode 0x1C→\n), display map buffering,
   control-char filter in all 7 keymaps, write_event assert
 - build-redbear.sh: auto-rebuild-prefix when fork timestamps are newer
   than prefix/x86_64-unknown-redox/sysroot (was warning-only). Added
   configurable REDBEAR_SKIP_PREFIX_REBUILD guard.
 - build-redbear.sh: set explicit keymap '-K us' in console activation
 - config/redbear-device-services.toml: remove spurious init.d service
   files for redbear-acmd/ecmd/usbaudiod. These USB device daemons are
   spawned dynamically by pcid-spawner, not as boot-time init services.
   Starting them without args panicked the boot flow.
 - relibc: grantpt/unlockpt/ptsname (then deduplicated against stdlib)
 - userutils: cherry-pick upstream getty commit 2834434 (standard C
   ptsname/grantpt/unlockpt)
 - base fork: Russian (ЙЦУКЕН) keymap + inputd control-char filter
   (K_ESC/K_BKSP/K_ENTER → \0, commit 73e44d81 in submodule/base)

=== Phase 2 — Login & Console ===
 - login.rs: restored to 0.2.5-known-good liner-based prompt
 - redbear-upower: removed tokio full/signal features → protection fault fix
 - redbear-power: excluded temporarily (being fixed in other session)
 - tlc version: updated to 0.3.0

=== Phase 3 — GPU/3D Drivers (commit 0898332f7a) ===
Intel i915: FULLY implemented — real ring buffer + MMIO command
submission via GEM DMA → GGTT → i915 render ring, with hardware
head-pointer polling (2M iterations, 50µs backoff). Zero stubs.

VirtIO GPU/Virgl (VirtioTransport): 11 VIRTGPU ioctls (GETPARAM,
GET_CAPS, RESOURCE_CREATE, RESOURCE_INFO, CONTEXT_INIT, EXECBUFFER,
WAIT, TRANSFER_TO_HOST, TRANSFER_FROM_HOST, MAP, CREATE_BLOB) ported
from Linux 7.1 virtgpu_ioctl.c and virtgpu_vq.c.
 - driver.rs: 8 virgl_* trait methods (default Unsupported)
 - scheme.rs: 11 ioctl constants + 8 wire structures + dispatch
 - virtio/transport.rs: PCI capability discovery, feature negotiation,
   control+cursor virtqueue setup, vring descriptor building
 - virtio/mod.rs: real implementations for all 8 virgl_* methods
 - intel/mod.rs: explicit virgl Unsupported stubs

Other changes from active sessions: Cargo.toml version bumps, linux-kpi
headers, libpciaccess recipe, mesa/recipe.toml, kf6 patches, expat,
driver-manager, redbear-sessiond, redbear-compositor, cub, tlc, and
many other local recipes.
2026-07-09 20:29:28 +03:00
vasilito 550551d8bc fix: migrate all local recipe Cargo.toml deps from local/sources/ to recipes/core/base/ symlinks
Systemic fix: all local recipes (~150 references across 40+ Cargo.toml files)
now resolve libredox, redox_syscall, and redox-scheme through
recipes/core/base/ symlinks instead of local/sources/ paths.
Eliminates lockfile collision between Cargo's resolution of the same
package through different path strings (local/sources/ vs recipes/core/base/).

This is required because the base recipe's workspace Cargo.toml resolves
these deps through recipes/core/base/ (via symlink chain from the
recipe copy location), and Cargo treats different path strings to the
same directory as different packages.
2026-07-09 15:31:01 +03:00
vasilito 095055df4b redbear-keymapd, redbear-ime: migrate to SchemeSync; redox-drm: test import; base bump 2026-07-09 12:53:23 +03:00
vasilito 117516153d redbear-authd: add Cargo.lock for offline build 2026-07-09 12:38:42 +03:00
vasilito 509ff54624 redbear-accessibility: migrate from SchemeBlockMut to SchemeSync for redox-scheme 0.11.2 2026-07-09 12:23:50 +03:00
vasilito d85702a3ca docs: resolve IMPROVEMENT-PLAN, update MASTER+RAPL plans, add RAPL energy reader
IMPROVEMENT-PLAN: marked RESOLVED (38/38 items done). Now historical record.

IMPLEMENTATION-MASTER-PLAN: removed quality gap references, added status
tables for active vs resolved subsystem plans.

RAPL-IMPLEMENTATION-PLAN: P0 blocker resolved — MSR scheme exists at
src/scheme/sys/msr.rs. Proceed to Phase 1.

redbear-power/sensor.rs: added RAPL energy register reader:
- MSR_PKG_ENERGY_STATUS (0x611) — Package domain
- MSR_PP0_ENERGY_STATUS (0x639) — Core domain
- MSR_PP1_ENERGY_STATUS (0x641) — Graphics domain
- MSR_DRAM_ENERGY_STATUS (0x619) — DRAM domain
- read_rapl_energy(), read_rapl_energy_unit(), read_rapl_energy_uj()
- RaplDomain enum (Package/Core/Graphics/Dram)
- Energy unit conversion: MSR_RAPL_POWER_UNIT (0x606) ESU bits
Cross-referenced with Linux 7.1 arch/x86/events/intel/rapl.c.
2026-07-09 01:02:00 +03:00
vasilito 1021219d4a redbear-upower: remove tokio signal feature causing protection fault
The previous tokio = { features = ["full"] } pulled in tokio::signal
(including tokio::signal::unix::SignalKind::terminate). On Redox the
libc signal-handler registration path is incomplete; calling
enable_all() in main triggered a protection fault inside relibc, and
the kernel then panicked on unreachable code in
process::exit_this_context (see kernel/src/syscall/process.rs:79).

Two-part fix:
- Cargo.toml: scope tokio features to rt, rt-multi-thread, macros,
  net, time, sync. This drops  and , which are
  unavailable on Redox anyway. The init system manages the daemon
  lifecycle, so a signal handler is not needed in this daemon.
- src/main.rs: spawn_signal_handler becomes a no-op. The shutdown_tx
  channel is preserved for any future internal shutdown signaling.
  The SIGTERM path is removed entirely.

This unblocks Phase 2.1 by removing the kernel panic cascade: the
protection fault no longer fires, the kernel's exit_this_context
reaches the context switch cleanly, and the previous
unreachable!() panic no longer triggers.
2026-07-08 22:08:21 +03:00
vasilito 44ef5f76c2 fix in-house crate deps: redox-driver-sys and linux-kpi to 0.3 2026-07-08 19:19:41 +03:00
vasilito 0046efb009 sync in-house crate versions to 0.3.0 and bump kernel/relibc/syscall submodules 2026-07-08 18:34:22 +03:00
vasilito eeb0292572 redbear-power: consume real /scheme/coretemp and /scheme/sys/cpu sources 2026-07-08 01:14:26 +03:00
vasilito 838e17f4fa coretempd: implement per-CPU die temperature daemon 2026-07-08 01:14:16 +03:00
vasilito 207dddff9e thermald: use Redox /scheme/sys/msr for CPU temperature reads 2026-07-08 01:14:05 +03:00
vasilito aa2185152a docs: comprehensive driver infrastructure assessment and cleanup
IMPLEMENTATION-MASTER-PLAN.md:
  - Updated Phase 2 Network Drivers to COMPLETE status
  - Added NETWORKING-IMPROVEMENT-PLAN.md to authority table
  - Comprehensive driver inventory (5 Ethernet, 7 storage, 4 USB, 4 GPU, etc.)
  - Linux 7.1 cross-references for every driver
  - Network stack completion summary (9,212 LoC, all protocols)
  - Updated e1000d/rtl8168d file statuses (was 'Truncated', now 'Complete')
  - Remaining smoltcp-dependent gaps documented

Archived stale docs:
  - C7-STATUS.md → archived/ (KF6/Plasma migration, completed)
  - BUILD-TOOLS-PORTING-PLAN.md → archived/ (superseded)
  - 0.2.5-GRAPHICS-FREEZE-PLAN.md → archived/ (version-specific)
2026-07-07 23:46:41 +03:00
vasilito 6e808741ea redbear-power: per-core governor display and Ctrl+g control 2026-07-07 22:16:27 +03:00
vasilito 596407a52d redbear-power: upower client + render/sensor/battery/dmi updates 2026-07-07 22:00:54 +03:00
vasilito 33c002d563 USB: cast O_* flags to u8 for NewFdFlags::from_bits_truncate
Cross-compile error: from_bits_truncate requires u8 but
O_STAT/O_RDWR are usize.  Cast with 'as u8'.

Applied to all 4 scheme wrappers: acmd, ftdi, ecmd, usbaudiod.
2026-07-07 21:54:39 +03:00
vasilito 46cd3704b9 USB: fix scheme API — match actual redox-scheme SchemeSync trait
Cross-referenced with wifictl's working scheme registration pattern.

scheme.rs fixes (acmd + ftdi):
- openat: 5→6 params (add &mut self, fcntl_flags: u32)
- read: 4→6 params (add offset: u64, fcntl_flags: u32)
- write: 4→6 params (add offset: u64, fcntl_flags: u32)
- Removed close() method (not in SchemeSync trait)
- OpenResult.flags: usize→NewFdFlags (via from_bits_truncate)
- Removed unused imports

main.rs fixes (acmd):
- Replaced register_async_scheme + handle_scheme_mut with
  wifictl pattern: setrens(0,0) + request.handle_sync() +
  socket.write_response() + RequestKind::Call match
- Socket::next_request returns Option<Request>, handle
  Ok(None)/Err gracefully instead of expect()

Verified: cargo check --offline passes on host.
2026-07-07 21:12:45 +03:00
vasilito fc34718ae8 redbear-power: update stale docstrings for Redox process control and MSR temperature fallback 2026-07-07 21:10:33 +03:00
vasilito dac00073ba USB: canonical scheme pattern — all 4 drivers aligned
ftdi/usbaudiod scheme.rs updated to match acmd/ecmd pattern:
  Explicit match arms in read/write (not map/map_err chains)
  Consistent openat with root dir + device file routing
  Saturating close count
  AudioScheme retains capture/playback path routing

All 4 scheme modules now identical in structure:
  acmd  → /scheme/ttys/usbACM_<N>      (Mutex<bulk_in>, Mutex<bulk_out>)
  ftdi  → /scheme/ttys/usbFTDI_<N>     (same)
  ecmd  → /scheme/net/usbECM_<N>       (same)
  audio → /scheme/audio/usbAudio_<N>   (Mutex<isoch_in>, Mutex<Option<isoch_out>>)
2026-07-07 20:01:37 +03:00
vasilito ac9c12d6d4 USB: align ecmd scheme with acmd pattern — explicit match arms, clean imports
ecmd scheme.rs: map/map_err chains → explicit match arms (same as acmd)
acmd scheme.rs: removed unused imports (io::{Read,Write}, Duration, Stat)

All 4 scheme modules now follow identical pattern:
  Mutex<XhciEndpHandle>, SchemeSync, explicit match in read/write
2026-07-07 19:59:43 +03:00
vasilito 5b4f2ac984 USB: P3 — wire scheme into main loop for ecmd + usbaudiod
redbear-ecmd: scheme loop replaces stdout on Redox
  (/scheme/net/usbECM_<N>), notification reader kept for
  CDC link state / speed change events on both paths.

redbear-usbaudiod: scheme loop replaces stdout on Redox
  (/scheme/audio/usbAudio_<N>), stdin→isoch_OUT playback
  thread kept for host stdout path only.

All 4 class drivers now fully wired:
  acmd  → scheme event loop active on Redox 
  ftdi  → scheme event loop active on Redox 
  ecmd  → scheme event loop active on Redox 
  usbaudiod → scheme event loop active on Redox 
2026-07-07 19:55:40 +03:00
vasilito 827cc0223d USB: P3 scheme service wrappers — ecmd + usbaudiod
redbear-ecmd: EcmScheme → /scheme/net/usbECM_<N> for netstack
redbear-usbaudiod: AudioScheme → /scheme/audio/usbAudio_<N> for audiod
  (supports capture/playback path routing via openat path names)

All 4 class drivers now have scheme service wrappers:
  redbear-acmd  → /scheme/ttys/usbACM_<N>
  redbear-ftdi  → /scheme/ttys/usbFTDI_<N>
  redbear-ecmd  → /scheme/net/usbECM_<N>
  redbear-usbaudiod → /scheme/audio/usbAudio_<N>
(HID+Storage already have scheme integration via ProducerHandle/DiskScheme)
2026-07-07 19:27:36 +03:00
vasilito 9e6851d43c USB: P3 scheme service wrapper — redbear-ftdi registers /scheme/ttys/usbFTDI_<N>
Same pattern as acmd: FtdiScheme with Mutex<XhciEndpHandle>,
SchemeSync impl, Socket::create() + register on Redox,
stdout fallback on host/Linux.
2026-07-07 19:24:46 +03:00
vasilito 726e628e0d USB: P3 scheme service wrapper — redbear-acmd registers /scheme/ttys/usbACM_<N>
Cross-referenced with Linux 7.1 tty_port_register_device() pattern.

New scheme.rs module:
- AcmScheme implements SchemeSync with Mutex-wrapped XhciEndpHandle
- openat(): root dir listing + device file open (O_RDWR)
- read(): USB bulk IN → scheme client (getty, terminal)
- write(): scheme client → USB bulk OUT
- close(): decrements open count
- fsync(): no-op

main.rs:
- #[cfg(target_os = redox)]: Socket::create() + register scheme
  under /scheme/ttys/usbACM_<port_id>, process requests with
  handle_scheme_mut() in event loop
- #[cfg(not(target_os = redox))]: stdout fallback for testing

This enables getty to open /scheme/ttys/usbACM_<N> as a serial
console on USB CDC ACM devices — the driver is now a proper
Redox scheme service, not just a stdout debugging tool.

Pattern replicable for redbear-ftdi (same scheme:ttys), redbear-ecmd
(scheme:net), and redbear-usbaudiod (scheme:audio).
2026-07-07 19:21:14 +03:00
vasilito ed7aba6ed1 USB: acmd scheme IPC documentation — stdout IS the Redox scheme path
The Redox init system connects daemon stdout to the appropriate
scheme service on spawn.  No explicit scheme registration needed
in the driver — stdout/stderr are the scheme IPC endpoints.

This is the standard Redox daemon architecture:
- Input daemons (HID, storage) write to stdout → scheme:input, scheme:disk
- Output daemons (ACM, ECM, Audio) read/write stdout → scheme:ttys, scheme:net
- The init system handles pipe-to-scheme binding via .service files

Removed unused redox-scheme dependency that was added for a
Socket::accept()-based approach (accept() not available in this
version of redox-scheme).  The stdout pattern is the correct,
working architecture.
2026-07-07 19:08:50 +03:00
vasilito 8641f22bd1 redbear-power: DRY /proc/loadavg parsing 2026-07-07 17:31:45 +03:00
vasilito 72fc7c6f87 redbear-power: wire package thermal status into header 2026-07-07 17:29:53 +03:00
vasilito acd6e221c5 redbear-power: track D-Bus worker disconnect state 2026-07-07 17:27:52 +03:00
vasilito dc9155a2a8 redbear-power: fix panic hook to restore terminal on panic 2026-07-07 17:22:20 +03:00
vasilito f79954e2bc USB: comprehensive hotplug with Linux 7.1 port event state machine
Cross-referenced with Linux 7.1 drivers/usb/core/hub.c:
- hub_port_debounce() (line 4698): 25ms-step debounce algorithm
  with 100ms stable threshold, 2000ms timeout per USB 2.0 §7.1.7.3
- hub_port_connect_change() (line 5055): connect/disconnect dispatch
- hub_irq() / port_event(): interrupt-driven change detection

PortState enum (replaces ad-hoc bool tracking):
  Disconnected → DebouncingConnect → Connected → Active → Disconnected

Debounce: stable_start timestamp, 4x 25ms checks for 100ms
stable window.  Connection drop during debounce → reset.
Timeout after 2000ms → warn + remove.

Phase-based main loop:
  Phase 1: scan controllers/ports → detect new connections
  Phase 2: debounce + state transitions per port
    - DebouncingConnect: check stability against stable_start
    - Connected: read descriptors → find_driver → spawn
    - Active: check driver exit (try_wait) + disconnect detection
  Phase 3: cleanup (remove disconnected, time out stale debounces)

Driver re-enumeration on crash: Active → Connected transition
on driver exit re-triggers descriptor read + spawn.

read_port_connected() uses XhciClientHandle open success as
connectivity check (lighter than full descriptor read).
2026-07-07 16:04:28 +03:00
vasilito 0d494d8e89 USB: comprehensive hotplug — extended driver map, recursive port scanning
usb-core spawn.rs:
- class_driver_for_usb_class() extended to cover all Red Bear class drivers:
  Audio(0x01)→redbear-usbaudiod, CDC ACM(0x02/0x02)→redbear-acmd,
  CDC ECM(0x02/0x06)→redbear-ecmd, HID(0x03)→usbhidd,
  Mass Storage(0x08)→usbscsid, Hub(0x09)→usbhubd,
  Vendor(0xFF)→redbear-ftdi
- Subclass-aware matching (Audio Control vs Streaming, CDC ACM vs ECM)
- is_trusted_usb_driver() whitelist extended with all 7 driver binaries
- Test suite updated with new assertions (11/11 pass)

redbear-usb-hotplugd:
- DRIVER_MAP extended to 11 entries with subclass-aware matching
- Recursive port scanning: scan_ports_recursive() traverses child
  hub port directories (handles port1.port2.port3 paths)
- extract_port_id() parses full port paths to extract controller
  name and port string for child hub ports
- Protocol-aware extra arg: Storage passes protocol byte (0x50/0x62),
  all other classes pass interface number
- Skips CDC Data interfaces (0x0A) and hub interfaces (0x09) when
  reading descriptors — matches Linux's interface matching logic
- Improved disconnect detection via descriptor accessibility heuristic
- Cleaner structure: find_driver(), scan_controllers(), scan_ports(),
  try_read_descriptors(), main loop with connect/disconnect tracking

All 7 Red Bear USB class drivers now auto-spawning on device connect:
usbhidd, usbscsid, usbhubd, redbear-acmd, redbear-ecmd,
redbear-usbaudiod, redbear-ftdi
2026-07-07 16:00:24 +03:00
Sisyphus Agent 19c7856642 redbear-power: add load average to JSON export
Add a JsonLoad struct with load_avg_1m/5m/15m fields and include it in the --json snapshot. Values are read from app.load_avg. Build, 224 tests, clippy, and fmt clean.
2026-07-07 15:40:56 +03:00
vasilito 777a2c71d3 USB: redbear-usb-hotplugd — auto-spawn class drivers on device connect
Cross-referenced with Linux 7.1 drivers/usb/core/hub.c port event
handling and drivers/usb/core/driver.c device-driver binding.

New daemon (216 lines) that watches USB controllers for device
attachment/detachment and auto-spawns the appropriate class driver.

Architecture:
- Polls /scheme/usb/ every 1000ms for controller directories
- For each controller, enumerates root hub ports
- Reads device descriptors (class/subclass/protocol) via XhciClientHandle
- Maps class to driver binary: HID(0x03)→usbhidd, Storage(0x08)→usbscsid,
  Hub(0x09)→usbhubd
- Spawns driver with <scheme> <port> <protocol> arguments
- Tracks spawned Child processes in HashMap<port_path, TrackedDevice>
- Detects disconnection (descriptor read fails) → kills driver + removes
  from tracking
- Detects driver exit (try_wait) → removes from tracking
- Skips hub interfaces (usbhubd handles its own children)

Config:
- Added to redbear-mini.toml (inherited by redbear-full)
- Auto-started via 02_usb_hotplug.service (oneshot_async, after base.target
  and pcid-spawner)

Driver map supports: HID (0x03), Mass Storage (0x08 with BOT protocol),
Hub (0x09). Additional class drivers extendable via DRIVER_MAP constant.
2026-07-07 15:33:42 +03:00
Sisyphus Agent 3452225e0e redbear-power: show live process filter input in keybar
Mirror the local process_filter_input buffer into App so render_keybar can display it. While filtering, the keybar shows "Filter: <buffer>  (N matches)  Enter:apply  Esc:clear  ↑↓:select" in a warm style instead of the normal hints. Build, 224 tests, clippy, and fmt clean.
2026-07-07 15:33:15 +03:00
Sisyphus Agent da8fe50c4a redbear-power: show selected signal + target in kill dialog footer
Replace the generic kill-dialog footer with an explicit confirmation line: "Send SIGTERM to PID 1234 (sshd)?  Enter: send   Esc: cancel   ↑↓: select". Extracts the signal name from the existing signal labels. Build, 224 tests, clippy, and fmt clean.
2026-07-07 15:24:35 +03:00
Sisyphus Agent 022d4ce28b redbear-power: persist refresh interval in session
Add refresh_ms to SessionState (0 = not set, use config/default). Load it into App::poll_ms, give it priority over config when initializing the event-loop poll interval, and save it back in save_session(). Update all SessionState test initializers and assertions. Build, 224 tests, clippy, and fmt clean.
2026-07-07 15:21:25 +03:00
Sisyphus Agent c5b916e062 redbear-power: header uptime and process count
Extend the header load-average line to also show system uptime and total process count. Uptime uses meminfo::format_uptime; process count uses app.processes.count(). All values stay on one line to keep HEADER_LINES at 8. Build, 224 tests, clippy, and fmt clean.
2026-07-07 15:08:40 +03:00
vasilito 1584acc4af USB: P6-C + P1-D — real USB Audio Class 1.0 driver replacing 32-line stub
Cross-referenced with Linux 7.1 sound/usb/card.c, mixer.c, pcm.c
and include/uapi/linux/usb/audio.h.

Replaces the 32-line scan-and-symlink stub with a 280-line real class driver:

Audio Control Interface (Feature Unit):
- Volume control: GET_CUR / SET_CUR via class-specific control requests
  (bmRequestType 0xA1/0x21, FU_VOLUME selector, per-channel)
- Mute control: GET_CUR / SET_CUR (FU_MUTE selector)
- AudioReq helper for bidirectional class-specific control requests

Audio Streaming Interface:
- Isochronous endpoint auto-detection (attributes & 0x03 == 0x01)
- Format heuristics from max packet size (stereo 16-bit 48kHz default)
- SET_CUR SAMPLING_FREQ_CONTROL (0x0100) for sample rate
- Bidirectional isoch I/O: isoch IN → stdout (recording),
  stdin → isoch OUT (playback)

Eliminates P1-D last remaining stub — all 3 scan-and-symlink stubs
(ecmd, acmd, usbaudiod) now have real class driver implementations.
2026-07-07 15:06:05 +03:00
Sisyphus Agent bec5262019 redbear-power: show load average in header
Add a "Load: 0.42 0.55 0.61" line to render_header, color-coded by load versus core count (green <= 50% capacity, yellow <= 100%, red overcommitted). Bump HEADER_LINES from 7 to 8. Build, 224 tests, clippy, and fmt clean.
2026-07-07 14:54:41 +03:00