logger.rs 983 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. //! Log implementation using the UART.
  2. use core::fmt::Write;
  3. use log::{LevelFilter, Log, Metadata, Record, SetLoggerError};
  4. use spin::mutex::SpinMutex;
  5. use uart_16550::SerialPort;
  6. static LOGGER: Logger = Logger {
  7. uart: SpinMutex::new(None),
  8. };
  9. struct Logger {
  10. uart: SpinMutex<Option<SerialPort>>,
  11. }
  12. /// Initialises UART logger.
  13. pub fn init(max_level: LevelFilter) -> Result<(), SetLoggerError> {
  14. // Safe because `0x3f8` is COM1 I/O port.
  15. let mut uart = unsafe { SerialPort::new(0x3f8) };
  16. uart.init();
  17. LOGGER.uart.lock().replace(uart);
  18. log::set_logger(&LOGGER)?;
  19. log::set_max_level(max_level);
  20. Ok(())
  21. }
  22. impl Log for Logger {
  23. fn enabled(&self, _metadata: &Metadata) -> bool {
  24. true
  25. }
  26. fn log(&self, record: &Record) {
  27. writeln!(
  28. LOGGER.uart.lock().as_mut().unwrap(),
  29. "[{}] {}",
  30. record.level(),
  31. record.args()
  32. )
  33. .unwrap();
  34. }
  35. fn flush(&self) {}
  36. }