refactor(measured boot): revisit error handling (2/3)

- In add_event2():

  Turn the first error condition checking whether there is room for an
  extra event2 data structure into an assertion. The platform layer is
  responsible for choosing an appropriate event log buffer size based
  on the number of measurements it expects. If this assertion fires,
  the platform macro EVENT_LOG_SIZE should be adjusted and the
  firmware recompiled.

  Call this assumption out in the function documentation.

  Also remove the second error condition check, which is a subset of
  the first one and thus is redundant.

  As a result of these changes, add_event2() can no longer fail. Thus,
  change its return type from int to void.

  Also, the 'size_of_event' local variable is now unused in release
  builds so remove it and move its value into the assertion.

Change-Id: I113fc141de59708b20435a0c7126255561ab7786
Signed-off-by: Sandrine Bailleux <sandrine.bailleux@arm.com>
This commit is contained in:
Sandrine Bailleux 2021-06-23 15:43:02 +02:00
parent ddb07a5689
commit 0c83207a55
1 changed files with 8 additions and 22 deletions

View File

@ -84,27 +84,22 @@ static const event2_header_t locality_event_header = {
*
* @param[in] hash Pointer to hash data of TCG_DIGEST_SIZE bytes
* @param[in] image_ptr Pointer to image_data_t structure
* @return:
* 0 = success
* < 0 = error code
*
* There must be room for storing this new event into the event log buffer.
*/
static int add_event2(const uint8_t *hash, const image_data_t *image_ptr)
static void add_event2(const uint8_t *hash, const image_data_t *image_ptr)
{
void *ptr = log_ptr;
uint32_t name_len;
uint32_t size_of_event;
assert(image_ptr != NULL);
assert(image_ptr->name != NULL);
name_len = (uint32_t)strlen(image_ptr->name) + 1U;
size_of_event = name_len + (uint32_t)EVENT2_HDR_SIZE;
/* Check for space in Event Log buffer */
if (((uintptr_t)ptr + size_of_event) > EVENT_LOG_END) {
ERROR("%s(): Event Log is short of memory", __func__);
return -ENOMEM;
}
assert(((uintptr_t)ptr + (uint32_t)EVENT2_HDR_SIZE + name_len) <=
EVENT_LOG_END);
/*
* As per TCG specifications, firmware components that are measured
@ -131,12 +126,6 @@ static int add_event2(const uint8_t *hash, const image_data_t *image_ptr)
/* TCG_PCR_EVENT2.Digests[].Digest[] */
ptr = (uint8_t *)((uintptr_t)ptr + offsetof(tpmt_ha, digest));
/* Check for space in Event Log buffer */
if (((uintptr_t)ptr + TCG_DIGEST_SIZE) > EVENT_LOG_END) {
ERROR("%s(): Event Log is short of memory", __func__);
return -ENOMEM;
}
if (hash == NULL) {
/* Get BL2 hash from DTB */
bl2_plat_get_hash(ptr);
@ -156,8 +145,6 @@ static int add_event2(const uint8_t *hash, const image_data_t *image_ptr)
/* End of event data */
log_ptr = (uint8_t *)((uintptr_t)ptr +
offsetof(event2_data_t, event) + name_len);
return 0;
}
/*
@ -235,9 +222,7 @@ void event_log_init(void)
log_ptr = (uint8_t *)ptr;
/* Add BL2 event */
if (add_event2(NULL, plat_data_ptr->images_data) != 0) {
panic();
}
add_event2(NULL, plat_data_ptr->images_data);
}
/*
@ -282,7 +267,8 @@ int tpm_record_measurement(uintptr_t data_base, uint32_t data_size,
return rc;
}
return add_event2(hash_data, data_ptr);
add_event2(hash_data, data_ptr);
return 0;
}
/*