Skip to main content

kernel/kprint/receivers/
uart.rs

1// SPDX-License-Identifier: GPL-3.0-only
2//! UART KPrint Receiver, receives kprint output to log to serial UART
3//!
4//! Authors: MarioS271
5
6use super::KPrintReceiver;
7use crate::drivers::tty::uart::UartOps;
8use crate::kprint::log_entry::{LogEntryHeader, LogLevel};
9use crate::kprint::state::KPrintState;
10use crate::state::simple_state::SIMPLE_STATE;
11
12pub struct UartReceiver;
13
14impl KPrintReceiver for UartReceiver {
15    fn receive(_state: &mut KPrintState, header: &LogEntryHeader, text: &str) {
16        if !SIMPLE_STATE.is_uart_initialized() {
17            return;
18        }
19
20        let log_level = LogLevel::from_u8(header.flags_and_level.get(
21            LogEntryHeader::LEVEL_START_BIT,
22            LogEntryHeader::LEVEL_NUM_BITS
23        ));
24        if log_level.is_none() { return; }
25        let log_level_letter = log_level.unwrap().get_letter();
26
27        // Safety: was initialized in stage 0
28        let mut lock = unsafe { SIMPLE_STATE.uart().lock() };
29        let _ = lock.write_byte(log_level_letter);
30        let _ = lock.write_byte(b' ');
31        let _ = lock.write_string(text);
32    }
33}