All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/2] arm: Make reset position-independent
@ 2014-09-03 21:32 Benoît Thébaudeau
  2014-09-03 21:32 ` [U-Boot] [PATCH 2/2] arm: Fix _start for CONFIG_SYS_DV_NOR_BOOT_CFG Benoît Thébaudeau
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Benoît Thébaudeau @ 2014-09-03 21:32 UTC (permalink / raw)
  To: u-boot

Some boards, like mx31pdk and tx25, require the beginning of the SPL
code to be position-independent. For these two boards, this is because
they use the i.MX external NAND boot, which starts by executing the
first NAND Flash page from the NFC page buffer. The SPL then needs to
copy itself to its actual link address in order to free the NFC page
buffer and use it to load the non-SPL image from Flash before running
it. This means that the SPL runtime address differs from its link
address between the reset and the initial copy performed by
board_init_f(), so this part of the SPL binary must be
position-independent.

This requirement was broken by commit 41623c9 'arm: move exception
handling out of start.S files', which used an absolute address to branch
to the reset routine. This new commit restores the original behavior,
which just performed a relative branch. This fixes the boot of mx31pdk
and tx25.

Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
Reported-by: Helmut Raiger <helmut.raiger@hale.at>
Cc: Albert Aribaud <albert.u.boot@aribaud.net>
Cc: Magnus Lilja <lilja.magnus@gmail.com>
Cc: John Rigby <jcrigby@gmail.com>
---
 arch/arm/lib/vectors.S |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/arm/lib/vectors.S b/arch/arm/lib/vectors.S
index 493f337..843b18f 100644
--- a/arch/arm/lib/vectors.S
+++ b/arch/arm/lib/vectors.S
@@ -50,7 +50,7 @@
 #endif
 
 _start:
-	ldr	pc, _reset
+	b	reset
 	ldr	pc, _undefined_instruction
 	ldr	pc, _software_interrupt
 	ldr	pc, _prefetch_abort
@@ -77,7 +77,6 @@ _start:
 	.globl	_irq
 	.globl	_fiq
 
-_reset:			.word reset
 _undefined_instruction:	.word undefined_instruction
 _software_interrupt:	.word software_interrupt
 _prefetch_abort:	.word prefetch_abort
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH 2/2] arm: Fix _start for CONFIG_SYS_DV_NOR_BOOT_CFG
  2014-09-03 21:32 [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
@ 2014-09-03 21:32 ` Benoît Thébaudeau
  2014-09-12  5:52   ` Albert ARIBAUD
  2014-09-03 21:52 ` [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Benoît Thébaudeau @ 2014-09-03 21:32 UTC (permalink / raw)
  To: u-boot

The boards using CONFIG_SYS_DV_NOR_BOOT_CFG (i.e. calimain,
da850evm_direct_nor and enbw_cmc) had the _start symbol defined after
the CONFIG_SYS_DV_NOR_BOOT_CFG word rather than before it in
arch/arm/lib/vectors.S. Because of that, if by lack of luck
'gd->mon_len = (ulong)&__bss_end - (ulong)_start' (see setup_mon_len())
was a multiple of 4 kiB (see reserve_uboot()), then the last BSS word
overlapped the first word of the following reserved RAM area (or went
beyond the top of RAM without such an area) after relocation because
__image_copy_start did not match _start (see relocate_code()).

This was broken by commit 41623c9 'arm: move exception handling out of
start.S files', which defined _start twice (before and after the
CONFIG_SYS_DV_NOR_BOOT_CFG word), then by commit 0a26e1d 'arm: fix a
double-definition error of _start symbol', which kept the definition of
the _start symbol after the CONFIG_SYS_DV_NOR_BOOT_CFG word. This new
commit fixes this issue by restoring the original behavior, i.e. by
defining the _start symbol before the CONFIG_SYS_DV_NOR_BOOT_CFG word.

Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
Cc: Albert Aribaud <albert.u.boot@aribaud.net>
Cc: Manfred Rudigier <manfred.rudigier@omicron.at>
Cc: Christian Riesch <christian.riesch@omicron.at>
Cc: Sudhakar Rajashekhara <sudhakar.raj@ti.com>
Cc: Heiko Schocher <hs@denx.de>
---
 arch/arm/lib/vectors.S |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm/lib/vectors.S b/arch/arm/lib/vectors.S
index 843b18f..0cb87ce 100644
--- a/arch/arm/lib/vectors.S
+++ b/arch/arm/lib/vectors.S
@@ -45,11 +45,12 @@
  *************************************************************************
  */
 
+_start:
+
 #ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
 	.word	CONFIG_SYS_DV_NOR_BOOT_CFG
 #endif
 
-_start:
 	b	reset
 	ldr	pc, _undefined_instruction
 	ldr	pc, _software_interrupt
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH 1/2] arm: Make reset position-independent
  2014-09-03 21:32 [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
  2014-09-03 21:32 ` [U-Boot] [PATCH 2/2] arm: Fix _start for CONFIG_SYS_DV_NOR_BOOT_CFG Benoît Thébaudeau
@ 2014-09-03 21:52 ` Benoît Thébaudeau
  2014-09-03 21:55 ` Benoît Thébaudeau
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Benoît Thébaudeau @ 2014-09-03 21:52 UTC (permalink / raw)
  To: u-boot

On Wed, Sep 3, 2014 at 11:32 PM, Beno?t Th?baudeau
<benoit.thebaudeau.dev@gmail.com> wrote:
> Some boards, like mx31pdk and tx25, require the beginning of the SPL
> code to be position-independent. For these two boards, this is because
> they use the i.MX external NAND boot, which starts by executing the
> first NAND Flash page from the NFC page buffer. The SPL then needs to
> copy itself to its actual link address in order to free the NFC page
> buffer and use it to load the non-SPL image from Flash before running
> it. This means that the SPL runtime address differs from its link
> address between the reset and the initial copy performed by
> board_init_f(), so this part of the SPL binary must be
> position-independent.
>
> This requirement was broken by commit 41623c9 'arm: move exception
> handling out of start.S files', which used an absolute address to branch
> to the reset routine. This new commit restores the original behavior,
> which just performed a relative branch. This fixes the boot of mx31pdk
> and tx25.
>
> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
> Reported-by: Helmut Raiger <helmut.raiger@hale.at>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Magnus Lilja <lilja.magnus@gmail.com>
> Cc: John Rigby <jcrigby@gmail.com>
> ---
>  arch/arm/lib/vectors.S |    3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/arch/arm/lib/vectors.S b/arch/arm/lib/vectors.S
> index 493f337..843b18f 100644
> --- a/arch/arm/lib/vectors.S
> +++ b/arch/arm/lib/vectors.S
> @@ -50,7 +50,7 @@
>  #endif
>
>  _start:
> -       ldr     pc, _reset
> +       b       reset
>         ldr     pc, _undefined_instruction
>         ldr     pc, _software_interrupt
>         ldr     pc, _prefetch_abort
> @@ -77,7 +77,6 @@ _start:
>         .globl  _irq
>         .globl  _fiq
>
> -_reset:                        .word reset
>  _undefined_instruction:        .word undefined_instruction
>  _software_interrupt:   .word software_interrupt
>  _prefetch_abort:       .word prefetch_abort
> --
> 1.7.10.4
>

Magnus, can I have your 'Tested-by' for mx31pdk since you said you
have tested this?

Tom, Albert, can you build-test all ARM boards with this patch (that
would take eons on my ultra slow machine)? It would also be nice if
someone could runtime-test an ARM board other than mx31pdk and tx25
with this patch.

Thanks in advance.

Best regards,
Beno?t

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH 1/2] arm: Make reset position-independent
  2014-09-03 21:32 [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
  2014-09-03 21:32 ` [U-Boot] [PATCH 2/2] arm: Fix _start for CONFIG_SYS_DV_NOR_BOOT_CFG Benoît Thébaudeau
  2014-09-03 21:52 ` [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
@ 2014-09-03 21:55 ` Benoît Thébaudeau
  2014-09-05 18:41 ` Magnus Lilja
  2014-09-12  5:51 ` Albert ARIBAUD
  4 siblings, 0 replies; 8+ messages in thread
From: Benoît Thébaudeau @ 2014-09-03 21:55 UTC (permalink / raw)
  To: u-boot

On Wed, Sep 3, 2014 at 11:32 PM, Beno?t Th?baudeau
<benoit.thebaudeau.dev@gmail.com> wrote:
> Some boards, like mx31pdk and tx25, require the beginning of the SPL
> code to be position-independent. For these two boards, this is because
> they use the i.MX external NAND boot, which starts by executing the
> first NAND Flash page from the NFC page buffer. The SPL then needs to
> copy itself to its actual link address in order to free the NFC page
> buffer and use it to load the non-SPL image from Flash before running
> it. This means that the SPL runtime address differs from its link
> address between the reset and the initial copy performed by
> board_init_f(), so this part of the SPL binary must be
> position-independent.
>
> This requirement was broken by commit 41623c9 'arm: move exception
> handling out of start.S files', which used an absolute address to branch
> to the reset routine. This new commit restores the original behavior,
> which just performed a relative branch. This fixes the boot of mx31pdk
> and tx25.
>
> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
> Reported-by: Helmut Raiger <helmut.raiger@hale.at>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Magnus Lilja <lilja.magnus@gmail.com>
> Cc: John Rigby <jcrigby@gmail.com>
> ---
>  arch/arm/lib/vectors.S |    3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/arch/arm/lib/vectors.S b/arch/arm/lib/vectors.S
> index 493f337..843b18f 100644
> --- a/arch/arm/lib/vectors.S
> +++ b/arch/arm/lib/vectors.S
> @@ -50,7 +50,7 @@
>  #endif
>
>  _start:
> -       ldr     pc, _reset
> +       b       reset
>         ldr     pc, _undefined_instruction
>         ldr     pc, _software_interrupt
>         ldr     pc, _prefetch_abort
> @@ -77,7 +77,6 @@ _start:
>         .globl  _irq
>         .globl  _fiq
>
> -_reset:                        .word reset
>  _undefined_instruction:        .word undefined_instruction
>  _software_interrupt:   .word software_interrupt
>  _prefetch_abort:       .word prefetch_abort
> --
> 1.7.10.4
>

Adding Helmut to Cc.

Beno?t

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH 1/2] arm: Make reset position-independent
  2014-09-03 21:32 [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
                   ` (2 preceding siblings ...)
  2014-09-03 21:55 ` Benoît Thébaudeau
@ 2014-09-05 18:41 ` Magnus Lilja
  2014-09-09 20:24   ` Fabio Estevam
  2014-09-12  5:51 ` Albert ARIBAUD
  4 siblings, 1 reply; 8+ messages in thread
From: Magnus Lilja @ 2014-09-05 18:41 UTC (permalink / raw)
  To: u-boot

Hi

On 3 September 2014 23:32, Beno?t Th?baudeau
<benoit.thebaudeau.dev@gmail.com> wrote:
> Some boards, like mx31pdk and tx25, require the beginning of the SPL
> code to be position-independent. For these two boards, this is because
> they use the i.MX external NAND boot, which starts by executing the
> first NAND Flash page from the NFC page buffer. The SPL then needs to
> copy itself to its actual link address in order to free the NFC page
> buffer and use it to load the non-SPL image from Flash before running
> it. This means that the SPL runtime address differs from its link
> address between the reset and the initial copy performed by
> board_init_f(), so this part of the SPL binary must be
> position-independent.
>
> This requirement was broken by commit 41623c9 'arm: move exception
> handling out of start.S files', which used an absolute address to branch
> to the reset routine. This new commit restores the original behavior,
> which just performed a relative branch. This fixes the boot of mx31pdk
> and tx25.
>
> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
> Reported-by: Helmut Raiger <helmut.raiger@hale.at>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Magnus Lilja <lilja.magnus@gmail.com>
> Cc: John Rigby <jcrigby@gmail.com>
> ---

Tested-by: Magnus Lilja <lilja.magnus@gmail.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH 1/2] arm: Make reset position-independent
  2014-09-05 18:41 ` Magnus Lilja
@ 2014-09-09 20:24   ` Fabio Estevam
  0 siblings, 0 replies; 8+ messages in thread
From: Fabio Estevam @ 2014-09-09 20:24 UTC (permalink / raw)
  To: u-boot

Hi Albert,

On Fri, Sep 5, 2014 at 3:41 PM, Magnus Lilja <lilja.magnus@gmail.com> wrote:
> Hi
>
> On 3 September 2014 23:32, Beno?t Th?baudeau
> <benoit.thebaudeau.dev@gmail.com> wrote:
>> Some boards, like mx31pdk and tx25, require the beginning of the SPL
>> code to be position-independent. For these two boards, this is because
>> they use the i.MX external NAND boot, which starts by executing the
>> first NAND Flash page from the NFC page buffer. The SPL then needs to
>> copy itself to its actual link address in order to free the NFC page
>> buffer and use it to load the non-SPL image from Flash before running
>> it. This means that the SPL runtime address differs from its link
>> address between the reset and the initial copy performed by
>> board_init_f(), so this part of the SPL binary must be
>> position-independent.
>>
>> This requirement was broken by commit 41623c9 'arm: move exception
>> handling out of start.S files', which used an absolute address to branch
>> to the reset routine. This new commit restores the original behavior,
>> which just performed a relative branch. This fixes the boot of mx31pdk
>> and tx25.
>>
>> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
>> Reported-by: Helmut Raiger <helmut.raiger@hale.at>
>> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
>> Cc: Magnus Lilja <lilja.magnus@gmail.com>
>> Cc: John Rigby <jcrigby@gmail.com>
>> ---
>
> Tested-by: Magnus Lilja <lilja.magnus@gmail.com>

Should this one go through your tree?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH 1/2] arm: Make reset position-independent
  2014-09-03 21:32 [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
                   ` (3 preceding siblings ...)
  2014-09-05 18:41 ` Magnus Lilja
@ 2014-09-12  5:51 ` Albert ARIBAUD
  4 siblings, 0 replies; 8+ messages in thread
From: Albert ARIBAUD @ 2014-09-12  5:51 UTC (permalink / raw)
  To: u-boot

Hi Beno?t,

On Wed,  3 Sep 2014 23:32:33 +0200, Beno?t Th?baudeau
<benoit.thebaudeau.dev@gmail.com> wrote:

> Some boards, like mx31pdk and tx25, require the beginning of the SPL
> code to be position-independent. For these two boards, this is because
> they use the i.MX external NAND boot, which starts by executing the
> first NAND Flash page from the NFC page buffer. The SPL then needs to
> copy itself to its actual link address in order to free the NFC page
> buffer and use it to load the non-SPL image from Flash before running
> it. This means that the SPL runtime address differs from its link
> address between the reset and the initial copy performed by
> board_init_f(), so this part of the SPL binary must be
> position-independent.
> 
> This requirement was broken by commit 41623c9 'arm: move exception
> handling out of start.S files', which used an absolute address to branch
> to the reset routine. This new commit restores the original behavior,
> which just performed a relative branch. This fixes the boot of mx31pdk
> and tx25.
> 
> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
> Reported-by: Helmut Raiger <helmut.raiger@hale.at>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Magnus Lilja <lilja.magnus@gmail.com>
> Cc: John Rigby <jcrigby@gmail.com>
> ---
>  arch/arm/lib/vectors.S |    3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/arch/arm/lib/vectors.S b/arch/arm/lib/vectors.S
> index 493f337..843b18f 100644
> --- a/arch/arm/lib/vectors.S
> +++ b/arch/arm/lib/vectors.S
> @@ -50,7 +50,7 @@
>  #endif
>  
>  _start:
> -	ldr	pc, _reset
> +	b	reset
>  	ldr	pc, _undefined_instruction
>  	ldr	pc, _software_interrupt
>  	ldr	pc, _prefetch_abort
> @@ -77,7 +77,6 @@ _start:
>  	.globl	_irq
>  	.globl	_fiq
>  
> -_reset:			.word reset
>  _undefined_instruction:	.word undefined_instruction
>  _software_interrupt:	.word software_interrupt
>  _prefetch_abort:	.word prefetch_abort

Applied (as a bug fix) to u-boot-arm/master, thanks!

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH 2/2] arm: Fix _start for CONFIG_SYS_DV_NOR_BOOT_CFG
  2014-09-03 21:32 ` [U-Boot] [PATCH 2/2] arm: Fix _start for CONFIG_SYS_DV_NOR_BOOT_CFG Benoît Thébaudeau
@ 2014-09-12  5:52   ` Albert ARIBAUD
  0 siblings, 0 replies; 8+ messages in thread
From: Albert ARIBAUD @ 2014-09-12  5:52 UTC (permalink / raw)
  To: u-boot

Hi Beno?t,

On Wed,  3 Sep 2014 23:32:34 +0200, Beno?t Th?baudeau
<benoit.thebaudeau.dev@gmail.com> wrote:

> The boards using CONFIG_SYS_DV_NOR_BOOT_CFG (i.e. calimain,
> da850evm_direct_nor and enbw_cmc) had the _start symbol defined after
> the CONFIG_SYS_DV_NOR_BOOT_CFG word rather than before it in
> arch/arm/lib/vectors.S. Because of that, if by lack of luck
> 'gd->mon_len = (ulong)&__bss_end - (ulong)_start' (see setup_mon_len())
> was a multiple of 4 kiB (see reserve_uboot()), then the last BSS word
> overlapped the first word of the following reserved RAM area (or went
> beyond the top of RAM without such an area) after relocation because
> __image_copy_start did not match _start (see relocate_code()).
> 
> This was broken by commit 41623c9 'arm: move exception handling out of
> start.S files', which defined _start twice (before and after the
> CONFIG_SYS_DV_NOR_BOOT_CFG word), then by commit 0a26e1d 'arm: fix a
> double-definition error of _start symbol', which kept the definition of
> the _start symbol after the CONFIG_SYS_DV_NOR_BOOT_CFG word. This new
> commit fixes this issue by restoring the original behavior, i.e. by
> defining the _start symbol before the CONFIG_SYS_DV_NOR_BOOT_CFG word.
> 
> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau.dev@gmail.com>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Manfred Rudigier <manfred.rudigier@omicron.at>
> Cc: Christian Riesch <christian.riesch@omicron.at>
> Cc: Sudhakar Rajashekhara <sudhakar.raj@ti.com>
> Cc: Heiko Schocher <hs@denx.de>
> ---
>  arch/arm/lib/vectors.S |    3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/lib/vectors.S b/arch/arm/lib/vectors.S
> index 843b18f..0cb87ce 100644
> --- a/arch/arm/lib/vectors.S
> +++ b/arch/arm/lib/vectors.S
> @@ -45,11 +45,12 @@
>   *************************************************************************
>   */
>  
> +_start:
> +
>  #ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
>  	.word	CONFIG_SYS_DV_NOR_BOOT_CFG
>  #endif
>  
> -_start:
>  	b	reset
>  	ldr	pc, _undefined_instruction
>  	ldr	pc, _software_interrupt

Applied (as a bug fix) to u-boot-arm/master, thanks!

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-09-12  5:52 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-03 21:32 [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
2014-09-03 21:32 ` [U-Boot] [PATCH 2/2] arm: Fix _start for CONFIG_SYS_DV_NOR_BOOT_CFG Benoît Thébaudeau
2014-09-12  5:52   ` Albert ARIBAUD
2014-09-03 21:52 ` [U-Boot] [PATCH 1/2] arm: Make reset position-independent Benoît Thébaudeau
2014-09-03 21:55 ` Benoît Thébaudeau
2014-09-05 18:41 ` Magnus Lilja
2014-09-09 20:24   ` Fabio Estevam
2014-09-12  5:51 ` Albert ARIBAUD

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.