Documents the project-wide rule that Red Bear OS local forks are the
complete, authoritative source of truth for every component they cover.
Key points:
- A fork that delegates to upstream/crates.io is not a fork — it's a wrapper.
- Missing fork functionality is implemented in the fork, not papered over.
- Path deps + [patch.crates-io] everywhere; no version strings for forks.
- Adapt to upstream at the same pace — never pin back.
Adds a cross-reference from local/AGENTS.md DESIGN PRINCIPLE section.
Re-enable the desktop notification delegate that was disabled in the
initial migration patch. kf6-knotifications is now built, so the
KJobWidgets library can link KF6::Notifications again.
- Remove duplicated Qt6GuiPrivate find_package lines from CMakeLists.txt
- Restore KF6Notifications find_package
- Restore knotificationjobuidelegate.cpp/h in src/CMakeLists.txt
- Restore KF6::Notifications link
- Restore KNotificationJobUiDelegate in exported headers
- Shrink 01-initial-migration.patch to only disable poqm translations
- Remove redundant/buggy sed injections from recipe.toml
The recipe.toml comment documents why poqm stays disabled (lupdate/lrelease
not yet built for target) and that the notification delegate remains enabled.
vmalloc now allocates with PROT_NONE guard pages on each side,
matching Linux kernel vmalloc behavior. Buffers overflow into a
guard page and segfault instead of silently corrupting adjacent
heap allocations.
Replaces posix_memalign fallback with proper physically-contiguous
allocation via scheme:memory/scheme-root + zeroed@wb?phys_contiguous.
Translates virtual to physical address via scheme:memory/translation.
Falls back to heap allocation if scheme:memory is unavailable.
Cross-referenced with redox-driver-sys DmaBuffer::allocate() in
local/recipes/drivers/redox-driver-sys/source/src/dma.rs.
Workqueue (redox_stubs.c + redox_glue.h):
- schedule_work: queues work for async execution by background worker thread
- schedule_delayed_work: spawns timer thread, delays before queueing
- cancel_work_sync: removes pending or waits for executing work
- cancel_delayed_work_sync: cancels timer then cancels work
- flush_workqueue/flush_scheduled_work: waits for queue to drain
Completion timeout:
- wait_for_completion_timeout uses pthread_cond_timedwait with deadline
instead of ignoring timeout and blocking indefinitely
DMA mapping:
- dma_map_page returns page address+offset instead of bogus 0
Kconfig:
- IS_ENABLED/IS_REACHABLE return actual config value instead of always 0
Cross-referenced with Linux 7.1 kernel/workqueue.c and
include/uapi/linux/kernel.h.
Replaced 42 fragile per-recipe sed hacks (commenting out
ecm_install_po_files_as_qm and ki18n_install(po) in CMakeLists.txt)
with a single clean cmake flag: -DKF_SKIP_PO_PROCESSING=ON.
Both ECMPoQmTools.cmake and KF6I18nMacros.cmake.in natively check
KF_SKIP_PO_PROCESSING and return early before reaching
find_package(Qt6 COMPONENTS LinguistTools CONFIG REQUIRED).
This eliminates the need for Qt6LinguistTools (lupdate/lrelease)
at build time. When qttools is eventually built and Qt6LinguistTools
becomes available, simply remove the flag to re-enable translations.
Updates relibc submodule pointer to include:
- sys/ioccom.h, byteswap.h, sys/statfs.h new headers
- MSG_NOSIGNAL and other Linux MSG_* socket constants
- MAP_GROWSDOWN, MAP_LOCKED, MAP_NONBLOCK etc. mman constants
- ELFMAG/SELFMAG defines in generated elf.h
Gnulib generates lib/sched.h which wraps the system sched.h via
#include_next, but the #if @HAVE_SCHED_H@ guard evaluates to 0 during
cross-compilation, preventing sched_param typedef from being visible.
Adding ac_cv_header_sched_h=yes fixes the guard.
fstools.mk: Use canonical local/sources/ paths for installer and redoxfs
cargo install --path. The recipes/ symlink chain caused cargo to resolve
path dependencies (../libredox, ../redoxfs, ../syscall) relative to the
recipe directory instead of the canonical source location, breaking
the host build.
bison: Add cross-compilation cache variables for POSIX spawn support.
Gnulib's configure couldn't detect the system spawn.h during cross-compile,
causing generated lib/spawn.h to omit #include_next, leaving
POSIX_SPAWN_* constants undefined.
Replace ad-hoc struct literals scattered across the source with
named constructor methods (CacheMetadata::placeholder, CacheMetadata::from_source,
FirmwareFallback::load_defaults, FirmwareFallback::load_from_dir,
FirmwareFallback::builtins). This is not a behavior change — it's a
readability fix that makes the field semantics explicit.
Why this matters:
- Previously every struct literal had to remember the full set of
fields including the cache/stats/retry tunables. Adding a new field
required finding every literal in the source tree.
- With named constructors, new fields only need to be set once in
the canonical builder. Test/placeholder sites stay minimal.
- Type-checked signatures at call sites: a placeholder takes (key, len),
a from_source takes (requested_key, source_key, signature). The
compiler now verifies you pass a SourceSignature when you need one.
Cross-referenced with Linux drivers/base/firmware_loader.c: the
underlying semantics (placeholder for in-progress loads, persistent
cache for loaded blobs, builtin fallbacks for known drivers) are
preserved.
Previously: host_redox_stubs returned ENOSYS for all syscalls except
close/munmap/get_euid/ruid/egid/rgid — silent failures when IOMMU
code was tested on the host.
Now (host only):
- open/read/write/close → real libc file I/O
- mmap → real libc memory allocation (MAP_ANON|MAP_PRIVATE)
- munmap → real libc munmap
- clock_gettime → real libc CLOCK_REALTIME
- fstat → real libc fstat
- fsync/fdatasync/ftruncate → real libc ops
- getpid/getuid/geteuid/getgid/getegid → real libc
- strerror → real libc strerror (not hardcoded message)
- 12 remaining unsupported ops: ENOSYS with same semantics
(dup, signals, waitpid, namespaces — not needed for IOMMU tests)
Three previously-stubbed xdg_positioner opcodes are now real
implementations:
- SET_REACTIVE: stores a bool in PositionerState.reactive. Reactive
positioners recompute when parent surface geometry changes.
Cross-referenced with wlroots xdg-positioner.c.
- SET_PARENT_SIZE: stores the (w, h) parent rectangle in
PositionerState.parent_size. Used when no parent_configure
is set.
- SET_PARENT_CONFIGURE: stores the u32 serial in
PositionerState.parent_configure. This ties the positioner
to a specific parent xdg_surface.configure event.
The PositionerState struct gained three new fields:
reactive: Option<bool>
parent_size: Option<(i32, i32)>
parent_configure: Option<u32>
The old catch-all sed pattern that discarded all three opcodes as
a single empty match arm has been replaced with three explicit
arms. Each arm validates payload length before reading.
_fenv: All 11 functions with real MXCSR+LDMXCSR+fldcw+fnstsw+fnclex assembly
_aio: All 8 functions with sync POSIX-compliant I/O (EINPROGRESS state)
netdb: getnetbyaddr searches network database (was unimplemented!)
All zero unimplemented!() in header files
The Rust-side implementation of Linux's idr_for_each_entry macro. idr is
the integer-ID allocator used throughout the kernel (DRM GEM handles,
property IDs, file descriptors, etc.). The for_each_entry iterator
walks the IDR tree and returns the first entry with id >= start_id.
Previously the kernel API was stubbed at the C level. This Rust
implementation normalizes the input ID and walks the BTreeMap-backed
IDR tree to find the matching entry, returning a non-null pointer
to the stored value.
Cross-referenced with Linux lib/idr.c: idr_for_each_entry().