diff --git a/bootstrap/src/exec.rs b/bootstrap/src/exec.rs index c1664ccba5..fe45a04c5e 100644 --- a/bootstrap/src/exec.rs +++ b/bootstrap/src/exec.rs @@ -4,7 +4,7 @@ use alloc::borrow::ToOwned; use alloc::vec::Vec; use syscall::flag::{O_CLOEXEC, O_RDONLY}; -use syscall::{EINTR, Error}; +use syscall::{Error, EINTR}; use redox_rt::proc::*; @@ -62,7 +62,7 @@ pub fn main() -> ! { if let Some(log_env) = envs .iter() - .find_map(|var| var.strip_prefix(b"BOOT_LOG_LEVEL=")) + .find_map(|var| var.strip_prefix(b"BOOTSTRAP_LOG_LEVEL=")) { if let Ok(Ok(log_level)) = str::from_utf8(&log_env).map(|s| log::LevelFilter::from_str(s)) { log::set_max_level(log_level); diff --git a/drivers/common/src/logger.rs b/drivers/common/src/logger.rs index 20e090d9f7..05cd76a070 100644 --- a/drivers/common/src/logger.rs +++ b/drivers/common/src/logger.rs @@ -1,7 +1,9 @@ +use std::str::FromStr; + +use libredox::{flag, Fd}; use redox_log::{OutputBuilder, RedoxLogger}; pub fn output_level() -> log::LevelFilter { - //TODO: adjust with bootloader environment log::LevelFilter::Info } @@ -15,9 +17,13 @@ pub fn setup_logging( category: &str, subcategory: &str, logfile_base: &str, - output_level: log::LevelFilter, + mut output_level: log::LevelFilter, file_level: log::LevelFilter, ) { + if let Some(log_level) = read_bootloader_log_level_env(category, subcategory) { + output_level = log_level; + } + let mut logger = RedoxLogger::new().with_output( OutputBuilder::stderr() .with_filter(output_level) // limit global output to important info @@ -57,3 +63,45 @@ pub fn setup_logging( logger.enable().expect("failed to set default logger"); } + +fn read_bootloader_log_level_env(category: &str, subcategory: &str) -> Option { + let mut env_bytes = [0_u8; 4096]; + + // TODO: Have the kernel env can specify prefixed env key instead of having to read all of them + let envs = { + let Ok(fd) = Fd::open("/scheme/sys/env", flag::O_RDONLY | flag::O_CLOEXEC, 0) else { + return None; + }; + let Ok(bytes_read) = fd.read(&mut env_bytes) else { + return None; + }; + if bytes_read >= env_bytes.len() { + return None; + } + let env_bytes = &mut env_bytes[..bytes_read]; + + env_bytes + .split(|&c| c == b'\n') + .filter(|var| var.starts_with(b"DRIVER_")) + .collect::>() + }; + + let log_env_keys = [ + format!("DRIVER_{}_LOG_LEVEL=", subcategory.to_ascii_uppercase()), + format!("DRIVER_{}_LOG_LEVEL=", category.to_ascii_uppercase()), + "DRIVER_LOG_LEVEL=".to_string(), + ]; + + for log_env_key in log_env_keys { + let log_env_key = log_env_key.as_bytes(); + if let Some(log_env) = envs.iter().find_map(|var| var.strip_prefix(log_env_key)) { + if let Ok(Ok(log_level)) = + str::from_utf8(&log_env).map(|s| log::LevelFilter::from_str(s)) + { + return Some(log_level); + } + } + } + + None +} diff --git a/drivers/graphics/ihdgd/src/main.rs b/drivers/graphics/ihdgd/src/main.rs index 683a9b656e..657d3dffb3 100644 --- a/drivers/graphics/ihdgd/src/main.rs +++ b/drivers/graphics/ihdgd/src/main.rs @@ -24,7 +24,8 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { "graphics", "pci", &name, - log::LevelFilter::Debug, //common::output_level(), + // TODO: common::output_level() once stable + log::LevelFilter::Debug, common::file_level(), ); diff --git a/drivers/pcid/src/main.rs b/drivers/pcid/src/main.rs index b49e68df68..88aa2807e4 100644 --- a/drivers/pcid/src/main.rs +++ b/drivers/pcid/src/main.rs @@ -236,15 +236,13 @@ fn main() { } fn daemon(daemon: daemon::Daemon) -> ! { - let mut args = pico_args::Arguments::from_env(); - let verbosity = (0..).find(|_| !args.contains("-v")).unwrap_or(0); - let log_level = match verbosity { - 0 => log::LevelFilter::Info, - 1 => log::LevelFilter::Debug, - _ => log::LevelFilter::Trace, - }; - - common::setup_logging("bus", "pci", "pcid", log_level, log::LevelFilter::Info); + common::setup_logging( + "bus", + "pci", + "pcid", + common::output_level(), + common::file_level(), + ); let pcie = Pcie::new(); let mut tree = BTreeMap::new(); diff --git a/drivers/usb/usbhubd/src/main.rs b/drivers/usb/usbhubd/src/main.rs index d98706f838..8df44c0493 100644 --- a/drivers/usb/usbhubd/src/main.rs +++ b/drivers/usb/usbhubd/src/main.rs @@ -34,7 +34,7 @@ fn main() { "usb", "device", &name, - log::LevelFilter::Warn, + common::output_level(), common::file_level(), ); diff --git a/drivers/usb/xhcid/src/main.rs b/drivers/usb/xhcid/src/main.rs index 613bd1c7be..0083f89906 100644 --- a/drivers/usb/xhcid/src/main.rs +++ b/drivers/usb/xhcid/src/main.rs @@ -129,7 +129,7 @@ fn daemon_with_context_size( "usb", "host", &name, - log::LevelFilter::Warn, + common::output_level(), common::file_level(), );