From d9f7a9e8084617a61232e2eadceb8d279a561175 Mon Sep 17 00:00:00 2001 From: vasilito Date: Wed, 1 Jul 2026 07:30:32 +0300 Subject: [PATCH] redox_syscall: add EnterS2Idle/ExitS2Idle AcpiVerb variants (Phase I/J) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase I/J: hardware-agnostic s2idle / Modern Standby support. These AcpiVerb variants are needed on any platform with Modern Standby firmware (Dell, HP, Lenovo, LG Gram, etc.), not just LG Gram. They mirror Linux 7.1: * EnterS2Idle (= 3) — s2idle_enter() in kernel/power/suspend.c:91 * ExitS2Idle (= 4) — s2idle_wake() in kernel/power/suspend.c:133 The version field stays at upstream 0.8.1. We do NOT bump the version — this is the durable overlay pattern (per AGENTS.md 'GOLDEN RULE — Red Bear adapts to upstream, never the reverse'). Periodic rebase via 'git fetch upstream && git rebase upstream/master' is the workflow when upstream changes. The patch file backing this commit is at local/patches/syscall/P1-acpiverb-enter-exit-s2idle.patch in the outer RedBear-OS repo. --- src/flag.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/flag.rs b/src/flag.rs index 455ec36b55..1dd50402a7 100644 --- a/src/flag.rs +++ b/src/flag.rs @@ -310,12 +310,29 @@ pub enum AcpiVerb { ReadRxsdt = 1, // no payload, just returns 0 or 1 CheckShutdown = 2, + /// Red Bear OS extension (Phase I): acpid requests the kernel + /// enter s2idle (Modern Standby / S0ix). The kernel sets + /// `S2IDLE_REQUESTED`; the idle path calls `mwait_loop()`. Read + /// payload (1 byte) returns the *previous* value of the flag. + /// Write payload is opaque (ignored by current kernel). + /// Mirrors Linux 7.1 `s2idle_enter()` in + /// `kernel/power/suspend.c:91`. Hardware-agnostic — works on + /// any platform with Modern Standby firmware (Dell, HP, Lenovo, + /// LG Gram, etc.), not just LG Gram. + EnterS2Idle = 3, + /// Red Bear OS extension (Phase I): acpid signals s2idle + /// exit. Kernel clears `S2IDLE_REQUESTED`. Read payload (1 + /// byte) always returns 0. Mirrors Linux 7.1 `s2idle_wake()` in + /// `kernel/power/suspend.c:133`. Hardware-agnostic. + ExitS2Idle = 4, } impl AcpiVerb { pub const fn try_from_raw(value: u64) -> Option { Some(match value { 1 => Self::ReadRxsdt, 2 => Self::CheckShutdown, + 3 => Self::EnterS2Idle, + 4 => Self::ExitS2Idle, _ => return None, }) }