Files
RedBear-OS/local/patches/base/P32-acpid-graceful-boot.patch
T

71 lines
3.4 KiB
Diff

diff --git a/drivers/acpid/src/main.rs b/drivers/acpid/src/main.rs
index 5528ad0a..b05102f6 100644
--- a/drivers/acpid/src/main.rs
+++ b/drivers/acpid/src/main.rs
@@ -50,2 +50,3 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- log::error!("acpid: failed to parse [RX]SDT: {}", e);
- std::process::exit(1);
+ log::warn!("acpid: failed to parse [RX]SDT: {} — booting without ACPI", e);
+ daemon.ready();
+ std::process::exit(0);
@@ -80,2 +81,3 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- log::error!("acpid: expected [RX]SDT from kernel to be RSDT or XSDT, got {:?}", String::from_utf8_lossy(&sdt.signature));
- std::process::exit(1);
+ log::warn!("acpid: expected [RX]SDT from kernel to be RSDT or XSDT, got {:?} — booting without ACPI", String::from_utf8_lossy(&sdt.signature));
+ daemon.ready();
+ std::process::exit(0);
@@ -102,2 +104 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- log::error!("acpid: failed to set I/O privilege level to Ring 3: {}", e);
- std::process::exit(1);
+ log::warn!("acpid: failed to set I/O privilege level to Ring 3: {} — continuing without port I/O", e);
@@ -106,2 +107,17 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- let shutdown_pipe = File::open("/scheme/kernel.acpi/kstop")
- .expect("acpid: failed to open `/scheme/kernel.acpi/kstop`");
+ let shutdown_pipe = match File::open("/scheme/kernel.acpi/kstop") {
+ Ok(f) => f,
+ Err(e) => {
+ log::warn!("acpid: failed to open `/scheme/kernel.acpi/kstop`: {} — booting without ACPI shutdown", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
+
+ let mut event_queue = match RawEventQueue::new() {
+ Ok(q) => q,
+ Err(e) => {
+ log::warn!("acpid: failed to create event queue: {} — booting without ACPI", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
@@ -109,2 +125,8 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- let mut event_queue = RawEventQueue::new().expect("acpid: failed to create event queue");
- let socket = Socket::nonblock().expect("acpid: failed to create disk scheme");
+ let socket = match Socket::nonblock() {
+ Ok(s) => s,
+ Err(e) => {
+ log::warn!("acpid: failed to create scheme socket: {} — booting without ACPI", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
@@ -115,6 +137,12 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- event_queue
- .subscribe(shutdown_pipe.as_raw_fd() as usize, 0, EventFlags::READ)
- .expect("acpid: failed to register shutdown pipe for event queue");
- event_queue
- .subscribe(socket.inner().raw(), 1, EventFlags::READ)
- .expect("acpid: failed to register scheme socket for event queue");
+ if let Err(e) = event_queue
+ .subscribe(shutdown_pipe.as_raw_fd() as usize, 0, EventFlags::READ) {
+ log::warn!("acpid: failed to register shutdown pipe for event queue: {} — booting without ACPI", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ if let Err(e) = event_queue
+ .subscribe(socket.inner().raw(), 1, EventFlags::READ) {
+ log::warn!("acpid: failed to register scheme socket for event queue: {} — booting without ACPI", e);
+ daemon.ready();
+ std::process::exit(0);
+ }