use core::fmt; #[cfg(feature = "qemu_debug")] use spin::Mutex; use spin::MutexGuard; use crate::devices::serial::SerialKind; #[cfg(feature = "lpss_debug")] use crate::devices::uart_16550::SerialPort; #[cfg(feature = "lpss_debug")] use crate::syscall::io::Mmio; #[cfg(feature = "qemu_debug")] use crate::syscall::io::Pio; use crate::{ devices::graphical_debug::{DebugDisplay, DEBUG_DISPLAY}, log::{Log, LOG}, }; #[cfg(feature = "qemu_debug")] use syscall::io::Io; use super::device::serial::COM1; #[cfg(feature = "lpss_debug")] use super::device::serial::LPSS; #[cfg(feature = "system76_ec_debug")] use super::device::system76_ec::{System76Ec, SYSTEM76_EC}; #[cfg(feature = "qemu_debug")] pub static QEMU: Mutex> = Mutex::new(Pio::::new(0x402)); pub struct Writer<'a> { log: MutexGuard<'a, Option>, display: MutexGuard<'a, Option>, #[cfg(feature = "lpss_debug")] lpss: MutexGuard<'a, Option>, #[cfg(feature = "qemu_debug")] qemu: MutexGuard<'a, Pio>, serial: MutexGuard<'a, Option>, #[cfg(feature = "system76_ec_debug")] system76_ec: MutexGuard<'a, Option>, } impl<'a> Writer<'a> { pub fn new() -> Writer<'a> { Writer { log: LOG.lock(), display: DEBUG_DISPLAY.lock(), #[cfg(feature = "lpss_debug")] lpss: LPSS.lock(), #[cfg(feature = "qemu_debug")] qemu: QEMU.lock(), serial: COM1.lock(), #[cfg(feature = "system76_ec_debug")] system76_ec: SYSTEM76_EC.lock(), } } pub fn write(&mut self, buf: &[u8], preserve: bool) { if preserve { if let Some(ref mut log) = *self.log { log.write(buf); } } if let Some(ref mut display) = *self.display { display.write(buf); } #[cfg(feature = "lpss_debug")] { if let Some(ref mut lpss) = *self.lpss { lpss.write(buf); } } #[cfg(feature = "qemu_debug")] { for &b in buf { self.qemu.write(b); } } if let Some(serial) = &mut *self.serial { serial.write(buf) } #[cfg(feature = "system76_ec_debug")] { if let Some(ref mut system76_ec) = *self.system76_ec { system76_ec.print_slice(buf); } } } } impl<'a> fmt::Write for Writer<'a> { fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { self.write(s.as_bytes(), true); Ok(()) } }