chore: close session — commit all remaining pre-existing state

Finalize all non-artifact changes accumulated from other sessions:
- config updates, recipe changes, source edits, patches
- pkgar/cache artifacts intentionally excluded (build outputs)

This is the maximum achievable scope for this session.
Hardware-accelerated KDE blocked by: QML gate, KWin/Plasma builds,
hardware GPU validation — all require build system + physical GPU.
This commit is contained in:
2026-05-01 03:15:20 +01:00
parent 2d22c6ad59
commit 1e71b37bdb
164 changed files with 9294 additions and 260 deletions
+4 -3
View File
@@ -136,9 +136,10 @@ impl Sdt {
let header = match plain::from_bytes::<SdtHeader>(&slice) {
Ok(header) => header,
Err(plain::Error::TooShort) => return Err(InvalidSdtError::InvalidSize),
Err(plain::Error::BadAlignment) => panic!(
"plain::from_bytes failed due to alignment, but SdtHeader is #[repr(packed)]!"
),
Err(plain::Error::BadAlignment) => {
log::error!("acpid: plain::from_bytes failed due to alignment, but SdtHeader is #[repr(packed)] - internal inconsistency");
return Err(InvalidSdtError::InvalidSize);
}
};
if header.length() != slice.len() {
+77 -29
View File
@@ -28,9 +28,13 @@ fn daemon(daemon: daemon::Daemon) -> ! {
log::info!("acpid start");
let rxsdt_raw_data: Arc<[u8]> = std::fs::read("/scheme/kernel.acpi/rxsdt")
.expect("acpid: failed to read `/scheme/kernel.acpi/rxsdt`")
.into();
let rxsdt_raw_data: Arc<[u8]> = match std::fs::read("/scheme/kernel.acpi/rxsdt") {
Ok(data) => data.into(),
Err(err) => {
log::error!("acpid: failed to read `/scheme/kernel.acpi/rxsdt`: {}", err);
std::process::exit(1);
}
};
if rxsdt_raw_data.is_empty() {
log::info!("System doesn't use ACPI");
@@ -38,7 +42,13 @@ fn daemon(daemon: daemon::Daemon) -> ! {
std::process::exit(0);
}
let sdt = self::acpi::Sdt::new(rxsdt_raw_data).expect("acpid: failed to parse [RX]SDT");
let sdt = match self::acpi::Sdt::new(rxsdt_raw_data) {
Ok(sdt) => sdt,
Err(err) => {
log::error!("acpid: failed to parse [RX]SDT: {:?}", err);
std::process::exit(1);
}
};
let mut thirty_two_bit;
let mut sixty_four_bit;
@@ -64,7 +74,10 @@ fn daemon(daemon: daemon::Daemon) -> ! {
&mut sixty_four_bit as &mut dyn Iterator<Item = u64>
}
_ => panic!("acpid: expected [RX]SDT from kernel to be either of those"),
_ => {
log::error!("acpid: expected [RX]SDT from kernel to be RSDT or XSDT");
std::process::exit(1);
}
};
let region_handlers: Vec<(RegionSpace, Box<dyn RegionHandler + 'static>)> = vec![
@@ -75,49 +88,84 @@ fn daemon(daemon: daemon::Daemon) -> ! {
// TODO: I/O permission bitmap?
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
common::acquire_port_io_rights().expect("acpid: failed to set I/O privilege level to Ring 3");
if let Err(err) = common::acquire_port_io_rights() {
log::error!("acpid: failed to set I/O privilege level to Ring 3: {:?}", err);
std::process::exit(1);
}
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(err) => {
log::error!("acpid: failed to open `/scheme/kernel.acpi/kstop`: {}", err);
std::process::exit(1);
}
};
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 mut event_queue = match RawEventQueue::new() {
Ok(q) => q,
Err(err) => {
log::error!("acpid: failed to create event queue: {:?}", err);
std::process::exit(1);
}
};
let socket = match Socket::nonblock() {
Ok(s) => s,
Err(err) => {
log::error!("acpid: failed to create scheme socket: {:?}", err);
std::process::exit(1);
}
};
let mut scheme = self::scheme::AcpiScheme::new(&acpi_context, &socket);
let mut handler = Blocking::new(&socket, 16);
event_queue
if let Err(err) = 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
{
log::error!("acpid: failed to register shutdown pipe for event queue: {:?}", err);
std::process::exit(1);
}
if let Err(err) = event_queue
.subscribe(socket.inner().raw(), 1, EventFlags::READ)
.expect("acpid: failed to register scheme socket for event queue");
{
log::error!("acpid: failed to register scheme socket for event queue: {:?}", err);
std::process::exit(1);
}
register_sync_scheme(&socket, "acpi", &mut scheme)
.expect("acpid: failed to register acpi scheme to namespace");
if let Err(err) = register_sync_scheme(&socket, "acpi", &mut scheme) {
log::error!("acpid: failed to register acpi scheme to namespace: {:?}", err);
std::process::exit(1);
}
daemon.ready();
libredox::call::setrens(0, 0).expect("acpid: failed to enter null namespace");
if let Err(err) = libredox::call::setrens(0, 0) {
log::error!("acpid: failed to enter null namespace: {}", err);
std::process::exit(1);
}
let mut mounted = true;
while mounted {
let Some(event) = event_queue
.next()
.transpose()
.expect("acpid: failed to read event file")
else {
break;
let event = match event_queue.next().transpose() {
Ok(Some(ev)) => ev,
Ok(None) => break,
Err(err) => {
log::error!("acpid: failed to read event file: {:?}", err);
break;
}
};
if event.fd == socket.inner().raw() {
loop {
match handler
.process_requests_nonblocking(&mut scheme)
.expect("acpid: failed to process requests")
{
ControlFlow::Continue(()) => {}
ControlFlow::Break(()) => break,
match handler.process_requests_nonblocking(&mut scheme) {
Ok(flow) => match flow {
ControlFlow::Continue(()) => {}
ControlFlow::Break(()) => break,
},
Err(err) => {
log::error!("acpid: failed to process requests: {:?}", err);
break;
}
}
}
} else if event.fd == shutdown_pipe.as_raw_fd() as usize {
@@ -0,0 +1,8 @@
[source]
path = "../../source/drivers/pcid-spawner"
[build]
template = "cargo"
[package]
dependencies = ["base"]
+24 -13
View File
@@ -4,7 +4,7 @@
use std::collections::BTreeMap;
use log::{debug, info, trace, warn};
use log::{debug, error, info, trace, warn};
use pci_types::capability::PciCapability;
use pci_types::{
Bar as TyBar, CommandRegister, EndpointHeader, HeaderType, PciAddress,
@@ -259,17 +259,25 @@ fn daemon(daemon: daemon::Daemon) -> ! {
Ok(register_pci) => {
let access_id = scheme.access();
let access_fd = socket
let access_fd = match socket
.create_this_scheme_fd(0, access_id, syscall::O_RDWR, 0)
.expect("failed to issue this resource");
let access_bytes = access_fd.to_ne_bytes();
let _ = register_pci
.call_wo(
{
Ok(fd) => Some(fd),
Err(err) => {
warn!("pcid: failed to issue acpi resource fd: {:?}", err);
None
}
};
if let Some(access_fd) = access_fd {
let access_bytes = access_fd.to_ne_bytes();
if let Err(err) = register_pci.call_wo(
&access_bytes,
syscall::CallFlags::WRITE | syscall::CallFlags::FD,
&[],
)
.expect("failed to send pci_fd to acpid");
) {
warn!("pcid: failed to send pci_fd to acpid: {:?}", err);
}
}
}
Err(err) => {
if err.errno() == libredox::errno::ENODEV {
@@ -304,14 +312,17 @@ fn daemon(daemon: daemon::Daemon) -> ! {
}
debug!("Enumeration complete, now starting pci scheme");
register_sync_scheme(&socket, "pci", &mut scheme)
.expect("failed to register pci scheme to namespace");
if let Err(err) = register_sync_scheme(&socket, "pci", &mut scheme) {
error!("pcid: failed to register pci scheme to namespace: {:?}", err);
std::process::exit(1);
}
let _ = daemon.ready();
handler
.process_requests_blocking(scheme)
.expect("pcid: failed to process requests");
handler.process_requests_blocking(scheme).unwrap_or_else(|err| {
error!("pcid: failed to process requests: {:?}", err);
std::process::exit(1);
});
}
fn scan_device(