diff mbox series

[U-Boot] arc: Introduce a possibility to not relocate U-boot

Message ID 20180125182203.24170-1-abrodkin@synopsys.com
State Accepted
Commit 264d298fda39c5caa9505702b257a1f60c3b7352
Delegated to: Alexey Brodkin
Headers show
Series [U-Boot] arc: Introduce a possibility to not relocate U-boot | expand

Commit Message

Alexey Brodkin Jan. 25, 2018, 6:22 p.m. UTC
From: Alexey Brodkin <Alexey.Brodkin@synopsys.com>

Disabling relocation might be useful on ARC for 2 reasons:
 a) For advanced debugging with Synopsys proprietary MetaWare debugger
    which is capable of accessing much more specific hardware resources
    compared to gdb. For example it may show contents of L1 and L2 caches,
    internal states of some hardware blocks etc.

    But on the downside MetaWare debugger still cannot work with PIE.
    Even though that limitation could be work-arounded with change of ELF's
    header and stripping down all debug info but with it we won't have
    debug info for source-level debugging which is quite inconvenient.

 b) Some platforms which might benefit from usage of U-Boot basically
    don't have enough RAM to accommodate relocation of U-Boot so we
    keep code in flash and use as much of RAM as possible for more
    interesting things.

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Bin Meng <bmeng.cn@gmail.com>
Cc: Heiko Schocher <hs@denx.de>
Cc: York Sun <york.sun@nxp.com>
Cc: Stefan Roese <sr@denx.de>
---
 arch/arc/lib/relocate.c | 6 ++++++
 arch/arc/lib/start.S    | 8 +++++++-
 common/board_f.c        | 3 ++-
 3 files changed, 15 insertions(+), 2 deletions(-)

Comments

Simon Glass Feb. 4, 2018, 1:40 p.m. UTC | #1
On 25 January 2018 at 11:22, Alexey Brodkin <Alexey.Brodkin@synopsys.com> wrote:
> From: Alexey Brodkin <Alexey.Brodkin@synopsys.com>
>
> Disabling relocation might be useful on ARC for 2 reasons:
>  a) For advanced debugging with Synopsys proprietary MetaWare debugger
>     which is capable of accessing much more specific hardware resources
>     compared to gdb. For example it may show contents of L1 and L2 caches,
>     internal states of some hardware blocks etc.
>
>     But on the downside MetaWare debugger still cannot work with PIE.
>     Even though that limitation could be work-arounded with change of ELF's
>     header and stripping down all debug info but with it we won't have
>     debug info for source-level debugging which is quite inconvenient.
>
>  b) Some platforms which might benefit from usage of U-Boot basically
>     don't have enough RAM to accommodate relocation of U-Boot so we
>     keep code in flash and use as much of RAM as possible for more
>     interesting things.
>
> Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Bin Meng <bmeng.cn@gmail.com>
> Cc: Heiko Schocher <hs@denx.de>
> Cc: York Sun <york.sun@nxp.com>
> Cc: Stefan Roese <sr@denx.de>
> ---
>  arch/arc/lib/relocate.c | 6 ++++++
>  arch/arc/lib/start.S    | 8 +++++++-
>  common/board_f.c        | 3 ++-
>  3 files changed, 15 insertions(+), 2 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Alexey Brodkin Feb. 20, 2018, 5:54 p.m. UTC | #2
Hi Simon, Tom,

On Sun, 2018-02-04 at 06:40 -0700, Simon Glass wrote:
> On 25 January 2018 at 11:22, Alexey Brodkin <Alexey.Brodkin@synopsys.com> wrote:

> > From: Alexey Brodkin <Alexey.Brodkin@synopsys.com>

> > 

> > Disabling relocation might be useful on ARC for 2 reasons:

> >  a) For advanced debugging with Synopsys proprietary MetaWare debugger

> >     which is capable of accessing much more specific hardware resources

> >     compared to gdb. For example it may show contents of L1 and L2 caches,

> >     internal states of some hardware blocks etc.

> > 

> >     But on the downside MetaWare debugger still cannot work with PIE.

> >     Even though that limitation could be work-arounded with change of ELF's

> >     header and stripping down all debug info but with it we won't have

> >     debug info for source-level debugging which is quite inconvenient.

> > 

> >  b) Some platforms which might benefit from usage of U-Boot basically

> >     don't have enough RAM to accommodate relocation of U-Boot so we

> >     keep code in flash and use as much of RAM as possible for more

> >     interesting things.

> > 

> > Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>

> > Cc: Simon Glass <sjg@chromium.org>

> > Cc: Bin Meng <bmeng.cn@gmail.com>

> > Cc: Heiko Schocher <hs@denx.de>

> > Cc: York Sun <york.sun@nxp.com>

> > Cc: Stefan Roese <sr@denx.de>

> > ---

> >  arch/arc/lib/relocate.c | 6 ++++++

> >  arch/arc/lib/start.S    | 8 +++++++-

> >  common/board_f.c        | 3 ++-

> >  3 files changed, 15 insertions(+), 2 deletions(-)

> 

> Reviewed-by: Simon Glass <sjg@chromium.org>


Is it OK if I pull this into my "next" tree?

I'm asking because common/board_f.c is affected even though
that's just an addition of CONFIG_ARC in one #ifdef.

-Alexey
Simon Glass Feb. 22, 2018, 4:18 p.m. UTC | #3
Hi Alexey,

On 20 February 2018 at 10:54, Alexey Brodkin
<Alexey.Brodkin@synopsys.com> wrote:
> Hi Simon, Tom,
>
> On Sun, 2018-02-04 at 06:40 -0700, Simon Glass wrote:
>> On 25 January 2018 at 11:22, Alexey Brodkin <Alexey.Brodkin@synopsys.com> wrote:
>> > From: Alexey Brodkin <Alexey.Brodkin@synopsys.com>
>> >
>> > Disabling relocation might be useful on ARC for 2 reasons:
>> >  a) For advanced debugging with Synopsys proprietary MetaWare debugger
>> >     which is capable of accessing much more specific hardware resources
>> >     compared to gdb. For example it may show contents of L1 and L2 caches,
>> >     internal states of some hardware blocks etc.
>> >
>> >     But on the downside MetaWare debugger still cannot work with PIE.
>> >     Even though that limitation could be work-arounded with change of ELF's
>> >     header and stripping down all debug info but with it we won't have
>> >     debug info for source-level debugging which is quite inconvenient.
>> >
>> >  b) Some platforms which might benefit from usage of U-Boot basically
>> >     don't have enough RAM to accommodate relocation of U-Boot so we
>> >     keep code in flash and use as much of RAM as possible for more
>> >     interesting things.
>> >
>> > Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
>> > Cc: Simon Glass <sjg@chromium.org>
>> > Cc: Bin Meng <bmeng.cn@gmail.com>
>> > Cc: Heiko Schocher <hs@denx.de>
>> > Cc: York Sun <york.sun@nxp.com>
>> > Cc: Stefan Roese <sr@denx.de>
>> > ---
>> >  arch/arc/lib/relocate.c | 6 ++++++
>> >  arch/arc/lib/start.S    | 8 +++++++-
>> >  common/board_f.c        | 3 ++-
>> >  3 files changed, 15 insertions(+), 2 deletions(-)
>>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> Is it OK if I pull this into my "next" tree?
>
> I'm asking because common/board_f.c is affected even though
> that's just an addition of CONFIG_ARC in one #ifdef.

It is OK with me.

Regards,
Simon
diff mbox series

Patch

diff --git a/arch/arc/lib/relocate.c b/arch/arc/lib/relocate.c
index 7802f4054594..96b4bd3d8fa6 100644
--- a/arch/arc/lib/relocate.c
+++ b/arch/arc/lib/relocate.c
@@ -17,6 +17,9 @@  int copy_uboot_to_ram(void)
 {
 	size_t len = (size_t)&__image_copy_end - (size_t)&__image_copy_start;
 
+	if (gd->flags & GD_FLG_SKIP_RELOC)
+		return 0;
+
 	memcpy((void *)gd->relocaddr, (void *)&__image_copy_start, len);
 
 	return 0;
@@ -40,6 +43,9 @@  int do_elf_reloc_fixups(void)
 	Elf32_Rela *re_src = (Elf32_Rela *)(&__rel_dyn_start);
 	Elf32_Rela *re_end = (Elf32_Rela *)(&__rel_dyn_end);
 
+	if (gd->flags & GD_FLG_SKIP_RELOC)
+		return 0;
+
 	debug("Section .rela.dyn is located at %08x-%08x\n",
 	      (unsigned int)re_src, (unsigned int)re_end);
 
diff --git a/arch/arc/lib/start.S b/arch/arc/lib/start.S
index ac9944c4cf32..c78dd001d81d 100644
--- a/arch/arc/lib/start.S
+++ b/arch/arc/lib/start.S
@@ -78,7 +78,13 @@  ENTRY(_start)
 
 	/* Zero the one and only argument of "board_init_f" */
 	mov_s	%r0, 0
-	j	board_init_f
+	bl	board_init_f
+
+	/* We only get here if relocation is disabled by GD_FLG_SKIP_RELOC */
+	/* Make sure we don't lose GD overwritten by zero new GD */
+	mov	%r0, %r25
+	mov	%r1, 0
+	bl	board_init_r
 ENDPROC(_start)
 
 /*
diff --git a/common/board_f.c b/common/board_f.c
index 7bfc73e8bca0..48c98d1a71af 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -904,7 +904,8 @@  void board_init_f(ulong boot_flags)
 		hang();
 
 #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX) && \
-		!defined(CONFIG_EFI_APP) && !CONFIG_IS_ENABLED(X86_64)
+		!defined(CONFIG_EFI_APP) && !CONFIG_IS_ENABLED(X86_64) && \
+		!defined(CONFIG_ARC)
 	/* NOTREACHED - jump_to_copy() does not return */
 	hang();
 #endif