From: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 4/4] arm: factorize relocate_code routine
Date: Tue, 14 May 2013 18:01:50 +0200 (CEST) [thread overview]
Message-ID: <1489195069.818131.1368547310358.JavaMail.root@advansee.com> (raw)
In-Reply-To: <1368525030-5162-5-git-send-email-albert.u.boot@aribaud.net>
Hi Albert,
On Tuesday, May 14, 2013 11:50:30 AM, 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>
[...]
> diff --git a/arch/arm/cpu/pxa/start.S b/arch/arm/cpu/pxa/start.S
> index 595778a..f9947de 100644
> --- a/arch/arm/cpu/pxa/start.S
> +++ b/arch/arm/cpu/pxa/start.S
> @@ -167,93 +167,19 @@ 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
> -
> - /*
> - * 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
> -
> -relocate_done:
> -
> - 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
> + /*
> + * 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.
> + */
> + b cpu_init_crit
Shouldn't the "#ifdef CONFIG_CPU_PXA25X" from the original code be kept here?
>
> /*
> *************************************************************************
[...]
> diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S
> new file mode 100644
> index 0000000..9e91fae
> --- /dev/null
> +++ b/arch/arm/lib/relocate.S
> @@ -0,0 +1,111 @@
> +/*
> + * 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>
> +
> +/*
> + * 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.
> + */
This comment is obsolete. It should either be removed or updated.
> +
> +/*
> + * void relocate_code(addr_moni)
> + *
> + * This function relocates the monitor code.
> + */
> +ENTRY(relocate_code)
> + mov r6, r0 /* save addr of destination */
> +
> + ldr r0, =_start
If you are avoiding the "ldr =" construct below, why do you use it here? You
could "ldr r0, _TEXT_BASE".
> + 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 */
Adding _start to a relocate_code-relative _image_copy_end_ofs?!
> +
> +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 <- sym table ofs */
> + add r10, r10, r9 /* r10 <- sym table in FLASH */
> + ldr r2, _rel_dyn_start_ofs /* r2 <- rel dyn start ofs */
> + add r2, r2, r9 /* r2 <- rel dyn start in FLASH */
> + ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */
> + add r3, r3, r9 /* r3 <- rel dyn end in FLASH */
This is mixing relocate_code-relative offsets with the relocation offset!
> +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:
> +
> + /* ARMv4- don't know bx lr but the assembler fails to see that */
> +
> +#ifdef __ARM_ARCH_4__
> + mov pc, lr
> +#else
> + bx lr
> +#endif
> +
> +_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
Best regards,
Beno?t
next prev parent reply other threads:[~2013-05-14 16:01 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 [this message]
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=1489195069.818131.1368547310358.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.