On Mon, Jun 30, 2025 at 02:17:18PM +0800, Zhenzhong Duan wrote:
> When 'tdx' is used, the VM will be launched with Intel TDX feature enabled.
> TDX feature supports running encrypted VM (Trust Domain, TD) under the
> control of KVM. A TD runs in a CPU model which protects the confidentiality
> of its memory and its CPU state from other software.
> 
> There are four optional child elements. Element policy is 64bit hex, bit 0
> is set to enable TDX debug, bit 28 is set to enable sept-ve-disable, other
> bits are reserved currently. When policy isn't specified, QEMU will use its
> own default value 0x10000000. mrConfigId, mrOwner and mrOwnerConfig are
> base64 encoded SHA384 digest string.
> 
> For example:
> 
>  <launchSecurity type='tdx'>
>    <policy>0x10000001</policy>
>    <mrConfigId>xxx</mrConfigId>
>    <mrOwner>xxx</mrOwner>
>    <mrOwnerConfig>xxx</mrOwnerConfig>
>  </launchSecurity>
> 
> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com>
> ---
>  src/conf/domain_conf.c            | 49 +++++++++++++++++++++++++++++++
>  src/conf/domain_conf.h            | 11 +++++++
>  src/conf/domain_validate.c        |  1 +
>  src/conf/schemas/domaincommon.rng | 32 ++++++++++++++++++++
>  src/conf/virconftypes.h           |  2 ++
>  src/qemu/qemu_cgroup.c            |  1 +
>  src/qemu/qemu_command.c           |  2 ++
>  src/qemu/qemu_driver.c            |  1 +
>  src/qemu/qemu_firmware.c          |  1 +
>  src/qemu/qemu_namespace.c         |  1 +
>  src/qemu/qemu_process.c           |  2 ++
>  src/qemu/qemu_validate.c          |  1 +
>  src/security/security_dac.c       |  2 ++
>  13 files changed, 106 insertions(+)


> diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
> index 2d0ec0b4fa..6c65a2751b 100644
> --- a/src/qemu/qemu_firmware.c
> +++ b/src/qemu/qemu_firmware.c
> @@ -1371,6 +1371,7 @@ qemuFirmwareMatchDomain(const virDomainDef *def,
>              }
>              break;
>          case VIR_DOMAIN_LAUNCH_SECURITY_PV:
> +        case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
>              break;
>          case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
>          case VIR_DOMAIN_LAUNCH_SECURITY_LAST:

We need a patch in this series that updates qemuFirmwareMatchDomain
to handle TDX guests.

Currently with

  <os firmware="efi">
    <type arch="x86_64" machine="q35">hvm</type>
    <boot dev="hd"/>
  </os>

we are *not* matching the right firmware imagte

qemuFirmwareMatchDomain:1383 : Firmware 
'/usr/share/qemu/firmware/30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json' matches 
domain requirements
qemuFirmwareFillDomainModern:1743 : Found matching firmware (description path 
'/usr/share/qemu/firmware/30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json')
qemuFirmwareEnableFeaturesModern:1439 : decided on firmware 
'/usr/share/edk2/ovmf/OVMF_CODE_4M.secboot.qcow2' template 
'/usr/share/edk2/ovmf/OVMF_VARS_4M.secboot.qcow2'
qemuFirmwareEnableFeaturesModern:1473 : Enabling SMM feature
qemuFirmwareEnableFeaturesModern:1476 : Enabling secure loader

and so we fail to boot as SMM is incompatible with TDX, as
well as incorrectly setting up separate NVRAM.

The file we should have matched is

  /usr/share/qemu/firmware/60-edk2-ovmf-x64-inteltdx.json

Which has the right feature for TDX launch security:

    "features": [
        "enrolled-keys",
        "intel-tdx",
        "secure-boot",
        "verbose-dynamic"
    ],

there is already logic in qemu_firmware.c for SEV/SNP,
and the same design pattern should work for TDX too.


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

Reply via email to