diff --git a/vmm/src/config.rs b/vmm/src/config.rs index b2ae29a84..2cf80191d 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -209,6 +209,8 @@ pub enum Error { /// Failed Parsing FwCfgItem config #[error("Error parsing --fw-cfg-config items")] ParseFwCfgItem(#[source] OptionParserError), + #[error("Error parsing common PCI device config")] + ParsePciDeviceCommonConfig(#[source] OptionParserError), } #[derive(Debug, PartialEq, Eq, Error)] @@ -1197,6 +1199,35 @@ impl RateLimiterGroupConfig { } } +impl PciDeviceCommonConfig { + pub fn parse(input: &str) -> Result { + let mut parser = OptionParser::new(); + + parser.add("id").add("iommu").add("pci_segment"); + + parser + .parse_subset(input) + .map_err(Error::ParsePciDeviceCommonConfig)?; + + let id = parser.get("id"); + let iommu = parser + .convert::("iommu") + .map_err(Error::ParsePciDeviceCommonConfig)? + .unwrap_or(Toggle(false)) + .0; + let pci_segment = parser + .convert("pci_segment") + .map_err(Error::ParsePciDeviceCommonConfig)? + .unwrap_or_default(); + + Ok(Self { + id, + iommu, + pci_segment, + }) + } +} + impl DiskConfig { pub const SYNTAX: &'static str = "Disk parameters \ \"path=,readonly=on|off,direct=on|off,iommu=on|off,\