mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-22 20:38:03 +00:00
Merge "feat(handoff): fix register convention r1/x1 value on transfer list" into integration
This commit is contained in:
commit
a3939b1bda
4 changed files with 43 additions and 18 deletions
|
@ -29,7 +29,22 @@
|
||||||
* Version of the register convention used.
|
* Version of the register convention used.
|
||||||
* Set to 1 for both AArch64 and AArch32 according to fw handoff spec v0.9
|
* Set to 1 for both AArch64 and AArch32 according to fw handoff spec v0.9
|
||||||
*/
|
*/
|
||||||
#define REGISTER_CONVENTION_VERSION_MASK (1 << 24)
|
#define REGISTER_CONVENTION_VERSION_SHIFT_64 UL(32)
|
||||||
|
#define REGISTER_CONVENTION_VERSION_SHIFT_32 UL(24)
|
||||||
|
#define REGISTER_CONVENTION_VERSION_MASK UL(0xff)
|
||||||
|
#define REGISTER_CONVENTION_VERSION UL(1)
|
||||||
|
|
||||||
|
#define TRANSFER_LIST_HANDOFF_X1_VALUE(__version) \
|
||||||
|
((TRANSFER_LIST_SIGNATURE & \
|
||||||
|
((1UL << REGISTER_CONVENTION_VERSION_SHIFT_64) - 1)) | \
|
||||||
|
(((__version) & REGISTER_CONVENTION_VERSION_MASK) << \
|
||||||
|
REGISTER_CONVENTION_VERSION_SHIFT_64))
|
||||||
|
|
||||||
|
#define TRANSFER_LIST_HANDOFF_R1_VALUE(__version) \
|
||||||
|
((TRANSFER_LIST_SIGNATURE & \
|
||||||
|
((1UL << REGISTER_CONVENTION_VERSION_SHIFT_32) - 1)) | \
|
||||||
|
(((__version) & REGISTER_CONVENTION_VERSION_MASK) << \
|
||||||
|
REGISTER_CONVENTION_VERSION_SHIFT_32))
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
|
|
|
@ -63,20 +63,21 @@ transfer_list_set_handoff_args(struct transfer_list_header *tl,
|
||||||
te = transfer_list_find(tl, TL_TAG_FDT);
|
te = transfer_list_find(tl, TL_TAG_FDT);
|
||||||
dt = transfer_list_entry_data(te);
|
dt = transfer_list_entry_data(te);
|
||||||
|
|
||||||
ep_info->args.arg1 = TRANSFER_LIST_SIGNATURE |
|
#ifdef __aarch64__
|
||||||
REGISTER_CONVENTION_VERSION_MASK;
|
if (GET_RW(ep_info->spsr) == MODE_RW_64) {
|
||||||
ep_info->args.arg3 = (uintptr_t)tl;
|
|
||||||
|
|
||||||
if (GET_RW(ep_info->spsr) == MODE_RW_32) {
|
|
||||||
/* aarch32 */
|
|
||||||
ep_info->args.arg0 = 0;
|
|
||||||
ep_info->args.arg2 = (uintptr_t)dt;
|
|
||||||
} else {
|
|
||||||
/* aarch64 */
|
|
||||||
ep_info->args.arg0 = (uintptr_t)dt;
|
ep_info->args.arg0 = (uintptr_t)dt;
|
||||||
|
ep_info->args.arg1 = TRANSFER_LIST_HANDOFF_X1_VALUE(REGISTER_CONVENTION_VERSION);
|
||||||
ep_info->args.arg2 = 0;
|
ep_info->args.arg2 = 0;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
ep_info->args.arg0 = 0;
|
||||||
|
ep_info->args.arg1 = TRANSFER_LIST_HANDOFF_R1_VALUE(REGISTER_CONVENTION_VERSION);
|
||||||
|
ep_info->args.arg2 = (uintptr_t)dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ep_info->args.arg3 = (uintptr_t)tl;
|
||||||
|
|
||||||
return ep_info;
|
return ep_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -357,12 +357,20 @@ static int qemu_bl2_handle_post_image_load(unsigned int image_id)
|
||||||
case BL31_IMAGE_ID:
|
case BL31_IMAGE_ID:
|
||||||
/*
|
/*
|
||||||
* arg0 is a bl_params_t reserved for bl31_early_platform_setup2
|
* arg0 is a bl_params_t reserved for bl31_early_platform_setup2
|
||||||
* we just need arg1 and arg3 for BL31 to update th TL from S
|
* we just need arg1 and arg3 for BL31 to update the TL from S
|
||||||
* to NS memory before it exits
|
* to NS memory before it exits
|
||||||
*/
|
*/
|
||||||
|
#ifdef __aarch64__
|
||||||
|
if (GET_RW(bl_mem_params->ep_info.spsr) == MODE_RW_64) {
|
||||||
bl_mem_params->ep_info.args.arg1 =
|
bl_mem_params->ep_info.args.arg1 =
|
||||||
TRANSFER_LIST_SIGNATURE |
|
TRANSFER_LIST_HANDOFF_X1_VALUE(REGISTER_CONVENTION_VERSION);
|
||||||
REGISTER_CONVENTION_VERSION_MASK;
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
bl_mem_params->ep_info.args.arg1 =
|
||||||
|
TRANSFER_LIST_HANDOFF_R1_VALUE(REGISTER_CONVENTION_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
bl_mem_params->ep_info.args.arg3 = (uintptr_t)bl2_tl;
|
bl_mem_params->ep_info.args.arg3 = (uintptr_t)bl2_tl;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -552,13 +552,14 @@ static int32_t opteed_handle_smc_load(uint64_t data_size, uint32_t data_pa)
|
||||||
|
|
||||||
if (opteed_rw == OPTEE_AARCH64) {
|
if (opteed_rw == OPTEE_AARCH64) {
|
||||||
arg0 = (uint64_t)dt;
|
arg0 = (uint64_t)dt;
|
||||||
|
arg1 = TRANSFER_LIST_HANDOFF_X1_VALUE(REGISTER_CONVENTION_VERSION);
|
||||||
arg2 = 0;
|
arg2 = 0;
|
||||||
} else {
|
} else {
|
||||||
arg2 = (uint64_t)dt;
|
|
||||||
arg0 = 0;
|
arg0 = 0;
|
||||||
|
arg1 = TRANSFER_LIST_HANDOFF_R1_VALUE(REGISTER_CONVENTION_VERSION);
|
||||||
|
arg2 = (uint64_t)dt;
|
||||||
}
|
}
|
||||||
arg1 = TRANSFER_LIST_SIGNATURE |
|
|
||||||
REGISTER_CONVENTION_VERSION_MASK;
|
|
||||||
arg3 = (uint64_t)bl31_tl;
|
arg3 = (uint64_t)bl31_tl;
|
||||||
} else {
|
} else {
|
||||||
/* Default handoff arguments */
|
/* Default handoff arguments */
|
||||||
|
|
Loading…
Add table
Reference in a new issue