[PATCH v5 06/10] qemu: add validations after TPM Proxy model introduction

Stefan Berger stefanb at linux.ibm.com
Wed May 27 18:46:51 UTC 2020


On 5/21/20 9:07 AM, Daniel Henrique Barboza wrote:
> Previous patch handled the conversion of def->tpm to the
> array def->tpms and the XML parsing logic. This patch handles
> the validations needed to ensure the intended behavior.
>
> The existing qemuValidateDomainDeviceDefTPM() function was updated
> to guarantee that the VIR_DOMAIN_TPM_MODEL_SPAPR_PROXY model is
> exclusive to PPC64 guests and to the VIR_DOMAIN_TPM_TYPE_PASSTHROUGH
> backend.
>
> A new function called qemuDomainDefTPMsPostParse() was added to guarantee
> that the following combinations in the same domain are valid:
>
> - a single TPM device
> - a single TPM Proxy device
> - a single TPM + single TPM Proxy devices
>
> And these combinations in the same domain are NOT valid:
>
> - 2 or more TPM devices
> - 2 or more TPM Proxy devices
>
> Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
> ---
>   src/qemu/qemu_domain.c   | 37 +++++++++++++++++++++++++++++++++++++
>   src/qemu/qemu_validate.c | 19 +++++++++++++++++++
>   2 files changed, 56 insertions(+)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 3173fc3a3b..b1b50f05d4 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -4953,6 +4953,40 @@ qemuDomainDefTsegPostParse(virDomainDefPtr def,
>   }
>   
>   
> +static int
> +qemuDomainDefTPMsPostParse(virDomainDefPtr def)
> +{
> +    virDomainTPMDefPtr proxyTPM = NULL;
> +    virDomainTPMDefPtr regularTPM = NULL;
> +    size_t i;
> +
> +    if (def->ntpms < 2)
> +        return 0;
> +
> +    for (i = 0; i < def->ntpms; i++) {
> +        virDomainTPMDefPtr tpm = def->tpms[i];
> +
> +        if (tpm->model == VIR_DOMAIN_TPM_MODEL_SPAPR_PROXY) {
> +            if (proxyTPM) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                               _("only a single TPM Proxy device is supported"));
> +                return -1;
> +            } else {
> +                proxyTPM = tpm;
> +            }
> +        } else if (regularTPM) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("only a single TPM non-proxy device is supported"));
> +            return -1;
> +        } else {
> +            regularTPM = tpm;
> +        }
> +    }
> +
> +    return 0;
> +}
> +
> +
>   static int
>   qemuDomainDefPostParseBasic(virDomainDefPtr def,
>                               void *opaque G_GNUC_UNUSED)
> @@ -5039,6 +5073,9 @@ qemuDomainDefPostParse(virDomainDefPtr def,
>       if (qemuDomainDefTsegPostParse(def, qemuCaps) < 0)
>           return -1;
>   
> +    if (qemuDomainDefTPMsPostParse(def) < 0)
> +        return -1;
> +
>       return 0;
>   }
>   
> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index 584d1375b8..28e02ebefc 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -3623,6 +3623,25 @@ qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm,
>       case VIR_DOMAIN_TPM_MODEL_SPAPR:
>           flag = QEMU_CAPS_DEVICE_TPM_SPAPR;
>           break;
> +    case VIR_DOMAIN_TPM_MODEL_SPAPR_PROXY:
> +        if (!ARCH_IS_PPC64(def->os.arch)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("TPM Proxy model %s is only available for "
> +                             "PPC64 guests"),
> +                          virDomainTPMModelTypeToString(tpm->model));
> +            return -1;
> +        }
> +
> +        /* TPM Proxy devices have 'passthrough' backend */
> +        if (tpm->type != VIR_DOMAIN_TPM_TYPE_PASSTHROUGH) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("TPM Proxy model %s requires "
> +                             "'Passthrough' backend"),
> +                            virDomainTPMModelTypeToString(tpm->model));
> +        }
> +
> +        flag = QEMU_CAPS_DEVICE_SPAPR_TPM_PROXY;
> +        break;
>       case VIR_DOMAIN_TPM_MODEL_LAST:
>       default:
>           virReportEnumRangeError(virDomainTPMModel, tpm->model);


Reviewed-by: Stefan Berger <stefanb at linux.ibm.com>




More information about the libvir-list mailing list