[U-Boot] [PATCH V7] POST cleanup.

Michael Zaidman michael.zaidman at gmail.com
Sun Nov 21 13:34:42 CET 2010


Dear Wolfgang,

Sorry for delayed response, I did not follow the u-boot list for few
weeks an missed your e-mails somehow.
Please see my comments below.

On Tue, Oct 26, 2010 at 11:09 PM, Wolfgang Denk <wd at denx.de> wrote:
> Dear Michael Zaidman,
>
> In message <d520c6ef298416a03789ebfa4e05e257b5331693.1284965175.git.michael.zaidman at gmail.com> you wrote:
>> - Revives POST for blackfin arch;
>> - Removes redundant code:
>>      arch/blackfin/lib/post.c
>>      arch/powerpc/cpu/ppc4xx/commproc.c
>>      arch/powerpc/cpu/mpc512x/common.c
>> - fixes up the post_word_{load|store} usage.
>
> Unfortunately it turns out that the code now contains a few nasty
> bugs...

Thanks for catching this, I expected a feedback due to a huge number
of boards and architectures the patch has touched...

> ...
>>  #define CONFIG_SYS_GBL_DATA_OFFSET   (CONFIG_SYS_INIT_RAM_END - CONFIG_SYS_GBL_DATA_SIZE)
>> -#define CONFIG_SYS_POST_WORD_ADDR    (CONFIG_SYS_GBL_DATA_OFFSET - 0x4)
>> -#define CONFIG_SYS_INIT_SP_OFFSET    CONFIG_SYS_POST_WORD_ADDR
>> +#define CONFIG_SYS_INIT_SP_OFFSET    (CONFIG_SYS_GBL_DATA_OFFSET - 0x4)
>
> This is a seriously broken design, as it sneaks in storage for a
> variable in a storage location where it is not expected.

There were a number of boards implemented this design (alpr, karef,
katmai, metrobox, ocotea, redwood, taishan, xpedite1000, yucca,
etc...)  I just grouped their definitions in a single place. But, you
are right, it should be fixed.

> But it's even worse.

> 244 in_flash:
> 245         lis     r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET)@h
> 246         ori     r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET)@l
> 247
> 248         li      r0, 0           /* Make room for stack frame header and */
> 249         stwu    r0, -4(r1)      /* clear final stack frame so that      */
> 250         stwu    r0, -4(r1)      /* stack backtraces terminate cleanly   */
> ...
>
> As you can see, the code does not use CONFIG_SYS_INIT_SP_OFFSET at
> all; instead it performs a calculation which should be redundant, but
> in the current code it means that the location of the POST_WORD is
> right in the initial stack.

This code should use the CONFIG_SYS_INIT_SP_OFFSET. This should be
fixed regardless of the POST_WORD location.
I figured out that there a number of architectures that implement this
redundancy.

>
> Why do we not simply reserve a word in the global data structure instead?

I guess, because the global data structure is cleared in the
cpu_init_f() upon startup?
	memset ((void *) gd, 0, sizeof (gd_t));

We can prevent part or single field of the gd structure from to be
cleared. Does this make sense to you?

Regards,
Michael


More information about the U-Boot mailing list