[PATCH 2/3] tpm: make pcr_read command more useful
Ludwig Nussel
ludwig.nussel at siemens.com
Wed Apr 29 13:41:42 CEST 2026
Output now more similar to Linux userspace tool "tpm2_pcrread".
Without arguments the command now prints contents of all PCR registers
Signed-off-by: Ludwig Nussel <ludwig.nussel at siemens.com>
---
cmd/tpm-v2.c | 54 ++++++++++++++++++++++++++++++++++------------------
1 file changed, 36 insertions(+), 18 deletions(-)
diff --git a/cmd/tpm-v2.c b/cmd/tpm-v2.c
index 847b2691581..3bcb11a8de6 100644
--- a/cmd/tpm-v2.c
+++ b/cmd/tpm-v2.c
@@ -8,6 +8,7 @@
#include <dm.h>
#include <log.h>
#include <mapmem.h>
+#include <malloc.h>
#include <tpm-common.h>
#include <tpm-v2.h>
#include "tpm-user-utils.h"
@@ -150,10 +151,11 @@ static int do_tpm_pcr_read(struct cmd_tbl *cmdtp, int flag, int argc,
u32 index, rc;
int algo_len;
unsigned int updates;
- void *data;
+ u8 *data;
int ret;
+ u32 pcr_start, pcr_end;
- if (argc < 3 || argc > 4)
+ if (argc > 4)
return CMD_RET_USAGE;
if (argc == 4) {
algo = tpm2_name_to_algorithm(argv[3]);
@@ -164,28 +166,44 @@ static int do_tpm_pcr_read(struct cmd_tbl *cmdtp, int flag, int argc,
ret = get_tpm(&dev);
if (ret)
- return ret;
+ goto out;
priv = dev_get_uclass_priv(dev);
if (!priv)
- return -EINVAL;
-
- index = simple_strtoul(argv[1], NULL, 0);
- if (index >= priv->pcr_count)
- return -EINVAL;
-
- data = map_sysmem(simple_strtoul(argv[2], NULL, 0), 0);
+ goto out;
- rc = tpm2_pcr_read(dev, index, priv->pcr_select_min, algo,
- data, algo_len, &updates);
- if (!rc) {
- printf("PCR #%u %s %d byte content (%u known updates):\n", index,
- tpm2_algorithm_name(algo), algo_len, updates);
- print_byte_string(data, algo_len);
+ if (argc >= 2) {
+ pcr_start = simple_strtoul(argv[1], NULL, 0);
+ if (pcr_start >= priv->pcr_count)
+ return -EINVAL;
+ pcr_end = pcr_start + 1;
+ } else {
+ pcr_start = 0;
+ pcr_end = priv->pcr_count;
}
- unmap_sysmem(data);
+ if (argc >= 3)
+ data = map_sysmem(simple_strtoul(argv[2], NULL, 0), 0);
+ else
+ data = malloc(algo_len);
+
+ printf("%8s:\n", tpm2_algorithm_name(algo));
+ for (index = pcr_start; index < pcr_end; ++index) {
+ rc = tpm2_pcr_read(dev, index, priv->pcr_select_min, algo,
+ data, algo_len, &updates);
+ if (!rc) {
+ printf("%6u: 0x", index);
+ for (int i = 0; i < algo_len; ++i)
+ printf("%02X", data[i]);
+ printf(" (%u known updates)\n", updates);
+ }
+ }
+ if (argc >= 3)
+ unmap_sysmem(data);
+ else
+ free(data);
+out:
return report_return_code(rc);
}
@@ -548,7 +566,7 @@ U_BOOT_CMD(tpm2, CONFIG_SYS_MAXARGS, 1, do_tpm, "Issue a TPMv2.x command",
" Extend PCR #<pcr> with digest at <digest_addr> with digest_algo.\n"
" <pcr>: index of the PCR\n"
" <digest_addr>: address of digest of digest_algo type (defaults to SHA256)\n"
-"pcr_read <pcr> <digest_addr> [<digest_algo>]\n"
+"pcr_read [<pcr> [<digest_addr> [<digest_algo>]]]\n"
" Read PCR #<pcr> to memory address <digest_addr> with <digest_algo>.\n"
" <pcr>: index of the PCR\n"
" <digest_addr>: address of digest of digest_algo type (defaults to SHA256)\n"
--
2.43.0
More information about the U-Boot
mailing list