On 10/4/2010 3:47 PM, Wolfgang Denk wrote:
> Dear Vipin Kumar,
> 

Dear Wolfgang

> In message <4ca9a095.9000...@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
> 

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

Reply via email to