vmm: move fw_cfg validation into PayloadConfig::validate()

Move FwCfgMissingKernel/Cmdline/Initramfs error variants from
ValidationError into PayloadConfigError. Change FwCfgConfig::validate()
to take &PayloadConfig instead of &VmConfig and return
PayloadConfigError. Wire the call through PayloadConfig::validate()
so both CLI and JSON API paths are covered.

Signed-off-by: Keith Adler <kadler@cloudflare.com>
This commit is contained in:
Keith Adler
2026-04-14 14:47:24 -05:00
committed by Rob Bradford
parent a10d9a3099
commit e4e3375a8d
2 changed files with 21 additions and 17 deletions

View File

@@ -373,18 +373,6 @@ pub enum ValidationError {
/// Invalid block device serial length
#[error("Block device serial length ({0}) exceeds maximum allowed length ({1})")]
InvalidSerialLength(usize, usize),
#[cfg(feature = "fw_cfg")]
/// FwCfg missing kernel
#[error("Error --fw-cfg-config: missing --kernel")]
FwCfgMissingKernel,
#[cfg(feature = "fw_cfg")]
/// FwCfg missing cmdline
#[error("Error --fw-cfg-config: missing --cmdline")]
FwCfgMissingCmdline,
#[cfg(feature = "fw_cfg")]
/// FwCfg missing initramfs
#[error("Error --fw-cfg-config: missing --initramfs")]
FwCfgMissingInitramfs,
#[cfg(feature = "ivshmem")]
/// Invalid Ivshmem input size
#[error("Invalid ivshmem input size")]
@@ -2038,14 +2026,13 @@ impl FwCfgConfig {
items,
})
}
pub fn validate(&self, vm_config: &VmConfig) -> ValidationResult<()> {
let payload = vm_config.payload.as_ref().unwrap();
pub fn validate(&self, payload: &PayloadConfig) -> std::result::Result<(), PayloadConfigError> {
if self.kernel && payload.kernel.is_none() {
return Err(ValidationError::FwCfgMissingKernel);
return Err(PayloadConfigError::FwCfgMissingKernel);
} else if self.cmdline && payload.cmdline.is_none() {
return Err(ValidationError::FwCfgMissingCmdline);
return Err(PayloadConfigError::FwCfgMissingCmdline);
} else if self.initramfs && payload.initramfs.is_none() {
return Err(ValidationError::FwCfgMissingInitramfs);
return Err(PayloadConfigError::FwCfgMissingInitramfs);
}
Ok(())
}

View File

@@ -747,6 +747,18 @@ pub enum PayloadConfigError {
/// Specifying a kernel or firmware is not supported when an igvm is provided.
#[error("Specifying a kernel or firmware is not supported when an igvm is provided")]
IgvmPlusOtherPayloads,
#[cfg(feature = "fw_cfg")]
/// FwCfg missing kernel
#[error("Error --fw-cfg-config: missing --kernel")]
FwCfgMissingKernel,
#[cfg(feature = "fw_cfg")]
/// FwCfg missing cmdline
#[error("Error --fw-cfg-config: missing --cmdline")]
FwCfgMissingCmdline,
#[cfg(feature = "fw_cfg")]
/// FwCfg missing initramfs
#[error("Error --fw-cfg-config: missing --initramfs")]
FwCfgMissingInitramfs,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
@@ -872,6 +884,11 @@ impl PayloadConfig {
(None, None) => Err(PayloadConfigError::MissingBootitem),
}?;
#[cfg(feature = "fw_cfg")]
if let Some(fw_cfg_config) = &self.fw_cfg_config {
fw_cfg_config.validate(self)?;
}
Ok(())
}
}