#include "qemu_process.h"
#include "qemu_firmware.h"
#include "virutil.h"
+#include "virtpm.h"
#include <fcntl.h>
#include <sys/stat.h>
}
+void
+virQEMUCapsFillDomainDeviceTPMCaps(virQEMUCaps *qemuCaps,
+ virDomainCapsDeviceTPM *tpm)
+{
+ tpm->supported = VIR_TRISTATE_BOOL_YES;
+ tpm->model.report = true;
+ tpm->backendModel.report = true;
+
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_TIS))
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->model, VIR_DOMAIN_TPM_MODEL_TIS);
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_CRB))
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->model, VIR_DOMAIN_TPM_MODEL_CRB);
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_SPAPR))
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->model, VIR_DOMAIN_TPM_MODEL_SPAPR);
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPAPR_TPM_PROXY))
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->model, VIR_DOMAIN_TPM_MODEL_SPAPR_PROXY);
+
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH))
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_PASSTHROUGH);
+ if (virTPMHasSwtpm() &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR))
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_EMULATOR);
+
+ /*
+ * Need at least one frontend if it is to be usable by applications
+ */
+ if (!tpm->model.values)
+ tpm->supported = VIR_TRISTATE_BOOL_NO;
+}
+
+
/**
* virQEMUCapsSupportsGICVersion:
* @qemuCaps: QEMU capabilities
virDomainCapsDeviceVideo *video = &domCaps->video;
virDomainCapsDeviceRNG *rng = &domCaps->rng;
virDomainCapsDeviceFilesystem *filesystem = &domCaps->filesystem;
+ virDomainCapsDeviceTPM *tpm = &domCaps->tpm;
virDomainCapsMemoryBacking *memoryBacking = &domCaps->memoryBacking;
virQEMUCapsFillDomainFeaturesFromQEMUCaps(qemuCaps, domCaps);
virQEMUCapsFillDomainDeviceHostdevCaps(qemuCaps, hostdev);
virQEMUCapsFillDomainDeviceRNGCaps(qemuCaps, rng);
virQEMUCapsFillDomainDeviceFSCaps(qemuCaps, filesystem);
+ virQEMUCapsFillDomainDeviceTPMCaps(qemuCaps, tpm);
virQEMUCapsFillDomainFeatureGICCaps(qemuCaps, domCaps);
virQEMUCapsFillDomainFeatureSEVCaps(qemuCaps, domCaps);
virQEMUCapsFillDomainFeatureS390PVCaps(qemuCaps, domCaps);
void virQEMUCapsFillDomainDeviceFSCaps(virQEMUCaps *qemuCaps,
virDomainCapsDeviceFilesystem *filesystem);
+void virQEMUCapsFillDomainDeviceTPMCaps(virQEMUCaps *qemuCaps,
+ virDomainCapsDeviceTPM *tpm);
+
bool virQEMUCapsGuestIsNative(virArch host,
virArch guest);
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='yes'>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='yes'>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='yes'>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>spapr-tpm-proxy</value>
+ </enum>
+ <enum name='backendModel'/>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='yes'>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-spapr</value>
+ <value>spapr-tpm-proxy</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>handle</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='yes'>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-spapr</value>
+ <value>spapr-tpm-proxy</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='yes'>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='no'/>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='yes'>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-spapr</value>
+ <value>spapr-tpm-proxy</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>
<value>virtiofs</value>
</enum>
</filesystem>
+ <tpm supported='yes'>
+ <enum name='model'>
+ <value>tpm-tis</value>
+ <value>tpm-crb</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>passthrough</value>
+ </enum>
+ </tpm>
</devices>
<features>
<gic supported='no'/>