Refresh status docs and add a visible changelog

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-14 10:50:04 +01:00
parent ba09482def
commit fd60edc823
20 changed files with 3311 additions and 77 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ the LinuxKPI compatibility approach — a clean Rust rewrite would take 5+ years
| ACPI | ✅ Complete | RSDP/SDT checksums, MADT types 0x4/0x5/0x9/0xA, LVT NMI, FADT shutdown/reboot |
| x2APIC | ✅ Works | Auto-detected via CPUID, APIC/SMP functional |
| HPET | ✅ Works | Timer initialized from ACPI |
| IOMMU | ❌ Missing | No VT-d or AMD-Vi support |
| IOMMU | 🚧 Buildable, unvalidated | `iommu` daemon now builds, but no VT-d/AMD-Vi hardware validation yet |
| AMD GPU | 🚧 In progress | MMIO mapped, DC port compiles, MSI-X wired, no hardware validation yet |
| Wi-Fi/BT | ❌ Missing | No wireless support |
| USB | ⚠️ Variable | Some USB controllers work, others don't |
+543
View File
@@ -0,0 +1,543 @@
# INPUTD SCHEME API ENHANCEMENT DESIGN
**Target**: `recipes/core/base/source/drivers/inputd`
**Scope**: Userspace-only `inputd` scheme enhancement
**Date**: 2026-04-13
## 1. Goal
Enhance `inputd` so it can do all of the following without breaking any existing callers:
1. Let producers register under stable names such as `ps2-keyboard`, `ps2-mouse`, or `usb-hid0`.
2. Expose per-device consumer streams so services such as `evdevd` can subscribe to one device only.
3. Publish hotplug notifications for device add/remove.
4. Expose currently registered devices through the scheme root directory.
This is an **additive** design. Existing paths, existing event payloads, existing VT behavior, and existing display/control behavior must continue to work unchanged.
## 2. Current Implementation Summary
The current `inputd` implementation in `recipes/core/base/source/drivers/inputd/src/main.rs` has these important properties:
- `Handle` only supports `Producer`, `Consumer`, `Display`, `Control`, and `SchemeRoot`.
- `openat()` only recognizes `producer`, `consumer`, `consumer_bootlog`, `handle`, `handle_early`, and `control`.
- All producers write anonymous `orbclient::Event` bytes into the same `Handle::Producer` path.
- Legacy consumers are per-VT handles. `write()` only delivers input bytes to the **active VT** consumer set.
- `SchemeRoot` exists, but it is not a real directory yet: it does not enumerate entries.
- `lib.rs` only exposes `ProducerHandle`, `ConsumerHandle`, `DisplayHandle`, and `ControlHandle`.
Current callers confirm the limitation:
- `ps2d` opens one `ProducerHandle` and sends both keyboard and mouse events into the same stream.
- `usbhidd` also opens one `ProducerHandle` and sends keyboard/mouse/button/scroll data into the same stream.
- local `evdevd` reads `/scheme/input/consumer`, receives anonymous mixed `orbclient::Event` values, and manually translates them.
## 3. Design Principles
1. **Keep legacy behavior intact**: `/scheme/input/producer` and `/scheme/input/consumer` must keep working exactly as they do today.
2. **Do not change event payloads**: device-specific streams still carry serialized `orbclient::Event` values.
3. **Keep all logic in userspace**: no kernel changes, no new kernel scheme semantics.
4. **Make enumeration path-driven**: device names are visible as entries below `/scheme/input/`.
5. **Use explicit hotplug events**: device discovery and liveness must not depend on polling failed opens.
## 4. Scheme Path Layout
The enhanced namespace is:
```text
/scheme/input/ — SchemeRoot (directory listing)
/scheme/input/producer — Legacy producer (unchanged)
/scheme/input/producer/{name} — Named producer: ps2-keyboard, ps2-mouse, usb-hid0
/scheme/input/consumer — Legacy consumer (unchanged)
/scheme/input/{device_name} — Per-device consumer: reads events from one named producer
/scheme/input/events — Hotplug event stream
/scheme/input/handle/{display} — Display handle (unchanged)
/scheme/input/control — Control commands (unchanged)
```
Legacy-only paths that must remain valid even though they are not part of the new API surface:
```text
/scheme/input/consumer_bootlog — Existing bootlog VT consumer
/scheme/input/handle_early/{display} — Existing early framebuffer handoff path
```
### 4.1 Root Directory Listing
`SchemeRoot` should become a real directory endpoint backed by `getdents`, not by overloading `read()`.
The root listing should expose:
- static entries: `producer`, `consumer`, `consumer_bootlog`, `events`, `handle`, `handle_early`, `control`
- one dynamic entry per registered device name from `devices`
That keeps the namespace honest while still allowing device enumeration from `/scheme/input/`.
`InputDeviceLister` in `lib.rs` should filter out the reserved static names and return only dynamic device entries.
## 5. Handle Model
The `Handle` enum in `main.rs` should become:
```rust
enum Handle {
Producer,
NamedProducer {
name: String,
},
Consumer {
events: EventFlags,
pending: Vec<u8>,
needs_handoff: bool,
notified: bool,
vt: usize,
},
DeviceConsumer {
device_name: String,
events: EventFlags,
pending: Vec<u8>,
notified: bool,
},
HotplugEvents {
events: EventFlags,
pending: Vec<u8>,
notified: bool,
},
Display {
events: EventFlags,
pending: Vec<VtEvent>,
notified: bool,
device: String,
is_earlyfb: bool,
},
Control,
SchemeRoot,
}
```
Notes:
- `Producer` remains the legacy anonymous producer path.
- `NamedProducer` only needs the registered name. Device ID lookup stays in shared scheme state.
- `DeviceConsumer` is byte-oriented like the legacy consumer, but without VT or handoff state.
- `HotplugEvents` stores serialized variable-length hotplug records in `pending`.
- `SchemeRoot` remains a dedicated handle variant, but now supports directory enumeration.
## 6. Scheme Open Semantics
`openat()` should parse paths as follows:
### 6.1 Existing Paths
- `producer` with no child component → `Handle::Producer`
- `consumer` → current VT consumer allocation logic
- `consumer_bootlog` → current VT 1 logic
- `handle/{display}` → unchanged
- `handle_early/{display}` → unchanged
- `control` → unchanged
### 6.2 New Paths
- `producer/{name}``Handle::NamedProducer { name }`
- `events``Handle::HotplugEvents { ... }`
- any other top-level non-reserved path component → `Handle::DeviceConsumer { device_name, ... }`
### 6.3 Name Validation
Named producer registration must reject:
- empty names
- names containing `/`
- reserved names: `producer`, `consumer`, `consumer_bootlog`, `events`, `handle`, `handle_early`, `control`
- duplicate live names already present in `devices`
Recommended error behavior:
- invalid name → `EINVAL`
- duplicate name → `EEXIST`
- open of `/scheme/input/{device_name}` for a currently unknown device → `ENOENT`
## 7. State Management
`InputScheme` should add:
```rust
devices: BTreeMap<String, u32>,
next_device_id: AtomicUsize,
```
Purpose:
- `devices` maps device name → current device ID
- `next_device_id` allocates monotonically increasing IDs
Behavior:
1. When `NamedProducer` opens successfully:
- allocate `device_id = next_device_id.fetch_add(1, Ordering::SeqCst) as u32`
- insert `devices.insert(name.clone(), device_id)`
- serialize a `DEVICE_ADD` hotplug message
- append it to every `Handle::HotplugEvents.pending`
- set `notified = false` on those hotplug handles
- set `has_new_events = true`
2. When `NamedProducer` closes:
- remove the entry from `devices`
- serialize a `DEVICE_REMOVE` hotplug message with the removed ID and name
- append it to every `Handle::HotplugEvents.pending`
- set `notified = false`
- set `has_new_events = true`
3. Device IDs are never reused. If `ps2-keyboard` disappears and later comes back, it gets a new `device_id`.
No additional kernel state is required. This is ordinary daemon-side bookkeeping.
## 8. Event Routing Logic
The existing preprocessing path in `write()` must remain in place:
- special Super+Fn VT switching behavior stays in `inputd`
- keymap translation still happens in `inputd`
- the emitted payload remains serialized `orbclient::Event`
After that preprocessing step, routing changes as follows.
### 8.1 Legacy Producer
Input written to `/scheme/input/producer` follows the current legacy route:
- deliver to the existing legacy consumer path
- preserve current active-VT behavior
- do **not** deliver to any `DeviceConsumer`
- do **not** generate hotplug events
### 8.2 Named Producer
Input written to `/scheme/input/producer/{name}` must be fanned out to:
1. the matching `DeviceConsumer` handles where `device_name == name`
2. the existing legacy consumer path used by Orbital and other old clients
That means named producers are **supersets** of legacy routing, not replacements.
### 8.3 Device Consumer
`/scheme/input/{device_name}` only receives events from the named producer with the exact same name.
It must never receive:
- anonymous legacy producer traffic
- events from other named producers
- display or control events
### 8.4 Routing Sketch
```text
legacy producer write
-> existing input normalization
-> legacy VT consumer fan-out only
named producer write(name)
-> existing input normalization
-> device consumers for name
-> legacy VT consumer fan-out
```
Implementation-wise, the simplest approach is:
1. detect whether the writer is `Producer` or `NamedProducer { name }`
2. run the existing event transformation code once
3. serialize transformed `Event` values once
4. if named, append to matching `DeviceConsumer.pending`
5. append to the legacy consumer path using the current active-VT logic
6. clear `notified` on affected readers and set `has_new_events = true`
## 9. Hotplug Event Stream
`/scheme/input/events` is a read-only stream of variable-length hotplug records.
### 9.1 Binary Format
```rust
#[repr(C)]
struct InputHotplugEvent {
kind: u32, // 1 = DEVICE_ADD, 2 = DEVICE_REMOVE
device_id: u32, // Unique device identifier
name_len: u32, // Length of device name
_reserved: u32, // Future use
}
// Followed by name_len bytes of UTF-8 device name
```
Constants:
```rust
const DEVICE_ADD: u32 = 1;
const DEVICE_REMOVE: u32 = 2;
```
### 9.2 Stream Semantics
- The stream is append-only and ordered by daemon observation.
- Each record is serialized as header bytes followed by UTF-8 name bytes.
- `read()` drains raw bytes from `pending`.
- Because records are variable-length, callers must handle partial reads.
- `HotplugHandle` in `lib.rs` should hide this by buffering partial bytes until one full record is available.
### 9.3 Notification Model
`Handle::HotplugEvents` participates in `fevent(EVENT_READ)` exactly like other readable handles:
- when at least one serialized hotplug record is pending and the handle is subscribed to `EVENT_READ`, post a read event
- after a successful read drains the buffer, notification becomes edge-triggered again
## 10. Scheme Root Enumeration
Enumeration should be implemented with `getdents()` on `Handle::SchemeRoot`.
Recommended behavior:
- `scheme_root()` still creates a `Handle::SchemeRoot`
- `getdents()` emits static entries plus one entry per `devices` key
- `read()` on `SchemeRoot` stays invalid (`EBADF` or `EISDIR` are both acceptable if applied consistently)
- `openat()` continues to require a valid `SchemeRoot` dirfd
Example visible entries after `ps2d` registers keyboard and mouse:
```text
producer
consumer
consumer_bootlog
events
handle
handle_early
control
ps2-keyboard
ps2-mouse
```
This gives normal filesystem-style discovery while keeping old endpoints visible.
## 11. `lib.rs` Public API Changes
The public API should be extended, not replaced.
### 11.1 Existing Types Stay
- `ProducerHandle`
- `ConsumerHandle`
- `DisplayHandle`
- `ControlHandle`
Their existing constructors and behavior remain unchanged.
### 11.2 New Types
```rust
pub struct NamedProducerHandle(File);
pub struct DeviceConsumerHandle(File);
pub struct HotplugHandle {
file: File,
partial: Vec<u8>,
}
#[derive(Debug, Clone)]
#[repr(C)]
pub struct HotplugEventHeader {
pub kind: u32,
pub device_id: u32,
pub name_len: u32,
pub reserved: u32,
}
#[derive(Debug, Clone)]
pub struct HotplugEvent {
pub kind: u32,
pub device_id: u32,
pub name: String,
}
pub struct InputDeviceLister;
```
### 11.3 Constructors
```rust
impl NamedProducerHandle {
pub fn new(name: &str) -> io::Result<Self>;
}
impl DeviceConsumerHandle {
pub fn new(device_name: &str) -> io::Result<Self>;
}
impl HotplugHandle {
pub fn new() -> io::Result<Self>;
}
```
Path mapping:
- `NamedProducerHandle::new("ps2-keyboard")``/scheme/input/producer/ps2-keyboard`
- `DeviceConsumerHandle::new("ps2-keyboard")``/scheme/input/ps2-keyboard`
- `HotplugHandle::new()``/scheme/input/events`
### 11.4 Read/Write Shape
Recommended API shape:
```rust
impl NamedProducerHandle {
pub fn write_event(&mut self, event: orbclient::Event) -> io::Result<()>;
}
pub enum DeviceConsumerHandleEvent<'a> {
Events(&'a [Event]),
}
impl DeviceConsumerHandle {
pub fn event_handle(&self) -> BorrowedFd<'_>;
pub fn read_events<'a>(&self, events: &'a mut [Event])
-> io::Result<DeviceConsumerHandleEvent<'a>>;
}
impl HotplugHandle {
pub fn event_handle(&self) -> BorrowedFd<'_>;
pub fn read_event(&mut self) -> io::Result<Option<HotplugEvent>>;
}
```
`DeviceConsumerHandle` deliberately mirrors `ConsumerHandle`, but it does not need `Handoff` support because VT display handoff is unrelated to per-device streams.
### 11.5 Device Enumeration Helper
`InputDeviceLister` should provide a safe wrapper around scheme-root directory reads, for example:
```rust
impl InputDeviceLister {
pub fn list() -> io::Result<Vec<String>>;
}
```
Behavior:
- read `/scheme/input/` as a directory
- drop reserved static entries
- return only currently registered device names
This keeps callers out of scheme-internal filtering logic.
## 12. Producer Lifecycle and Consumer Behavior
### 12.1 Named Producer Registration
Opening `/scheme/input/producer/{name}` is both:
- creation of a producer handle
- registration of `{name}` as a live device
Closing the fd unregisters the device.
This matches current scheme style well because `inputd` already uses `on_close()` to clean up VT consumers.
### 12.2 Device Consumer Lifetime
Per-device consumer handles are name-based subscriptions.
- open succeeds only while the device name is currently registered
- once open, the handle remains attached to that name
- if the producer disappears, no more events arrive for that handle
- if the same name is registered again later, the handle resumes receiving events for that name
- the hotplug stream is how clients notice that the underlying producer instance changed
This keeps `DeviceConsumer` simple and avoids introducing a second handle teardown protocol.
## 13. Migration Path
### 13.1 `ps2d`
`ps2d` is the first caller that should adopt the new API because it already has a clean split between keyboard and mouse sources.
Recommended startup logic:
1. Try `NamedProducerHandle::new("ps2-keyboard")`
2. Try `NamedProducerHandle::new("ps2-mouse")`
3. If both succeed, run in named mode
4. If either fails, close any partially opened named handle and fall back to one legacy `ProducerHandle::new()`
Routing:
- keyboard scancodes → `ps2-keyboard`
- mouse move / absolute move / button / scroll events → `ps2-mouse`
This preserves compatibility with old `inputd` while immediately enabling per-device consumers on new `inputd`.
### 13.2 `evdevd`
Once the scheme exists, local `evdevd` can move from `/scheme/input/consumer` to:
- `InputDeviceLister::list()` to discover devices
- `DeviceConsumerHandle::new(name)` for device-local streams
- `HotplugHandle::new()` to watch add/remove
It can keep the legacy consumer path as a fallback for older systems.
### 13.3 `usbhidd`
`usbhidd` can remain legacy initially, then later migrate to named producers such as `usb-hid0`, `usb-hid1`, or more specific per-interface names.
## 14. Backward Compatibility Requirements
All of the following must continue to work unchanged:
- `/scheme/input/producer`
- `/scheme/input/consumer`
- `/scheme/input/consumer_bootlog`
- `/scheme/input/handle/{display}`
- `/scheme/input/handle_early/{display}`
- `/scheme/input/control`
- current `ProducerHandle`, `ConsumerHandle`, `DisplayHandle`, and `ControlHandle` APIs
- current active-VT routing and graphics handoff behavior
Compatibility rules:
1. Old producers still emit anonymous events into the legacy stream.
2. Old consumers still receive the same event format and VT behavior.
3. New named producers additionally feed the legacy stream, so old consumers continue to see those events.
4. No caller is forced to understand hotplug or enumeration.
## 15. Non-Goals
This design does **not** include:
- capability discovery (`keyboard` vs `mouse` metadata)
- kernel support or syscall ABI changes
- replacing `orbclient::Event` with a new event format
- changing VT ownership, display handoff, or control command semantics
- automatic migration of existing daemons
## 16. Implementation Checklist
Another developer implementing this design should be able to proceed in this order:
1. extend `Handle` and `InputScheme` state
2. teach `openat()` to parse `producer/{name}`, `events`, and dynamic device names
3. add root `getdents()` support for `SchemeRoot`
4. refactor `write()` so producer type is detected before routing
5. fan out named-producer events to matching `DeviceConsumer` handles and the existing legacy path
6. add hotplug queue serialization helpers
7. extend `fevent()` and daemon notification loop for `DeviceConsumer` and `HotplugEvents`
8. add cleanup in `on_close()` for `NamedProducer`
9. extend `lib.rs` with the new handle types and directory lister
10. migrate `ps2d` with a named-producer-first, legacy-fallback strategy
## 17. Final Outcome
After this enhancement:
- Orbital and any other legacy consumer continue to work as-is.
- `ps2d` and future drivers can publish stable device names.
- `evdevd` and similar services can subscribe to exactly one device stream.
- userspace can enumerate live input devices and react to hotplug events.
That solves the current anonymity problem without changing the kernel or breaking the existing Redox input stack.
File diff suppressed because it is too large Load Diff
+83
View File
@@ -0,0 +1,83 @@
# Red Bear OS Networking: RTL8125 + netctl
## Native stack
Red Bear uses the native Redox wired networking path already present in the base tree:
`pcid-spawner` → native NIC daemon (`rtl8168d`, `e1000d`, `ixgbed`, `virtio-netd`) → `network.*`
scheme → `smolnetd``dhcpd` / `netcfg`.
This change keeps RTL8125 in that native path instead of trying to introduce a Linux netdevice,
`sk_buff`, or NAPI compatibility layer into `linux-kpi`.
## RTL8125 path
- Autoload now matches `10ec:8125` in `recipes/core/base/source/drivers/net/rtl8168d/config.toml`.
- The existing Realtek driver binary remains the autoload target (`rtl8168d`).
- The daemon names RTL8125 devices distinctly in its `network.*` scheme name suffix.
This is the narrowest viable implementation path in the current tree. It reuses the existing
userspace driver, PCI spawn, and netstack plumbing already proven for the native Realtek path.
## relibc networking surface
The Redox-facing libc networking surface was extended to stop reporting a fake `stub` interface:
- `net/if.h` now exposes a real `eth0`-based view of the active interface model
- `ifaddrs.h` now returns a populated `eth0` entry
- Redox `ioctl()` now answers the common read-only `SIOCGIF*` queries used by interface-aware apps
- `netinet/in.h` now includes `in6_pktinfo`
- a minimal `resolv.h` is now generated in relibc
This is intentionally aligned with the current single-active-interface design in `smolnetd` and
`netcfg`.
## netctl
Red Bear ships a Redox-native `netctl` compatibility command in `redbear-netctl`.
### Supported profile subset
- `Interface=eth0`
- `Connection=ethernet`
- `IP=dhcp`
- `IP=static`
- `Address=('a.b.c.d/prefix')`
- `Gateway='a.b.c.d'`
- `DNS=('a.b.c.d')`
### Supported commands
- `netctl list`
- `netctl status [profile]`
- `netctl start <profile>`
- `netctl stop <profile>`
- `netctl enable <profile>`
- `netctl disable [profile]`
- `netctl is-enabled [profile]`
- `netctl --boot`
Profiles live in `/etc/netctl`. Shipped examples live in `/etc/netctl/examples/`.
### Boot integration
Red Bear configs install `/usr/lib/init.d/12_netctl.service`, which runs:
```text
netctl --boot
```
If `/etc/netctl/active` contains a profile name, that profile is applied during boot after the
base networking services have started.
## Validation notes
- `redbear-netctl` was type-checked and smoke-tested with a fake runtime root by exercising:
`list`, `enable`, `status`, and `start`.
- `rtl8168d` type-checks with the RTL8125 autoload configuration in place.
- relibc type-checks with the interface and header updates in place.
## Remaining hardware validation
This repo change set wires RTL8125 through the native path, but real hardware validation is still
required for full confidence in packet I/O on specific RTL8125 revisions.
+348
View File
@@ -0,0 +1,348 @@
# Qt6 Port — Red Bear OS
**Last updated:** 2026-04-14
**Qt version:** 6.11.0
**Target:** x86_64-unknown-redox (cross-compiled from Linux x86_64 host)
**Phase 1 status:** ✅ COMPLETE — Qt6 core stack + OpenGL/EGL + D-Bus + Wayland
**Phase 2 status:** ✅ COMPLETE — All 32 KF6 frameworks built
**Phase 3 status:** 🔄 IN PROGRESS — KWin + KDE Plasma build
## Current Status Summary
| Component | Status | Details |
|-----------|--------|---------|
| **qtbase** | ✅ | 13 libs incl. OpenGL, EGL, DBus, WaylandClient |
| **qtdeclarative** | ✅ | 11 libs, QML JIT disabled |
| **qtsvg** | ✅ | 2 libs |
| **qtwayland** | ✅ | Wayland client + compositor |
| **Mesa EGL+GBM** | ✅ | libEGL, libgbm, libGLESv2, swrast DRI |
| **libdrm** | ✅ | libdrm + libdrm_amdgpu |
| **libinput** | ✅ | 1.30.2 with comprehensive redox.patch |
| **D-Bus** | ✅ | 1.16.2, libdbus-1.so |
| **KF6 Frameworks** | ✅ 32/32 | All frameworks built |
| **KWin** | 🔄 | Recipe ready, now using real `libxcvt`, but still blocked by remaining shimmed/stubbed deps and incomplete runtime path |
| **Hardware acceleration** | ❌ | Requires kernel DMA-BUF (future work) |
---
## Scope Definition
**Phase 1 scope**: qtbase, qtdeclarative, qtsvg — the foundational Qt6 stack.
Qt6 consists of many modules — each is a separate source package. Phase 2 (qtwayland + KF6 Tier 1)
follows in the next step.
**User-agreed scope constraints:**
- OpenGL: software/shm only, no EGL — get Qt compiling first
- Disabled features: process, sharedmemory, systemsemaphore, testlib, sql, printsupport
- Iterative approach: enable modules incrementally, re-enable disabled features later
## Build Status
### qtbase — Enabled Modules (7 libraries built)
| Module | Library | Size | Description |
|--------|---------|------|-------------|
| QtCore | libQt6Core.so.6.11.0 | 13 MB | Core non-GUI: event loop, IO, threads, plugins |
| QtConcurrent | libQt6Concurrent.so.6.11.0 | 26 KB | High-level multi-threading without locks |
| QtXml | libQt6Xml.so.6.11.0 | 212 KB | XML stream reader/writer (SAX/DOM) |
| QtGui | libQt6Gui.so.6.11.0 | 12 MB | GUI infra: images, painting, text, input, windowing |
| QtWidgets | libQt6Widgets.so.6.11.0 | 9.4 MB | Widget toolkit: buttons, layouts, dialogs |
| QtWaylandClient | libQt6WaylandClient.so.6.11.0 | — | Wayland client integration |
| QtWlShellIntegration | libQt6WlShellIntegration.so.6.11.0 | — | Wayland Shell integration |
### qtbase — Plugins (12 plugin libraries)
| Plugin | File | Type |
|--------|------|------|
| redox | libqredox.so | QPA platform |
| offscreen | libqoffscreen.so | QPA platform |
| minimal | libqminimal.so | QPA platform |
| wayland-bsoft-integration | libqwayland-bsoft-integration.so | Wayland integration |
| gif | libqgif.so | Image format |
| ico | libqico.so | Image format |
| jpeg | libqjpeg.so | Image format |
| png | libqpng.so | Image format |
| svg | libqsvg.so | Image format |
| iconengines | libqsvgicon.so | Icon engine |
| text | libqtext.so | Text platform |
| xkb | libqxkb.so | XKB support |
### qtdeclarative — Built Successfully (build 15)
| Library | Description |
|---------|-------------|
| libQt6Qml.so.6.11.0 | QML core |
| libQt6QmlModels.so.6.11.0 | Models (ListModel, etc.) |
| libQt6Quick.so.6.11.0 | QtQuick UI framework |
| libQt6QmlCore.so.6.11.0 | QML internals |
| libQt6QmlCompiler.so.6.11.0 | QML JIT compiler |
| libQt6QmlWorkerScript.so.6.11.0 | Worker script runtime |
| libQt6QmlMeta.so.6.11.0 | QML meta-object |
| libQt6QmlXmlListModel.so.6.11.0 | XML ListModel |
| libQt6LabsFolderListModel.so.6.11.0 | Folder list model |
| libQt6LabsQmlModels.so.6.11.0 | Lab models |
| libQt6LabsSettings.so.6.11.0 | Settings |
| libQt6LabsSynchronizer.so.6.11.0 | Synchronizer |
Plus: QML debug plugins, QtQuick/QML modules staged.
**Note**: QML JIT (`QT_FEATURE_qml_jit`) does not compile for Redox — disabled.
### qtsvg — Built Successfully
| Component | File |
|-----------|------|
| libQt6Svg.so.6.11.0 | SVG rendering |
| libQt6SvgWidgets.so.6.11.0 | SVG widget integration |
| qsvg icon engine | libqsvgicon.so |
| qsvg image format | libqsvg.so |
### Disabled Modules — Full Blocker Analysis
| Module | Blocker | Root Cause | Re-enable Path |
|--------|---------|------------|----------------|
| QtNetwork | Runtime validation still pending | the relibc header/ioctl surface is now present in-tree, but downstream QtNetwork behavior still needs end-to-end validation on Redox | Validate QtNetwork against the updated relibc networking surface |
| QtOpenGL | No EGL, no GPU driver runtime validation | amdgpu/intel DRM drivers compile but haven't been validated on hardware; no Mesa EGL build | Validate GPU drivers on HW → build Mesa with EGL → enable QtOpenGL |
| QtOpenGLWidgets | Gated by `QT_FEATURE_opengl` | Same as QtOpenGL | Same as QtOpenGL |
| QtDBus | D-Bus IPC system not ported to Redox | No D-Bus daemon or libdbus on Redox | Port libdbus → enable QtDBus |
| QtSql | User-agreed scope exclusion | Not needed for initial GUI | Add sqlite/odbc recipe → enable QtSql |
| QtPrintSupport | User-agreed scope exclusion | No printing subsystem on Redox | Port cups/filters → enable QtPrintSupport |
### Disabled Features — Full Blocker Analysis
| Feature | CMake Flag | Blocker | Re-enable Path |
|---------|-----------|---------|----------------|
| OpenGL | `-DFEATURE_opengl=OFF` | No EGL, no GPU runtime validation | Validate GPU drivers → Mesa EGL → enable |
| EGL | `-DFEATURE_egl=OFF` | No libEGL from Mesa | Mesa EGL build → enable |
| XCB/Xlib | `-DFEATURE_xcb=OFF -DFEATURE_xlib=OFF` | No X11 on Redox | Not applicable — Redox uses Wayland |
| Vulkan | `-DFEATURE_vulkan=OFF` | No Vulkan runtime | Port Mesa Vulkan ICD → enable |
| OpenSSL | `-DFEATURE_openssl=OFF` | OpenSSL3 port in WIP but not validated | Validate openssl3 recipe → enable |
| D-Bus | `-DFEATURE_dbus=OFF` | No D-Bus on Redox | Port libdbus → enable |
| Process | `-DFEATURE_process=OFF` | relibc POSIX completeness for QProcess | Test QProcess on Redox → enable |
| Shared Memory | `-DFEATURE_sharedmemory=OFF` | `QSharedMemory` uses `shm_open()`/`shmget()` | Add `shm_open`/`shmget` to relibc |
| System Semaphore | `-DFEATURE_systemsemaphore=OFF` | `QSystemSemaphore` uses `sem_open()`/`semget()` | Add POSIX semaphores to relibc |
| qmake | `-DFEATURE_qmake=OFF` | Build tool, not needed with CMake | Enable if downstream needs qmake |
| SQL | `-DFEATURE_sql=OFF` | User-agreed scope exclusion | Add sqlite/odbc → enable |
| Print Support | `-DFEATURE_printsupport=OFF` | User-agreed scope exclusion | Port cups → enable |
| QML JIT | `-DFEATURE_qml_jit=OFF` | Does not compile for Redox | Fix in upstream or disable permanently |
---
## New Discoveries (Builds 817)
| # | Discovery | Fix |
|---|-----------|-----|
| 8 | qtwaylandscanner is a host tool, needs `FEATURE_qtwaylandscanner=ON` in both host and target builds | Enable feature in both cmake configs |
| 9 | wayland-scanner must be host binary — use `-DWaylandScanner_EXECUTABLE=/usr/bin/wayland-scanner` | Pass explicit path to host wayland-scanner |
| 10 | OpenGL guards needed in Wayland code (`#if QT_CONFIG(opengl)`) | Add guard in qtbase patch |
| 11 | `cmake --install` produces relocatable cmake files — replaced manual cmake copy | Use cmake install instead of manual sed |
| 12 | `QT_MKSPECS_DIR` must point to staged mkspecs — conditional in toolchain file | Add conditional logic in redox-toolchain.cmake |
| 13 | QtNetwork features leak into downstream — pass `QT_FEATURE_ssl=OFF` etc. | Explicitly disable in downstream cmake |
| 14 | SBOM generation fails — use `-DQT_GENERATE_SBOM=OFF` | Disable SBOM generation |
| 15 | Sysroot path mismatch — cookbook only symlinks bin/include/lib/share, need manual symlinks for plugins/mkspecs/metatypes/modules | Add manual symlinks in recipe |
| 16 | masm `CheckedArithmetic.h` missing `ArithmeticOperations<unsigned,long>` for LP64 | Add missing arithmetic operation to masm |
| 17 | QML JIT (`QT_FEATURE_qml_jit`) doesn't compile for Redox — disabled | Disable feature, works without JIT |
| 56 | **plasma-wayland-protocols** is a required separate package — kf6-kwayland needs PLASMA_WAYLAND_PROTOCOLS_DIR pointing to protocol XMLs | Created recipe that installs XML files + symlink for naming mismatch (org-kde-plasma-virtual-desktop.xml → plasma-virtual-desktop.xml) |
| 57 | **kf6-kcmutils** requires Qt6Quick unconditionally upstream | Strip Quick/QML/kcmshell from CMakeLists via Python-based source patching — produces libKF6KCMUtils.so + libKF6KCMUtilsCore.so (widget-only build) |
| 58 | **kf6-kwayland** fails with `get_filename_component called with incorrect number of arguments` when PLASMA_WAYLAND_PROTOCOLS_DIR is unset | Fix: create plasma-wayland-protocols package + point the cmake variable to the installed XMLs |
| 59 | **seatd** now builds as a standalone runtime package for Redox and is wired into the KDE runtime config; keep it out of KWin compile deps until DRM-lease/runtime validation exists | Runtime dependency only |
---
## Build Iteration History
| # | Issue | Fix |
|---|-------|-----|
| 1-7 | Patch format, byteswap.h, forwarding headers | Patch structure |
| 8 | qtwaylandscanner is host tool | `FEATURE_qtwaylandscanner=ON` in host+target |
| 9 | wayland-scanner must be host binary | `-DWaylandScanner_EXECUTABLE=/usr/bin/wayland-scanner` |
| 10 | OpenGL guards in Wayland code | `#if QT_CONFIG(opengl)` guard |
| 11 | cmake --install relocatable | Use cmake install over manual copy |
| 12 | QT_MKSPECS_DIR mismatch | Conditional in toolchain file |
| 13 | QtNetwork feature leak | Pass explicit QT_FEATURE_* flags |
| 14 | SBOM generation fails | `-DQT_GENERATE_SBOM=OFF` |
| 15 | Sysroot path mismatch (plugins/mkspecs/metatypes/modules) | Manual symlinks |
| 16 | masm CheckedArithmetic.h missing LP64 operation | Add ArithmeticOperations |
| 17 | QML JIT doesn't compile for Redox | Disable `QT_FEATURE_qml_jit` |
| **Phase 1** | **qtbase + qtdeclarative + qtsvg complete** | **✅ Core stack built** |
---
## relibc Gaps — Complete Inventory
### Resolved (workarounds in recipe/patch)
| Gap | Workaround | Location |
|-----|-----------|----------|
| `sys/statfs.h` missing | Wrapper → `sys/statvfs.h` (typedef, #define) | recipe.toml heredoc |
| `ELFMAG` string missing from `elf.h` | `#define ELFMAG "\177ELF"` prepended to source | recipe.toml printf |
| `resolv.h` availability | Minimal relibc header now exists in-tree | verify downstream consumers against the generated header |
| `unlinkat()`/`linkat()` missing | Inline stubs with `AT_FDCWD` | redox.patch |
| `byteswap.h` missing | Skip include on Redox | redox.patch (brg_endian.h) |
| Float16 soft-fp (`__truncsfhf2` etc.) | Custom IEEE 754 C implementation | redox.patch (qt_float16_shims.c) |
| Half-float comparison (`__eqhf2` etc.) | Custom IEEE 754 C implementation | redox.patch (same file) |
| `openat()` not available | `#ifdef Q_OS_REDOX` guard | redox.patch (qcore_unix_p.h) |
### Networking Surface — Now Present, Still Needs Runtime Validation
| Gap | Impact | relibc File to Modify |
|-----|--------|----------------------|
| `resolv.h` | Present in relibc | `recipes/core/relibc/source/src/header/resolv/` |
| `in6_pktinfo` / `ipv6_mreq` | Present in relibc | `recipes/core/relibc/source/src/header/netinet_in/mod.rs` |
| `SIOCGIF*` ioctls | Present for the current Redox `eth0` model | `recipes/core/relibc/source/src/header/sys_ioctl/redox/mod.rs` |
| `::ioctl` path | Present in relibc Redox ioctl implementation | `recipes/core/relibc/source/src/header/sys_ioctl/` |
| `ifreq` / `ifconf` / `ifaddrs` | Present for the current Redox `eth0` model | `recipes/core/relibc/source/src/header/net_if/mod.rs`, `recipes/core/relibc/source/src/header/ifaddrs/mod.rs` |
### Unresolved — Blocks Other Qt Modules/Features
| Gap | Impact | Module Blocked |
|-----|--------|---------------|
| D-Bus IPC | QtDBus, KDE components | QtDBus |
| GPU display validation | Hardware-accelerated rendering | QtOpenGL |
| `shm_open()` / `shmget()` | Shared memory | QSharedMemory |
| `sem_open()` / `semget()` | POSIX semaphores | QSystemSemaphore |
| `fork()`/`exec()` POSIX completeness | QProcess internals | QProcess |
| Fontconfig | Advanced font selection | QtGui (bundled FreeType works for basic) |
---
## Next Steps
### Phase 2a — qtbase D-Bus Enablement (✅ COMPLETE)
- qtbase rebuilt with `-DFEATURE_dbus=ON` in both host and target builds
- libQt6DBus.so + Qt6DBusConfig.cmake + Qt6DBus.pc staged to sysroot
- D-Bus 1.16.2 already built (24-line redox.patch for epoll + socketpair)
- Unblocks: kf6-kdbusaddons, kf6-kservice, kf6-kpackage, kf6-kglobalaccel
### Phase 2b — qtwayland Module (🔄 Building)
- Recipe at `recipes/wip/qt/qtwayland/recipe.toml`
- Uses redox-toolchain.cmake + host Qt build pattern
- Wayland compositor disabled, client-only build
- OpenGL guards applied for software rendering
### Phase 2c — Input Stack (✅ COMPLETE)
- linux-input-headers: ✅ Built — provides linux/input.h + linux/types.h + _CNT macros
- libevdev 1.13.2: ✅ Built — uinput stubs + input.h __redox__ guard
- libinput 1.30.2: ✅ Built — comprehensive redox.patch:
- SYS_pidfd_open meson guard (cc.has_header check)
- Non-udev shim (libudev stub for HAVE_UDEV=0)
- Vendored Linux input.h selection for __redox__
- strtod_l() fallback
- timerfd fallback (tracks expiry without timerfd fd)
- Linux-only tool binaries skipped on Redox
### Phase 3 — KF6 Frameworks (✅ ALL 32 BUILT)
All KF6 frameworks built and staged:
ecm, kcoreaddons, kwidgetsaddons, kconfig, ki18n, kcodecs, kguiaddons, kcolorscheme,
kauth, kwindowsystem, knotifications, kjobwidgets, kconfigwidgets, karchive, sonnet,
kcompletion, kitemviews, kitemmodels, solid, kdbusaddons, kservice, kpackage,
kcrash, ktextwidgets, kiconthemes, kglobalaccel, kdeclarative, kxmlgui, kbookmarks,
kidletime, kio, kcmutils
Additional KDE packages:
- kdecoration ✅ BUILT (KDecoration3 window decoration library)
- kirigami ✅ STUB ONLY (dependency-resolution package, not a real runtime-ready Kirigami build)
- kf6-kwayland ✅ BUILT
- kf6-kcmutils ✅ BUILT (widget-only, Quick/QML/kcmshell stripped)
- plasma-wayland-protocols ✅ BUILT (protocol XMLs for kf6-kwayland)
Graphics stack (PRIMARY DELIVERABLE):
- Mesa EGL+GBM ✅ BUILT (libEGL.so, libgbm.so, libGLESv2.so, swrast_dri.so)
- libdrm amdgpu ✅ BUILT (libdrm_amdgpu.so, /scheme/drm/ paths)
- Qt6 OpenGL ✅ BUILT (libQt6OpenGL.so, libQt6EglFSDeviceIntegration.so, GLES 2.0)
- D-Bus ✅ BUILT (libdbus-1.so.3.38.3, dbus-daemon)
- libinput ✅ BUILT (libinput.so.10.13.0, comprehensive redox.patch)
- libevdev ✅ BUILT (libevdev.so.2.3.0, uinput stubs)
KWin recipe updated with 40 dependencies (all KF6 + Mesa + libdrm + libinput + qtwayland).
plasma-workspace, plasma-desktop recipes created.
### Phase 4 — Graphics Stack (✅ COMPLETE)
Mesa EGL+GBM+GLES2 built:
- libEGL.so (225KB) — platforms: redox, surfaceless, drm
- libgbm.so (68KB) — Generic Buffer Manager for compositor buffer allocation
- libGLESv2.so — OpenGL ES 2.0 (software via LLVMpipe)
- libGLESv1_CM.so — OpenGL ES 1.1
- swrast_dri.so + kms_swrast_dri.so — LLVMpipe software DRI drivers
- pkgconfig: egl.pc, gbm.pc, osmesa.pc, glesv2.pc, dri.pc
libdrm amdgpu enabled:
- libdrm_amdgpu.so (48KB) — AMD GPU DRM API
- Device paths: /scheme/drm/cardN, /scheme/drm/renderD
Qt6 OpenGL enabled:
- libQt6OpenGL.so (716KB) — Qt OpenGL module (GLES 2.0 path)
- libQt6OpenGLWidgets.so — Qt OpenGL widgets
- libQt6EglFSDeviceIntegration.so — EGLFS platform integration
- EGLFS KMS plugin for direct DRM/KMS rendering
### Phase 4b — Qt6 OpenGL Enablement (✅ COMPLETE)
qtbase rebuilt with `-DFEATURE_opengl=ON -DINPUT_opengl=es2 -DFEATURE_egl=ON`
Qt cmake summary: EGL=yes, OpenGL=yes, "OpenGL ES 2.0=yes, EGLFS GBM=yes"
### Phase 5 — KDE Plasma (🔄 IN PROGRESS)
KDE Plasma packages built:
- kf6-kwayland ✅ BUILT
- kf6-kcmutils ✅ BUILT (widget-only, Quick/QML/kcmshell stripped)
- kirigami ✅ STUB ONLY (dependency-resolution package, not a real runtime-ready Kirigami build)
- plasma-wayland-protocols ✅ BUILT (protocol XMLs for kf6-kwayland)
- kdecoration ✅ BUILT (KDecoration3 window decoration library)
KWin recipe updated with dependencies (all KF6 + Mesa + libdrm + libinput + qtwayland):
- All KF6 deps built (kconfigwidgets, kxmlgui, kglobalaccel, kidletime, kio, etc.)
- Mesa EGL+GBM ✅
- libinput ✅
- libdrm ✅
- kf6-kwayland ✅
- seatd builds separately (runtime dependency, not needed for compilation)
### Phase 6 — KWin (🔄 BUILDING)
## Dependency Graph
```
Phase 1 ✅ (qtbase + qtdeclarative + qtsvg)
└── Phase 2a ✅ (D-Bus daemon + qtbase D-Bus enablement)
└── Phase 2b ✅ (qtwayland built)
└── Phase 2c ✅ (libevdev + libinput built)
└── Phase 3 ✅ (KF6 — ALL 32 frameworks built)
└── Phase 4 ✅ (Mesa EGL+GBM+GLES2, Qt6 OpenGL+EGL, libdrm amdgpu)
└── Phase 5 🔄 (kdecoration ✅, kf6-kwayland ✅, kirigami stub-only, KWin still blocked on shimmed/scaffolded deps)
```
---
## Known Issues
1. **QML JIT disabled**`QT_FEATURE_qml_jit` does not compile for Redox. QML still works
via the interpreter path, just without JIT acceleration. Non-blocking for basic QML apps.
2. **QtNetwork disabled** — DNS resolver and IPv6 multicast gaps in relibc. HTTP/WebSocket
unavailable until relibc networking is completed. QML network access also affected.
3. **No GPU hardware acceleration** — Qt6 OpenGL/EGL and Mesa EGL+GBM now build, but they are still validated only on the software/LLVMpipe path.
True hardware acceleration (radeonsi or equivalent) still requires kernel DMA-BUF fd passing and real hardware validation.
4. **relibc / graphics surface still incomplete for runtime** — the build-side `open_memstream` and Wayland-facing header export path now work,
but DMA-BUF ioctls, sync objects, and broader graphics runtime validation are still unavailable.
5. **KDE Plasma does NOT compile or run end-to-end** — KWin, plasma-workspace, plasma-desktop recipes exist,
but are still blocked on shimmed/stubbed dependencies, runtime integration, and compositor validation.
## Honest Status Assessment
The Qt6/KF6 build stack is substantially further along than the earlier "~50%" estimate implied:
- Qt6, QtWayland, Mesa EGL+GBM, Qt6 OpenGL, libdrm amdgpu, and all 32 KF6 frameworks now build
- the remaining blockers are concentrated in KWin/Plasma runtime integration and in the still-shimmed or stub-only packages such as Kirigami, libepoxy, libudev, lcms2, and libdisplay-info
- hardware acceleration still requires kernel DMA-BUF work and real hardware validation
- a successful build stack is not yet the same thing as a working KDE Plasma session
(Updated 2026-04-14 — status reconciled after relibc/libwayland bridge fixes; build-side progress is real, runtime remains incomplete)
+64
View File
@@ -0,0 +1,64 @@
# redbear-info Runtime Report
`redbear-info` is the canonical Red Bear OS runtime integration and debugging command.
## Purpose
The tool is intentionally passive. It reports what the running system can actually prove through
read-only runtime surfaces instead of flattening everything into a single “available” bit.
It is meant to answer:
- what Red Bear integrations are installed,
- what services or schemes are actually active,
- what integrations passed a safe read-only runtime probe,
- whether networking is configured, including IP, DNS, and default route,
- whether key hardware discovery surfaces (PCI, USB, DRM, RTL8125) are visible.
## Output model
Each integration is reported with one of these layered states:
- `absent` — no artifact or runtime surface was observed
- `present` — an artifact or config exists, but there is no live runtime proof yet
- `active` — a live runtime surface exists, but the probe cannot honestly claim full working order
- `functional` — a safe read-only runtime probe succeeded
- `unobservable` — no honest runtime proof exists for a deeper claim
This distinction matters because some Red Bear integrations compile or package cleanly before they
are hardware-validated at runtime.
## Current sections
`redbear-info` reports:
- **Identity** — OS name, version, hostname
- **Networking** — stack state, connected flag, interface, MAC, IP/CIDR, DNS, default route,
active `netctl` profile, visible `network.*` schemes
- **Hardware** — PCI device count, USB controller count, DRM card count, RTL8125 PCI visibility
- **Integrations** — tools, daemons, and integration paths such as `lspci`, `lsusb`, `netctl`,
`pcid-spawner`, `smolnetd`, `firmware-loader`, `udev-shim`, `evdevd`, `redox-drm`, and the
native RTL8125 path
## Commands
- `redbear-info` — human-readable report
- `redbear-info --verbose` — includes evidence and claim limits
- `redbear-info --json` — structured machine-readable output
- `redbear-info --test` — suggested follow-up diagnostic commands
## Maintenance rule
Whenever Red Bear adds or materially changes an integration, update `redbear-info` in the same
change set.
That includes new:
- user-facing tools
- scheme daemons
- services
- hardware integration paths
- configuration layers that users rely on to debug a running image
The goal is for `redbear-info` to remain the first command users run when they need to understand
the state of a Red Bear system.