[U-Boot] __attribute__((__packed__)) switching to byte-access on ARM
Guennadi Liakhovetski
lg at denx.de
Mon Aug 11 21:20:12 CEST 2008
On Mon, 11 Aug 2008, Scott Wood wrote:
> On Mon, Aug 11, 2008 at 05:48:21PM +0200, Guennadi Liakhovetski wrote:
> > The respective assembly code is quite simple:
> >
> > 00000000 <read_timer>:
> > 0: e59f3004 ldr r3, [pc, #4] ; c <timer_load_val>
> > 4: e5930040 ldr r0, [r3, #64]
> > 8: e12fff1e bx lr
> > c: 7f006000 swivc 0x00006000
> >
> > Perfect. Now, if I make the two structs above packed, I get this assembly:
> >
> > 00000000 <read_timer>:
> > 0: e59f301c ldr r3, [pc, #28] ; 24 <.text+0x24>
> > 4: e5d30040 ldrb r0, [r3, #64]
> > 8: e5d32041 ldrb r2, [r3, #65]
> > c: e5d31042 ldrb r1, [r3, #66]
> > 10: e1800402 orr r0, r0, r2, lsl #8
> > 14: e5d33043 ldrb r3, [r3, #67]
> > 18: e1800801 orr r0, r0, r1, lsl #16
> > 1c: e1800c03 orr r0, r0, r3, lsl #24
> > 20: e12fff1e bx lr
> > 24: 7f006000 swivc 0x00006000
> >
> > which converts all accesses to the structure to 8-bit... Ideas? Toolchain
> > eldk-4.1. U-Boot from nand/testing git with the patches I just sent to the
> > list, configured for smdk6400_config.
>
> Packed implies a lack of alignment. Since ARM can't do unaligned
> accesses in a "normal" way, the compiler avoids them.
>
> Why do you need to pack the struct?
I don't. These structs are already filled with dummy bytes. So it also
works without the packed attribute. Why I tried to enable it was because
the attribute was in the original code from Samsung, but was commented
out, so, I wanted to find out what happens if I re-enable it. Besides, the
packed attribute serves as a hint in the source, that this struct has
special requirements for its in-memory representation.
Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
More information about the U-Boot
mailing list