diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c60c4d3d6c..c765aea832 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10439,18 +10439,17 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt, goto error; } } - if (def->data.emulator.version == VIR_DOMAIN_TPM_VERSION_2_0) { - if ((nnodes = virXPathNodeSet("./backend/active_pcr_banks/*", ctxt, &nodes)) < 0) - break; - for (i = 0; i < nnodes; i++) { - if ((bank = virDomainTPMPcrBankTypeFromString((const char *)nodes[i]->name)) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported PCR banks '%s'"), - nodes[i]->name); - goto error; - } - def->data.emulator.activePcrBanks |= (1 << bank); + + if ((nnodes = virXPathNodeSet("./backend/active_pcr_banks/*", ctxt, &nodes)) < 0) + break; + for (i = 0; i < nnodes; i++) { + if ((bank = virDomainTPMPcrBankTypeFromString((const char *)nodes[i]->name)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported PCR banks '%s'"), + nodes[i]->name); + goto error; } + def->data.emulator.activePcrBanks |= (1 << bank); } break; case VIR_DOMAIN_TPM_TYPE_LAST: diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index e673e4b81a..d4d72037d5 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -2650,6 +2650,30 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu) return 0; } + +static int +virDomainTPMDevValidate(const virDomainTPMDef *tpm) +{ + switch (tpm->type) { + case VIR_DOMAIN_TPM_TYPE_EMULATOR: + if (tpm->data.emulator.activePcrBanks && + tpm->data.emulator.version != VIR_DOMAIN_TPM_VERSION_2_0) { + virReportError(VIR_ERR_XML_ERROR, + _(" requires TPM version '%s'"), + virDomainTPMVersionTypeToString(VIR_DOMAIN_TPM_VERSION_2_0)); + return -1; + } + break; + + case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: + case VIR_DOMAIN_TPM_TYPE_LAST: + break; + } + + return 0; +} + + static int virDomainDeviceInfoValidate(const virDomainDeviceDef *dev) { @@ -2754,12 +2778,14 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_IOMMU: return virDomainIOMMUDefValidate(dev->data.iommu); + case VIR_DOMAIN_DEVICE_TPM: + return virDomainTPMDevValidate(dev->data.tpm); + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_HUB: case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: - case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: