Hi Levi, On Tue, 9 Jul 2024 at 09:25, Levi Yun <yeoreum....@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....@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