use core::fmt::{Arguments, Result, Write};
#[def_interface(gen_caller)]
pub trait ConsoleIf {
fn write_bytes(bytes: &[u8]);
fn read_bytes(bytes: &mut [u8]) -> usize;
}
struct EarlyConsole;
impl Write for EarlyConsole {
fn write_str(&mut self, s: &str) -> Result {
write_bytes(s.as_bytes());
Ok(())
}
}
pub static CONSOLE_LOCK: kspin::SpinNoIrq<()> = kspin::SpinNoIrq::new(());
#[macro_export]
macro_rules! console_print {
($($arg:tt)*) => {
$crate::console::__simple_print(format_args!($($arg)*));
}
}
#[macro_export]
macro_rules! console_println {
() => { $crate::ax_print!("\n") };
($($arg:tt)*) => {
$crate::console::__simple_print(format_args!("{}\n", format_args!($($arg)*)));
}
}
#[doc(hidden)]
pub fn __simple_print(fmt: Arguments) {
let _guard = CONSOLE_LOCK.lock();
EarlyConsole.write_fmt(fmt).unwrap();
drop(_guard);
}