From 30e36e53ec645f6c837d588ee02a1f82a1e4195c Mon Sep 17 00:00:00 2001 From: Vasilito Date: Mon, 4 May 2026 15:29:00 +0100 Subject: [PATCH] feat: kirigami builds (QML gate cleared) - QNetworkReply stub header for Redox cross-build - GuiPrivate + Network in find_package - QElapsedTimer include fix - networkAccessManager null stub in icon.cpp - Primitives target links Qt6::Network for headers --- .../CPU-DMA-IRQ-MSI-SCHEDULER-FIX-PLAN.md | 154 ++++++++++++++++++ local/recipes/kde/kirigami/recipe.toml | 5 +- .../kde/kirigami/source/CMakeLists.txt | 2 +- .../source/src/layouts/toolbarlayout.cpp | 9 + .../source/src/primitives/CMakeLists.txt | 2 +- .../kirigami/source/src/primitives/icon.cpp | 2 +- .../source/stubs/QtNetwork/QNetworkReply | 26 +++ 7 files changed, 196 insertions(+), 4 deletions(-) create mode 100644 local/docs/CPU-DMA-IRQ-MSI-SCHEDULER-FIX-PLAN.md create mode 100644 local/recipes/kde/kirigami/source/stubs/QtNetwork/QNetworkReply diff --git a/local/docs/CPU-DMA-IRQ-MSI-SCHEDULER-FIX-PLAN.md b/local/docs/CPU-DMA-IRQ-MSI-SCHEDULER-FIX-PLAN.md new file mode 100644 index 00000000..b433aae9 --- /dev/null +++ b/local/docs/CPU-DMA-IRQ-MSI-SCHEDULER-FIX-PLAN.md @@ -0,0 +1,154 @@ +# Red Bear OS — CPU/DMA/IRQ/MSI/Scheduler Fix Plan + +**Date**: 2026-05-04 +**Status**: Proposed +**Source of truth**: Linux kernel 7.0 (local/reference/linux-7.0/) + +## 1. Problem Statement + +Five critical integration gaps in the microkernel architecture: + +| Gap | Severity | Impact | +|-----|----------|--------| +| MSI absent from kernel | CRITICAL | All NVMe/GPU/NIC on legacy INTx | +| DMA/IOMMU not integrated | CRITICAL | DMA buffers unprotected | +| PIT tick (148Hz) vs LAPIC (1000Hz) | HIGH | Scheduler 6x slower than Linux | +| Global scheduler lock | HIGH | Serializes all context switches | +| Thread creation (3 IPC hops) | HIGH | 3x slower than Linux clone() | + +## 2. Phase 1: MSI/MSI-X in Kernel (Week 1-3) + +### T1.1: MSI Capability Parsing +- File: kernel arch/x86_shared/device/msi.rs (new) +- Linux ref: arch/x86/kernel/apic/msi.c (391 lines) +- Parse MSI/MSI-X capability structures from PCI config +- Extract: Message Address, Message Data, Mask Bits, Pending Bits +- Support per-vector masking via MSI-X Table + +### T1.2: MSI Message Composition +- Linux ref: __irq_msi_compose_msg() +- Compose APIC destination + vector into address/data pair +- Handle: dest mode (phys/logical), redirection hint +- Support: interrupt remapping (DMAR) for IOMMU + +### T1.3: Vector Allocation Matrix +- File: kernel arch/x86_shared/device/vector.rs (new) +- Linux ref: arch/x86/kernel/apic/vector.c (1387 lines) +- Dynamic per-CPU vector allocation (replace static irq+32) +- Track: allocated/free per CPU, reserved system vectors +- Vector migration on CPU hotplug + +### T1.4: MSI IRQ Domain +- Modify: kernel scheme/irq.rs +- Register MSI IRQs via new scheme operations +- Dispatch through existing interrupt handler path +- Wire LAPIC timer to scheduler tick (partially done) + +### T1.5: Userspace MSI Consumer +- File: redox-driver-sys source/src/irq.rs +- Expose MSI allocation/enable to driver daemons +- Quirk-aware fallback: FORCE_LEGACY, NO_MSI, NO_MSIX + +## 3. Phase 2: DMA/IOMMU Integration (Week 3-5) + +### T2.1: Coherent DMA API +- File: kernel memory/dma.rs (new) +- Linux ref: kernel/dma/mapping.c (1016 lines) +- dma_alloc_coherent(size, phys) -> vaddr +- dma_free_coherent(vaddr, size, phys) + +### T2.2: Streaming DMA API +- dma_map_single(cpu_addr, size, dir) -> dma_addr_t +- dma_unmap_single(dma_addr, size, dir) +- Cache coherence per architecture + +### T2.3: Scatter-Gather DMA +- Linux ref: lib/scatterlist.c +- dma_map_sg / dma_unmap_sg +- Discontiguous physical pages + +### T2.4: IOMMU DMA Remapping +- File: iommu daemon dma_remap.rs (new) +- Wire dma_map_* through IOMMU page tables +- IOVA allocation, page table programming, TLB invalidation +- Integrate with existing 4411-line iommu daemon + +### T2.5: SWIOTLB Fallback +- Linux ref: kernel/dma/swiotlb.c +- Bounce buffer for <4GB devices +- DMA_TO_DEVICE / DMA_FROM_DEVICE copy + +## 4. Phase 3: Scheduler Improvements (Week 4-6) + +### T3.1: LAPIC Timer as Primary Tick +- Calibrate LAPIC timer against PIT (one-time) +- Set Periodic mode at 1000Hz (1ms tick) +- PIT fallback if LAPIC fails +- Already partially done: timer enabled, IDT entry added + +### T3.2: Per-CPU Scheduler Locks +- Replace global CONTEXT_SWITCH_LOCK with per-CPU spinlock +- Lock-free runqueue manipulation +- Cross-CPU lock only during load balancing + +### T3.3: Load Balancing +- Linux ref: kernel/sched/fair.c load_balance() +- Idle CPUs steal work from overloaded CPUs +- Per-CPU load average, nr_running +- IPI-based context pull + +### T3.4: RT Scheduling Class +- Linux ref: kernel/sched/rt.c +- FIFO and Round-Robin classes +- Priority inheritance +- RT throttling: 95% CPU cap/sec + +### T3.5: TSC-Deadline Timer +- Use IA32_TSC_DEADLINE MSR for precise tick +- True tickless operation +- TSC calibration via HPET or PIT + +## 5. Phase 4: Thread Creation (Week 6-7) + +### T4.1: Batched Thread Creation +- Batch new-thread requests (reduce IPC) +- Pre-allocate stack pages during fork + +### T4.2: Kernel Thread Pool +- Pre-create idle kernel threads +- Reuse via object pool + +### T4.3: Shared Memory IPC +- Use shm for proc scheme bulk ops +- Avoid data copy through IPC channel + +## 6. Dependencies + +Phase 1 (MSI): T1.1 -> T1.2 -> T1.3 -> T1.4 -> T1.5 +Phase 2 (DMA): T2.1 -> T2.2 -> T2.3 -> T2.4 -> T2.5 +Phase 3 (Sched): T3.1 -> T3.5 -> T3.2 -> T3.3 -> T3.4 +Phase 4 (Thread): T4.1 -> T4.2 -> T4.3 + +Phase 1+2 independent (parallel). Phase 2.4 needs Phase 1.3. +Phase 3.1 partially done (start immediately). + +## 7. Timeline + +| Phase | Duration | Cumulative | +|-------|----------|------------| +| Phase 1 (MSI) | 3 weeks | Week 3 | +| Phase 2 (DMA/IOMMU) | 3 weeks | Week 5 | +| Phase 3 (Scheduler) | 3 weeks | Week 7 | +| Phase 4 (Threads) | 2 weeks | Week 7 | + +Total: 7 weeks (2 devs parallel Phase 1+2) + +## 8. Success Metrics + +| Metric | Before | After | +|--------|--------|-------| +| Scheduler tick | 148Hz (PIT) | 1000Hz (LAPIC) | +| NVMe throughput | INTx shared | MSI-X 4+ queues | +| Context switch | ~6.75ms | ~1ms | +| Thread create | 3 IPC hops | 2 IPC hops | +| DMA safety | Unprotected | IOMMU-mapped | diff --git a/local/recipes/kde/kirigami/recipe.toml b/local/recipes/kde/kirigami/recipe.toml index 0b8cf11b..7d665f31 100644 --- a/local/recipes/kde/kirigami/recipe.toml +++ b/local/recipes/kde/kirigami/recipe.toml @@ -79,12 +79,15 @@ sed -i 's/COMPONENTS Core Quick Gui Svg QuickControls2 Concurrent ShaderTools/CO # Fix missing QElapsedTimer include in toolbarlayout.cpp sed -i '/#include /a #include ' "${COOKBOOK_SOURCE}/src/layouts/toolbarlayout.cpp" +# Add Qt6::Network to KirigamiPrimitives link libraries for QNetworkReply headers +sed -i 's|target_link_libraries(KirigamiPrimitives PRIVATE Qt6::Quick KirigamiPlatform)|target_link_libraries(KirigamiPrimitives PRIVATE Qt6::Quick Qt6::Network KirigamiPlatform)|' "${COOKBOOK_SOURCE}/src/primitives/CMakeLists.txt" + cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ -DQT_HOST_PATH="${HOST_BUILD}" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_CXX_FLAGS="-include ${COOKBOOK_BUILD}/qml_off_noop.h -include ${COOKBOOK_BUILD}/redbear_network_stub.h -I${COOKBOOK_SYSROOT}/usr/include/QtQml -I${COOKBOOK_SYSROOT}/usr/include/QtQuick" \ + -DCMAKE_CXX_FLAGS="-DQT_NO_NETWORK -include ${COOKBOOK_BUILD}/qml_off_noop.h -I${COOKBOOK_SOURCE}/stubs/QtNetwork -I${COOKBOOK_SYSROOT}/usr/include/QtQml -I${COOKBOOK_SYSROOT}/usr/include/QtQuick" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}:${COOKBOOK_STAGE}/usr/lib/cmake" \ -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES="${COOKBOOK_BUILD}/shader_noop.cmake" \ -DBUILD_TESTING=OFF \ diff --git a/local/recipes/kde/kirigami/source/CMakeLists.txt b/local/recipes/kde/kirigami/source/CMakeLists.txt index 61162869..475db476 100644 --- a/local/recipes/kde/kirigami/source/CMakeLists.txt +++ b/local/recipes/kde/kirigami/source/CMakeLists.txt @@ -31,7 +31,7 @@ endif() include(FeatureSummary) include(KDEInstallDirs) -find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Core Quick Gui GuiPrivate Svg QuickControls2 Concurrent ShaderTools) +find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Core Quick Gui GuiPrivate Network Svg QuickControls2 Concurrent ShaderTools) if (BUILD_TESTING) find_package(Qt6QuickTest ${REQUIRED_QT_VERSION} CONFIG QUIET) endif() diff --git a/local/recipes/kde/kirigami/source/src/layouts/toolbarlayout.cpp b/local/recipes/kde/kirigami/source/src/layouts/toolbarlayout.cpp index 910650c3..76d034a4 100644 --- a/local/recipes/kde/kirigami/source/src/layouts/toolbarlayout.cpp +++ b/local/recipes/kde/kirigami/source/src/layouts/toolbarlayout.cpp @@ -22,6 +22,15 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include diff --git a/local/recipes/kde/kirigami/source/src/primitives/CMakeLists.txt b/local/recipes/kde/kirigami/source/src/primitives/CMakeLists.txt index 96e8afd8..0b2b9a8c 100644 --- a/local/recipes/kde/kirigami/source/src/primitives/CMakeLists.txt +++ b/local/recipes/kde/kirigami/source/src/primitives/CMakeLists.txt @@ -46,7 +46,7 @@ set_target_properties(KirigamiPrimitives PROPERTIES target_include_directories(KirigamiPrimitives PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) -target_link_libraries(KirigamiPrimitives PRIVATE Qt6::Quick KirigamiPlatform) +target_link_libraries(KirigamiPrimitives PRIVATE Qt6::Quick Qt6::Network KirigamiPlatform) if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") set(_extra_options DEBUGINFO) diff --git a/local/recipes/kde/kirigami/source/src/primitives/icon.cpp b/local/recipes/kde/kirigami/source/src/primitives/icon.cpp index b6537efb..d9a24778 100644 --- a/local/recipes/kde/kirigami/source/src/primitives/icon.cpp +++ b/local/recipes/kde/kirigami/source/src/primitives/icon.cpp @@ -513,7 +513,7 @@ QImage Icon::findIcon(const QSize &size) const auto url = m_source.toUrl(); QQmlEngine *engine = qmlEngine(this); QNetworkAccessManager *qnam; - if (engine && (qnam = engine->networkAccessManager()) && (!m_networkReply || m_networkReply->url() != url)) { + if (engine && (qnam = nullptr /* Redox: networkAccessManager not available */) && (!m_networkReply || m_networkReply->url() != url)) { QNetworkRequest request(url); request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); m_networkReply = qnam->get(request); diff --git a/local/recipes/kde/kirigami/source/stubs/QtNetwork/QNetworkReply b/local/recipes/kde/kirigami/source/stubs/QtNetwork/QNetworkReply new file mode 100644 index 00000000..8973add8 --- /dev/null +++ b/local/recipes/kde/kirigami/source/stubs/QtNetwork/QNetworkReply @@ -0,0 +1,26 @@ +#ifndef REDBEAR_QNETWORKREPLY_H +#define REDBEAR_QNETWORKREPLY_H +#include +#include +class QNetworkRequest { +public: + enum Attribute { CacheLoadControlAttribute }; + enum CacheLoadControl { PreferCache }; + explicit QNetworkRequest(const QUrl&) {} + void setAttribute(Attribute, CacheLoadControl) {} +}; +class QNetworkAccessManager { +public: + class QNetworkReply; + QNetworkReply* get(const QNetworkRequest&) { return nullptr; } +}; +class QNetworkReply : public QObject { + Q_OBJECT +public: + enum NetworkError { NoError = 0 }; + QUrl url() const { return QUrl(); } + NetworkError error() const { return NoError; } + void close() {} + void abort() {} +}; +#endif