@Peter Krempa <[email protected]>  - Apologies - mistaken send - I am
resending the patch

On Mon, Apr 20, 2026 at 6:01 PM Srihari Parimi <[email protected]> wrote:

> Parses vtpm.present from VMX files and converts to libvirt TPM
> device with CRB model and emulator backend. VMware vTPM uses
> TPM 2.0 as described in the link below
>
>
> https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/vsphere/8-0/vsphere-security/securing-virtual-machines-with-virtual-trusted-platform-module/vtpm-overview.html
>
> Default to the CRB interface for TPM 2.0 systems to improve
> performance and follow industry standards over legacy TIS.
>
> Signed-off-by: Srihari Parimi <[email protected]>
> ---
>  src/vmx/vmx.c              | 34 ++++++++++++++++++++++++++++++++++
>  tests/vmx2xmldata/vtpm.vmx | 22 ++++++++++++++++++++++
>  tests/vmx2xmldata/vtpm.xml | 32 ++++++++++++++++++++++++++++++++
>  tests/vmx2xmltest.c        |  2 ++
>  4 files changed, 90 insertions(+)
>  create mode 100644 tests/vmx2xmldata/vtpm.vmx
>  create mode 100644 tests/vmx2xmldata/vtpm.xml
>
> diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
> index 57dfd57cfc..9873794568 100644
> --- a/src/vmx/vmx.c
> +++ b/src/vmx/vmx.c
> @@ -599,6 +599,7 @@ static int virVMXParseSerial(virVMXContext *ctx,
> virConf *conf, int port,
>  static int virVMXParseParallel(virVMXContext *ctx, virConf *conf, int
> port,
>                                 virDomainChrDef **def);
>  static int virVMXParseSVGA(virConf *conf, virDomainVideoDef **def);
> +static int virVMXParseTPM(virConf *conf, virDomainTPMDef **def);
>
>  static int virVMXFormatVNC(virDomainGraphicsDef *def, virBuffer *buffer);
>  static int virVMXFormatDisk(virVMXContext *ctx, virDomainDiskDef *def,
> @@ -1938,6 +1939,18 @@ virVMXParseConfig(virVMXContext *ctx,
>
>      def->nvideos = 1;
>
> +    /* def:tpms */
> +    {
> +        virDomainTPMDef *tpm = NULL;
> +        if (virVMXParseTPM(conf, &tpm) < 0)
> +            goto cleanup;
> +
> +        VIR_DEBUG("Is vtpm present: %s",
> +                (tpm != NULL) ? "yes" : "no");
> +        if (tpm)
> +            VIR_APPEND_ELEMENT(def->tpms, def->ntpms, tpm);
> +    }
> +
>      /* def:sounds */
>      /* FIXME */
>
> @@ -3367,6 +3380,27 @@ virVMXParseSVGA(virConf *conf, virDomainVideoDef
> **def)
>      return result;
>  }
>
> +static int
> +virVMXParseTPM(virConf *conf, virDomainTPMDef **def)
> +{
> +    bool vtpm_present = false;
> +
> +    /* vmx:vtpm.present */
> +    if (virVMXGetConfigBoolean(conf, "vtpm.present", &vtpm_present,
> +                               false, true) < 0) {
> +        return -1;
> +    }
> +
> +    if (!vtpm_present)
> +        return 0;
> +
> +    *def = g_new0(virDomainTPMDef, 1);
> +    (*def)->type = VIR_DOMAIN_TPM_TYPE_EMULATOR;
> +    (*def)->model = VIR_DOMAIN_TPM_MODEL_CRB;
> +    (*def)->data.emulator.version = VIR_DOMAIN_TPM_VERSION_2_0;
> +
> +    return 0;
> +}
>
>
>  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
> * * *
> diff --git a/tests/vmx2xmldata/vtpm.vmx b/tests/vmx2xmldata/vtpm.vmx
> new file mode 100644
> index 0000000000..6e2fd725b7
> --- /dev/null
> +++ b/tests/vmx2xmldata/vtpm.vmx
> @@ -0,0 +1,22 @@
> +config.version = "8"
> +virtualHW.version = "19"
> +displayName = "test-vtpm"
> +memsize = "4096"
> +numvcpus = "2"
> +guestOS = "windows9-64"
> +
> +# Disk Configuration
> +scsi0.present = "TRUE"
> +scsi0.virtualDev = "lsisas1068"
> +scsi0:0.present = "TRUE"
> +scsi0:0.deviceType = "scsi-hardDisk"
> +scsi0:0.fileName = "test_disk.vmdk"
> +
> +# vTPM configuration
> +vtpm.present = "TRUE"
> +
> +# Network Configuration
> +ethernet0.present = "TRUE"
> +ethernet0.connectionType = "nat"
> +ethernet0.virtualDev = "e1000e"
> +ethernet0.addressType = "generated"
> diff --git a/tests/vmx2xmldata/vtpm.xml b/tests/vmx2xmldata/vtpm.xml
> new file mode 100644
> index 0000000000..cbb23ce673
> --- /dev/null
> +++ b/tests/vmx2xmldata/vtpm.xml
> @@ -0,0 +1,32 @@
> +<domain type='vmware'>
> +  <name>test-vtpm</name>
> +  <uuid>00000000-0000-0000-0000-000000000000</uuid>
> +  <memory unit='KiB'>4194304</memory>
> +  <currentMemory unit='KiB'>4194304</currentMemory>
> +  <vcpu placement='static'>2</vcpu>
> +  <os>
> +    <type arch='x86_64'>hvm</type>
> +  </os>
> +  <clock offset='utc'/>
> +  <on_poweroff>destroy</on_poweroff>
> +  <on_reboot>restart</on_reboot>
> +  <on_crash>destroy</on_crash>
> +  <devices>
> +    <disk type='file' device='disk'>
> +      <source file='[datastore] directory/test_disk.vmdk'/>
> +      <target dev='sda' bus='scsi'/>
> +      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> +    </disk>
> +    <controller type='scsi' index='0' model='lsisas1068'/>
> +    <interface type='user'>
> +      <mac address='00:00:00:00:00:00' type='generated'/>
> +      <model type='e1000e'/>
> +    </interface>
> +    <tpm model='tpm-crb'>
> +      <backend type='emulator' version='2.0'/>
> +    </tpm>
> +    <video>
> +      <model type='vmvga' vram='4096' primary='yes'/>
> +    </video>
> +  </devices>
> +</domain>
> diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c
> index fcca765bed..3ffc04fda4 100644
> --- a/tests/vmx2xmltest.c
> +++ b/tests/vmx2xmltest.c
> @@ -243,6 +243,8 @@ mymain(void)
>
>      DO_TEST("firmware-efi");
>
> +    DO_TEST("vtpm");
> +
>      ctx.datacenterPath = "folder1/folder2/datacenter1";
>
>      DO_TEST("datacenterpath");
> --
> 2.53.0
>
>

Reply via email to