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 |
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>
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
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 --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