On 9/10/24 3:05 AM, marcandre.lureau@xxxxxxxxxx wrote:
From: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx>
Learn to parse a directory for the TPM state.
Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx>
Reviewed-by: Stefan Berger <stefanb@xxxxxxxxxxxxx>
---
docs/formatdomain.rst | 3 +++
src/conf/domain_conf.c | 13 ++++++++++---
src/conf/domain_conf.h | 1 +
src/conf/schemas/domaincommon.rng | 15 ++++++++++++---
tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml | 1 +
5 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 4818113bc2..24dcc6daaa 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
This attribute requires that swtpm v0.7 or later is installed.
+ ``dir``
+ The path to the TPM state storage directory.
+
:since:`Since v10.8.0`
``persistent_state``
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 18c58d16dc..d1e9e4a50c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
source_node = virXPathNode("./backend/source", ctxt);
if (source_node) {
- path = virXMLPropString(source_node, "file");
+ if ((path = virXMLPropString(source_node, "file"))) {
+ def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
+ } else if ((path = virXMLPropString(source_node, "dir"))) {
+ def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
+ }
if (!path) {
virReportError(VIR_ERR_XML_ERROR, "%s",
- _("missing TPM file source"));
+ _("missing TPM file or directory source"));
goto error;
}
- def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
def->data.emulator.storagepath = g_steal_pointer(&path);
}
@@ -25084,6 +25087,10 @@ virDomainTPMDefFormat(virBuffer *buf,
virBufferAsprintf(&backendChildBuf, "<source file='%s'/>\n",
def->data.emulator.storagepath);
break;
+ case VIR_DOMAIN_TPM_STORAGE_DIR:
+ virBufferAsprintf(&backendChildBuf, "<source dir='%s'/>\n",
+ def->data.emulator.storagepath);
+ break;
case VIR_DOMAIN_TPM_STORAGE_DEFAULT:
break;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 371e6ecf6c..4e4ae2e048 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1465,6 +1465,7 @@ typedef enum {
typedef enum {
VIR_DOMAIN_TPM_STORAGE_DEFAULT,
+ VIR_DOMAIN_TPM_STORAGE_DIR,
VIR_DOMAIN_TPM_STORAGE_FILE,
} virDomainTPMStorage;
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 62d3f0e6fe..f6b47ae97e 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -5985,9 +5985,18 @@
<define name="tpm-backend-emulator-source">
<optional>
<element name="source">
- <attribute name="file">
- <ref name="filePath"/>
- </attribute>
+ <choice>
+ <group>
+ <attribute name="dir">
+ <ref name="absDirPath"/>
+ </attribute>
+ </group>
+ <group>
+ <attribute name="file">
+ <ref name="filePath"/>
+ </attribute>
+ </group>
+ </choice>
</element>
</optional>
</define>
diff --git a/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml b/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
index 9c2279b28b..016c68296c 100644
--- a/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
+++ b/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
@@ -30,6 +30,7 @@
<tpm model='tpm-tis'>
<backend type='emulator' version='2.0'>
<encryption secret='32ee7e76-2178-47a1-ab7b-269e6e348015'/>
+ <source dir='/some/dir'/>
</backend>
</tpm>
<audio id='1' type='none'/>