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 "./include/rpi3_measured_boot.h" 12*c4c9e2bcSAbhi Singh 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/common/common_def.h> 17*c4c9e2bcSAbhi Singh #include <plat/common/platform.h> 18*c4c9e2bcSAbhi Singh #include <platform_def.h> 19*c4c9e2bcSAbhi Singh #include <tools_share/tbbr_oid.h> 20*c4c9e2bcSAbhi Singh 21*c4c9e2bcSAbhi Singh /* RPI3 table with platform specific image IDs, names and PCRs */ 22*c4c9e2bcSAbhi Singh const event_log_metadata_t rpi3_event_log_metadata[] = { 23*c4c9e2bcSAbhi Singh { BL31_IMAGE_ID, MBOOT_BL31_IMAGE_STRING, PCR_0 }, 24*c4c9e2bcSAbhi Singh { BL33_IMAGE_ID, MBOOT_BL33_IMAGE_STRING, PCR_0 }, 25*c4c9e2bcSAbhi Singh { NT_FW_CONFIG_ID, MBOOT_NT_FW_CONFIG_STRING, PCR_0 }, 26*c4c9e2bcSAbhi Singh 27*c4c9e2bcSAbhi Singh { EVLOG_INVALID_ID, NULL, (unsigned int)(-1) } /* Terminator */ 28*c4c9e2bcSAbhi Singh }; 29*c4c9e2bcSAbhi Singh 30*c4c9e2bcSAbhi Singh static uint8_t *event_log_start; 31*c4c9e2bcSAbhi Singh static size_t event_log_size; 32*c4c9e2bcSAbhi Singh 33*c4c9e2bcSAbhi Singh void bl2_plat_mboot_init(void) 34*c4c9e2bcSAbhi Singh { 35*c4c9e2bcSAbhi Singh uint8_t *bl2_event_log_start; 36*c4c9e2bcSAbhi Singh uint8_t *bl2_event_log_finish; 37*c4c9e2bcSAbhi Singh 38*c4c9e2bcSAbhi Singh rpi3_mboot_fetch_eventlog_info(&event_log_start, &event_log_size); 39*c4c9e2bcSAbhi Singh bl2_event_log_start = event_log_start + event_log_size; 40*c4c9e2bcSAbhi Singh bl2_event_log_finish = event_log_start + PLAT_ARM_EVENT_LOG_MAX_SIZE; 41*c4c9e2bcSAbhi Singh event_log_init(bl2_event_log_start, bl2_event_log_finish); 42*c4c9e2bcSAbhi Singh } 43*c4c9e2bcSAbhi Singh 44*c4c9e2bcSAbhi Singh void bl2_plat_mboot_finish(void) 45*c4c9e2bcSAbhi Singh { 46*c4c9e2bcSAbhi Singh /* Event Log filled size */ 47*c4c9e2bcSAbhi Singh size_t event_log_cur_size; 48*c4c9e2bcSAbhi Singh 49*c4c9e2bcSAbhi Singh event_log_cur_size = event_log_get_cur_size((uint8_t *)event_log_start); 50*c4c9e2bcSAbhi Singh 51*c4c9e2bcSAbhi Singh /* Dump Event Log for user view */ 52*c4c9e2bcSAbhi Singh dump_event_log((uint8_t *)event_log_start, event_log_cur_size); 53*c4c9e2bcSAbhi Singh } 54*c4c9e2bcSAbhi Singh 55*c4c9e2bcSAbhi Singh int plat_mboot_measure_image(unsigned int image_id, image_info_t *image_data) 56*c4c9e2bcSAbhi Singh { 57*c4c9e2bcSAbhi Singh int rc = 0; 58*c4c9e2bcSAbhi Singh 59*c4c9e2bcSAbhi Singh unsigned char hash_data[CRYPTO_MD_MAX_SIZE]; 60*c4c9e2bcSAbhi Singh const event_log_metadata_t *metadata_ptr = rpi3_event_log_metadata; 61*c4c9e2bcSAbhi Singh 62*c4c9e2bcSAbhi Singh /* Measure the payload with algorithm selected by EventLog driver */ 63*c4c9e2bcSAbhi Singh rc = event_log_measure(image_data->image_base, image_data->image_size, hash_data); 64*c4c9e2bcSAbhi Singh if (rc != 0) { 65*c4c9e2bcSAbhi Singh return rc; 66*c4c9e2bcSAbhi Singh } 67*c4c9e2bcSAbhi Singh 68*c4c9e2bcSAbhi Singh while ((metadata_ptr->id != EVLOG_INVALID_ID) && 69*c4c9e2bcSAbhi Singh (metadata_ptr->id != image_id)) { 70*c4c9e2bcSAbhi Singh metadata_ptr++; 71*c4c9e2bcSAbhi Singh } 72*c4c9e2bcSAbhi Singh assert(metadata_ptr->id != EVLOG_INVALID_ID); 73*c4c9e2bcSAbhi Singh 74*c4c9e2bcSAbhi Singh event_log_record(hash_data, EV_POST_CODE, metadata_ptr); 75*c4c9e2bcSAbhi Singh 76*c4c9e2bcSAbhi Singh return rc; 77*c4c9e2bcSAbhi Singh } 78