[U-Boot] [PATCH] net: fec_mxc: Fix timeouts during tftp transfer
Benoît Thébaudeau
benoit.thebaudeau at advansee.com
Tue Sep 17 16:42:32 CEST 2013
Dear Wolfgang Denk,
On Tuesday, September 17, 2013 1:47:02 PM, Wolfgang Denk wrote:
> Dear Benoît Thébaudeau,
>
> In message <1135126743.1842859.1379415574013.JavaMail.zimbra at advansee.com>
> you wrote:
> >
> > > So how can the above not properly align the buffer? Is that a compiler
> > > bug
> > > then?
> > >
> > > btw. using ALLOC_CACHE_ALIGN_BUFFER will be safer were someone to change
> > > FEC_MAX_PKT_SIZE, the buffer would still be safe for cache flush/inval
> > > ops.
> >
> > I have encountered the same kind of alignment issue recently on something
> > else.
> > It looks like GCC for ARM just silently ignores the aligned attribute for
> > auto
> > (stacked) variables.
>
> I would really like to see the generated code from such a system, so
> we verify if this is indeed true, or if something else is causing such
> issues.
>
> Even if the suggested patch fixes the current problem, it leaves a bad
> feeling as it's only based on speculation about the causes.
Here is a basic alignment test that I have run on ARM:
---
#include <stdio.h>
void foo(void *var)
{
printf("var=0x%.8x\n", (int)var);
}
int main(void)
{
unsigned char var[1536] __attribute__((__aligned__(64)));
unsigned int i;
for (i = 0; i < 10; i++)
foo(&var);
return 0;
}
---
I have built it using:
$ cross-gcc align.c -o align
With GCC 4.5.4, the kind of output that I get is 'var=0x7ee1a6b8' (i.e. not
aligned as requested).
The generated asm is:
---
0000849c <main>:
849c: e92d4800 push {fp, lr}
84a0: e28db004 add fp, sp, #4
84a4: e24ddc06 sub sp, sp, #1536 ; 0x600
84a8: e24dd008 sub sp, sp, #8
84ac: e3a03000 mov r3, #0
84b0: e50b3008 str r3, [fp, #-8]
84b4: ea000007 b 84d8 <main+0x3c>
84b8: e24b3c06 sub r3, fp, #1536 ; 0x600
84bc: e2433004 sub r3, r3, #4
84c0: e2433008 sub r3, r3, #8
84c4: e1a00003 mov r0, r3
84c8: ebffffe7 bl 846c <foo>
84cc: e51b3008 ldr r3, [fp, #-8]
84d0: e2833001 add r3, r3, #1
84d4: e50b3008 str r3, [fp, #-8]
84d8: e51b3008 ldr r3, [fp, #-8]
84dc: e3530009 cmp r3, #9
84e0: 9afffff4 bls 84b8 <main+0x1c>
84e4: e3a03000 mov r3, #0
84e8: e1a00003 mov r0, r3
84ec: e24bd004 sub sp, fp, #4
84f0: e8bd8800 pop {fp, pc}
---
With GCC 4.6.2, the kind of output that I get is 'var=0x7e808680' (i.e. aligned
as requested).
The generated asm is:
---
000083a4 <main>:
83a4: e92d4810 push {r4, fp, lr}
83a8: e28db008 add fp, sp, #8
83ac: e24dd00c sub sp, sp, #12
83b0: e24ddd19 sub sp, sp, #1600 ; 0x640
83b4: e1a0300d mov r3, sp
83b8: e283303f add r3, r3, #63 ; 0x3f
83bc: e1a03323 lsr r3, r3, #6
83c0: e1a04303 lsl r4, r3, #6
83c4: e3a03000 mov r3, #0
83c8: e50b3010 str r3, [fp, #-16]
83cc: ea000004 b 83e4 <main+0x40>
83d0: e1a00004 mov r0, r4
83d4: ebffffe6 bl 8374 <foo>
83d8: e51b3010 ldr r3, [fp, #-16]
83dc: e2833001 add r3, r3, #1
83e0: e50b3010 str r3, [fp, #-16]
83e4: e51b3010 ldr r3, [fp, #-16]
83e8: e3530009 cmp r3, #9
83ec: 9afffff7 bls 83d0 <main+0x2c>
83f0: e3a03000 mov r3, #0
83f4: e1a00003 mov r0, r3
83f8: e24bd008 sub sp, fp, #8
83fc: e8bd8810 pop {r4, fp, pc}
---
I did not succeed to duplicate the issue with GCC 4.6.2, while GCC 4.5.4 almost
always produces an unexpected alignment for auto variables.
Best regards,
Benoît
More information about the U-Boot
mailing list