blob: 35972f4152bd35b4e5dbc0deedc98dabe64238f8 [file] [log] [blame] [edit]
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")));
}