[U-Boot] [RFC PATCH] arm: provide a CONFIG flag for disabling relocation
GROYER, Anthony
Anthony.GROYER at airliquide.com
Tue Sep 20 16:22:15 CEST 2011
Hello,
I came back on a discussion started on April 2011.
The use of the initial patches for the CONFIG_SYS_SKIP_ARM_RELOCATION features has revealed two issues.
First issue: the calculation of the relocation offset was done only if the relocation is actually done. So we could reach a point where r9 has a wrong value, since it has never been used before (in my case, this bug happens without JTAG). The first diff moves the relocation offset calculation before the test of a relocation need.
Second issue: board_init_r was thinking the memory area for the malloc is just below the code, whereas the board_init_f had allocated some space for the malloc at the end of the SDRAM. If the code is located at the base of the SDRAM with CONFIG_SYS_SKIP_ARM_RELOCATION defined, the malloc area does not point to a correct memory address.
The 2 other diff store the calculated malloc start address in a global data member so that it can be used in board_init_r().
Index: arch/arm/cpu/arm926ejs/start.S
===================================================================
--- arch/arm/cpu/arm926ejs/start.S (révision 1083)
+++ arch/arm/cpu/arm926ejs/start.S (révision 1113)
@@ -196,6 +196,10 @@
mov r4, r0 /* save addr_sp */
mov r5, r1 /* save addr of gd */
mov r6, r2 /* save addr of destination */
+ /* set relocation offset here for all cases:
+ relocation or not */
+ ldr r0, _TEXT_BASE /* r0 <- Text base */
+ sub r9, r6, r0 /* r9 <- relocation offset */
/* Set up the stack */
stack_setup:
@@ -218,8 +222,6 @@
/*
* fix .rel.dyn relocations
*/
- ldr r0, _TEXT_BASE /* r0 <- Text base */
- sub r9, r6, r0 /* r9 <- relocation offset */
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 */
Index: arch/arm/include/asm/global_data.h
===================================================================
--- arch/arm/include/asm/global_data.h (révision 1083)
+++ arch/arm/include/asm/global_data.h (copie de travail)
@@ -69,6 +69,7 @@
unsigned long mon_len; /* monitor len */
unsigned long irq_sp; /* irq stack pointer */
unsigned long start_addr_sp; /* start_addr_stackpointer */
+ unsigned long start_addr_malloc; /* start_addr_malloc */
unsigned long reloc_off;
#if !(defined(CONFIG_SYS_NO_ICACHE) && defined(CONFIG_SYS_NO_DCACHE))
unsigned long tlb_addr;
Index: arch/arm/lib/board.c
===================================================================
--- arch/arm/lib/board.c (révision 1138)
+++ arch/arm/lib/board.c (copie de travail)
@@ -367,6 +367,7 @@
* reserve memory for malloc() arena
*/
addr_sp = addr - TOTAL_MALLOC_LEN;
+ gd->start_addr_malloc = addr_sp;
debug ("Reserving %dk for malloc() at: %08lx\n",
TOTAL_MALLOC_LEN >> 10, addr_sp);
/*
@@ -445,7 +446,6 @@
{
char *s;
bd_t *bd;
- ulong malloc_start;
#if !defined(CONFIG_SYS_NO_FLASH)
ulong flash_size;
#endif
@@ -473,9 +473,7 @@
post_output_backlog ();
#endif
- /* The Malloc area is immediately below the monitor copy in DRAM */
- malloc_start = dest_addr - TOTAL_MALLOC_LEN;
- mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
+ mem_malloc_init (gd->start_addr_malloc, TOTAL_MALLOC_LEN);
#if !defined(CONFIG_SYS_NO_FLASH)
puts ("Flash: ");
Regards,
Anthony Groyer
>On Wed, Apr 20, 2011 at 11:56 PM, Aneesh V <ane... at ti.com> wrote:
>> Hi Simon, Wolfgang,
>>
>> On Thursday 21 April 2011 12:04 AM, Simon Glass wrote:
>>>
>>> On Fri, Mar 25, 2011 at 11:35 AM, Albert ARIBAUD<albert.arib... at free.fr>
>>> wrote:
>>>>
>>>> Le 25/03/2011 17:12, Aneesh V a écrit :
>>>>
>>>>> Another problem I have with relocation is that it makes debugging with
>>>>> JTAG debugers more difficult. The addresses of symbols in the ELF
>>>>> target are no longer valid. Of course, you can load the symbols at an
>>>>> offset from the original location. But one has to first enable debug
>>>>> prints, find the relocation offset, use it while loading the symbols
>>>>> before you can do source level debugging.
>>>>
>>>> Actually you don't need recompiling: simply set a breakpoint at the
>>>> entry of relocate_code and once you hit the bp, look up r2: it contains
>>>> the destination. If you want the offset rather than the absolute
>>>> address, set the breakpoint right after the 'sub r9, r6, r0' round line
>>>> 222: r9 will then give you the offset. Unload the current symbols,
>>>> reload the symbols with the relevant offset, and there you go.
>>>
>>> I would like to revisit this thread. I'm not sure how other people do
>>> development in U-Boot but I like to use an ICE and a source-level
>>> debugger for any significant effort. I think it should be possible to
>>> use a JTAG debugging just by loading the u-boot ELF file and running.
>>>
>>> With this patch (or something similar) this is possible. Without it,
>>> it is painful.
>>>
>>> To be clear, we are not talking here about creating a platform that
>>> doesn't use relocation, just that for development purposes it is
>>> convenient to be able to disable it.
>>
>> Actually, I am not even sure why relocation shouldn't be disabled in my
>> platform for good. It may be useful to have things such as the frame
>> buffer at the end of available memory. But, IMHO, that can still be
>> done without relocating u-boot. That's what the patch does.Am I missing
>> something?
>
>Well relocation does remove a lot of this ad-hoc positioning of things
>at compile time. I think it is desirable. My point is that it is not
>engineer-friendly during development, and we should have an easy way
>to disable it for debugging / JTAG purposes.
>
>Regards,
>Simon
>
>>
>>>
>>> Looking at the December thread
>>> http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/88067/focus=88262
>>>
>>> Aneesh:
>>>>>
>>>>> Shouldn't we provide a CONFIG option by which users can disable
>>>>> Elf relocation?
>>>
>>> Wolfgang:
>>>>
>>>> Why should we? It would just make the code even more complicated, and
>>>> require a lot of additional test cases.
>>>
>>> From what I can see this is a new CONFIG option, two ifdefs in the
>>> board.c file, and optionally disabling the -pie position-independent
>>> executable option to reduce size. It is pretty trivial:
>>>
>>> arch/arm/config.mk | 2 ++
>>> arch/arm/lib/board.c | 5 +++++
>>> 2 files changed, 7 insertions(+), 0 deletions(-)
>>>
>>> Regards,
>>> Simon
>>>
>>>>
>>>> Amicalement,
>>>> --
>>>> Albert.
>>>> _______________________________________________
>>>> U-Boot mailing list
>>>> U-Boot at lists.denx.de
>>>> http://lists.denx.de/mailman/listinfo/u-boot
>>>>
>>
>_______________________________________________
>U-Boot mailing list
>U-Boot at lists.denx.de
>http://lists.denx.de/mailman/listinfo/u-boot
>
More information about the U-Boot
mailing list