[U-Boot] [PATCH 01/10] ARM: move interrupt_init to before relocation

Rob Herring
2013-05-15T21:29:41Z

On Wed, May 15, 2013 at 3:26 PM, Albert ARIBAUD
<albert.u.boot@aribaud.net> wrote:
> Hi Rob,
>
> On Wed, 15 May 2013 14:56:07 -0500, Rob Herring <robherring2@gmail.com>
> wrote:
>
>> From: Rob Herring <rob.herring@calxeda.com>
>>
>> interrupt_init also sets up the abort stack, but is not setup before
>> relocation. So any aborts during relocation will hang and not print out
>> any useful information. Fix this by moving the interrupt_init to after
>> the stack setup in board_init_f.
>>
>> Signed-off-by: Rob Herring <rob.herring@calxeda.com>
>> ---
>> arch/arm/lib/board.c | 1 +
>> 1 file changed, 1 insertion(+)
>>
>> diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
>> index 09ab4ad..6dbe7e2 100644
>> --- a/arch/arm/lib/board.c
>> +++ b/arch/arm/lib/board.c
>> @@ -447,6 +447,7 @@ void board_init_f(ulong bootflag)
>> addr_sp += 128; /* leave 32 words for abort-stack */
>> gd->irq_sp = addr_sp;
>> #endif
>> + interrupt_init();
>>
>> debug("New Stack Pointer is: %08lx\n", addr_sp);
>>
>
> I fail to understand how this is even supposed to work through
> relocation: exception vectors are not relocated, so if they work before
> relocation, then they won't work any more afterward unless some code is
> added to relocate them.

They work before and after in my testing. The vectors are relocated
along with the rest of u-boot and the vector base is updated by
c_runtime_cpu_setup. I'm simply setting up the abort stack earlier. An
alternative would be to setup a different abort handler and stack
before relocation. I'm open to suggestions, but as it stands now
aborts before or during relocation will simply hang without this.

> Also: if this patch is moving interrupt_init(), then where is the line
> where a call to interrupt_init() is removed?

Yes, the later call to interrupt_init should be removed assuming we
keep this approach.

Rob