1use core::fmt::{Arguments, Result, Write};
4
5#[def_plat_interface]
7pub trait ConsoleIf {
8 fn write_bytes(bytes: &[u8]);
10
11 fn read_bytes(bytes: &mut [u8]) -> usize;
15
16 #[cfg(feature = "irq")]
20 fn irq_num() -> Option<usize>;
21}
22
23struct EarlyConsole;
24
25impl Write for EarlyConsole {
26 fn write_str(&mut self, s: &str) -> Result {
27 write_bytes(s.as_bytes());
28 Ok(())
29 }
30}
31
32pub static CONSOLE_LOCK: ax_kspin::SpinNoIrq<()> = ax_kspin::SpinNoIrq::new(());
34
35#[macro_export]
37macro_rules! console_print {
38 ($($arg:tt)*) => {
39 $crate::console::__simple_print(format_args!($($arg)*));
40 }
41}
42
43#[macro_export]
45macro_rules! console_println {
46 () => { $crate::ax_print!("\n") };
47 ($($arg:tt)*) => {
48 $crate::console::__simple_print(format_args!("{}\n", format_args!($($arg)*)));
49 }
50}
51
52#[doc(hidden)]
53pub fn __simple_print(fmt: Arguments) {
54 let _guard = CONSOLE_LOCK.lock();
55 EarlyConsole.write_fmt(fmt).unwrap();
56 drop(_guard);
57}