Add virDomainTPMProxyDefParseXML() and virDomainTPMProxyDefFormat()
to handle the creating of the TPM Proxy device via its XML
description.
Signed-off-by: Daniel Henrique Barboza <danielhb413(a)gmail.com>
---
src/conf/domain_conf.c | 94 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 93 insertions(+), 1 deletion(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4c731b9f36..4f43dcddee 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13779,6 +13779,50 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
return NULL;
}
+static virDomainTPMProxyDefPtr
+virDomainTPMProxyDefParseXML(virDomainXMLOptionPtr xmlopt,
+ xmlNodePtr node,
+ xmlXPathContextPtr ctxt,
+ unsigned int flags)
+{
+ virDomainTPMProxyDefPtr def;
+ VIR_XPATH_NODE_AUTORESTORE(ctxt);
+ g_autofree char *path = NULL;
+ g_autofree char *model = NULL;
+
+ if (VIR_ALLOC(def) < 0)
+ return NULL;
+
+ def->model = VIR_DOMAIN_TPMPROXY_MODEL_DEFAULT;
+
+ model = virXMLPropString(node, "model");
+ if (model != NULL &&
+ (def->model = virDomainTPMProxyModelTypeFromString(model)) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Unknown TPM Proxy frontend model '%s'"),
model);
+ goto error;
+ }
+
+ ctxt->node = node;
+
+ path = virXPathString("string(./device/@path)", ctxt);
+ if (!path) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing TPM Proxy device path"));
+ goto error;
+ }
+ def->path = g_steal_pointer(&path);
+
+ if (virDomainDeviceInfoParseXML(xmlopt, node, &def->info, flags) < 0)
+ goto error;
+
+ return def;
+
+ error:
+ virDomainTPMProxyDefFree(def);
+ return NULL;
+}
+
static virDomainPanicDefPtr
virDomainPanicDefParseXML(virDomainXMLOptionPtr xmlopt,
xmlNodePtr node,
@@ -17076,6 +17120,10 @@ virDomainDeviceDefParse(const char *xmlStr,
return NULL;
break;
case VIR_DOMAIN_DEVICE_TPMPROXY:
+ if (!(dev->data.tpmproxy = virDomainTPMProxyDefParseXML(xmlopt, node,
+ ctxt, flags)))
+ return NULL;
+ break;
case VIR_DOMAIN_DEVICE_NONE:
case VIR_DOMAIN_DEVICE_LAST:
break;
@@ -22024,6 +22072,23 @@ virDomainDefParseXML(xmlDocPtr xml,
}
VIR_FREE(nodes);
+ /* Parse TPM Proxy device */
+ if ((n = virXPathNodeSet("./devices/tpmproxy", ctxt, &nodes)) < 0)
+ goto error;
+
+ if (n > 1) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("only a single TPM Proxy device is supported"));
+ goto error;
+ }
+
+ if (n > 0) {
+ if (!(def->tpmproxy = virDomainTPMProxyDefParseXML(xmlopt, nodes[0],
+ ctxt, flags)))
+ goto error;
+ }
+ VIR_FREE(nodes);
+
if ((n = virXPathNodeSet("./devices/nvram", ctxt, &nodes)) < 0)
goto error;
@@ -27166,6 +27231,26 @@ virDomainTPMDefFormat(virBufferPtr buf,
}
+static int
+virDomainTPMProxyDefFormat(virBufferPtr buf,
+ virDomainTPMProxyDefPtr def,
+ unsigned int flags)
+{
+ virBufferAsprintf(buf, "<tpmproxy model='%s'>\n",
+ virDomainTPMProxyModelTypeToString(def->model));
+ virBufferAdjustIndent(buf, 2);
+ virBufferEscapeString(buf, "<device path='%s'/>\n",
def->path);
+
+ if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ return -1;
+
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</tpmproxy>\n");
+
+ return 0;
+}
+
+
static int
virDomainSoundDefFormat(virBufferPtr buf,
virDomainSoundDefPtr def,
@@ -29853,6 +29938,11 @@ virDomainDefFormatInternalSetRootName(virDomainDefPtr def,
goto error;
}
+ if (def->tpmproxy) {
+ if (virDomainTPMProxyDefFormat(buf, def->tpmproxy, flags) < 0)
+ goto error;
+ }
+
for (n = 0; n < def->ngraphics; n++) {
if (virDomainGraphicsDefFormat(buf, def->graphics[n], flags) < 0)
goto error;
@@ -31038,13 +31128,15 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src,
case VIR_DOMAIN_DEVICE_VSOCK:
rc = virDomainVsockDefFormat(&buf, src->data.vsock);
break;
+ case VIR_DOMAIN_DEVICE_TPMPROXY:
+ rc = virDomainTPMProxyDefFormat(&buf, src->data.tpmproxy, flags);
+ break;
case VIR_DOMAIN_DEVICE_NONE:
case VIR_DOMAIN_DEVICE_SMARTCARD:
case VIR_DOMAIN_DEVICE_MEMBALLOON:
case VIR_DOMAIN_DEVICE_NVRAM:
case VIR_DOMAIN_DEVICE_IOMMU:
- case VIR_DOMAIN_DEVICE_TPMPROXY:
case VIR_DOMAIN_DEVICE_LAST:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Copying definition of '%d' type "
--
2.26.2