Hi Ruchika, > [...]
> +static efi_status_t efi_init_event_log(struct udevice *dev) > { > /* > * vendor_info_size is currently set to 0, we need to change the length > * and allocate the flexible array member if this changes > */ > struct tcg_pcr_event *event_header = NULL; > - struct udevice *dev; > + struct tpml_digest_values digest_list; > size_t spec_event_size; > efi_status_t ret; > + u32 pcr, pos; > + u64 base; > + u32 sz; > > ret = platform_get_tpm2_device(&dev); > if (ret != EFI_SUCCESS) > @@ -1266,26 +1507,65 @@ static efi_status_t efi_init_event_log(void) > * last log entry > */ > memset(event_log.buffer, 0xff, TPM2_EVENT_LOG_SIZE); > + > + /* > + * The log header is defined to be in SHA1 event log entry format. > + * Setup event header > + */ > + event_header = (struct tcg_pcr_event *)event_log.buffer; > event_log.pos = 0; > event_log.last_event_size = 0; > event_log.get_event_called = false; > event_log.truncated = false; > > /* > - * The log header is defined to be in SHA1 event log entry format. > - * Setup event header > + * Check if earlier firmware have passed any eventlog. Different > + * platforms can use different ways to do so > */ > - event_header = (struct tcg_pcr_event *)event_log.buffer; > - put_unaligned_le32(0, &event_header->pcr_index); > - put_unaligned_le32(EV_NO_ACTION, &event_header->event_type); > - memset(&event_header->digest, 0, sizeof(event_header->digest)); > - ret = create_specid_event(dev, (void *)((uintptr_t)event_log.buffer + > sizeof(*event_header)), > - &spec_event_size); > - if (ret != EFI_SUCCESS) > - goto free_pool; > - put_unaligned_le32(spec_event_size, &event_header->event_size); > - event_log.pos = spec_event_size + sizeof(*event_header); > - event_log.last_event_size = event_log.pos; > + ret = platform_get_eventlog(dev, &base, &sz); I think we can refactor this slightly and make it easier to read. Can we merge the logic of getting + validating the eventlog in platform_get_eventlog(). Then just return EFI_XXXXX and continue from there. > + if (ret == EFI_SUCCESS && sz < TPM2_EVENT_LOG_SIZE) { > + void *buffer = (void *)base; > + > + pos = 0; > + /* Parse the eventlog to check for its validity */ > + ret = parse_event_log_header(buffer, sz, &pos); > + if (ret || pos > sz) { > + ret = EFI_COMPROMISED_DATA; > + goto free_pool; > + } > + > + ret = parse_specid_event(dev, buffer, sz, &pos, &digest_list); > + if (ret || pos > sz) { > + log_err("Error parsing SPEC ID Event\n"); > + ret = EFI_COMPROMISED_DATA; > + goto free_pool; > + } > + > + while (pos < sz) { > + ret = tcg2_parse_event(dev, buffer, sz, &pos, > + &digest_list, &pcr); > + if (ret) { > + log_err("Error parsing event\n"); > + goto free_pool; > + } > + } > + > + memcpy(event_log.buffer, buffer, sz); > + event_log.pos = sz; > + } else { > + put_unaligned_le32(0, &event_header->pcr_index); > + put_unaligned_le32(EV_NO_ACTION, &event_header->event_type); > + memset(&event_header->digest, 0, sizeof(event_header->digest)); > + ret = create_specid_event(dev, > + (void *)((uintptr_t)event_log.buffer + > + sizeof(*event_header)), > + &spec_event_size); > + if (ret != EFI_SUCCESS) > + goto free_pool; > + put_unaligned_le32(spec_event_size, &event_header->event_size); > + event_log.pos = spec_event_size + sizeof(*event_header); > + event_log.last_event_size = event_log.pos; > + } > > ret = create_final_event(); > if (ret != EFI_SUCCESS) > @@ -1664,7 +1944,7 @@ efi_status_t efi_tcg2_register(void) > return EFI_SUCCESS; > } > > - ret = efi_init_event_log(); > + ret = efi_init_event_log(dev); > if (ret != EFI_SUCCESS) > goto fail; > > -- > 2.25.1 > Thanks /Ilias