diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 1a3042c86..f790b74c6 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -31,7 +31,7 @@ jobs: # ld to work, so build all the objects without performing the # final linking step. - name: Build - run: make FEATURES="default,enable-gdb" stage1/stage1.o stage1/reset.o + run: make FEATURES="default-debug,enable-gdb" stage1/stage1.o stage1/reset.o - name: Run tests run: make test diff --git a/Cargo.toml b/Cargo.toml index 4b5214c5e..f72d3f194 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,8 @@ packit = { git = "https://github.com/coconut-svsm/packit", version = "0.1.0" } cc = "1.0.46" [features] -default = ["enable-stacktrace"] +default-release = ["enable-stacktrace"] +default-debug = ["enable-stacktrace", "enable-console-log"] enable-stacktrace = [] enable-gdb = [] +enable-console-log = [] diff --git a/Makefile b/Makefile index 83d528a9d..773ca1f28 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,12 @@ -FEATURES ?= "default" -CARGO_ARGS = --features ${FEATURES} - ifdef RELEASE TARGET_PATH="release" +FEATURES ?= "default-release" +CARGO_ARGS = --features ${FEATURES} CARGO_ARGS += --release else TARGET_PATH="debug" +FEATURES ?= "default-debug" +CARGO_ARGS = --features ${FEATURES} endif diff --git a/src/line_buffer.rs b/src/line_buffer.rs index 219e4c710..892ca6afe 100644 --- a/src/line_buffer.rs +++ b/src/line_buffer.rs @@ -1,3 +1,6 @@ +#[cfg(feature = "enable-console-log")] +use crate::console::_print; + use crate::cpu::percpu::this_cpu_mut; use crate::log_buffer::LB; use crate::utils::immut_after_init::ImmutAfterInitCell; @@ -67,32 +70,42 @@ impl log::Log for BufferLogger { } fn log(&self, record: &log::Record) { - let component: &'static str = &self.component; + let comp: &'static str = &self.component; let line_buf: &mut LineBuffer = this_cpu_mut().get_line_buffer(); // Log format/detail depends on the level. + let rec_args = record.args(); + let lvl = record.metadata().level().as_str(); + let target = record.metadata().target(); match record.metadata().level() { - log::Level::Error | log::Level::Warn => write!( - line_buf, - "[{}] {}: {}\n", - component, - record.metadata().level().as_str(), - record.args() - ) - .expect("write error"), + log::Level::Error | log::Level::Warn => { + line_buf + .write_fmt(format_args!("[{}] {}: {}\n", comp, lvl, rec_args)) + .unwrap(); + #[cfg(feature = "enable-console-log")] + { + _print(format_args!("[{}] {}: {}\n", comp, lvl, rec_args)); + } + } log::Level::Info => { - write!(line_buf, "[{}] {}\n", component, record.args()).expect("write error") + line_buf + .write_fmt(format_args!("[{}] {}\n", comp, rec_args)) + .unwrap(); + #[cfg(feature = "enable-console-log")] + { + _print(format_args!("[{}] {}\n", comp, rec_args)); + } } - log::Level::Debug | log::Level::Trace => write!( - line_buf, - "[{}/{}] {} {}\n", - component, - record.metadata().target(), - record.metadata().level().as_str(), - record.args() - ) - .expect("write error"), + log::Level::Debug | log::Level::Trace => { + line_buf + .write_fmt(format_args!("[{}/{}] {} {}\n", comp, target, lvl, rec_args)) + .unwrap(); + #[cfg(feature = "enable-console-log")] + { + _print(format_args!("[{}/{}] {} {}\n", comp, target, lvl, rec_args)); + } + } } } diff --git a/src/stage2.rs b/src/stage2.rs index e5b2633a2..9bf1646d9 100644 --- a/src/stage2.rs +++ b/src/stage2.rs @@ -104,7 +104,12 @@ fn setup_env() { unsafe { WRITER.lock().set(&mut CONSOLE_SERIAL); } - init_console(); + + #[cfg(feature = "enable-console-log")] + { + init_console(); + } + init_log_buffer(); if let Err(_) = install_buffer_logger("Stage2") { panic!("log buffer installation error") diff --git a/src/svsm.rs b/src/svsm.rs index 494a4b936..4e2cae466 100644 --- a/src/svsm.rs +++ b/src/svsm.rs @@ -390,7 +390,11 @@ pub extern "C" fn svsm_start(li: &KernelLaunchInfo, mi: &MigrateInfo) { if let Err(_) = install_buffer_logger("SVSM") { panic!("log buffer installation error") } - init_console(); + + #[cfg(feature = "enable-console-log")] + { + init_console(); + } log::info!("COCONUT Secure Virtual Machine Service Module (SVSM)");