docs: comprehensive update to upstream-sync known issues

Document all kernel compile errors and fixes from V151-V156:
- Feature gates (asm_cfg, if_let_guard)
- Unsafe blocks (Rust 2024 edition)
- Removed Red Bear APIs (SchedPolicy, RUN_QUEUE_COUNT, etc.)
- CONTEXT_SWITCH_LOCK missing
- new_addrsp_guard field missing
- switch.rs must be replaced entirely (EEVDF replaces DWRR)
- kcall signature change
- ProcSchemeVerb new variants
- notify_files type change (Vec -> SmallVec)
- RSDP signature change
- Cookbook symlink behavior for local forks
- m4 platform detection and -fcommon fix

Author: vasilito <adminpupkin@gmail.com>
This commit is contained in:
2026-06-19 00:09:51 +03:00
parent a853c9250e
commit 75d10c2f90
+142
View File
@@ -456,3 +456,145 @@ fail against the synced upstream code.
**Fix:** Switched recipe to `path = "../../../local/sources/kernel"` (local
fork mode). All patches were already squash-merged into the fork.
### Kernel: Compile Errors After Upstream Sync (31 errors)
After the squash-merge, the kernel had 31 compile errors across ~20 files.
These were caused by upstream API evolution interacting with Red Bear code
that survived in non-conflicting regions of the merge.
#### Feature Gates Required
Upstream code uses two experimental features that require feature gates:
- `#![feature(asm_cfg)]` — for `#[cfg(target_arch)]` on inline assembly
- `#![feature(if_let_guard)]` — for `if let` guards in match arms
Both must be added to `src/main.rs`.
#### Unsafe Blocks Required (Rust 2024 Edition)
Rust 2024 edition requires explicit `unsafe { }` blocks for unsafe operations
even inside `unsafe fn`. Affected files:
- `src/arch/x86_shared/cpuid.rs``__cpuid_count`
- `src/arch/x86_shared/device/tsc.rs``__cpuid`
- `src/arch/x86_shared/device/local_apic.rs``set_lvt_timer`
#### Removed Red Bear APIs
These Red Bear types/constants no longer exist after taking upstream:
- `SchedPolicy` — Red Bear's DWRR scheduler policy enum (upstream uses EEVDF)
- `RUN_QUEUE_COUNT` — Red Bear's per-NUMA run queue count constant
- `get_event_stat()` — Red Bear's event system statistics (upstream uses eventfd)
- `PIPES` — Red Bear's pipe storage (renamed to `HANDLES`)
Fixes:
- Remove `SchedPolicy` from the `pub use` in `context/mod.rs`
- Define `RUN_QUEUE_COUNT` locally in `percpu.rs` if still needed
- Implement `get_event_stat()` in `event.rs` using the upstream `REGISTRY` static
- Use `HANDLES` instead of `PIPES` in `scheme/pipe.rs`
#### `CONTEXT_SWITCH_LOCK` Missing
Upstream added `pub static CONTEXT_SWITCH_LOCK: AtomicBool` to
`src/context/arch/x86_64.rs` but our fork was missing it. Must be added
with the `core::sync::atomic::AtomicBool` import.
#### `new_addrsp_guard` Field Missing from PercpuBlock
Upstream added a separate `new_addrsp_guard: Cell<Option<AddrSpaceSwitchReadGuard>>`
field to `PercpuBlock` for storing the addr space read guard during context
switch. Our fork only had `new_addrsp_tmp` (for the `Arc<AddrSpaceWrapper>`).
Both fields must exist.
#### `switch.rs` Must Be Replaced Entirely
The Red Bear DWRR scheduler in `switch.rs` is fundamentally incompatible with
the upstream EEVDF scheduler data structures. The `RunContextData` changed from
`set: [VecDeque<WeakContextRef>; N]` to `queue: BTreeMap<(vd, rem_slice, ctxt_id), ...>`.
The entire `switch.rs` must be replaced with the upstream version:
```bash
git show upstream/master:src/context/switch.rs > src/context/switch.rs
```
#### `kcall` Trait Method Signature Changed
Upstream changed `id: usize` to `fds: &[usize]` in the `kcall` trait method.
Update the `ProcScheme` impl to extract the first element:
```rust
fn kcall(&self, fds: &[usize], ...) -> Result<usize> {
let id = *fds.first().ok_or(Error::new(EBADF))?;
```
#### `ProcSchemeVerb` New Variants
Upstream added new variants to `ProcSchemeVerb`: `RegsInt`, `RegsFloat`,
`RegsEnv`, `SchedAffinity`, `Start`. The match in `scheme/proc.rs` must
handle them (currently returns `ENOSYS`).
#### `notify_files` Type Change
`handle_notify_files()` now expects `UnmapVec` (`SmallVec<[UnmapResult; 16]>`)
instead of `Vec`. Import `UnmapVec` from `context::memory` and use
`UnmapVec::new()` instead of `Vec::new()`.
#### `Rsdp::get_rsdp` Signature Change
Upstream changed the parameter from `Option<NonNull<u8>>` to
`Option<*const u8>`. Convert at the call site:
```rust
Rsdp::get_rsdp(already_supplied_rsdp.map(|ptr| ptr.as_ptr() as *const u8))
```
#### Syntax Error in `acpi/madt/arch/x86.rs`
A `const` statement was accidentally placed inside a `use crate::{...}` block
during the merge. Must be moved outside.
#### `halt_boot` Scope Issue
`halt_boot` was defined inside the `impl KernelArgs` block, making it a method
rather than a free function. Must be moved outside the impl block.
### Cookbook Symlink Behavior for Local Forks
**Critical:** When a recipe uses `path = "..."` pointing inside
`/local/sources/` or `/local/recipes/`, the cookbook creates a **symlink**
(not a copy) from `recipes/<name>/source` → the local fork path. This means:
1. Build artifacts and `cargo` operations can modify files in the local fork
through the symlink.
2. After each build attempt, verify the fork's git status:
```bash
cd local/sources/<component>
git status --short
```
3. If the working tree is dirty, reset before rebuilding:
```bash
git checkout -- .
```
4. Always clean both `target/` and `source/` when restarting a kernel build:
```bash
rm -rf recipes/core/kernel/target recipes/core/kernel/source
cd local/sources/kernel && git checkout -- .
```
### m4: `getlocalename_l-unsafe.c` Platform Detection
**Problem:** m4's gnulib `getlocalename_l-unsafe.c` has a Redox case guarded
by `HAVE_GETLOCALENAME_L`, which relibc doesn't define.
**Fix:** Changed the guard from `__redox__ && HAVE_GETLOCALENAME_L` to just
`__redox__` and return `"C"` (Redox only supports the C/POSIX locale).
### m4: `rpl_realloc` Multiple Definition
**Problem:** GCC 10+ defaults to `-fno-common`, causing `rpl_realloc` (gnulib
replacement) to be multiply defined across translation units.
**Fix:** Add `-fcommon` to CFLAGS in the m4 recipe:
```toml
script = """
DYNAMIC_INIT
export CFLAGS="-fcommon $CFLAGS"
```