[PATCH v6 3/3] tpm: get tpm event log from bloblist

Raymond Mao raymond.mao at linaro.org
Thu Jan 23 16:50:58 CET 2025


Hi Ilias,

On Thu, 23 Jan 2025 at 02:00, Ilias Apalodimas <ilias.apalodimas at linaro.org>
wrote:

> Hi Raymond
>
> On Fri, 17 Jan 2025 at 18:36, 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.
> >
> >  lib/tpm_tcg2.c | 58 +++++++++++++++++++++++++++++++++-----------------
> >  1 file changed, 38 insertions(+), 20 deletions(-)
> >
> > diff --git a/lib/tpm_tcg2.c b/lib/tpm_tcg2.c
> > index 4134d93a35..6425bf143a 100644
> > --- a/lib/tpm_tcg2.c
> > +++ b/lib/tpm_tcg2.c
> > @@ -5,6 +5,7 @@
> >
> >  #include <dm.h>
> >  #include <dm/of_access.h>
> > +#include <malloc.h>
>
> This is probably a leftover from your V2
>
>
Yes, I will remove it.


> >  #include <tpm_api.h>
> >  #include <tpm-common.h>
> >  #include <tpm-v2.h>
> > @@ -19,6 +20,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 +674,40 @@ 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)
>
> Don't we need map_physmem here as well?
>
>
I don't think so. Unlike the ones from dt, bloblist_get_blob() returns a
virtual address.

Regards,
Raymond


> Thanks
> /Ilias
> > +               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 +715,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;
> > +       }
> > +
> > +       if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0, 0,
> &args))
> > +               return -ENODEV;
> >
> > -               a = ofnode_get_addr_size(args.node, "reg", &s);
> > -               if (a == FDT_ADDR_T_NONE)
> > -                       return -ENOMEM;
> > +       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;
> > -       }
> > +       *addr = map_physmem(a, s, MAP_NOCACHE);
> > +       *size = (u32)s;
> >
> >         return 0;
> >  }
> > --
> > 2.25.1
> >
>


More information about the U-Boot mailing list