diff --git a/plat/qemu/common/qemu_common.c b/plat/qemu/common/qemu_common.c index 0bfb12682..5dc39a1ec 100644 --- a/plat/qemu/common/qemu_common.c +++ b/plat/qemu/common/qemu_common.c @@ -258,6 +258,23 @@ static void plat_get_memory_node(int index, struct ns_dram_bank *bank_ptr) } #endif /* PLAT_qemu */ +/* + * Calculate checksum of 64-bit words @buffer, of @size bytes + */ +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) { int i, last; @@ -352,10 +369,12 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest) last = num_banks - 1; for (i = 0; i < num_banks; i++) { plat_get_memory_node(i, &bank_ptr[last]); - checksum += bank_ptr[last].base + bank_ptr[last].size; last--; } + checksum += checksum_calc((uint64_t *)bank_ptr, + num_banks * sizeof(*bank_ptr)); + /* Checksum must be 0 */ manifest->plat_dram.checksum = ~checksum + 1UL; @@ -373,8 +392,8 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest) strlcpy(console_ptr[0].name, "pl011", sizeof(console_ptr[0].name)); /* 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, + num_consoles * sizeof(*console_ptr)); /* Checksum must be 0 */ manifest->plat_console.checksum = ~checksum + 1UL;