From 3d2951a23d5421d8e6579591bbc7b12bcd71c515 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:35:54 +0100 Subject: [PATCH] init: Convert vesad, fbbootlogd and fbcond to services --- drivers/graphics/fbbootlogd/src/scheme.rs | 2 +- drivers/inputd/src/lib.rs | 8 ++++++++ drivers/inputd/src/main.rs | 18 ++++++++++++++++-- init.d/20_fbbootlogd.service | 12 ++++++++++++ init.d/20_fbcond.service | 13 +++++++++++++ init.d/20_graphics | 4 ---- init.d/20_graphics.target | 11 +++++++++++ init.d/20_vesad.service | 19 +++++++++++++++++++ init.d/40_drivers | 2 +- init/src/script.rs | 6 +++++- init/src/service.rs | 13 +++++++++++-- 11 files changed, 97 insertions(+), 11 deletions(-) create mode 100644 init.d/20_fbbootlogd.service create mode 100644 init.d/20_fbcond.service delete mode 100644 init.d/20_graphics create mode 100644 init.d/20_graphics.target create mode 100644 init.d/20_vesad.service diff --git a/drivers/graphics/fbbootlogd/src/scheme.rs b/drivers/graphics/fbbootlogd/src/scheme.rs index bb89bc262e..a599893aa1 100644 --- a/drivers/graphics/fbbootlogd/src/scheme.rs +++ b/drivers/graphics/fbbootlogd/src/scheme.rs @@ -25,7 +25,7 @@ pub struct FbbootlogScheme { impl FbbootlogScheme { pub fn new() -> FbbootlogScheme { let mut scheme = FbbootlogScheme { - input_handle: ConsumerHandle::new_vt().expect("fbbootlogd: Failed to open vt"), + input_handle: ConsumerHandle::bootlog_vt().expect("fbbootlogd: Failed to open vt"), display_map: None, text_screen: console_draw::TextScreen::new(), text_buffer: console_draw::TextBuffer::new(1000), diff --git a/drivers/inputd/src/lib.rs b/drivers/inputd/src/lib.rs index 5ecf8b6600..0a8fffa2c2 100644 --- a/drivers/inputd/src/lib.rs +++ b/drivers/inputd/src/lib.rs @@ -47,6 +47,14 @@ impl ConsumerHandle { Ok(Self(file)) } + pub fn bootlog_vt() -> io::Result { + let file = OpenOptions::new() + .read(true) + .custom_flags(O_NONBLOCK as i32) + .open(format!("/scheme/input/consumer_bootlog"))?; + Ok(Self(file)) + } + pub fn event_handle(&self) -> BorrowedFd<'_> { self.0.as_fd() } diff --git a/drivers/inputd/src/main.rs b/drivers/inputd/src/main.rs index 7a986bd566..ba572255e0 100644 --- a/drivers/inputd/src/main.rs +++ b/drivers/inputd/src/main.rs @@ -25,7 +25,7 @@ use redox_scheme::{CallerCtx, OpenResult, RequestKind, Response, SignalBehavior, use orbclient::{Event, EventOption}; use syscall::schemev2::NewFdFlags; -use syscall::{Error as SysError, EventFlags, EACCES, EBADF, EINVAL}; +use syscall::{Error as SysError, EventFlags, EACCES, EBADF, EEXIST, EINVAL}; pub mod keymap; @@ -79,7 +79,7 @@ impl InputScheme { handles: BTreeMap::new(), next_id: AtomicUsize::new(0), - next_vt_id: AtomicUsize::new(1), + next_vt_id: AtomicUsize::new(2), // VT 1 is reserved for the bootlog display: None, vts: BTreeSet::new(), @@ -195,6 +195,20 @@ impl SchemeSync for InputScheme { vt, } } + "consumer_bootlog" => { + if !self.vts.insert(1) { + return Err(SysError::new(EEXIST)); + } + + self.switch_vt(1); + Handle::Consumer { + events: EventFlags::empty(), + pending: Vec::new(), + needs_handoff: false, + notified: false, + vt: 1, + } + } "handle" | "handle_early" => { let display = path_parts.collect::>().join("."); diff --git a/init.d/20_fbbootlogd.service b/init.d/20_fbbootlogd.service new file mode 100644 index 0000000000..2a2c86f1b8 --- /dev/null +++ b/init.d/20_fbbootlogd.service @@ -0,0 +1,12 @@ +{ + "unit": { + "description": "Graphical bootlog", + "requires_weak": ["10_inputd.service"] + }, + "service": { + "cmd": "fbbootlogd", + "type": { + "scheme": "fbbootlog" + } + } +} diff --git a/init.d/20_fbcond.service b/init.d/20_fbcond.service new file mode 100644 index 0000000000..f11d4d5aa8 --- /dev/null +++ b/init.d/20_fbcond.service @@ -0,0 +1,13 @@ +{ + "unit": { + "description": "Framebuffer text console", + "requires_weak": ["10_inputd.service", "20_vesad.service"] + }, + "service": { + "cmd": "fbcond", + "args": ["2"], + "type": { + "scheme": "fbcon" + } + } +} diff --git a/init.d/20_graphics b/init.d/20_graphics deleted file mode 100644 index 3cf2decf32..0000000000 --- a/init.d/20_graphics +++ /dev/null @@ -1,4 +0,0 @@ -requires_weak 10_inputd.service -notify FRAMEBUFFER_ADDR=$ FRAMEBUFFER_VIRT=$ FRAMEBUFFER_WIDTH=$ FRAMEBUFFER_HEIGHT=$ FRAMEBUFFER_STRIDE=$ vesad -scheme fbbootlog fbbootlogd -scheme fbcon fbcond 2 diff --git a/init.d/20_graphics.target b/init.d/20_graphics.target new file mode 100644 index 0000000000..f8230dfe5d --- /dev/null +++ b/init.d/20_graphics.target @@ -0,0 +1,11 @@ +{ + "unit": { + "description": "Graphics subsystem", + "requires_weak": [ + "10_inputd.service", + "20_vesad.service", + "20_fbbootlogd.service", + "20_fbcond.service" + ] + } +} diff --git a/init.d/20_vesad.service b/init.d/20_vesad.service new file mode 100644 index 0000000000..5feea711ec --- /dev/null +++ b/init.d/20_vesad.service @@ -0,0 +1,19 @@ +{ + "unit": { + "description": "Bootloader framebuffer handler", + "requires_weak": [ + "10_inputd.service" + ] + }, + "service": { + "cmd": "vesad", + "inherit_envs": [ + "FRAMEBUFFER_ADDR", + "FRAMEBUFFER_VIRT", + "FRAMEBUFFER_WIDTH", + "FRAMEBUFFER_HEIGHT", + "FRAMEBUFFER_STRIDE" + ], + "type": "notify" + } +} diff --git a/init.d/40_drivers b/init.d/40_drivers index b23ea0d14c..769d714048 100644 --- a/init.d/40_drivers +++ b/init.d/40_drivers @@ -1,4 +1,4 @@ -requires_weak 10_lived.service 20_graphics +requires_weak 10_lived.service 20_graphics.target notify ps2d notify RSDP_ADDR=$ RSDP_SIZE=$ hwd pcid-spawner --initfs diff --git a/init/src/script.rs b/init/src/script.rs index 888db7ddd3..f61ff6fbcb 100644 --- a/init/src/script.rs +++ b/init/src/script.rs @@ -1,4 +1,4 @@ -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use std::{env, io, iter}; use crate::service::{Service, ServiceType}; @@ -66,6 +66,7 @@ impl Command { cmd: process.cmd, args: process.args, envs: process.envs, + inherit_envs: BTreeSet::new(), type_: ServiceType::Notify, })) } @@ -80,6 +81,7 @@ impl Command { cmd: process.cmd, args: process.args, envs: process.envs, + inherit_envs: BTreeSet::new(), type_: ServiceType::Scheme(scheme), })) } @@ -90,6 +92,7 @@ impl Command { cmd: process.cmd, args: process.args, envs: process.envs, + inherit_envs: BTreeSet::new(), type_: ServiceType::OneshotAsync, })) } @@ -100,6 +103,7 @@ impl Command { cmd: process.cmd, args: process.args, envs: process.envs, + inherit_envs: BTreeSet::new(), type_: ServiceType::Oneshot, })) } diff --git a/init/src/service.rs b/init/src/service.rs index 049be3839c..529548819a 100644 --- a/init/src/service.rs +++ b/init/src/service.rs @@ -1,4 +1,5 @@ -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; +use std::env; use std::ffi::OsString; use std::process::Command; @@ -11,6 +12,8 @@ pub struct Service { pub args: Vec, #[serde(default)] pub envs: BTreeMap, + #[serde(default)] + pub inherit_envs: BTreeSet, #[serde(rename = "type")] pub type_: ServiceType, } @@ -29,7 +32,13 @@ impl Service { pub fn spawn(&self, base_envs: &BTreeMap) { let mut command = Command::new(&self.cmd); command.args(&self.args); - command.env_clear().envs(base_envs).envs(&self.envs); + command.env_clear(); + for env in &self.inherit_envs { + if let Some(value) = env::var_os(env) { + command.env(env, value); + } + } + command.envs(base_envs).envs(&self.envs); match &self.type_ { ServiceType::Notify => {