openhcl_boot/
boot_logger.rs1#[cfg(target_arch = "x86_64")]
12use crate::arch::tdx::TdxIoAccess;
13use crate::host_params::shim_params::IsolationType;
14use crate::single_threaded::SingleThreaded;
15use core::cell::RefCell;
16use core::fmt;
17use core::fmt::Write;
18#[cfg(target_arch = "x86_64")]
19use minimal_rt::arch::InstrIoAccess;
20use minimal_rt::arch::Serial;
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24pub enum LoggerType {
25 Serial,
26}
27
28enum Logger {
29 #[cfg(target_arch = "x86_64")]
30 Serial(Serial<InstrIoAccess>),
31 #[cfg(target_arch = "aarch64")]
32 Serial(Serial),
33 #[cfg(target_arch = "x86_64")]
34 TdxSerial(Serial<TdxIoAccess>),
35 None,
36}
37
38impl Logger {
39 fn write_str(&mut self, s: &str) -> fmt::Result {
40 match self {
41 Logger::Serial(serial) => serial.write_str(s),
42 #[cfg(target_arch = "x86_64")]
43 Logger::TdxSerial(serial) => serial.write_str(s),
44 Logger::None => Ok(()),
45 }
46 }
47}
48
49pub struct BootLogger {
50 logger: SingleThreaded<RefCell<Logger>>,
51}
52
53pub static BOOT_LOGGER: BootLogger = BootLogger {
54 logger: SingleThreaded(RefCell::new(Logger::None)),
55};
56
57pub fn boot_logger_init(isolation_type: IsolationType, logger_type: LoggerType) {
62 let mut logger = BOOT_LOGGER.logger.borrow_mut();
63
64 *logger = match (isolation_type, logger_type) {
65 #[cfg(target_arch = "x86_64")]
66 (IsolationType::None, LoggerType::Serial) => Logger::Serial(Serial::init(InstrIoAccess)),
67 #[cfg(target_arch = "aarch64")]
68 (IsolationType::None, LoggerType::Serial) => Logger::Serial(Serial::init()),
69 #[cfg(target_arch = "x86_64")]
70 (IsolationType::Tdx, LoggerType::Serial) => Logger::TdxSerial(Serial::init(TdxIoAccess)),
71 _ => Logger::None,
72 };
73}
74
75impl Write for &BootLogger {
76 fn write_str(&mut self, s: &str) -> fmt::Result {
77 self.logger.borrow_mut().write_str(s)
78 }
79}
80
81macro_rules! log {
87 () => {};
88 ($($arg:tt)*) => {
89 {
90 use core::fmt::Write;
91 let _ = writeln!(&$crate::boot_logger::BOOT_LOGGER, $($arg)*);
92 }
93 };
94}
95
96pub(crate) use log;
97
98#[expect(unused_macros)]
105macro_rules! debug_log {
106 ($($arg:tt)*) => {
107 $crate::boot_logger::log!($($arg)*)
108 };
109}
110
111#[expect(unused_imports)]
114pub(crate) use debug_log;