diff --git a/src/libos/src/entry.rs b/src/libos/src/entry.rs index e8b46a80..5e57d86d 100644 --- a/src/libos/src/entry.rs +++ b/src/libos/src/entry.rs @@ -5,6 +5,7 @@ use util::mem_util::from_untrusted::*; #[no_mangle] pub extern "C" fn libos_boot(path_buf: *const c_char, argv: *const *const c_char) -> i32 { + util::log::init(); let (path, args) = match parse_arguments(path_buf, argv) { Ok(path_and_args) => path_and_args, Err(_) => { diff --git a/src/libos/src/syscall/mod.rs b/src/libos/src/syscall/mod.rs index bf60348f..507c3d12 100644 --- a/src/libos/src/syscall/mod.rs +++ b/src/libos/src/syscall/mod.rs @@ -27,6 +27,7 @@ pub extern "C" fn dispatch_syscall( arg4: isize, arg5: isize, ) -> isize { + debug!("syscall {}: {:#x}, {:#x}, {:#x}, {:#x}, {:#x}, {:#x}", num, arg0, arg1, arg2, arg3, arg4, arg5); let ret = match num { SYS_open => do_open(arg0 as *const i8, arg1 as u32, arg2 as u32), SYS_close => do_close(arg0 as FileDesc), diff --git a/src/libos/src/util/log.rs b/src/libos/src/util/log.rs new file mode 100644 index 00000000..0c786d1c --- /dev/null +++ b/src/libos/src/util/log.rs @@ -0,0 +1,88 @@ +use log::*; + +pub fn init() { + static LOGGER: SimpleLogger = SimpleLogger; + 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, + }); +} + +struct SimpleLogger; + +impl Log for SimpleLogger { + fn enabled(&self, _metadata: &Metadata) -> bool { + true + } + fn log(&self, record: &Record) { + if self.enabled(record.metadata()) { + let color = Color::from(record.level()); + let (show, code) = color.to_console_code(); + println!("\u{1B}[{};{}m[{:>5}] {}\u{1B}[0m", + show, code + 30, record.level(), record.args()); + } + } + fn flush(&self) {} +} + +impl From for Color { + fn from(level: Level) -> Self { + match level { + Level::Error => Color::Red, + Level::Warn => Color::Yellow, + Level::Info => Color::Blue, + Level::Debug => Color::Green, + Level::Trace => Color::DarkGray, + } + } +} + +#[allow(dead_code)] +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +#[repr(u8)] +pub enum Color { + Black = 0, + Blue = 1, + Green = 2, + Cyan = 3, + Red = 4, + Magenta = 5, + Brown = 6, + LightGray = 7, + DarkGray = 8, + LightBlue = 9, + LightGreen = 10, + LightCyan = 11, + LightRed = 12, + Pink = 13, + Yellow = 14, + White = 15, +} + +impl Color { + fn to_console_code(&self) -> (u8, u8) { + match self { + Color::Black => (0, 0), + Color::Blue => (0, 4), + Color::Green => (0, 2), + Color::Cyan => (0, 6), + Color::Red => (0, 1), + Color::Magenta => (0, 5), + Color::Brown => (0, 3), + Color::LightGray => (1, 7), + Color::DarkGray => (0, 7), + Color::LightBlue => (1, 4), + Color::LightGreen => (1, 2), + Color::LightCyan => (1, 6), + Color::LightRed => (1, 1), + Color::Pink => (1, 5), + Color::Yellow => (1, 3), + Color::White => (1, 0), + } + } +} \ No newline at end of file diff --git a/src/libos/src/util/mod.rs b/src/libos/src/util/mod.rs index b408539c..20c084fb 100644 --- a/src/libos/src/util/mod.rs +++ b/src/libos/src/util/mod.rs @@ -3,3 +3,4 @@ use super::*; pub mod mem_util; pub mod mpx_util; pub mod ring_buf; +pub mod log;