[PATCH] tpm: Refactor open-coded bitmap 'activePcrBanks' to virBitmap

Peter Krempa posted 1 patch 1 year, 9 months ago
Failed in applying to current master (apply log)
src/conf/domain_conf.c | 17 +++++++++--------
src/conf/domain_conf.h |  2 +-
src/qemu/qemu_tpm.c    | 21 +++++++++------------
3 files changed, 19 insertions(+), 21 deletions(-)
[PATCH] tpm: Refactor open-coded bitmap 'activePcrBanks' to virBitmap
Posted by Peter Krempa 1 year, 9 months ago
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---

Applies on top of Michal's series to fix 'activePcrBank' handling.

 src/conf/domain_conf.c | 17 +++++++++--------
 src/conf/domain_conf.h |  2 +-
 src/qemu/qemu_tpm.c    | 21 +++++++++------------
 3 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ddd6fe1c90..fccb29bc63 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3255,6 +3255,7 @@ void virDomainTPMDefFree(virDomainTPMDef *def)
         virObjectUnref(def->data.emulator.source);
         g_free(def->data.emulator.storagepath);
         g_free(def->data.emulator.logfile);
+        virBitmapFree(def->data.emulator.activePcrBanks);
         break;
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
@@ -10442,6 +10443,8 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,

         if ((nnodes = virXPathNodeSet("./backend/active_pcr_banks/*", ctxt, &nodes)) < 0)
             break;
+        if (nnodes > 0)
+            def->data.emulator.activePcrBanks = virBitmapNew(0);
         for (i = 0; i < nnodes; i++) {
             if ((bank = virDomainTPMPcrBankTypeFromString((const char *)nodes[i]->name)) < 0) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -10449,7 +10452,7 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
                                nodes[i]->name);
                 goto error;
             }
-            def->data.emulator.activePcrBanks |= (1 << bank);
+            virBitmapSetBitExpand(def->data.emulator.activePcrBanks, bank);
         }
         break;
     case VIR_DOMAIN_TPM_TYPE_LAST:
@@ -20671,7 +20674,8 @@ virDomainTPMDefCheckABIStability(virDomainTPMDef *src,
             return false;
         }

-        if (src->data.emulator.activePcrBanks != dst->data.emulator.activePcrBanks) {
+        if (!virBitmapEqual(src->data.emulator.activePcrBanks,
+                            dst->data.emulator.activePcrBanks)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                            _("Target active PCR banks doesn't match source"));
             return false;
@@ -24235,13 +24239,10 @@ virDomainTPMDefFormat(virBuffer *buf,
         }
         if (def->data.emulator.activePcrBanks) {
             g_auto(virBuffer) activePcrBanksBuf = VIR_BUFFER_INIT_CHILD(&backendChildBuf);
-            size_t i;
+            ssize_t bank = -1;

-            for (i = VIR_DOMAIN_TPM_PCR_BANK_SHA1; i < VIR_DOMAIN_TPM_PCR_BANK_LAST; i++) {
-                if ((def->data.emulator.activePcrBanks & (1 << i)))
-                    virBufferAsprintf(&activePcrBanksBuf, "<%s/>\n",
-                                      virDomainTPMPcrBankTypeToString(i));
-            }
+            while ((bank = virBitmapNextSetBit(def->data.emulator.activePcrBanks, bank)) > -1)
+                virBufferAsprintf(&activePcrBanksBuf, "<%s/>\n", virDomainTPMPcrBankTypeToString(bank));

             virXMLFormatElement(&backendChildBuf, "active_pcr_banks", NULL, &activePcrBanksBuf);
         }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 200a75d705..724265b6b5 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1451,7 +1451,7 @@ struct _virDomainTPMDef {
             unsigned char secretuuid[VIR_UUID_BUFLEN];
             bool hassecretuuid;
             bool persistent_state;
-            unsigned int activePcrBanks;
+            virBitmap *activePcrBanks;
         } emulator;
     } data;
 };
diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index f28dd2e1e9..c08b0851da 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -444,19 +444,16 @@ qemuTPMEmulatorRunSetup(const char *storagepath,


 static char *
-qemuTPMPcrBankBitmapToStr(unsigned int pcrBanks)
+qemuTPMPcrBankBitmapToStr(virBitmap *activePcrBanks)
 {
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
-    const char *comma = "";
-    size_t i;
-
-    for (i = VIR_DOMAIN_TPM_PCR_BANK_SHA1; i < VIR_DOMAIN_TPM_PCR_BANK_LAST; i++) {
-        if (pcrBanks & (1 << i)) {
-            virBufferAsprintf(&buf, "%s%s",
-                              comma, virDomainTPMPcrBankTypeToString(i));
-            comma = ",";
-        }
-    }
+    ssize_t bank = -1;
+
+    while ((bank = virBitmapNextSetBit(activePcrBanks, bank)) > -1)
+        virBufferAsprintf(&buf, "%s,", virDomainTPMPcrBankTypeToString(bank));
+
+    virBufferTrim(&buf, ",");
+
     return virBufferContentAndReset(&buf);
 }

@@ -481,7 +478,7 @@ static int
 qemuTPMEmulatorReconfigure(const char *storagepath,
                            uid_t swtpm_user,
                            gid_t swtpm_group,
-                           unsigned int activePcrBanks,
+                           virBitmap *activePcrBanks,
                            const char *logfile,
                            const virDomainTPMVersion tpmversion,
                            const unsigned char *secretuuid)
-- 
2.36.1
Re: [PATCH] tpm: Refactor open-coded bitmap 'activePcrBanks' to virBitmap
Posted by Michal Prívozník 1 year, 9 months ago
On 8/1/22 13:54, Peter Krempa wrote:
> Signed-off-by: Peter Krempa <pkrempa@redhat.com>
> ---
> 
> Applies on top of Michal's series to fix 'activePcrBank' handling.
> 
>  src/conf/domain_conf.c | 17 +++++++++--------
>  src/conf/domain_conf.h |  2 +-
>  src/qemu/qemu_tpm.c    | 21 +++++++++------------
>  3 files changed, 19 insertions(+), 21 deletions(-)

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>

Michal