Re: [PATCH u-boot-marvell v2 12/20] tools: kwbimage: Enforce 128-bit boundary alignment only for Sheeva CPU

Stefan Roese
2022-01-13T06:41:02Z

On 1/12/22 18:20, Pali Rohár wrote:
> This alignment is required only for platforms based on Sheeva CPU core
> which are A370 and AXP. Now when U-Boot build system correctly propagates
> LOAD_ADDRESS there is no need to have enabled 128-bit boundary alignment on
> platforms which do not need it. Previously it was required because load
> address was implicitly rounded to 128-bit boundary and U-Boot build system
> expected it and misused it. Now with explicit setting of LOAD_ADDRESS there
> is no guessing for load address anymore.
>
> Signed-off-by: Pali Rohár <pali@kernel.org>

Reviewed-by: Stefan Roese <sr@denx.de>

Thanks,
Stefan

> ---
> tools/kwbimage.c | 12 ++++++++----
> 1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/tools/kwbimage.c b/tools/kwbimage.c
> index ce053a4a5a78..7c2106006ad7 100644
> --- a/tools/kwbimage.c
> +++ b/tools/kwbimage.c
> @@ -1101,8 +1101,10 @@ static size_t image_headersz_v1(int *hasext)
> return 0;
> }
> headersz = e->binary.loadaddr - base_addr;
> - } else {
> + } else if (cpu_sheeva) {
> headersz = ALIGN(headersz, 16);
> + } else {
> + headersz = ALIGN(headersz, 4);
> }
>
> headersz += ALIGN(s.st_size, 4) + sizeof(uint32_t);
> @@ -1158,8 +1160,8 @@ static int add_binary_header_v1(uint8_t **cur, uint8_t **next_ext,
> *cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
>
> /*
> - * ARM executable code inside the BIN header on some mvebu platforms
> - * (e.g. A370, AXP) must always be aligned with the 128-bit boundary.
> + * ARM executable code inside the BIN header on platforms with Sheeva
> + * CPU (A370 and AXP) must always be aligned with the 128-bit boundary.
> * In the case when this code is not position independent (e.g. ARM
> * SPL), it must be placed at fixed load and execute address.
> * This requirement can be met by inserting dummy arguments into
> @@ -1170,8 +1172,10 @@ static int add_binary_header_v1(uint8_t **cur, uint8_t **next_ext,
> offset = *cur - (uint8_t *)main_hdr;
> if (binarye->binary.loadaddr)
> add_args = (binarye->binary.loadaddr - base_addr - offset) / sizeof(uint32_t);
> - else
> + else if (cpu_sheeva)
> add_args = ((16 - offset % 16) % 16) / sizeof(uint32_t);
> + else
> + add_args = 0;
> if (add_args) {
> *(args - 1) = cpu_to_le32(binarye->binary.nargs + add_args);
> *cur += add_args * sizeof(uint32_t);
>

Viele Grüße,
Stefan Roese

--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr@denx.de