[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