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