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:
@@ -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 |
|
||||
|
||||
@@ -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
@@ -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.
|
||||
@@ -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 8–17)
|
||||
|
||||
| # | 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)
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user