1*cb2c4f93SYing-Chun Liu (PaulLiu) /* 2*cb2c4f93SYing-Chun Liu (PaulLiu) * Copyright (c) 2022, Arm Limited. All rights reserved. 3*cb2c4f93SYing-Chun Liu (PaulLiu) * Copyright (c) 2022, Linaro. 4*cb2c4f93SYing-Chun Liu (PaulLiu) * 5*cb2c4f93SYing-Chun Liu (PaulLiu) * SPDX-License-Identifier: BSD-3-Clause 6*cb2c4f93SYing-Chun Liu (PaulLiu) */ 7*cb2c4f93SYing-Chun Liu (PaulLiu) 8*cb2c4f93SYing-Chun Liu (PaulLiu) #include <string.h> 9*cb2c4f93SYing-Chun Liu (PaulLiu) 10*cb2c4f93SYing-Chun Liu (PaulLiu) #include "./include/imx8m_measured_boot.h" 11*cb2c4f93SYing-Chun Liu (PaulLiu) #include <drivers/measured_boot/event_log/event_log.h> 12*cb2c4f93SYing-Chun Liu (PaulLiu) #include <plat/arm/common/plat_arm.h> 13*cb2c4f93SYing-Chun Liu (PaulLiu) 14*cb2c4f93SYing-Chun Liu (PaulLiu) /* Event Log data */ 15*cb2c4f93SYing-Chun Liu (PaulLiu) static uint8_t event_log[PLAT_IMX_EVENT_LOG_MAX_SIZE]; 16*cb2c4f93SYing-Chun Liu (PaulLiu) 17*cb2c4f93SYing-Chun Liu (PaulLiu) /* FVP table with platform specific image IDs, names and PCRs */ 18*cb2c4f93SYing-Chun Liu (PaulLiu) static const event_log_metadata_t imx8m_event_log_metadata[] = { 19*cb2c4f93SYing-Chun Liu (PaulLiu) { BL31_IMAGE_ID, EVLOG_BL31_STRING, PCR_0 }, 20*cb2c4f93SYing-Chun Liu (PaulLiu) { BL32_IMAGE_ID, EVLOG_BL32_STRING, PCR_0 }, 21*cb2c4f93SYing-Chun Liu (PaulLiu) { BL32_EXTRA1_IMAGE_ID, EVLOG_BL32_EXTRA1_STRING, PCR_0 }, 22*cb2c4f93SYing-Chun Liu (PaulLiu) { BL32_EXTRA2_IMAGE_ID, EVLOG_BL32_EXTRA2_STRING, PCR_0 }, 23*cb2c4f93SYing-Chun Liu (PaulLiu) { BL33_IMAGE_ID, EVLOG_BL33_STRING, PCR_0 }, 24*cb2c4f93SYing-Chun Liu (PaulLiu) { EVLOG_INVALID_ID, NULL, (unsigned int)(-1) } /* Terminator */ 25*cb2c4f93SYing-Chun Liu (PaulLiu) }; 26*cb2c4f93SYing-Chun Liu (PaulLiu) 27*cb2c4f93SYing-Chun Liu (PaulLiu) const event_log_metadata_t *plat_event_log_get_metadata(void) 28*cb2c4f93SYing-Chun Liu (PaulLiu) { 29*cb2c4f93SYing-Chun Liu (PaulLiu) return imx8m_event_log_metadata; 30*cb2c4f93SYing-Chun Liu (PaulLiu) } 31*cb2c4f93SYing-Chun Liu (PaulLiu) 32*cb2c4f93SYing-Chun Liu (PaulLiu) int plat_mboot_measure_image(unsigned int image_id, image_info_t *image_data) 33*cb2c4f93SYing-Chun Liu (PaulLiu) { 34*cb2c4f93SYing-Chun Liu (PaulLiu) /* Calculate image hash and record data in Event Log */ 35*cb2c4f93SYing-Chun Liu (PaulLiu) int err = event_log_measure_and_record(image_data->image_base, 36*cb2c4f93SYing-Chun Liu (PaulLiu) image_data->image_size, 37*cb2c4f93SYing-Chun Liu (PaulLiu) image_id); 38*cb2c4f93SYing-Chun Liu (PaulLiu) if (err != 0) { 39*cb2c4f93SYing-Chun Liu (PaulLiu) ERROR("%s%s image id %u (%i)\n", 40*cb2c4f93SYing-Chun Liu (PaulLiu) "Failed to ", "record", image_id, err); 41*cb2c4f93SYing-Chun Liu (PaulLiu) return err; 42*cb2c4f93SYing-Chun Liu (PaulLiu) } 43*cb2c4f93SYing-Chun Liu (PaulLiu) 44*cb2c4f93SYing-Chun Liu (PaulLiu) return 0; 45*cb2c4f93SYing-Chun Liu (PaulLiu) } 46*cb2c4f93SYing-Chun Liu (PaulLiu) 47*cb2c4f93SYing-Chun Liu (PaulLiu) void bl2_plat_mboot_init(void) 48*cb2c4f93SYing-Chun Liu (PaulLiu) { 49*cb2c4f93SYing-Chun Liu (PaulLiu) event_log_init(event_log, event_log + sizeof(event_log)); 50*cb2c4f93SYing-Chun Liu (PaulLiu) event_log_write_header(); 51*cb2c4f93SYing-Chun Liu (PaulLiu) } 52*cb2c4f93SYing-Chun Liu (PaulLiu) 53*cb2c4f93SYing-Chun Liu (PaulLiu) void bl2_plat_mboot_finish(void) 54*cb2c4f93SYing-Chun Liu (PaulLiu) { 55*cb2c4f93SYing-Chun Liu (PaulLiu) int rc = 0; 56*cb2c4f93SYing-Chun Liu (PaulLiu) 57*cb2c4f93SYing-Chun Liu (PaulLiu) /* Event Log address in Non-Secure memory */ 58*cb2c4f93SYing-Chun Liu (PaulLiu) uintptr_t ns_log_addr; 59*cb2c4f93SYing-Chun Liu (PaulLiu) 60*cb2c4f93SYing-Chun Liu (PaulLiu) /* Event Log filled size */ 61*cb2c4f93SYing-Chun Liu (PaulLiu) size_t event_log_cur_size; 62*cb2c4f93SYing-Chun Liu (PaulLiu) 63*cb2c4f93SYing-Chun Liu (PaulLiu) event_log_cur_size = event_log_get_cur_size(event_log); 64*cb2c4f93SYing-Chun Liu (PaulLiu) 65*cb2c4f93SYing-Chun Liu (PaulLiu) rc = imx8m_set_nt_fw_info(event_log_cur_size, &ns_log_addr); 66*cb2c4f93SYing-Chun Liu (PaulLiu) if (rc != 0) { 67*cb2c4f93SYing-Chun Liu (PaulLiu) ERROR("%s(): Unable to update %s_FW_CONFIG\n", 68*cb2c4f93SYing-Chun Liu (PaulLiu) __func__, "NT"); 69*cb2c4f93SYing-Chun Liu (PaulLiu) /* 70*cb2c4f93SYing-Chun Liu (PaulLiu) * It is a fatal error because on i.MX U-boot assumes that 71*cb2c4f93SYing-Chun Liu (PaulLiu) * a valid event log exists and will use it to record the 72*cb2c4f93SYing-Chun Liu (PaulLiu) * measurements into the fTPM. 73*cb2c4f93SYing-Chun Liu (PaulLiu) */ 74*cb2c4f93SYing-Chun Liu (PaulLiu) panic(); 75*cb2c4f93SYing-Chun Liu (PaulLiu) } 76*cb2c4f93SYing-Chun Liu (PaulLiu) 77*cb2c4f93SYing-Chun Liu (PaulLiu) /* Copy Event Log to Non-secure memory */ 78*cb2c4f93SYing-Chun Liu (PaulLiu) (void)memcpy((void *)ns_log_addr, (const void *)event_log, 79*cb2c4f93SYing-Chun Liu (PaulLiu) event_log_cur_size); 80*cb2c4f93SYing-Chun Liu (PaulLiu) 81*cb2c4f93SYing-Chun Liu (PaulLiu) /* Ensure that the Event Log is visible in Non-secure memory */ 82*cb2c4f93SYing-Chun Liu (PaulLiu) flush_dcache_range(ns_log_addr, event_log_cur_size); 83*cb2c4f93SYing-Chun Liu (PaulLiu) 84*cb2c4f93SYing-Chun Liu (PaulLiu) dump_event_log((uint8_t *)event_log, event_log_cur_size); 85*cb2c4f93SYing-Chun Liu (PaulLiu) } 86