mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 09:34:18 +00:00
fix(fconf): boot fails using ARM_ARCH_MINOR=8
When building TF-A (with SPMD support) with ARM_ARCH_MAJOR=8/ ARCH_ARCH_MINOR=8 options, this forces the -march=armv8.8-a compiler option. In this condition, the compiler optimises statement [1] into a store pair to an unaligned address resulting to a supposedly alignment fault. With -march=armv8.7-a and earlier the compiler resolves with a memcpy. Replacing this line by an explicit memcpy masks out the issue. Prefer using the plain struct uuid in place of the uuid_helper union for further clarity. [1] https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/tree/ plat/arm/common/fconf/arm_fconf_sp.c?h=v2.10#n77 Signed-off-by: Olivier Deprez <olivier.deprez@arm.com> Change-Id: I509b7bc50c7c4a894885d24dc8279d0fe634e8f2
This commit is contained in:
parent
99db13bfaa
commit
0c86a846d9
1 changed files with 16 additions and 14 deletions
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* Copyright (c) 2020-2022, ARM Limited and Contributors. All rights reserved.
|
||||
* Copyright (c) 2020-2024, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <common/desc_image_load.h>
|
||||
|
@ -27,7 +28,7 @@ struct arm_sp_t arm_sp;
|
|||
int fconf_populate_arm_sp(uintptr_t config)
|
||||
{
|
||||
int sp_node, node, err;
|
||||
union uuid_helper_t uuid_helper;
|
||||
struct uuid uuid;
|
||||
unsigned int index = 0;
|
||||
uint32_t val32;
|
||||
const unsigned int sip_start = SP_PKG1_ID;
|
||||
|
@ -68,13 +69,14 @@ int fconf_populate_arm_sp(uintptr_t config)
|
|||
|
||||
/* Read UUID */
|
||||
err = fdtw_read_uuid(dtb, sp_node, "uuid", 16,
|
||||
(uint8_t *)&uuid_helper);
|
||||
(uint8_t *)&uuid);
|
||||
if (err < 0) {
|
||||
ERROR("FCONF: cannot read SP uuid\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
arm_sp.uuids[index] = uuid_helper;
|
||||
memcpy_s(&arm_sp.uuids[index].uuid_struct, sizeof(struct uuid),
|
||||
&uuid, sizeof(struct uuid));
|
||||
|
||||
/* Read Load address */
|
||||
err = fdt_read_uint32(dtb, sp_node, "load-address", &val32);
|
||||
|
@ -88,16 +90,16 @@ int fconf_populate_arm_sp(uintptr_t config)
|
|||
" %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
|
||||
" load_addr=%lx\n",
|
||||
__func__,
|
||||
uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1],
|
||||
uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3],
|
||||
uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1],
|
||||
uuid_helper.uuid_struct.time_hi_and_version[0],
|
||||
uuid_helper.uuid_struct.time_hi_and_version[1],
|
||||
uuid_helper.uuid_struct.clock_seq_hi_and_reserved,
|
||||
uuid_helper.uuid_struct.clock_seq_low,
|
||||
uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1],
|
||||
uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3],
|
||||
uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5],
|
||||
uuid.time_low[0], uuid.time_low[1],
|
||||
uuid.time_low[2], uuid.time_low[3],
|
||||
uuid.time_mid[0], uuid.time_mid[1],
|
||||
uuid.time_hi_and_version[0],
|
||||
uuid.time_hi_and_version[1],
|
||||
uuid.clock_seq_hi_and_reserved,
|
||||
uuid.clock_seq_low,
|
||||
uuid.node[0], uuid.node[1],
|
||||
uuid.node[2], uuid.node[3],
|
||||
uuid.node[4], uuid.node[5],
|
||||
arm_sp.load_addr[index]);
|
||||
|
||||
/* Read owner field only for dualroot CoT */
|
||||
|
|
Loading…
Add table
Reference in a new issue