Hi Simon,

I'm very glad you answered this, I was busy with other stuff these last weeks
but I had planed to pick this issue again this week.

On 09/28/2014 06:27 AM, Simon Glass wrote:
> Hi,
> 
> On 26 August 2014 09:17, Valentin Longchamp
> <valentin.longch...@keymile.com> wrote:
>>
>> Hello,
>>
>> Here is the outcome of my debug session today:
>>
>> On 08/25/2014 05:42 PM, Valentin Longchamp wrote:
>>> Hello,
>>>
>>> I am currently porting all the Keymile boards to CONFIG_SYS_GENERIC_BOARD.
>>> On u-boot 2014.10-rc1 I have all of them working quite well (at least 
>>> booting
>>> and showing no obvious problem), except for our boards using a MPC8360
>>> from Freescale (kmcoge5ne and kmeter1, both using km8360.h as config) that 
>>> do
>>> not boot at all.
>>>
>>> I have found out that u-boot crashes as soon as a getenv function call 
>>> happens
>>> before relocation. When I disable them, u-boot seems to work fine. I am
>>> currently trying to debug further, but it's not clear yet exactly what 
>>> causes
>>> the crash.
>>
>> So the problem is that for an unknown reason, the gd->flags are not correct 
>> and
>> getenv actually calls hsearch_h to look for the desired env variable. This 
>> fails
>> before relocation (due to the small stack ?).
>>
>> If I replace the board_f getenv_ulong calls in board_f.c with my 
>> getenv_f_ulong
>> function that explicitely calls getenv_f the board boots up nicely.
>>
>> Now the question is, why are my gd->flags not correct/corrupted ? Has someone
>> already seen something similar ? I unfortunateley cannot access gd easily 
>> with
>> the BDI, since it is located in the INIT_RAM which is a data cache, for 
>> which I
>> have no LAW configured (could work on that).
> 
> I just saw this. There is condition code at the start of
> board_init_f() in board_f.c that might exclude your board. So your
> global data might not be zeroed.
> 

That's not exactly the problem here, since defining
CONFIG_SYS_GENERIC_GLOBAL_DATA did not solve the problem. However it made me
look at the right place and I have noticed that gd->flags are set in the generic
board_inif_f() and were not in the previous powerpc specific board_init_f(). If
I comment out the gd->flags = boot_flags in the board_init_f() function, then
everything works well.

Since board_init_f() is called from the assembly code (in my case
mpc83xx/start.S), I guess the ulong boot_flags argument ends up being a register
(if the arguments are passed in register ... which I am not sure of for
powerpc). Since prior to the bl board_init_f call in the start.S file, there is
a call another C function (cpu_init_f()), I guess the register passed as
argument has an undefined content ... that ends up in gd->flags.

I think that the best way to fix this is to make sure from start.S that
boot_flags (so the register) has a defined (zeroed ?) content ? But how to make
sure which register it is and that this will not change, since the compiler
comes into play here ?

Valentin
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to