diff --git a/bin/propolis-server/src/lib/initializer.rs b/bin/propolis-server/src/lib/initializer.rs index ed8694334..4594b9dcf 100644 --- a/bin/propolis-server/src/lib/initializer.rs +++ b/bin/propolis-server/src/lib/initializer.rs @@ -267,6 +267,7 @@ impl<'a> MachineInitializer<'a> { } pub fn initialize_qemu_debug_port(&self) -> Result<(), Error> { + // TODO: Make the output file configurable let dbg = QemuDebugPort::create(&self.machine.bus_pio); let debug_file = std::fs::File::create("debug.out")?; let poller = chardev::BlockingFileOutput::new(debug_file); diff --git a/bin/propolis-standalone/README.md b/bin/propolis-standalone/README.md index fa6048bde..ca6bd4aee 100644 --- a/bin/propolis-standalone/README.md +++ b/bin/propolis-standalone/README.md @@ -16,6 +16,8 @@ name = "testvm" cpus = 4 bootrom = "/path/to/bootrom/OVMF_CODE.fd" memory = 1024 +# File path to store qemu debug port output (optional) +# qemu_debug_file = "/path/to/output" [block_dev.alpine_iso] type = "file" diff --git a/bin/propolis-standalone/src/main.rs b/bin/propolis-standalone/src/main.rs index 0716665d5..1d7df9793 100644 --- a/bin/propolis-standalone/src/main.rs +++ b/bin/propolis-standalone/src/main.rs @@ -834,10 +834,20 @@ fn setup_instance( ps2_ctrl.attach(pio, chipset.as_ref()); inv.register(&ps2_ctrl)?; - let debug_file = std::fs::File::create("debug.out")?; - let debug_out = chardev::BlockingFileOutput::new(debug_file); + // Qemu debug IO port let debug_device = hw::qemu::debug::QemuDebugPort::create(pio); - debug_out.attach(Arc::clone(&debug_device) as Arc); + match &config.main.qemu_debug_file { + Some(path) => { + let debug_file = std::fs::File::create(path)?; + let debug_out = chardev::BlockingFileOutput::new(debug_file); + debug_out + .attach(Arc::clone(&debug_device) as Arc); + } + None => { + // Send output bytes to the bit bucket + debug_device.set_consumer(Some(chardev::null_blocking_consumer())); + } + }; inv.register(&debug_device)?; for (name, dev) in config.devices.iter() { diff --git a/crates/propolis-standalone-config/src/lib.rs b/crates/propolis-standalone-config/src/lib.rs index ded94903a..8eb33cabc 100644 --- a/crates/propolis-standalone-config/src/lib.rs +++ b/crates/propolis-standalone-config/src/lib.rs @@ -3,6 +3,7 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use std::collections::BTreeMap; +use std::path::PathBuf; use serde::{Deserialize, Serialize}; use strum::FromRepr; @@ -50,6 +51,7 @@ pub struct Main { pub bootrom: String, pub memory: usize, pub use_reservoir: Option, + pub qemu_debug_file: Option, pub cpuid_profile: Option, } diff --git a/lib/propolis/src/chardev/mod.rs b/lib/propolis/src/chardev/mod.rs index d27689619..2c4e38fff 100644 --- a/lib/propolis/src/chardev/mod.rs +++ b/lib/propolis/src/chardev/mod.rs @@ -105,3 +105,10 @@ impl ConsumerCell { } } } + +/// Build a [`BlockingSourceConsumer`] which silently consumes any output bytes +pub fn null_blocking_consumer() -> BlockingSourceConsumer { + Box::new(|_buf| { + // Simply do nothing with the buffer + }) +}