1use crate::dev::x86_64::serial::Com1Sink;
4use crate::spinlock::SpinLock;
5use core::fmt::Write;
6
7static mut SERIAL: SpinLock<Com1Sink> = SpinLock::new(Com1Sink::new());
9
10#[doc(hidden)]
11#[unsafe(no_mangle)]
12pub fn _print(fmt: core::fmt::Arguments<'_>) {
15 let mut guard = unsafe { SERIAL.lock() };
16 let _ = write!(&mut *guard, "{fmt}");
17 guard.unlock();
18}
19
20#[doc(hidden)]
24pub unsafe fn force_unlock_serial() {
25 unsafe {
26 SERIAL = SpinLock::new(Com1Sink::new());
27 }
28}
29
30#[macro_export]
35macro_rules! print {
36 ($($arg:tt)*) => ($crate::kprint::_print(format_args!($($arg)*)));
37}
38
39#[macro_export]
44macro_rules! println {
45 () => ($crate::print!("\n"));
46 ($($arg:tt)*) => ($crate::print!("{}\n", format_args!($($arg)*)));
47}
48
49#[macro_export]
54macro_rules! info {
55 () => (if !$crate::QUITE.load(core::sync::atomic::Ordering::SeqCst) { $crate::print!("[INFO]\n") });
56 ($($arg:tt)*) => (if !$crate::QUITE.load(core::sync::atomic::Ordering::SeqCst) { $crate::print!("[INFO] {}\n", format_args!($($arg)*)) });
57}
58
59#[macro_export]
64macro_rules! warning {
65 () => (if !$crate::QUITE.load(core::sync::atomic::Ordering::SeqCst) { $crate::print!("[WARN]\n") });
66 ($($arg:tt)*) => (if !$crate::QUITE.load(core::sync::atomic::Ordering::SeqCst) { $crate::print!("[WARN] {}\n", format_args!($($arg)*)) });
67}
68
69#[macro_export]
74macro_rules! debug {
75 () => (if !$crate::QUITE.load(core::sync::atomic::Ordering::SeqCst) { $crate::print!("[DEBUG]\n") });
76 ($($arg:tt)*) => (if !$crate::QUITE.load(core::sync::atomic::Ordering::SeqCst) { $crate::print!("[DEBUG] {}\n", format_args!($($arg)*))} );
77}