1*c4c9e2bcSAbhi Singh /* 2*c4c9e2bcSAbhi Singh * Copyright (c) 2025, Arm Limited. All rights reserved. 3*c4c9e2bcSAbhi Singh * 4*c4c9e2bcSAbhi Singh * SPDX-License-Identifier: BSD-3-Clause 5*c4c9e2bcSAbhi Singh */ 6*c4c9e2bcSAbhi Singh 7*c4c9e2bcSAbhi Singh #include <assert.h> 8*c4c9e2bcSAbhi Singh #include <stdarg.h> 9*c4c9e2bcSAbhi Singh #include <stdint.h> 10*c4c9e2bcSAbhi Singh 11*c4c9e2bcSAbhi Singh #include <common/desc_image_load.h> 12*c4c9e2bcSAbhi Singh #include <common/ep_info.h> 13*c4c9e2bcSAbhi Singh #include <drivers/auth/crypto_mod.h> 14*c4c9e2bcSAbhi Singh #include <drivers/measured_boot/event_log/event_log.h> 15*c4c9e2bcSAbhi Singh #include <drivers/measured_boot/metadata.h> 16*c4c9e2bcSAbhi Singh #include <plat/arm/common/plat_arm.h> 17*c4c9e2bcSAbhi Singh #include <plat/common/platform.h> 18*c4c9e2bcSAbhi Singh #include <platform_def.h> 19*c4c9e2bcSAbhi Singh 20*c4c9e2bcSAbhi Singh /* Event Log data */ 21*c4c9e2bcSAbhi Singh uint8_t event_log[PLAT_ARM_EVENT_LOG_MAX_SIZE]; 22*c4c9e2bcSAbhi Singh 23*c4c9e2bcSAbhi Singh /* RPI3 table with platform specific image IDs, names and PCRs */ 24*c4c9e2bcSAbhi Singh const event_log_metadata_t rpi3_event_log_metadata[] = { 25*c4c9e2bcSAbhi Singh { FW_CONFIG_ID, MBOOT_FW_CONFIG_STRING, PCR_0 }, 26*c4c9e2bcSAbhi Singh { TB_FW_CONFIG_ID, MBOOT_TB_FW_CONFIG_STRING, PCR_0 }, 27*c4c9e2bcSAbhi Singh { BL2_IMAGE_ID, MBOOT_BL2_IMAGE_STRING, PCR_0 }, 28*c4c9e2bcSAbhi Singh 29*c4c9e2bcSAbhi Singh { EVLOG_INVALID_ID, NULL, (unsigned int)(-1) } /* Terminator */ 30*c4c9e2bcSAbhi Singh }; 31*c4c9e2bcSAbhi Singh 32*c4c9e2bcSAbhi Singh void bl1_plat_mboot_init(void) 33*c4c9e2bcSAbhi Singh { 34*c4c9e2bcSAbhi Singh event_log_init(event_log, event_log + sizeof(event_log)); 35*c4c9e2bcSAbhi Singh event_log_write_header(); 36*c4c9e2bcSAbhi Singh } 37*c4c9e2bcSAbhi Singh 38*c4c9e2bcSAbhi Singh void bl1_plat_mboot_finish(void) 39*c4c9e2bcSAbhi Singh { 40*c4c9e2bcSAbhi Singh size_t event_log_cur_size; 41*c4c9e2bcSAbhi Singh image_desc_t *image_desc; 42*c4c9e2bcSAbhi Singh entry_point_info_t *ep_info; 43*c4c9e2bcSAbhi Singh 44*c4c9e2bcSAbhi Singh event_log_cur_size = event_log_get_cur_size(event_log); 45*c4c9e2bcSAbhi Singh image_desc = bl1_plat_get_image_desc(BL2_IMAGE_ID); 46*c4c9e2bcSAbhi Singh assert(image_desc != NULL); 47*c4c9e2bcSAbhi Singh 48*c4c9e2bcSAbhi Singh /* Get the entry point info */ 49*c4c9e2bcSAbhi Singh ep_info = &image_desc->ep_info; 50*c4c9e2bcSAbhi Singh ep_info->args.arg2 = (uint64_t) event_log; 51*c4c9e2bcSAbhi Singh ep_info->args.arg3 = (uint32_t) event_log_cur_size; 52*c4c9e2bcSAbhi Singh } 53*c4c9e2bcSAbhi Singh 54*c4c9e2bcSAbhi Singh int plat_mboot_measure_image(unsigned int image_id, image_info_t *image_data) 55*c4c9e2bcSAbhi Singh { 56*c4c9e2bcSAbhi Singh int rc = 0; 57*c4c9e2bcSAbhi Singh unsigned char hash_data[CRYPTO_MD_MAX_SIZE]; 58*c4c9e2bcSAbhi Singh const event_log_metadata_t *metadata_ptr = rpi3_event_log_metadata; 59*c4c9e2bcSAbhi Singh 60*c4c9e2bcSAbhi Singh rc = event_log_measure(image_data->image_base, image_data->image_size, hash_data); 61*c4c9e2bcSAbhi Singh if (rc != 0) { 62*c4c9e2bcSAbhi Singh return rc; 63*c4c9e2bcSAbhi Singh } 64*c4c9e2bcSAbhi Singh 65*c4c9e2bcSAbhi Singh while ((metadata_ptr->id != EVLOG_INVALID_ID) && 66*c4c9e2bcSAbhi Singh (metadata_ptr->id != image_id)) { 67*c4c9e2bcSAbhi Singh metadata_ptr++; 68*c4c9e2bcSAbhi Singh } 69*c4c9e2bcSAbhi Singh assert(metadata_ptr->id != EVLOG_INVALID_ID); 70*c4c9e2bcSAbhi Singh 71*c4c9e2bcSAbhi Singh event_log_record(hash_data, EV_POST_CODE, metadata_ptr); 72*c4c9e2bcSAbhi Singh 73*c4c9e2bcSAbhi Singh /* Dump Event Log for user view */ 74*c4c9e2bcSAbhi Singh dump_event_log((uint8_t *)event_log, event_log_get_cur_size(event_log)); 75*c4c9e2bcSAbhi Singh 76*c4c9e2bcSAbhi Singh return rc; 77*c4c9e2bcSAbhi Singh } 78