[U-Boot] packed attribute problem
Vipin Kumar
vipin.kumar at st.com
Mon Oct 4 13:01:03 CEST 2010
On 10/4/2010 4:26 PM, Reinhard Meyer wrote:
> Dear Wolfgang Denk, Vipin Kumar,
>>
>> In message <4CA9ACAA.2020001 at st.com> you wrote:
>>>>> This writel results in writing byte by byte on the address pointed to by status_reg.
>>>>> This problem is visible with both gcc version 4.4.1 as well as 4.5.0
>>>> I bet this is on some ARM system?
>>> Yes, it is on an ARM system (CortexA9). But I still feel that since I am creating
>>> a new u32 * status_reg, the code should not use any intelligence and use the pointer
>>> only to produce an str instruction in the form
>>> str r0, [r1]
>>>
>>> But it retains the packed property of the structure even with a new u32 ponter
>>> typecasted to u32 *
>>> u32 * status_reg = (u32 *)xyz->x;
>>>
>>> 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 ?
> 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
Regards
Vipin
More information about the U-Boot
mailing list