[PATCH v7 3/3] tpm: get tpm event log from bloblist
Ilias Apalodimas
ilias.apalodimas at linaro.org
Tue Jan 28 08:10:32 CET 2025
On Mon, 27 Jan 2025 at 16:50, Raymond Mao <raymond.mao at linaro.org> wrote:
>
> Get tpm event log from bloblist instead of FDT when bloblist is
> enabled and valid from previous boot stage.
>
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
> Changes in v2
> - Remove patch dependency.
> - Remove the fallback to FDT when BLOBLIST is selected.
> Changes in v3
> - Malloc an 8KB buffer when user eventlog buffer does not exist.
> Changes in v4
> - Replace the default eventlog size with TPM2_EVENT_LOG_SIZE.
> Changes in v5
> - Replace TPM2_EVENT_LOG_SIZE with CONFIG_TPM2_EVENT_LOG_SIZE.
> - Add an inline TODO comment.
> Changes in v6
> - Remove the malloc and keep the buffer pointed by "sml" for the fallback
> as it is the right place for linux to discover the eventlog.
> Changes in v7
> - Remove '#include <malloc.h>'.
> - Add mapping for the blob address.
>
> lib/tpm_tcg2.c | 59 +++++++++++++++++++++++++++++++++-----------------
> 1 file changed, 39 insertions(+), 20 deletions(-)
>
> diff --git a/lib/tpm_tcg2.c b/lib/tpm_tcg2.c
> index 4134d93a35..adb32a14f0 100644
> --- a/lib/tpm_tcg2.c
> +++ b/lib/tpm_tcg2.c
> @@ -19,6 +19,7 @@
> #include <linux/unaligned/generic.h>
> #include <linux/unaligned/le_byteshift.h>
> #include "tpm-utils.h"
> +#include <bloblist.h>
>
> int tcg2_get_pcr_info(struct udevice *dev, u32 *supported_bank, u32 *active_bank,
> u32 *bank_num)
> @@ -672,21 +673,42 @@ void tcg2_measurement_term(struct udevice *dev, struct tcg2_event_log *elog,
>
> __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size)
> {
> - const __be32 *addr_prop;
> - const __be32 *size_prop;
> + const __be32 *addr_prop = NULL;
> + const __be32 *size_prop = NULL;
> int asize;
> int ssize;
> + struct ofnode_phandle_args args;
> + phys_addr_t a;
> + fdt_size_t s;
>
> *addr = NULL;
> *size = 0;
>
> - addr_prop = dev_read_prop(dev, "tpm_event_log_addr", &asize);
> - if (!addr_prop)
> - addr_prop = dev_read_prop(dev, "linux,sml-base", &asize);
> + *addr = bloblist_get_blob(BLOBLISTT_TPM_EVLOG, size);
> + if (*addr && *size) {
> + *addr = map_physmem((uintptr_t)(*addr), *size, MAP_NOCACHE);
> + return 0;
> + }
>
> - size_prop = dev_read_prop(dev, "tpm_event_log_size", &ssize);
> - if (!size_prop)
> + /*
> + * TODO:
> + * Replace BLOBLIST with a new kconfig for handoff all components
> + * (fdt, tpm event log, etc...) from previous boot stage via bloblist
> + * mandatorily following Firmware Handoff spec.
> + */
> + if (!CONFIG_IS_ENABLED(BLOBLIST)) {
> + addr_prop = dev_read_prop(dev, "tpm_event_log_addr", &asize);
> + size_prop = dev_read_prop(dev, "tpm_event_log_size", &ssize);
> + }
> +
> + /*
> + * If no eventlog was observed, a sml buffer is required for the kernel
> + * to discover the eventlog.
> + */
> + if (!addr_prop || !size_prop) {
> + addr_prop = dev_read_prop(dev, "linux,sml-base", &asize);
> size_prop = dev_read_prop(dev, "linux,sml-size", &ssize);
> + }
>
> if (addr_prop && size_prop) {
> u64 a = of_read_number(addr_prop, asize / sizeof(__be32));
> @@ -694,22 +716,19 @@ __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size)
>
> *addr = map_physmem(a, s, MAP_NOCACHE);
> *size = (u32)s;
> - } else {
> - struct ofnode_phandle_args args;
> - phys_addr_t a;
> - fdt_size_t s;
>
> - if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0,
> - 0, &args))
> - return -ENODEV;
> + return 0;
> + }
>
> - a = ofnode_get_addr_size(args.node, "reg", &s);
> - if (a == FDT_ADDR_T_NONE)
> - return -ENOMEM;
> + if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0, 0, &args))
> + return -ENODEV;
>
> - *addr = map_physmem(a, s, MAP_NOCACHE);
> - *size = (u32)s;
> - }
> + a = ofnode_get_addr_size(args.node, "reg", &s);
> + if (a == FDT_ADDR_T_NONE)
> + return -ENOMEM;
> +
> + *addr = map_physmem(a, s, MAP_NOCACHE);
> + *size = (u32)s;
>
> return 0;
> }
> --
> 2.25.1
>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
More information about the U-Boot
mailing list