From: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 4/4] arm: factorize relocate_code routine
Date: Thu, 16 May 2013 17:56:29 +0200 (CEST) [thread overview]
Message-ID: <2101738847.873216.1368719789615.JavaMail.root@advansee.com> (raw)
In-Reply-To: <1368705777-8789-5-git-send-email-albert.u.boot@aribaud.net>
Hi Albert,
On Thursday, May 16, 2013 2:02:57 PM, Albert ARIBAUD wrote:
> Replace all relocate_code routines from ARM start.S files
> with a single instance in file arch/arm/lib/relocate.S.
> For PXA, this requires moving the dcache unlocking code
> from within relocate_code into c_runtime_cpu_setup.
>
> Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
> ---
> Changes in v3:
> - fix bugs in relocation offset computations
> - move and fix comment regarding linker symbols
> - fix missing conditionals on PXA25X dcache code
> - replace FLASH/RAM mentions with SRC/DST ones
>
> Changes in v2:
> - use ENTRY / ENDPROC macros
> - preserve PXA25X dcache unlocking
[...]
> diff --git a/arch/arm/cpu/pxa/start.S b/arch/arm/cpu/pxa/start.S
> index 595778a..21fa84c 100644
> --- a/arch/arm/cpu/pxa/start.S
> +++ b/arch/arm/cpu/pxa/start.S
> @@ -167,94 +167,23 @@ 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
> -
> - 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
> + .globl c_runtime_cpu_setup
> +c_runtime_cpu_setup:
>
> +#ifdef CONFIG_CPU_PXA25X
> /*
> - * fix .rel.dyn relocations
> + * Unlock (actually, disable) the cache now that board_init_f
> + * is done. We could do this earlier but we would need to add
> + * a new C runtime hook, whereas c_runtime_cpu_setup already
> + * exists.
> + * As this routine is just a call to cpu_init_crit, let us
> + * tail-optimize and do a simple branch here.
> */
> - 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
> -
> -relocate_done:
> -
> + b cpu_init_crit
> +#else
> bx lr
> -
> -_image_copy_end_ofs:
> - .word __image_copy_end - _start
> -_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:
> -
> - bx lr
> -
Keeping an empty line here would be good for code clarity.
> /*
> *************************************************************************
> *
[...]
> diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S
> new file mode 100644
> index 0000000..e391822
> --- /dev/null
> +++ b/arch/arm/lib/relocate.S
> @@ -0,0 +1,106 @@
> +/*
> + * 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
> + */
> +
> +#include <linux/linkage.h>
> +
> +/*
> + * void relocate_code(addr_moni)
> + *
> + * This function relocates the monitor code.
> + *
> + * NOTE:
> + * To prevent the code below from containing references with an R_ARM_ABS32
> + * relocation record type, we never refer to linker-defined symbols
> directly.
> + * Instead, we declare literals which contain their relative location with
> + * respect to relocate_code, and at run time, add relocate_code back to
> them.
> + */
> +
> +ENTRY(relocate_code)
> + mov r6, r0 /* save addr of destination */
> +
> + ldr r0, =_start /* r0 <- SRC _start */
Or "&_start" in the comment above to be more consistent with the comments below.
> + subs r9, r6, r0 /* r9 <- relocation offset */
> + beq relocate_done /* skip relocation */
> + mov r1, r6 /* r1 <- scratch for copy loop */
> + adr r7, relocate_code /* r7 <- SRC &relocate_code */
> + ldr r3, _image_copy_end_ofs /* r3 <- __image_copy_end local ofs */
> + add r2, r7, r3 /* r2 <- SRC &__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
> +
> + /*
> + * fix .rel.dyn relocations
> + */
> + ldr r10, _dynsym_start_ofs /* r10 <- __dynsym_start local ofs */
> + add r10, r10, r7 /* r10 <- SRC &__dynsym_start */
> + ldr r2, _rel_dyn_start_ofs /* r2 <- _rel_dyn_start local ofs */
> + add r2, r2, r7 /* r2 <- SRC &_rel_dyn_start */
> + ldr r3, _rel_dyn_end_ofs /* r3 <- _rel_dyn_end local ofs */
> + add r3, r3, r7 /* r3 <- SRC &_rel_dyn_end */
It's __rel_dyn_start and __rel_dyn_end with 2 leading underscores in the 4
comments above.
> +fixloop:
> + ldr r0, [r2] /* r0 <- SRC location to fix up */
> + add r0, r0, r9 /* r0 <- DST location to fix up */
> + 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
> +
> +relocate_done:
> +
> + bx lr
Argh! The "bx lr" issue is back. That was correct in v2.
> +
> +_image_copy_end_ofs:
> + .word __image_copy_end - relocate_code
> +_rel_dyn_start_ofs:
> + .word __rel_dyn_start - relocate_code
> +_rel_dyn_end_ofs:
> + .word __rel_dyn_end - relocate_code
> +_dynsym_start_ofs:
> + .word __dynsym_start - relocate_code
> +
> +ENDPROC(relocate_code)
> --
> 1.7.10.4
The rest of the v3 series is fine.
Best regards,
Beno?t
next prev parent reply other threads:[~2013-05-16 15:56 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
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 [this message]
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=2101738847.873216.1368719789615.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox