From 8ec5a248cdf32946b24f9a1e0d9650a22b05ac53 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Mon, 15 Aug 2022 15:41:38 +0100 Subject: [PATCH] main, vmm: Add option to pass firmware parameter in payload Signed-off-by: Rob Bradford --- src/main.rs | 20 +++++++++++++------- vmm/src/config.rs | 11 ++++++++--- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index ab9d13e2d..8725129a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -192,11 +192,18 @@ fn create_app<'a>( .min_values(1) .group("vm-config"), ) + .arg( + Arg::new("firmware") + .long("firmware") + .help("Path to firmware that is loaded in an architectural specific way") + .takes_value(true) + .group("vm-config"), + ) .arg( Arg::new("kernel") .long("kernel") .help( - "Path to loaded kernel. This may be a kernel or firmware that supports a PVH \ + "Path to kernel to load. This may be a kernel or firmware that supports a PVH \ entry point (e.g. vmlinux) or architecture equivalent", ) .takes_value(true) @@ -567,16 +574,15 @@ fn start_vmm(cmd_arguments: ArgMatches) -> Result, Error> { ) .map_err(Error::StartVmmThread)?; + let payload_present = + cmd_arguments.is_present("kernel") || cmd_arguments.is_present("firmware"); + // Can't test for "vm-config" group as some have default values. The kernel (or tdx if enabled) // is the only required option for booting the VM. #[cfg(feature = "tdx")] - let tdx_or_kernel_present = - cmd_arguments.is_present("kernel") || cmd_arguments.is_present("tdx"); + let payload_present = payload_present || cmd_arguments.is_present("tdx"); - #[cfg(not(feature = "tdx"))] - let tdx_or_kernel_present = cmd_arguments.is_present("kernel"); - - if tdx_or_kernel_present { + if payload_present { let vm_params = config::VmParams::from_arg_matches(&cmd_arguments); let vm_config = config::VmConfig::parse(vm_params).map_err(Error::ParsingConfig)?; diff --git a/vmm/src/config.rs b/vmm/src/config.rs index deba1c576..9d72f8feb 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -343,6 +343,7 @@ pub struct VmParams<'a> { pub cpus: &'a str, pub memory: &'a str, pub memory_zones: Option>, + pub firmware: Option<&'a str>, pub kernel: Option<&'a str>, pub initramfs: Option<&'a str>, pub cmdline: Option<&'a str>, @@ -377,11 +378,10 @@ impl<'a> VmParams<'a> { let memory_zones: Option> = args.values_of("memory-zone").map(|x| x.collect()); let rng = args.value_of("rng").unwrap(); let serial = args.value_of("serial").unwrap(); - + let firmware = args.value_of("firmware"); let kernel = args.value_of("kernel"); let initramfs = args.value_of("initramfs"); let cmdline = args.value_of("cmdline"); - let disks: Option> = args.values_of("disk").map(|x| x.collect()); let net: Option> = args.values_of("net").map(|x| x.collect()); let console = args.value_of("console").unwrap(); @@ -405,6 +405,7 @@ impl<'a> VmParams<'a> { cpus, memory, memory_zones, + firmware, kernel, initramfs, cmdline, @@ -2250,6 +2251,8 @@ impl RestoreConfig { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] pub struct PayloadConfig { + #[serde(default)] + pub firmware: Option, #[serde(default)] pub kernel: Option, #[serde(default)] @@ -2334,6 +2337,7 @@ impl VmConfig { Some(self.cmdline.args.drain(..).collect()) }, initramfs: self.initramfs.take().map(|i| i.path), + ..Default::default() }) } @@ -2671,11 +2675,12 @@ impl VmConfig { numa = Some(numa_config_list); } - let payload = if vm_params.kernel.is_some() { + let payload = if vm_params.kernel.is_some() || vm_params.firmware.is_some() { Some(PayloadConfig { kernel: vm_params.kernel.map(PathBuf::from), initramfs: vm_params.initramfs.map(PathBuf::from), cmdline: vm_params.cmdline.map(|s| s.to_string()), + firmware: vm_params.firmware.map(PathBuf::from), }) } else { None