diff --git a/include/plat/arm/common/arm_def.h b/include/plat/arm/common/arm_def.h index 1bb7db78c..925ff2115 100644 --- a/include/plat/arm/common/arm_def.h +++ b/include/plat/arm/common/arm_def.h @@ -82,6 +82,7 @@ * - L1 GPT DRAM: Reserved for L1 GPT if RME is enabled * - REALM DRAM: Reserved for Realm world if RME is enabled * - TF-A <-> RMM SHARED: Area shared for communication between TF-A and RMM + * - Event Log: Area for Event Log if MEASURED_BOOT feature is enabled * - AP TZC DRAM: The remaining TZC secured DRAM reserved for AP use * * RME enabled(64MB) RME not enabled(16MB) @@ -89,13 +90,15 @@ * | | | | * | AP TZC (~28MB) | | AP TZC (~14MB) | * -------------------- ------------------- + * | Event Log | | Event Log | + * | (4KB) | | (4KB) | + * -------------------- ------------------- + * | REALM (RMM) | | | + * | (32MB - 4KB) | | EL3 TZC (2MB) | + * -------------------- ------------------- * | | | | - * | REALM (RMM) | | EL3 TZC (2MB) | - * | (32MB - 4KB) | ------------------- - * -------------------- | | - * | | | SCP TZC | - * | TF-A <-> RMM | 0xFFFF_FFFF------------------- - * | SHARED (4KB) | + * | TF-A <-> RMM | | SCP TZC | + * | SHARED (4KB) | 0xFFFF_FFFF------------------- * -------------------- * | | * | EL3 TZC (3MB) | @@ -114,7 +117,6 @@ */ #define ARM_EL3_TZC_DRAM1_SIZE UL(0x00300000) /* 3MB */ #define ARM_L1_GPT_SIZE UL(0x00100000) /* 1MB */ - /* 32MB - ARM_EL3_RMM_SHARED_SIZE */ #define ARM_REALM_SIZE (UL(0x02000000) - \ ARM_EL3_RMM_SHARED_SIZE) @@ -134,6 +136,25 @@ #define ARM_SCP_TZC_DRAM1_SIZE PLAT_ARM_SCP_TZC_DRAM1_SIZE #define ARM_SCP_TZC_DRAM1_END (ARM_SCP_TZC_DRAM1_BASE + \ ARM_SCP_TZC_DRAM1_SIZE - 1U) + +# if (defined(SPD_tspd) || defined(SPD_opteed) || defined(SPD_spmd)) && \ +MEASURED_BOOT +#define ARM_EVENT_LOG_DRAM1_SIZE UL(0x00001000) /* 4KB */ + +#if ENABLE_RME +#define ARM_EVENT_LOG_DRAM1_BASE (ARM_REALM_BASE - \ + ARM_EVENT_LOG_DRAM1_SIZE) +#else +#define ARM_EVENT_LOG_DRAM1_BASE (ARM_EL3_TZC_DRAM1_BASE - \ + ARM_EVENT_LOG_DRAM1_SIZE) +#endif /* ENABLE_RME */ +#define ARM_EVENT_LOG_DRAM1_END (ARM_EVENT_LOG_DRAM1_BASE + \ + ARM_EVENT_LOG_DRAM1_SIZE - \ + 1U) +#else +#define ARM_EVENT_LOG_DRAM1_SIZE UL(0) +#endif /* (SPD_tspd || SPD_opteed || SPD_spmd) && MEASURED_BOOT */ + #if ENABLE_RME #define ARM_L1_GPT_ADDR_BASE (ARM_DRAM1_BASE + \ ARM_DRAM1_SIZE - \ @@ -170,7 +191,9 @@ ARM_EL3_TZC_DRAM1_SIZE + \ ARM_EL3_RMM_SHARED_SIZE + \ ARM_REALM_SIZE + \ - ARM_L1_GPT_SIZE)) + ARM_L1_GPT_SIZE + \ + ARM_EVENT_LOG_DRAM1_SIZE)) + #define ARM_AP_TZC_DRAM1_END (ARM_AP_TZC_DRAM1_BASE + \ ARM_AP_TZC_DRAM1_SIZE - 1U) @@ -313,6 +336,15 @@ PLAT_ARM_TRUSTED_DRAM_SIZE, \ MT_MEMORY | MT_RW | MT_SECURE) +# if (defined(SPD_tspd) || defined(SPD_opteed) || defined(SPD_spmd)) && \ +MEASURED_BOOT +#define ARM_MAP_EVENT_LOG_DRAM1 \ + MAP_REGION_FLAT( \ + ARM_EVENT_LOG_DRAM1_BASE, \ + ARM_EVENT_LOG_DRAM1_SIZE, \ + MT_MEMORY | MT_RW | MT_SECURE) +#endif /* (SPD_tspd || SPD_opteed || SPD_spmd) && MEASURED_BOOT */ + #if ENABLE_RME /* * We add the EL3_RMM_SHARED size to RMM mapping to map the region as a block. diff --git a/plat/arm/board/fvp/fvp_bl2_measured_boot.c b/plat/arm/board/fvp/fvp_bl2_measured_boot.c index 29b66197d..7b0673a14 100644 --- a/plat/arm/board/fvp/fvp_bl2_measured_boot.c +++ b/plat/arm/board/fvp/fvp_bl2_measured_boot.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022, Arm Limited. All rights reserved. + * Copyright (c) 2021-2023, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -15,6 +15,11 @@ #include #include +#if defined(SPD_tspd) || defined(SPD_opteed) || defined(SPD_spmd) +CASSERT(ARM_EVENT_LOG_DRAM1_SIZE >= PLAT_ARM_EVENT_LOG_MAX_SIZE, \ + assert_res_eventlog_mem_insufficient); +#endif /* defined(SPD_tspd) || defined(SPD_opteed) || defined(SPD_spmd) */ + /* Event Log data */ static uint64_t event_log_base; @@ -195,9 +200,19 @@ void bl2_plat_mboot_finish(void) event_log_cur_size = event_log_get_cur_size((uint8_t *)event_log_base); +#if defined(SPD_tspd) || defined(SPD_opteed) || defined(SPD_spmd) + /* Copy Event Log to TZC secured DRAM memory */ + (void)memcpy((void *)ARM_EVENT_LOG_DRAM1_BASE, + (const void *)event_log_base, + event_log_cur_size); + + /* Ensure that the Event Log is visible in TZC secured DRAM memory */ + flush_dcache_range(ARM_EVENT_LOG_DRAM1_BASE, event_log_cur_size); +#endif /* defined(SPD_tspd) || defined(SPD_opteed) || defined(SPD_spmd) */ + rc = arm_set_nt_fw_info( #ifdef SPD_opteed - (uintptr_t)event_log_base, + (uintptr_t)ARM_EVENT_LOG_DRAM1_BASE, #endif event_log_cur_size, &ns_log_addr); if (rc != 0) { @@ -222,7 +237,7 @@ void bl2_plat_mboot_finish(void) #if defined(SPD_tspd) || defined(SPD_spmd) /* Set Event Log data in TOS_FW_CONFIG */ - rc = arm_set_tos_fw_info((uintptr_t)event_log_base, + rc = arm_set_tos_fw_info((uintptr_t)ARM_EVENT_LOG_DRAM1_BASE, event_log_cur_size); if (rc != 0) { ERROR("%s(): Unable to update %s_FW_CONFIG\n", diff --git a/plat/arm/board/fvp/fvp_common.c b/plat/arm/board/fvp/fvp_common.c index f500f3a3e..283918bb0 100644 --- a/plat/arm/board/fvp/fvp_common.c +++ b/plat/arm/board/fvp/fvp_common.c @@ -111,6 +111,15 @@ const mmap_region_t plat_arm_mmap[] = { * Required to load HW_CONFIG, SPMC and SPs to trusted DRAM. */ ARM_MAP_TRUSTED_DRAM, + + /* + * Required to load Event Log in TZC secured memory + */ +#if MEASURED_BOOT && (defined(SPD_tspd) || defined(SPD_opteed) || \ +defined(SPD_spmd)) + ARM_MAP_EVENT_LOG_DRAM1, +#endif /* MEASURED_BOOT && (SPD_tspd || SPD_opteed || SPD_spmd) */ + #if ENABLE_RME ARM_MAP_RMM_DRAM, ARM_MAP_GPT_L1_DRAM, diff --git a/plat/arm/board/fvp/include/platform_def.h b/plat/arm/board/fvp/include/platform_def.h index 52146a3b6..039f8e299 100644 --- a/plat/arm/board/fvp/include/platform_def.h +++ b/plat/arm/board/fvp/include/platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2022, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2023, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -168,7 +168,12 @@ # define MAX_XLAT_TABLES 5 #else # define PLAT_ARM_MMAP_ENTRIES 12 -# define MAX_XLAT_TABLES 6 +# if (defined(SPD_tspd) || defined(SPD_opteed) || defined(SPD_spmd)) && \ +defined(IMAGE_BL2) && MEASURED_BOOT +# define MAX_XLAT_TABLES 7 +# else +# define MAX_XLAT_TABLES 6 +# endif /* (SPD_tspd || SPD_opteed || SPD_spmd) && IMAGE_BL2 && MEASURED_BOOT */ #endif /*