mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 14:25:44 +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
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <common/debug.h>
|
#include <common/debug.h>
|
||||||
#include <common/desc_image_load.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 fconf_populate_arm_sp(uintptr_t config)
|
||||||
{
|
{
|
||||||
int sp_node, node, err;
|
int sp_node, node, err;
|
||||||
union uuid_helper_t uuid_helper;
|
struct uuid uuid;
|
||||||
unsigned int index = 0;
|
unsigned int index = 0;
|
||||||
uint32_t val32;
|
uint32_t val32;
|
||||||
const unsigned int sip_start = SP_PKG1_ID;
|
const unsigned int sip_start = SP_PKG1_ID;
|
||||||
|
@ -68,13 +69,14 @@ int fconf_populate_arm_sp(uintptr_t config)
|
||||||
|
|
||||||
/* Read UUID */
|
/* Read UUID */
|
||||||
err = fdtw_read_uuid(dtb, sp_node, "uuid", 16,
|
err = fdtw_read_uuid(dtb, sp_node, "uuid", 16,
|
||||||
(uint8_t *)&uuid_helper);
|
(uint8_t *)&uuid);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
ERROR("FCONF: cannot read SP uuid\n");
|
ERROR("FCONF: cannot read SP uuid\n");
|
||||||
return -1;
|
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 */
|
/* Read Load address */
|
||||||
err = fdt_read_uint32(dtb, sp_node, "load-address", &val32);
|
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"
|
" %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
|
||||||
" load_addr=%lx\n",
|
" load_addr=%lx\n",
|
||||||
__func__,
|
__func__,
|
||||||
uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1],
|
uuid.time_low[0], uuid.time_low[1],
|
||||||
uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3],
|
uuid.time_low[2], uuid.time_low[3],
|
||||||
uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1],
|
uuid.time_mid[0], uuid.time_mid[1],
|
||||||
uuid_helper.uuid_struct.time_hi_and_version[0],
|
uuid.time_hi_and_version[0],
|
||||||
uuid_helper.uuid_struct.time_hi_and_version[1],
|
uuid.time_hi_and_version[1],
|
||||||
uuid_helper.uuid_struct.clock_seq_hi_and_reserved,
|
uuid.clock_seq_hi_and_reserved,
|
||||||
uuid_helper.uuid_struct.clock_seq_low,
|
uuid.clock_seq_low,
|
||||||
uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1],
|
uuid.node[0], uuid.node[1],
|
||||||
uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3],
|
uuid.node[2], uuid.node[3],
|
||||||
uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5],
|
uuid.node[4], uuid.node[5],
|
||||||
arm_sp.load_addr[index]);
|
arm_sp.load_addr[index]);
|
||||||
|
|
||||||
/* Read owner field only for dualroot CoT */
|
/* Read owner field only for dualroot CoT */
|
||||||
|
|
Loading…
Add table
Reference in a new issue