[U-Boot] packed attribute problem

Reinhard Meyer u-boot at emk-elektronik.de
Mon Oct 4 13:46:28 CEST 2010


Dear Vipin Kumar,
>>>> A writel to status_reg results in byte by byte writing
>> How do you know that? Disassembly? Bus snooping?
>>
> 
> Disassembly
> 
>>> I agree with you. I always considered such behaviour of the ARM C
>>> compiler a bug, and still do.  However, people with better knowledge
>>> of the ARm architecture than me might be able to explain why the
>>> responsible PTB consider this to be a good and necessary "feature" of
>>> th compiler.
>> Maybe because writel(v,a) is ultimately defined as
>>
>> (*(volatile unsigned int *)(a) = (v))
>>
>> and the compiler has to assume the worst, i.e. that (a) is not word
>> aligned? Maybe there is a new compiler switch to turn that
>> "pessimisation" off?
>>
> 
> I agree with you on this. But if I create a new u32 pointer and point to 
> an element with in the packed structure, then what should be the behavior ?

Do you imply that the code is really different when the pointer gets
its value by assigning it NOT to a packed entity? Hard to believe.

My assumptions:
1. it has to do NOTHING with packed attributes, once the pointer is in a
new variable, that "packed" information should be lost. Just try
int *ptr = (int *) 0x10000;
a)   *ptr = 5;
b)   writel (5, ptr);

do a) and b) produce different code?

2. the culprit on ARM is that unaligned accesses do not raise any signal
but silently IGNORE the "unused" adress lines which leads to very
undesirable effects that are hard to find.

*((int *)0x10000) = 5 is the same as *((int *)0x10003) = 5 !
Both write 5 to the word at adress 0x10000 !

So, MAYBE, in newer toolchains it was decided to circumvent that problem
by always assuming unaligned pointers unless clearly instructed otherwise.

> 
>> On the other hand, if what you say were true, all code for AT91 that
>> uses writel() to access 32 bit only peripheral registers would not
>> work with those newer toolchains (still 4.2.4 here).
>>
> 
> Yes, if the at91 code is using packed attribute for device structures


Nope. It does not have to do with packed. It would have to do with the fact
that I/O registers cannot be safely written byte-wise.

Reinhard



More information about the U-Boot mailing list