[U-Boot] packed attribute problem
Vipin Kumar
vipin.kumar at st.com
Mon Oct 4 12:30:02 CEST 2010
On 10/4/2010 3:47 PM, Wolfgang Denk wrote:
> Dear Vipin Kumar,
>
Dear Wolfgang
> In message <4CA9A095.9000900 at st.com> you wrote:
>>
>> I encountered a problem something like
>>
>> struct xyz {
>> int x;
>> int y;
>> int z[CONST];
>> } __attribute__ ((packed));
>>
>> struct xyz *abc;
>> u32 * status_reg = (u32 *)&abc->z[0];
>>
>> writel(status, status_reg);
>>
>> 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
>> Incidently, the same code works well with 4.2.4
>
> ...which surprises me. I thought this has always been an ARM
> "feature".
>
>> The problem is visible in the usb host driver which uses the packed structures for
>> accessing device registers.
>
> Hm... Why do these structs have any "__attribute__ ((packed))" at all?
>
Even I could not understand that very well
Regards
Vipin
> Best regards,
>
> Wolfgang Denk
>
More information about the U-Boot
mailing list