diff --git a/Cargo.lock b/Cargo.lock index 7d62e49..34fdcba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,12 +20,19 @@ version = "0.1.0" dependencies = [ "bit_field", "bitflags", + "log", "plain", "rbtree", "rustc-demangle", "seq-macro", ] +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + [[package]] name = "plain" version = "0.2.3" diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index dddd093..235e137 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -24,6 +24,7 @@ harness = false [dependencies] bit_field = "0.10.3" bitflags = "2.13.1" +log = { version = "0.4", default-features = false } seq-macro = "0.3.6" rbtree = { path = "../crates/rbtree" } diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 6664fbc..fb109f7 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -19,6 +19,7 @@ extern crate alloc; pub mod bits; pub mod limine; +pub mod logger; pub mod serial; pub mod sync; pub mod x86_64; diff --git a/kernel/src/logger.rs b/kernel/src/logger.rs new file mode 100644 index 0000000..dcaefdf --- /dev/null +++ b/kernel/src/logger.rs @@ -0,0 +1,25 @@ +use log::{LevelFilter, Log, Metadata, Record}; + +use crate::serial_println; + +pub struct SerialLogger; + +impl Log for SerialLogger { + fn enabled(&self, metadata: &Metadata<'_>) -> bool { + metadata.level() <= log::max_level() + } + + fn log(&self, record: &Record<'_>) { + if self.enabled(record.metadata()) { + serial_println!("[{:}] {}", record.level(), record.args()); + } + } + + fn flush(&self) {} +} + +pub fn init(max_level: LevelFilter) { + static LOGGER: SerialLogger = SerialLogger; + log::set_logger(&LOGGER).expect("logger already initialized"); + log::set_max_level(max_level); +} diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 9ba7f6d..7f9c3f8 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -22,7 +22,7 @@ static GDT: LazyLock = LazyLock::new(GlobalDescriptorTabl /// Entry point for the kernel #[unsafe(no_mangle)] extern "C" fn _start() -> ! { - kernel::serial_println!("Hello, world!"); + kernel::logger::init(log::LevelFilter::Trace); assert!(limine_requests::LIMINE_BASE_REVISION.is_supported()); _ = kernel::memory::HHDM_BASE @@ -56,7 +56,6 @@ extern "C" fn _start() -> ! { GDT.load(); IDT.load(); - unsafe { (0 as *mut u8).write_volatile(0x42) }; kernel::serial_println!("entry point: 0x{:x}", _start as *const () as usize); kernel::serial_println!(