From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tom Evans Date: Wed, 04 Mar 2009 11:19:08 +1100 Subject: [U-Boot] Alignment bug in itest on ARM & doesn't work on big-endian either? In-Reply-To: References: Message-ID: <49ADC8FC.5030803@ceos.com.au> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Jean-Christophe PLAGNIOL-VILLARD wrote: > On 17:40 Tue 03 Mar , Tom Evans wrote: >> BUG IN ITEST >> ------------ >> itest crashes ARM chips. I can "iread.b *82000000 == 0", >> but "iread.b *82000001 == 0" throws an alignment >> exception that kills the box. The code in itest.c is: >> >> static long evalexp(char *s, int w) >> { >> long l, *p; >> >> /* if the parameter starts with a * then assume >> is a pointer to the value we want */ >> if (s[0] == '*') { >> p = (long *)simple_strtoul(&s[1], NULL, 16); >> l = *p; > here you are support to use the good accessor > readb/readw/readl Thank you for your response. readl() is defined in asm-arm/io.h as "__arch_getl(a)" which is defined as "(*(volatile unsigned int *)(a))" which doesn't handle misalignment and will still crash. I think those functions are only meant for I/O reads. The code then "selects the byte" with the following: >> return (l & ((1 << (w * 8)) - 1)); That selects the LOWER 8/16/32 bits of the 32-bit read. Which works on a 486, ARM variants with unaligned transfers, but NOT on a PPC or any other big-endian CPUs (about half of them supported by U-Boot). On a big-endian unaligned supporting CPU I'd expect a byte read of address "0" to read "3" and a read of "1" to read "4" (in the next word!). Ditto for itest.w. Whoever owns/maintains this code, and/or can test it on a big-endian target should fix these, taking hints from the cmd_mem.c code which does all of this in a portable manner. I don't have a big-endian target so I can't test the big-endian fix. > the arm does not allow you to do an non aligned access I know that. The current itest code doesn't. The "indirect pointer feature" mustn't be used much if I'm the first one to find these problems. -- === Tom Evans Tom.Evans at ceos.com.au CEOS Pty Ltd www.ceos.com.au 3/17 Burgundy St, Heidelberg, Victoria 3084, Australia