[PATCH] bloblist: Fix bloblist convention checking.
Raymond Mao
raymond.mao at linaro.org
Tue Jul 9 16:23:54 CEST 2024
Hi Levi,
On Tue, 9 Jul 2024 at 09:25, Levi Yun <yeoreum.yun at arm.com> wrote:
> According to recently firmware handsoff spec [1]'s
> "Register usage at handoff boundary",
> Transfer List's signature value was changed from 0x40_b10b
> (3 bytes) to 4a0f_b10b (4 bytes).
>
> As updating of TL's signature, register value of x1/r1 should be:
>
> In aarch32's r1 value should be
> R1[23:0]: TL signature (4a0f_b10b->masked range value: 0f_b10b)
> R1[31:24]: version of the register convention == 1
>
> and
>
> In aarch64's x1 value should be
> X1[31:0]: TL signature (4a0f_b10b)
> X1[39:32]: version of the register convention == 1
> X1[63:40]: MBZ
> (See the [2] and [3]).
>
> Also, according to architecture, the convention is slight different:
>
> In aarch32:
> R0: MBZ
> R1: see above
> R2: Compatibility location for passing a platform description
> devicetree
> R3: tl_base_pa
>
> In aarch64:
> X0: Compatibility location for passing a platform description
> devicetree
> X1: see above
> X2: MBZ
> X3: tl_base_pa
>
> This patch fix problems:
> 1. breaking X1 value with updated specification in aarch64
> - change of length of signature field.
>
> 2. previous error value set in R1 in arm32.
> - length of signature should be 24, but it uses 32bit signature.
>
> 3. according to architecture, check register convetion differently.
>
> [1] https://github.com/FirmwareHandoff/firmware_handoff
> [2] https://github.com/FirmwareHandoff/firmware_handoff/issues/32
> [3]
> https://github.com/FirmwareHandoff/firmware_handoff/commit/5aa7aa1d3a1db75213e458d392b751f0707de027
>
> Signed-off-by: Levi Yun <yeoreum.yun at arm.com>
> ---
> arch/arm/lib/xferlist.c | 8 +++++---
> common/bloblist.c | 11 ++++++++++-
> include/bloblist.h | 5 ++++-
> 3 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/lib/xferlist.c b/arch/arm/lib/xferlist.c
> index f9c5d88bd4..a6349293bd 100644
> --- a/arch/arm/lib/xferlist.c
> +++ b/arch/arm/lib/xferlist.c
> @@ -12,12 +12,14 @@ int xferlist_from_boot_arg(ulong addr, ulong size)
> {
> int ret;
>
> - ret = bloblist_check(saved_args[3], size);
> + if (IS_ENABLED(CONFIG_64BIT))
> + ret = bloblist_check_reg_conv(saved_args[0],
> saved_args[2], saved_args[1]);
> + else
> + ret = bloblist_check_reg_conv(saved_args[2],
> saved_args[0], saved_args[1]);
>
The handoff of armv7 will break if you swap arg[0] and arg[2] here.
The args are already aligned in the correct order via the assembly code.
Please see the 'save_boot_params' function in start.S of armv7.
Regards,
Raymond
More information about the U-Boot
mailing list