good_os_framework/drivers/
serial.rs

1use core::fmt::{self, Write};
2use spin::{Lazy, Mutex};
3use uart_16550::SerialPort;
4use x86_64::instructions::interrupts;
5
6/// Print something to the serial port.
7#[macro_export]
8macro_rules! serial_print {
9    ($($arg: tt)*) => ($crate::drivers::serial::_print(format_args!($($arg)*)));
10}
11
12/// Print something to the serial port, appending a newline.
13#[macro_export]
14macro_rules! serial_println {
15    () => ($crate::serial_print!("\n"));
16    ($($arg: tt)*) => ($crate::serial_print!("{}\n", format_args!($($arg)*)));
17}
18
19#[doc(hidden)]
20pub fn _print(args: fmt::Arguments) {
21    interrupts::without_interrupts(|| {
22        SERIAL.lock().write_fmt(args).unwrap();
23    });
24}
25
26pub static SERIAL: Lazy<Mutex<SerialPort>> = Lazy::new(|| {
27    let mut serial_port = unsafe { SerialPort::new(0x3f8) };
28    serial_port.init();
29    Mutex::new(serial_port)
30});