diff --git a/Cargo.lock b/Cargo.lock index f721321..ca0229b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,10 +2,17 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + [[package]] name = "os" version = "0.1.0" dependencies = [ + "log", "sbi-rt", ] diff --git a/Cargo.toml b/Cargo.toml index 61fc07a..534f0dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,5 @@ version = "0.1.0" edition = "2021" [dependencies] +log = "0.4.22" sbi-rt = "0.0.3" diff --git a/src/logger.rs b/src/logger.rs new file mode 100644 index 0000000..5b720e7 --- /dev/null +++ b/src/logger.rs @@ -0,0 +1,42 @@ +use log::{Level, LevelFilter, Log}; + +use crate::println; + +struct Logger; + +impl Log for Logger { + fn enabled(&self, _metadata: &log::Metadata) -> bool { + true + } + + fn log(&self, record: &log::Record) { + if !self.enabled(record.metadata()) { + return; + } + + let (color, level) = match record.level() { + Level::Error => (31, "ERR"), + Level::Warn => (93, "WRN"), + Level::Info => (34, "INF"), + Level::Debug => (32, "DBG"), + Level::Trace => (90, "TRC"), + }; + + println!("\x1b[{}m{}\x1b[0m \x1b[1m{}\x1b[0m {}", color, level, record.target(), record.args()); + } + + fn flush(&self) {} +} + +pub fn init() { + static LOGGER: Logger = Logger; + log::set_logger(&LOGGER).unwrap(); + log::set_max_level(match option_env!("LOG") { + Some("ERROR") => LevelFilter::Error, + Some("WARN") => LevelFilter::Warn, + Some("INFO") => LevelFilter::Info, + Some("DEBUG") => LevelFilter::Debug, + Some("TRACE") => LevelFilter::Trace, + _ => LevelFilter::Off, + }); +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index d4dcc6e..b5d403f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,24 +3,30 @@ mod lang_items; mod sbi; +mod logger; #[macro_use] mod console; use core::arch::global_asm; +use log::{debug, error, info, trace, warn}; + global_asm!(include_str!("entry.asm")); #[no_mangle] pub fn rust_main() -> ! { clear_bss(); + logger::init(); sbi::console_write_byte('O' as u8); sbi::console_write_byte('K' as u8); sbi::console_write_byte('\n' as u8); - sbi::console_write("Hello World.\n".as_bytes()); - - println!("hello world from macro"); + trace!("Hello World."); + debug!("Hello World."); + info!("Hello World."); + warn!("Hello World."); + error!("Hello World."); panic!("Shutdown machine!"); }