Semver pre-release suffix (-rb0.2.5) breaks Cargo's [patch.crates-io]
matching for transitive deps. Build metadata (+rb0.2.5) is semver-
compatible: ^0.9.0 matches 0.9.0+rb0.2.5, patch redirection works,
and the Red Bear suffix is still visible in the version string.
Per local/AGENTS.md \xC2\xA7 "Category 2 - Local forks of upstream packages",
all Cat 2 forks must use the `<upstream-tag>-rb<N>` version convention. The
`-rb1` suffix is a Cargo pre-release identifier that prevents upstream
`<upstream-tag>` from silently substituting for this fork in transitive
dependency resolution.
- The base tag (e.g. 0.9.0 for redox_syscall) tracks upstream
unchanged.
- The `rb1` part records that one Red Bear patch round has been
applied on top of the upstream tag.
This is the initial policy enforcement pass. The branch is
considered unfrozen at this point; once a freeze is declared, future
`-rbN` increments will land on a frozen `0.X.Y` branch per
local/AGENTS.md.
Phase J: the kernel needs two Cargo patch overrides so
that the typed-AcPiVerb path (EnterS2Idle / ExitS2Idle)
is usable. Without these:
* the kernel's redox_syscall dep is fetched from
gitlab.redox-os.org (upstream), so the local fork at
local/sources/syscall (with the new AcPiVerb variants)
is not visible to the kernel's build.
* the libredox dep is fetched from crates.io, so the
local fork at local/sources/libredox (which uses the
local syscall fork) is not visible. This means
libredox::error::Error and syscall::Error are
different compile-time types and the E0277 errors in
scheme-utils and daemon return.
The fix: a single [patch.crates-io] section overriding
libredox (which is from crates.io) and a [patch.'<URL>']
section overriding redox_syscall (which is from a git URL).
[patch.crates-io] only matches crates.io deps; [patch.'<URL>']
matches the dep's source URL.
Also: declare members = ['.', 'rmm'] in the [workspace]
section. Without this, cargo doesn't recognize the kernel
as a workspace and the [patch] sections are silently
ignored (workspace_metadata is None). The members list
includes the kernel's own directory and the rmm path
dep.
The kernel needs the same libredox override as base: the
local libredox fork at ../libredox uses the local syscall
fork at ../syscall, so the kernel's libredox::error::Error
type is now the same compile-time type as syscall::Error.
The [patch.crates-io] libredox override in the kernel
workspace is what wires this through.
This is the kernel-side mirror of the base commit
aadf55b ('base: Phase J [patch.crates-io] libredox +
kstop_enter_s2idle helper').
Phase A of the ACPI fork-sync plan (local/docs/ACPI-FORK-SYNC-STRATEGY-2026-06-30.md).
Restores the kernel to the upstream Redox OS kernel main branch state for
the ACPI subsystem:
- Cargo.toml: switch redox_syscall from 0.7.4 (two versions behind) to a
git ref of gitlab.redox-os.org/redox-os/syscall.git, matching the
upstream master dependency. The crates.io 0.8.1 release predates the
AcpiVerb enum that MR #613 / MR #275 introduced, so a crates.io pin
is insufficient.
- src/acpi/rsdp.rs: full rewrite to match upstream f49c7d99 (RSDP
validation + NonNull + fail-softly):
* signature check "RSD PTR "
* 20-byte base checksum
* full-length checksum for revision >= 2
* NonNull<u8> instead of *const u8
Fixes gap #1 from the 2026-06-30 ACPI assessment: the kernel was
accepting any pointer from the bootloader without validation.
- src/startup/mod.rs: acpi_rsdp() returns Option<NonNull<u8>> to match
the new Rsdp::get_rsdp signature.
- src/acpi/mod.rs: init() takes Option<NonNull<u8>>.
- src/scheme/acpi.rs: full rewrite to upstream MR #613 (Simplify acpi
scheme). Drops the /scheme/kernel.acpi/ filesystem surface in favor
of a single Fd::open + call() interface with AcpiVerb verbs:
* AcpiVerb::ReadRxsdt - returns the raw RXSDT bytes
* AcpiVerb::CheckShutdown - returns whether shutdown is pending
Uses HandleBits bitflags, atomic EXISTS_KSTOP_HANDLE, Mutex<L4> from
crate::sync::ordered. Replaces /scheme/kernel.acpi/rxsdt and
/scheme/kernel.acpi/kstop files.
- src/scheme/mod.rs: KernelScheme::kcall signature updated to take
fds: &[usize] instead of id: usize (matches upstream). kfpath now
has a default body returning EOPNOTSUPP (matches upstream).
- src/scheme/memory.rs, proc.rs, user.rs: kcall impls updated to
match new trait signature, using fds.first() to extract the single
handle for backward compat.
- src/scheme/proc.rs: kcall dispatch adds _ => Err(EINVAL) catch-all
for the new ProcSchemeVerb variants (RegsInt, RegsFloat, RegsEnv,
SchedAffinity, Start) that the gitlab syscall crate adds. These
verbs are not yet implemented in the proc scheme; the catch-all
returns EINVAL cleanly instead of failing to compile.
- src/syscall/fs.rs: SYS_CALL dispatcher now passes &[number] to
scheme.kcall() to match the new trait signature.
- Makefile: removed -Z json-target-spec flag (promoted to stable in
nightly 2026-04-01; the flag is unknown in our pinned toolchain).
Verified by `make` in local/sources/kernel/ with PATH including the
prefix cross-toolchain: kernel builds and links successfully.