use crate::{boot, system}; use core::fmt::Write; /// INTERNAL API! Helper for print macros. #[doc(hidden)] pub fn _print(args: core::fmt::Arguments) { if boot::are_boot_services_active() { system::with_stdout(|stdout| { stdout.write_fmt(args).expect("Failed to write to stdout"); }); } else { // Ease debugging: Depending on logger, this might write to serial or // debugcon. log::debug!("You are using `print!` after the boot services have been exited."); } } /// Prints to the standard output of the UEFI boot service console. /// /// # Usage /// Use this similar to `print!` from the Rust standard library, but only /// as long as boot services have not been exited. /// /// You should never use this macro in a custom Logger ([`log::Log`] impl) to /// prevent a circular runtime dependency. /// /// # Panics /// Will panic if the system table's `stdout` is not set, or if writing fails. /// /// # Examples /// ``` /// print!(""); /// print!("Hello World\n"); /// print!("Hello {}", "World"); /// ``` #[macro_export] macro_rules! print { ($($arg:tt)*) => ($crate::helpers::_print(core::format_args!($($arg)*))); } /// Prints to the standard output of the UEFI boot service console, but with a /// newline. /// /// # Usage /// Use this similar to `println!` from the Rust standard library, but only /// as long as boot services have not been exited. /// /// You should never use this macro in a custom Logger ([`log::Log`] impl) to /// prevent a circular runtime dependency. /// /// # Panics /// Will panic if the system table's `stdout` is not set, or if writing fails. /// /// # Examples /// ``` /// println!(); /// println!("Hello World"); /// println!("Hello {}", "World"); /// ``` #[macro_export] macro_rules! println { () => ($crate::print!("\n")); ($($arg:tt)*) => ($crate::helpers::_print(core::format_args!("{}{}", core::format_args!($($arg)*), "\n"))); }