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 <Alexei.Fedorov@arm.com>
This commit is contained in:
AlexeiFedorov 2024-11-15 13:10:34 +00:00 committed by Alexei Fedorov
parent 3109367c34
commit aa99881d30
2 changed files with 31 additions and 17 deletions

View file

@ -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,

View file

@ -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;