
Hi Levi,
On Tue, 9 Jul 2024 at 09:25, Levi Yun yeoreum.yun@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:
breaking X1 value with updated specification in aarch64
- change of length of signature field.
previous error value set in R1 in arm32.
- length of signature should be 24, but it uses 32bit signature.
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/5aa7aa1d3a1db7521...
Signed-off-by: Levi Yun yeoreum.yun@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