From 08f55bd0f5b6943e7d8bee1e79f92f4b212a9173 Mon Sep 17 00:00:00 2001 From: Kat Perez Date: Fri, 7 Nov 2025 16:55:00 -0500 Subject: [PATCH] Add log crate adapter to RustAdvancedLoggerDxe --- .../Crates/RustAdvancedLoggerDxe/Cargo.toml | 1 + .../Crates/RustAdvancedLoggerDxe/src/lib.rs | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/Cargo.toml b/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/Cargo.toml index 86d3ff0472..cae7f19217 100644 --- a/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/Cargo.toml +++ b/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/Cargo.toml @@ -11,6 +11,7 @@ path = "src/lib.rs" [dependencies] r-efi = { workspace = true } mu_uefi_boot_services = { workspace = true } +log = { workspace = true } [dev-dependencies] mu_uefi_boot_services = { workspace = true, features = ["mockall"] } diff --git a/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/src/lib.rs b/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/src/lib.rs index f73bbff713..6d57c8236e 100644 --- a/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/src/lib.rs +++ b/AdvLoggerPkg/Crates/RustAdvancedLoggerDxe/src/lib.rs @@ -138,6 +138,38 @@ impl fmt::Write for LogTransactor<'_> { } } +// Adapter to route log crate output to AdvancedLogger +struct LogCrateAdapter; + +static LOG_CRATE_ADAPTER: LogCrateAdapter = LogCrateAdapter; + +impl log::Log for LogCrateAdapter { + fn enabled(&self, _metadata: &log::Metadata) -> bool { + // Always enabled - let AdvancedLogger decide + true + } + + fn log(&self, record: &log::Record) { + if self.enabled(record.metadata()) { + // Map log crate levels to UEFI debug levels + let level = match record.level() { + log::Level::Error => DEBUG_ERROR, + log::Level::Warn => DEBUG_WARN, + log::Level::Info => DEBUG_INFO, + log::Level::Debug => DEBUG_VERBOSE, + log::Level::Trace => DEBUG_VERBOSE, + }; + + // Format: [LEVEL] target: message (with newline) + LOGGER.log(level, format_args!("[{}] {}: {}\n", record.level(), record.target(), record.args())); + } + } + + fn flush(&self) { + // No-op for AdvancedLogger + } +} + /// Initializes the logging subsystem. The `debug` and `debugln` macros may be called before calling this function, but /// output is discarded if the logger has not yet been initialized via this routine. /// # Safety @@ -145,6 +177,10 @@ impl fmt::Write for LogTransactor<'_> { pub unsafe fn init_debug(efi_boot_services: *mut efi::BootServices) { let standard_boot_services = unsafe { boot_services::StandardBootServices::new(&*efi_boot_services) }; LOGGER.init(&standard_boot_services); + + // Also set up the standard log crate to route to AdvancedLogger + let _ = log::set_logger(&LOG_CRATE_ADAPTER); + log::set_max_level(log::LevelFilter::Trace); } #[doc(hidden)]