fix: remove P18-5 duplicate RSDP hunk, fix P19-init log crate dependency

P18-5 had a duplicate acpi.rs RSDP probing hunk that reversed P5's
BIOS probing code, causing P19-acpid hunk #8 to fail. Removed the
duplicate, keeping only aml_physmem.rs hunks.

P19-init used log::warn!() but init in initfs has no log crate
dependency. Replaced with init_warn(&format!(...)) from the existing
color module.

All 58/58 patches validate. redbear-mini builds successfully.
This commit is contained in:
2026-05-18 17:00:01 +03:00
parent 419ff3c536
commit f3bef6b403
3 changed files with 48 additions and 55 deletions
@@ -1,41 +1,3 @@
--- a/drivers/acpid/src/acpi.rs
+++ b/drivers/acpid/src/acpi.rs
@@ -266,7 +266,34 @@
let format_err = |err| format!("{:?}", err);
let handler = AmlPhysMemHandler::new(Arc::clone(&self.pci_fd), Arc::clone(&self.page_cache));
//TODO: use these parsed tables for the rest of acpid
- let rsdp_address = usize::from_str_radix(&std::env::var("RSDP_ADDR")?, 16)?;
+ let rsdp_address = match std::env::var("RSDP_ADDR") {
+ Ok(addr) => usize::from_str_radix(&addr, 16)?,
+ Err(_) => {
+ // RSDP_ADDR not provided — probe BIOS area (0xE00000xFFFFF) for RSDP signature
+ log::info!("RSDP_ADDR not set, probing BIOS area for RSDP...");
+ let mut found = None;
+ for page_base in (0xE_0000..0x10_0000).step_by(16) {
+ let mapped = unsafe {
+ common::physmap(
+ page_base,
+ 16,
+ common::Prot::RW,
+ common::MemoryType::default(),
+ )
+ };
+ if let Ok(virt) = mapped {
+ let sig = unsafe { std::slice::from_raw_parts(virt as *const u8, 8) };
+ if sig == b"RSD PTR " {
+ log::info!("found RSDP at physical {:#x}", page_base);
+ found = Some(page_base);
+ break;
+ }
+ let _ = unsafe { libredox::call::munmap(virt as *mut (), 16) };
+ }
+ }
+ found.ok_or("RSDP not found in BIOS area (0xE0000-0xFFFFF)")?
+ }
+ };
let tables =
unsafe { AcpiTables::from_rsdp(handler.clone(), rsdp_address).map_err(format_err)? };
let platform = AcpiPlatform::new(tables, handler).map_err(format_err)?;
--- a/drivers/acpid/src/aml_physmem.rs
+++ b/drivers/acpid/src/aml_physmem.rs
@@ -190,7 +190,10 @@
@@ -1,5 +1,5 @@
diff --git a/drivers/acpid/src/acpi.rs b/drivers/acpid/src/acpi.rs
index 343533d0..0189c3ad 100644
index 343533d0..8ef6ab0e 100644
--- a/drivers/acpid/src/acpi.rs
+++ b/drivers/acpid/src/acpi.rs
@@ -55,3 +55,2 @@ impl SdtHeader {
@@ -44,14 +44,44 @@ index 343533d0..0189c3ad 100644
- .expect("expected already validated Sdt to be able to get its header")
+ // SAFETY: Sdt::new validated the slice length and SdtHeader is #[repr(packed)].
+ unsafe { &*(self.0.as_ptr() as *const SdtHeader) }
@@ -444,3 +455,3 @@ impl AcpiContext {
@@ -269,28 +280 @@ impl AmlSymbols {
- let rsdp_address = match std::env::var("RSDP_ADDR") {
- Ok(addr) => usize::from_str_radix(&addr, 16)?,
- Err(_) => {
- // RSDP_ADDR not provided — probe BIOS area (0xE00000xFFFFF) for RSDP signature
- log::info!("RSDP_ADDR not set, probing BIOS area for RSDP...");
- let mut found = None;
- for page_base in (0xE_0000..0x10_0000).step_by(16) {
- let mapped = unsafe {
- common::physmap(
- page_base,
- 16,
- common::Prot::RW,
- common::MemoryType::default(),
- )
- };
- if let Ok(virt) = mapped {
- let sig = unsafe { std::slice::from_raw_parts(virt as *const u8, 8) };
- if sig == b"RSD PTR " {
- log::info!("found RSDP at physical {:#x}", page_base);
- found = Some(page_base);
- break;
- }
- let _ = unsafe { libredox::call::munmap(virt as *mut (), 16) };
- }
- }
- found.ok_or("RSDP not found in BIOS area (0xE0000-0xFFFFF)")?
- }
- };
+ let rsdp_address = usize::from_str_radix(&std::env::var("RSDP_ADDR")?, 16)?;
@@ -444,3 +428,3 @@ impl AcpiContext {
- interpreter
- .release_global_lock()
- .expect("Failed to release GIL!"); //TODO: check if this should panic
+ if let Err(e) = interpreter.release_global_lock() {
+ log::error!("Failed to release AML global lock: {:?}", e);
+ }
@@ -462,4 +473,8 @@ impl AcpiContext {
@@ -462,4 +446,8 @@ impl AcpiContext {
- .map(|physaddr| {
- let physaddr: usize = physaddr
- .try_into()
@@ -64,7 +94,7 @@ index 343533d0..0189c3ad 100644
+ return None;
+ }
+ };
@@ -469 +484,7 @@ impl AcpiContext {
@@ -469 +457,7 @@ impl AcpiContext {
- Sdt::load_from_physical(physaddr).expect("failed to load physical SDT")
+ match Sdt::load_from_physical(physaddr) {
+ Ok(sdt) => Some(sdt),
@@ -73,7 +103,7 @@ index 343533d0..0189c3ad 100644
+ None
+ }
+ }
@@ -865,3 +886,4 @@ impl Fadt {
@@ -865,3 +859,4 @@ impl Fadt {
- Err(plain::Error::BadAlignment) => unreachable!(
- "plain::from_bytes reported bad alignment, but FadtAcpi2Struct is #[repr(packed)]"
- ),
@@ -81,12 +111,12 @@ index 343533d0..0189c3ad 100644
+ log::error!("plain::from_bytes reported bad alignment for FadtAcpi2Struct, but it is #[repr(packed)]");
+ None
+ }
@@ -876,2 +898,2 @@ impl Deref for Fadt {
@@ -876,2 +871,2 @@ impl Deref for Fadt {
- plain::from_bytes::<FadtStruct>(&self.0 .0)
- .expect("expected FADT struct to already be validated in Deref impl")
+ // SAFETY: Fadt::new validated the slice length and FadtStruct is #[repr(packed)].
+ unsafe { &*(self.0 .0.as_ptr() as *const FadtStruct) }
@@ -890,3 +912,7 @@ impl Fadt {
@@ -890,3 +885,7 @@ impl Fadt {
- let fadt_sdt = context
- .take_single_sdt(*b"FACP")
- .expect("expected ACPI to always have a FADT");
@@ -97,7 +127,7 @@ index 343533d0..0189c3ad 100644
+ return;
+ }
+ };
@@ -903,4 +929,2 @@ impl Fadt {
@@ -903,4 +902,2 @@ impl Fadt {
- Some(fadt2) => usize::try_from(fadt2.x_dsdt).unwrap_or_else(|_| {
- usize::try_from(fadt.dsdt).expect("expected any given u32 to fit within usize")
- }),
@@ -105,7 +135,7 @@ index 343533d0..0189c3ad 100644
+ Some(fadt2) => fadt2.x_dsdt as usize,
+ None => fadt.dsdt as usize,
diff --git a/drivers/acpid/src/acpi/dmar/mod.rs b/drivers/acpid/src/acpi/dmar/mod.rs
index ed27849b..c6d335c9 100644
index ed27849b..b5cb96f2 100644
--- a/drivers/acpid/src/acpi/dmar/mod.rs
+++ b/drivers/acpid/src/acpi/dmar/mod.rs
@@ -47,2 +47,2 @@ impl Deref for Dmar {
@@ -189,7 +219,7 @@ index ed27849b..c6d335c9 100644
-
-
diff --git a/drivers/acpid/src/main.rs b/drivers/acpid/src/main.rs
index ea3cbaeb..79d739c2 100644
index ea3cbaeb..0c1d4c72 100644
--- a/drivers/acpid/src/main.rs
+++ b/drivers/acpid/src/main.rs
@@ -32,3 +32,8 @@ fn daemon(daemon: daemon::Daemon) -> ! {
@@ -230,20 +260,21 @@ index ea3cbaeb..79d739c2 100644
+ if let Err(e) = libredox::call::setrens(0, 0) {
+ log::warn!("acpid: failed to enter null namespace: {} — continuing", e);
+ }
@@ -114,5 +133,7 @@ fn daemon(daemon: daemon::Daemon) -> ! {
@@ -114,6 +133,7 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- let Some(event) = event_queue
- .next()
- .transpose()
- .expect("acpid: failed to read event file")
- else {
+ let Some(event) = match event_queue.next().transpose() {
+ Ok(e) => e,
- break;
+ let event = match event_queue.next().transpose() {
+ Ok(Some(e)) => e,
+ Ok(None) => break,
+ Err(e) => {
+ log::error!("acpid: failed to read event file: {} — continuing", e);
+ continue;
+ }
+ } else {
@@ -124,6 +145,7 @@ fn daemon(daemon: daemon::Daemon) -> ! {
@@ -124,6 +144,7 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- match handler
- .process_requests_nonblocking(&mut scheme)
- .expect("acpid: failed to process requests")
@@ -257,7 +288,7 @@ index ea3cbaeb..79d739c2 100644
+ log::error!("acpid: failed to process requests: {} — continuing", e);
+ continue;
+ }
@@ -146 +168,2 @@ fn daemon(daemon: daemon::Daemon) -> ! {
@@ -146 +167,2 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- unreachable!("System should have shut down before this is entered");
+ log::error!("System should have shut down before this was reached");
+ std::process::exit(1);
@@ -8,7 +8,7 @@ index 5891b808..b8720e81 100644
@@ -174 +174,3 @@ fn main() {
- libredox::call::setrens(0, 0).expect("init: failed to enter null namespace");
+ if let Err(err) = libredox::call::setrens(0, 0) {
+ log::warn!("init: failed to enter null namespace: {} — continuing", err);
+ init_warn(&format!("init: failed to enter null namespace: {} — continuing", err));
+ }
diff --git a/init/src/service.rs b/init/src/service.rs
index 10bb9d8a..970c0338 100644