From aa99881d30114e4e3a34eb4cc9808bac5f04226b Mon Sep 17 00:00:00 2001 From: AlexeiFedorov Date: Fri, 15 Nov 2024 13:10:34 +0000 Subject: [PATCH] fix(rme): add console name to checksum calculation The name field of console_info structure was missed in checksum calculation. This is corrected by adding a new helper checksum_calc() which computes the checksum in a field agnostic manner. Change-Id: I5c39ee43f1fa20872c37846e3feeabd0525a47ae Signed-off-by: AlexeiFedorov --- include/services/rmm_core_manifest.h | 8 +++--- plat/arm/board/fvp/fvp_common.c | 40 +++++++++++++++++++--------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/include/services/rmm_core_manifest.h b/include/services/rmm_core_manifest.h index 578bc14b4..6b57267d8 100644 --- a/include/services/rmm_core_manifest.h +++ b/include/services/rmm_core_manifest.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023, Arm Limited. All rights reserved. + * Copyright (c) 2022-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -67,7 +67,7 @@ struct console_info { uintptr_t base; /* Console base address */ uint64_t map_pages; /* Num of pages to be mapped in RMM for the console MMIO */ char name[RMM_CONSOLE_MAX_NAME_LEN]; /* Name of console */ - uint64_t clk_in_hz; /* UART clock (in HZ) for the console */ + uint64_t clk_in_hz; /* UART clock (in Hz) for the console */ uint64_t baud_rate; /* Baud rate */ uint64_t flags; /* Additional flags RES0 */ }; @@ -87,8 +87,8 @@ CASSERT(offsetof(struct console_info, flags) == 40UL, struct console_list { uint64_t num_consoles; /* Number of consoles */ - struct console_info *consoles; /* Pointer to ns_dram_bank[] */ - uint64_t checksum; /* Checksum of ns_dram_info data */ + struct console_info *consoles; /* Pointer to console_info[] */ + uint64_t checksum; /* Checksum of console_list data */ }; CASSERT(offsetof(struct console_list, num_consoles) == 0UL, diff --git a/plat/arm/board/fvp/fvp_common.c b/plat/arm/board/fvp/fvp_common.c index 0c5a76cca..bdc2cacfb 100644 --- a/plat/arm/board/fvp/fvp_common.c +++ b/plat/arm/board/fvp/fvp_common.c @@ -575,6 +575,23 @@ size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared) return (size_t)RMM_SHARED_SIZE; } +/* + * Calculate checksum of 64-bit words @buffer with @size length + */ +static uint64_t checksum_calc(uint64_t *buffer, size_t size) +{ + uint64_t sum = 0UL; + + assert(((uintptr_t)buffer & (sizeof(uint64_t) - 1UL)) == 0UL); + assert((size & (sizeof(uint64_t) - 1UL)) == 0UL); + + for (unsigned long i = 0UL; i < (size / sizeof(uint64_t)); i++) { + sum += buffer[i]; + } + + return sum; +} + int plat_rmmd_load_manifest(struct rmm_manifest *manifest) { uint64_t checksum, num_banks, num_consoles; @@ -661,16 +678,13 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest) /* Store FVP DRAM banks data in Boot Manifest */ for (unsigned long i = 0UL; i < num_banks; i++) { - uintptr_t base = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].base); - uint64_t size = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].size); - - bank_ptr[i].base = base; - bank_ptr[i].size = size; - - /* Update checksum */ - checksum += base + size; + bank_ptr[i].base = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].base); + bank_ptr[i].size = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].size); } + /* Update checksum */ + checksum += checksum_calc((uint64_t *)bank_ptr, sizeof(struct ns_dram_bank) * num_banks); + /* Checksum must be 0 */ manifest->plat_dram.checksum = ~checksum + 1UL; @@ -678,18 +692,18 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest) checksum = num_consoles + (uint64_t)console_ptr; /* Zero out the console info struct */ - memset((void *)console_ptr, '\0', sizeof(struct console_info) * num_consoles); + (void)memset((void *)console_ptr, '\0', sizeof(struct console_info) * num_consoles); - console_ptr[0].map_pages = 1; console_ptr[0].base = FVP_RMM_CONSOLE_BASE; + console_ptr[0].map_pages = 1UL; console_ptr[0].clk_in_hz = FVP_RMM_CONSOLE_CLK_IN_HZ; console_ptr[0].baud_rate = FVP_RMM_CONSOLE_BAUD; - strlcpy(console_ptr[0].name, FVP_RMM_CONSOLE_NAME, RMM_CONSOLE_MAX_NAME_LEN-1UL); + (void)strlcpy(console_ptr[0].name, FVP_RMM_CONSOLE_NAME, RMM_CONSOLE_MAX_NAME_LEN - 1UL); /* Update checksum */ - checksum += console_ptr[0].base + console_ptr[0].map_pages + - console_ptr[0].clk_in_hz + console_ptr[0].baud_rate; + checksum += checksum_calc((uint64_t *)console_ptr, + sizeof(struct console_info) * num_consoles); /* Checksum must be 0 */ manifest->plat_console.checksum = ~checksum + 1UL;