All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 4/4] arm: factorize relocate_code routine
Date: Sat, 11 May 2013 04:04:09 +0200 (CEST)	[thread overview]
Message-ID: <1470173111.739335.1368237849736.JavaMail.root@advansee.com> (raw)
In-Reply-To: <1368223012-17609-5-git-send-email-albert.u.boot@aribaud.net>

Hi Albert,

On Friday, May 10, 2013 11:56:52 PM, Albert ARIBAUD wrote:
> Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
> ---
>  arch/arm/cpu/arm1136/start.S   |   82 --------------------------------
>  arch/arm/cpu/arm1176/start.S   |   75 ------------------------------
>  arch/arm/cpu/arm720t/start.S   |   82 --------------------------------
>  arch/arm/cpu/arm920t/start.S   |   75 ------------------------------
>  arch/arm/cpu/arm925t/start.S   |   75 ------------------------------
>  arch/arm/cpu/arm926ejs/start.S |   82 --------------------------------
>  arch/arm/cpu/arm946es/start.S  |   75 ------------------------------
>  arch/arm/cpu/arm_intcm/start.S |   75 ------------------------------
>  arch/arm/cpu/armv7/start.S     |   78 -------------------------------
>  arch/arm/cpu/ixp/start.S       |   75 ------------------------------
>  arch/arm/cpu/pxa/start.S       |   84 ---------------------------------
>  arch/arm/cpu/s3c44b0/start.S   |   75 ------------------------------
>  arch/arm/cpu/sa1100/start.S    |   75 ------------------------------
>  arch/arm/lib/Makefile          |    2 +-
>  arch/arm/lib/relocate.S        |  100
>  ++++++++++++++++++++++++++++++++++++++++
>  15 files changed, 101 insertions(+), 1009 deletions(-)
>  create mode 100644 arch/arm/lib/relocate.S
> 

[...]

> diff --git a/arch/arm/cpu/pxa/start.S b/arch/arm/cpu/pxa/start.S
> index ada91a6..3078bec 100644
> --- a/arch/arm/cpu/pxa/start.S
> +++ b/arch/arm/cpu/pxa/start.S
> @@ -170,90 +170,6 @@ reset:
>  
>  	bl	_main
>  
> -/*------------------------------------------------------------------------------*/
> -#ifndef CONFIG_SPL_BUILD
> -/*
> - * void relocate_code(addr_moni)
> - *
> - * This function relocates the monitor code.
> - */
> -	.globl	relocate_code
> -relocate_code:
> -	mov	r6, r0	/* save addr of destination */
> -
> -/* Disable the Dcache RAM lock for stack now */
> -#ifdef	CONFIG_CPU_PXA25X
> -	mov	r12, lr
> -	bl	cpu_init_crit
> -	mov	lr, r12
> -#endif

What about this thing that you silently drop?

> -
> -	adr	r0, _start
> -	subs	r9, r6, r0		/* r9 <- relocation offset */
> -	beq	relocate_done		/* skip relocation */
> -	mov	r1, r6			/* r1 <- scratch for copy_loop */
> -	ldr	r3, _image_copy_end_ofs
> -	add	r2, r0, r3		/* r2 <- source end address	    */
> -
> -copy_loop:
> -	ldmia	r0!, {r10-r11}		/* copy from source address [r0]    */
> -	stmia	r1!, {r10-r11}		/* copy to   target address [r1]    */
> -	cmp	r0, r2			/* until source end address [r2]    */
> -	blo	copy_loop
> -
> -#ifndef CONFIG_SPL_BUILD
> -	/*
> -	 * fix .rel.dyn relocations
> -	 */
> -	ldr	r0, _TEXT_BASE		/* r0 <- Text base */
> -	ldr	r10, _dynsym_start_ofs	/* r10 <- sym table ofs */
> -	add	r10, r10, r0		/* r10 <- sym table in FLASH */
> -	ldr	r2, _rel_dyn_start_ofs	/* r2 <- rel dyn start ofs */
> -	add	r2, r2, r0		/* r2 <- rel dyn start in FLASH */
> -	ldr	r3, _rel_dyn_end_ofs	/* r3 <- rel dyn end ofs */
> -	add	r3, r3, r0		/* r3 <- rel dyn end in FLASH */
> -fixloop:
> -	ldr	r0, [r2]		/* r0 <- location to fix up, IN FLASH! */
> -	add	r0, r0, r9		/* r0 <- location to fix up in RAM */
> -	ldr	r1, [r2, #4]
> -	and	r7, r1, #0xff
> -	cmp	r7, #23			/* relative fixup? */
> -	beq	fixrel
> -	cmp	r7, #2			/* absolute fixup? */
> -	beq	fixabs
> -	/* ignore unknown type of fixup */
> -	b	fixnext
> -fixabs:
> -	/* absolute fix: set location to (offset) symbol value */
> -	mov	r1, r1, LSR #4		/* r1 <- symbol index in .dynsym */
> -	add	r1, r10, r1		/* r1 <- address of symbol in table */
> -	ldr	r1, [r1, #4]		/* r1 <- symbol value */
> -	add	r1, r1, r9		/* r1 <- relocated sym addr */
> -	b	fixnext
> -fixrel:
> -	/* relative fix: increase location by offset */
> -	ldr	r1, [r0]
> -	add	r1, r1, r9
> -fixnext:
> -	str	r1, [r0]
> -	add	r2, r2, #8		/* each rel.dyn entry is 8 bytes */
> -	cmp	r2, r3
> -	blo	fixloop
> -#endif
> -
> -relocate_done:
> -
> -	bx	lr
> -
> -_rel_dyn_start_ofs:
> -	.word __rel_dyn_start - _start
> -_rel_dyn_end_ofs:
> -	.word __rel_dyn_end - _start
> -_dynsym_start_ofs:
> -	.word __dynsym_start - _start
> -
> -#endif
> -
>  	.globl	c_runtime_cpu_setup
>  c_runtime_cpu_setup:
>  

[...]

> diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S
> new file mode 100644
> index 0000000..ce533ca
> --- /dev/null
> +++ b/arch/arm/lib/relocate.S
> @@ -0,0 +1,100 @@
> +/*
> + *  relocate - common relocation function for ARM U-Boot
> + *
> + *  Copyright (c) 2013  Albert ARIBAUD <albert.u.boot@aribaud.net>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +/*
> + * These are defined in the board-specific linker script.
> + * Subtracting _start from them lets the linker put their
> + * relative position in the executable instead of leaving
> + * them null.
> + */
> +
> +	.globl	__image_copy_start
> +	.globl	__image_copy_end
> +	.globl	__rel_dyn_start
> +	.globl	__rel_dyn_end
> +	.globl	__dynsym_start

.globl is for exporting symbols to the linker, not importing, so the lines above
should be removed.

> +
> +/*------------------------------------------------------------------------------*/
> +
> +/*
> + * void relocate_code(addr_moni)
> + *
> + * This function relocates the monitor code.
> + */
> +	.globl	relocate_code
> +relocate_code:

Or "ENTRY(relocate_code)" instead of the two lines above.

> +	mov	r6, r0	/* save addr of destination */
> +
> +	ldr	r0, =_start

This is wrong. Here, r0 will get _start link-time address, while with 'adr' in
the original code, r0 was getting _start runtime address, which is not the same
for all boards. relocate_code() is and must stay position-independent code, at
least for SPL.

E.g., for mx31pdk or tx25, the SPL is first loaded by the boot ROM in the NAND
Flash controller buffer, then executed from there. The SPL then has to use
relocate_code() to relocate itself to CONFIG_SPL_TEXT_BASE in order to free the
NFC buffer to load U-Boot from NAND Flash. This means that 'ldr r0, =_start'
would set r0 to CONFIG_SPL_TEXT_BASE, while 'adr r0, _start' sets r0 to the
address of the NFC buffer. Since the SPL calls relocate_code() with
CONFIG_SPL_TEXT_BASE, the 'ldr' choice would just result in a branch to
relocate_done below, which would abort the relocation and break the boot on
those boards.

The issue is that 'adr' requires that _start be defined in the same file and
section. That's why my patch 31/31 was using a macro to define relocate_code()
in the start.S files. Perhaps some other constructs like
'sub r0, pc, . - _start' would work, but I doubt it if _start is not in the same
file and section since this is exactly how 'adr' is translated.

> +	subs	r9, r6, r0		/* r9 <- relocation offset */
> +	beq	relocate_done		/* skip relocation */
> +	mov	r1, r6			/* r1 <- scratch for copy_loop */
> +	ldr	r2, =__image_copy_end
> +
> +copy_loop:
> +	ldmia	r0!, {r10-r11}		/* copy from source address [r0]    */
> +	stmia	r1!, {r10-r11}		/* copy to   target address [r1]    */
> +	cmp	r0, r2			/* until source end address [r2]    */
> +	blo	copy_loop
> +
> +#ifndef CONFIG_SPL_BUILD
> +	/*
> +	 * fix .rel.dyn relocations
> +	 */
> +	ldr	r0, =_TEXT_BASE		/* r0 <- Text base */

The value you load above into r0 then gets overwritten prior to having been
used, so you can drop this line, all the more it is wrong, loading the address
of _TEXT_BASE instead of its value.

> +	ldr	r10, =__dynsym_start	/* r10 <- sym table ofs */
> +	ldr	r2, =__rel_dyn_start	/* r2 <- rel dyn start ofs */
> +	ldr	r3, =__rel_dyn_end	/* r3 <- rel dyn end ofs */

'ofs' should be replaced with 'in FLASH' in the comments above.

Contrary to above, this construct works here because this can't be SPL code.

> +fixloop:
> +	ldr	r0, [r2]		/* r0 <- location to fix up, IN FLASH! */
> +	add	r0, r0, r9		/* r0 <- location to fix up in RAM */
> +	ldr	r1, [r2, #4]
> +	and	r7, r1, #0xff
> +	cmp	r7, #23			/* relative fixup? */
> +	beq	fixrel
> +	cmp	r7, #2			/* absolute fixup? */
> +	beq	fixabs
> +	/* ignore unknown type of fixup */
> +	b	fixnext
> +fixabs:
> +	/* absolute fix: set location to (offset) symbol value */
> +	mov	r1, r1, LSR #4		/* r1 <- symbol index in .dynsym */
> +	add	r1, r10, r1		/* r1 <- address of symbol in table */
> +	ldr	r1, [r1, #4]		/* r1 <- symbol value */
> +	add	r1, r1, r9		/* r1 <- relocated sym addr */
> +	b	fixnext
> +fixrel:
> +	/* relative fix: increase location by offset */
> +	ldr	r1, [r0]
> +	add	r1, r1, r9
> +fixnext:
> +	str	r1, [r0]
> +	add	r2, r2, #8		/* each rel.dyn entry is 8 bytes */
> +	cmp	r2, r3
> +	blo	fixloop
> +#endif
> +
> +relocate_done:
> +
> +	bx	lr

This instruction is not supported on ARMv4, even if GCC does not complain about
it (it looks like this is not even fixed by the linker, except if the
instruction was issued by GCC itself), but it is required for more recent ARM
versions for Thumb inter-working, which is enabled by some boards in U-Boot.
Hence, shouldn't the line above be replaced with:

#ifdef __ARM_ARCH_4__
        mov        pc, lr
#else
        bx        lr
#endif

Or using CONFIG_SYS_THUMB_BUILD?

"ENDPROC(relocate_code)" should be added here if you go for ENTRY() at the
beginning.

Best regards,
Beno?t

  reply	other threads:[~2013-05-11  2:04 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-10 21:56 [U-Boot] [PATCH 0/4] Factorize ARM relocation code Albert ARIBAUD
2013-05-10 21:56 ` [U-Boot] [PATCH 1/4] Rename arch/arm/lib/bss.c to sections.c Albert ARIBAUD
2013-05-10 21:56   ` [U-Boot] [PATCH 2/4] arm: make __image_copy_{start, end} compiler-generated Albert ARIBAUD
2013-05-10 21:56     ` [U-Boot] [PATCH 3/4] arm: make relocation section symbols compiler-generated Albert ARIBAUD
2013-05-10 21:56       ` [U-Boot] [PATCH 4/4] arm: factorize relocate_code routine Albert ARIBAUD
2013-05-11  2:04         ` Benoît Thébaudeau [this message]
2013-05-11  7:40           ` Albert ARIBAUD
2013-05-11 13:40             ` Benoît Thébaudeau
2013-05-11 22:13         ` Simon Glass
2013-05-11  0:25     ` [U-Boot] [PATCH 2/4] arm: make __image_copy_{start, end} compiler-generated Benoît Thébaudeau
2013-05-11  8:02       ` Albert ARIBAUD
2013-05-11 17:52         ` Benoît Thébaudeau
2013-05-11 20:13           ` Albert ARIBAUD
2013-05-12  8:57             ` Albert ARIBAUD
2013-05-14  9:50 ` [U-Boot] [PATCH v2 0/4] Factorize ARM relocate_code instances Albert ARIBAUD
2013-05-14  9:50   ` [U-Boot] [PATCH v2 1/4] mx31pdk: copy SPL directly, not using relocate_code Albert ARIBAUD
2013-05-14  9:50     ` [U-Boot] [PATCH v2 2/4] tx25: " Albert ARIBAUD
2013-05-14  9:50       ` [U-Boot] [PATCH v2 3/4] arm: do not compile relocate_code() for SPL builds Albert ARIBAUD
2013-05-14  9:50         ` [U-Boot] [PATCH v2 4/4] arm: factorize relocate_code routine Albert ARIBAUD
2013-05-14 16:01           ` Benoît Thébaudeau
2013-05-14 16:32             ` Albert ARIBAUD
2013-05-14 17:17               ` Benoît Thébaudeau
2013-05-14 18:51                 ` Albert ARIBAUD
2013-05-14 18:49                   ` Benoît Thébaudeau
2013-05-15  7:31             ` Albert ARIBAUD
2013-05-15  8:30               ` Albert ARIBAUD
2013-05-15 16:36                 ` Benoît Thébaudeau
2013-05-15 17:55                   ` Albert ARIBAUD
2013-05-16 14:29                     ` Albert ARIBAUD
2013-05-16 14:28                       ` Benoît Thébaudeau
2013-05-16 14:52                         ` Albert ARIBAUD
2013-05-16 14:56                           ` Albert ARIBAUD
2013-05-14 15:21         ` [U-Boot] [PATCH v2 3/4] arm: do not compile relocate_code() for SPL builds Benoît Thébaudeau
2013-05-14 16:21           ` Albert ARIBAUD
2013-05-14 17:12             ` Benoît Thébaudeau
2013-05-14 15:15       ` [U-Boot] [PATCH v2 2/4] tx25: copy SPL directly, not using relocate_code Benoît Thébaudeau
2013-05-14 15:14     ` [U-Boot] [PATCH v2 1/4] mx31pdk: " Benoît Thébaudeau
2013-05-14 16:13       ` Albert ARIBAUD
2013-05-14 17:10         ` Benoît Thébaudeau
2013-05-14 18:24           ` Albert ARIBAUD
2013-05-14  9:55   ` [U-Boot] [PATCH v2 0/4] Factorize ARM relocate_code instances Albert ARIBAUD
2013-05-16 12:02   ` [U-Boot] [PATCH v3 " Albert ARIBAUD
2013-05-16 12:02     ` [U-Boot] [PATCH v3 1/4] mx31pdk: copy SPL directly, not using relocate_code Albert ARIBAUD
2013-05-16 12:02       ` [U-Boot] [PATCH v3 2/4] tx25: " Albert ARIBAUD
2013-05-16 12:02         ` [U-Boot] [PATCH v3 3/4] arm: do not compile relocate_code() for SPL builds Albert ARIBAUD
2013-05-16 12:02           ` [U-Boot] [PATCH v3 4/4] arm: factorize relocate_code routine Albert ARIBAUD
2013-05-16 15:56             ` Benoît Thébaudeau
2013-05-16 16:57               ` Albert ARIBAUD
2013-05-16 14:53     ` [U-Boot] [PATCH v3 0/4] Factorize ARM relocate_code instances Albert ARIBAUD
2013-05-16 14:55       ` Albert ARIBAUD
2013-05-19 11:48     ` [U-Boot] [PATCH v4 " Albert ARIBAUD
2013-05-19 11:48       ` [U-Boot] [PATCH v4 1/4] mx31pdk: copy SPL directly, not using relocate_code Albert ARIBAUD
2013-05-19 11:48         ` [U-Boot] [PATCH v4 2/4] tx25: " Albert ARIBAUD
2013-05-19 11:48           ` [U-Boot] [PATCH v4 3/4] arm: do not compile relocate_code() for SPL builds Albert ARIBAUD
2013-05-19 11:48             ` [U-Boot] [PATCH v4 4/4] arm: factorize relocate_code routine Albert ARIBAUD
2013-05-19 15:57       ` [U-Boot] [PATCH v4 0/4] Factorize ARM relocate_code instances Benoît Thébaudeau
2013-05-20  9:26         ` Albert ARIBAUD
2013-05-20 15:39           ` Benoît Thébaudeau
2013-05-21 13:24             ` Fabio Estevam
2013-05-28 13:28               ` Albert ARIBAUD
2013-05-29 12:57                 ` Fabio Estevam
2013-05-27 14:56           ` Simon Glass
2013-05-27 16:16             ` Albert ARIBAUD
2013-05-27 16:37               ` Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1470173111.739335.1368237849736.JavaMail.root@advansee.com \
    --to=benoit.thebaudeau@advansee.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.