From 48ca218dd04806847f86fd67e644da6380eb9173 Mon Sep 17 00:00:00 2001 From: Erin Date: Sun, 4 Jun 2017 11:27:14 -0500 Subject: [PATCH] Implement a `log` backend which writes to the VGA console --- Cargo.lock | 6 ++++++ Cargo.toml | 3 +++ src/lib.rs | 4 ++++ src/logger.rs | 28 ++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 src/logger.rs diff --git a/Cargo.lock b/Cargo.lock index 5c4e104..87aac22 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,7 @@ name = "sparkle_os" version = "0.1.0" dependencies = [ + "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "rlibc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "volatile 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -33,6 +34,10 @@ version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "log" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + name = "num" version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -208,6 +213,7 @@ dependencies = [ "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum csv 0.14.7 (registry+https://github.com/rust-lang/crates.io-index)" = "266c1815d7ca63a5bd86284043faf91e8c95e943e55ce05dc0ae08e952de18bc" "checksum libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)" = "e7eb6b826bfc1fdea7935d46556250d1799b7fe2d9f7951071f4291710665e3e" +"checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" "checksum num 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "98b15ba84e910ea7a1973bccd3df7b31ae282bf9d8bd2897779950c9b8303d40" "checksum num-bigint 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "ba6d838b16e56da1b6c383d065ff1ec3c7d7797f65a3e8f6ba7092fd87820bac" "checksum num-complex 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "148eb324ca772230853418731ffdf13531738b50f89b30692a01fcdcb0a64677" diff --git a/Cargo.toml b/Cargo.toml index 8c851f6..c2de024 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,6 @@ rlibc = "1.0" spin = "0.4.5" volatile = "0.2" x86 = "0.8" +[dependencies.log] +version = "0.3" +default-features = false diff --git a/src/lib.rs b/src/lib.rs index 741fb7b..72e877d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,8 @@ #![feature(lang_items)] #![no_std] +#[macro_use] +extern crate log; extern crate rlibc; extern crate spin; extern crate volatile; @@ -12,6 +14,7 @@ mod arch; #[macro_use] mod macros; mod misc; +mod logger; use arch::x86_64::device::vga_console; @@ -25,6 +28,7 @@ pub extern fn kernel_main() { vga_console::WRITER.lock().clear_screen(); println!("--- Sparkle v{} booting! ---", ::misc::VERSION); + logger::init().expect("Logger failed to launch!"); loop {} diff --git a/src/logger.rs b/src/logger.rs new file mode 100644 index 0000000..36aab98 --- /dev/null +++ b/src/logger.rs @@ -0,0 +1,28 @@ +//! A basic console logging backend for the `log` crate. + +use log; +use log::{Log, LogRecord, LogLevel, LogLevelFilter, LogMetadata}; +use log::{SetLoggerError}; + +pub fn init() -> Result<(), SetLoggerError> { + unsafe { + log::set_logger_raw(|max_log_level| { + static LOGGER: ConsoleLogger = ConsoleLogger; + max_log_level.set(LogLevelFilter::Info); + &ConsoleLogger + }) + } +} + +struct ConsoleLogger; +impl Log for ConsoleLogger { + fn enabled(&self, metadata: &LogMetadata) -> bool { + metadata.level() <= LogLevel::Info + } + + fn log(&self, record: &LogRecord) { + if self.enabled(record.metadata()) { + println!("{} - {}", record.level(), record.args()); + } + } +}