[SeaBIOS] [PATCH 4/8] tpm: Use pcpes->event[] to pass data to tpm_extend_acpi_log()

Stefan Berger stefanb at linux.vnet.ibm.com
Mon Nov 23 02:31:43 CET 2015


On 11/22/2015 08:02 PM, Kevin O'Connor wrote:
> Instead of passing in the event data to tpm_extend_acpi_log() via
> parameters, use the event[] field in the pcpes.  Update those callers
> that don't populate the pcpes->event to do so prior to calling
> tpm_extend_acpi_log().
>
> Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
> ---
>   src/std/tcg.h |  2 +-
>   src/tcgbios.c | 76 +++++++++++++++++++++++++++++------------------------------
>   2 files changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/src/std/tcg.h b/src/std/tcg.h
> index 88b2688..5f9cad9 100644
> --- a/src/std/tcg.h
> +++ b/src/std/tcg.h
> @@ -207,7 +207,7 @@ struct pcpes
>       u32    eventtype;
>       u8     digest[SHA1_BUFSIZE];
>       u32    eventdatasize;
> -    u32    event;
> +    u8     event[0];
>   } PACKED;
>
>   struct pcctes
> diff --git a/src/tcgbios.c b/src/tcgbios.c
> index 0c28935..e7adf3f 100644
> --- a/src/tcgbios.c
> +++ b/src/tcgbios.c
> @@ -290,18 +290,15 @@ reset_acpi_log(void)
>    *  Returns an error code in case of faiure, 0 in case of success
>    */
>   static u32
> -tpm_extend_acpi_log(struct pcpes *pcpes,
> -                    const char *event, u32 event_length)
> +tpm_extend_acpi_log(struct pcpes *pcpes)
>   {
> -    u32 size;
> -
>       dprintf(DEBUG_tcg, "TCGBIOS: LASA = %p, next entry = %p\n",
>               tpm_state.log_area_start_address, tpm_state.log_area_next_entry);
>
>       if (tpm_state.log_area_next_entry == NULL)
>           return TCG_PC_LOGOVERFLOW;
>
> -    size = offsetof(struct pcpes, event) + event_length;
> +    u32 size = sizeof(*pcpes) + pcpes->eventdatasize;
>
>       if ((tpm_state.log_area_next_entry + size - tpm_state.log_area_start_address) >
>            tpm_state.log_area_minimum_length) {
> @@ -309,11 +306,7 @@ tpm_extend_acpi_log(struct pcpes *pcpes,
>           return TCG_PC_LOGOVERFLOW;
>       }
>
> -    pcpes->eventdatasize = event_length;
> -
> -    memcpy(tpm_state.log_area_next_entry, pcpes, offsetof(struct pcpes, event));
> -    memcpy(tpm_state.log_area_next_entry + offsetof(struct pcpes, event),
> -           event, event_length);
> +    memcpy(tpm_state.log_area_next_entry, pcpes, size);
>
>       tpm_state.log_area_last_entry = tpm_state.log_area_next_entry;
>       tpm_state.log_area_next_entry += size;
> @@ -513,7 +506,7 @@ tpm_extend(u8 *hash, u32 pcrindex)
>   }
>
>   static u32
> -tpm_log_event(struct pcpes *pcpes, const char *event, u32 event_length)
> +tpm_log_event(struct pcpes *pcpes)
>   {
>       if (pcpes->pcrindex >= 24)
>           return TCG_INVALID_INPUT_PARA;
> @@ -521,16 +514,16 @@ tpm_log_event(struct pcpes *pcpes, const char *event, u32 event_length)
>       if (!has_working_tpm())
>           return TCG_GENERAL_ERROR;
>
> -    u32 rc = tpm_extend_acpi_log(pcpes, event, event_length);
> +    u32 rc = tpm_extend_acpi_log(pcpes);
>       if (rc)
>           tpm_set_failure();
>       return rc;
>   }
>
>   static u32
> -tpm_log_extend_event(struct pcpes *pcpes, const char *event, u32 event_length)
> +tpm_log_extend_event(struct pcpes *pcpes)
>   {
> -    u32 rc = tpm_log_event(pcpes, event, event_length);
> +    u32 rc = tpm_log_event(pcpes);
>       if (rc)
>           return rc;
>       return tpm_extend(pcpes->digest, pcpes->pcrindex);
> @@ -560,12 +553,21 @@ tpm_add_measurement_to_log(u32 pcrindex, u32 event_type,
>                              const char *event, u32 event_length,
>                              const u8 *hashdata, u32 hashdata_length)
>   {
> -    struct pcpes pcpes = {
> -        .pcrindex = pcrindex,
> -        .eventtype = event_type,
> +    struct {
> +        struct pcpes pcpes;
> +        u8 event[128];


You are undoing a previous change now. I had tried to prevent having 
this event buffer (on the stack) but allow higher layers to pass 
arbitrary-length event buffers around that get copied into the log at 
the very end. This was to avoid having to append them here.

    Stefan




More information about the SeaBIOS mailing list