On 06/17/2011 08:17 PM, Somebody in the thread at some point said:
On 06/17/2011 08:11 AM, Andy Green wrote:
On 06/17/2011 01:10 PM, Somebody in the thread at some point said:
Hi -
I've recently become aware that a few packages are causing alignment faults on ARM, and are relying on the alignment fixup emulation code in the kernel in order to work.
Just a FYI a lot of later ARM chips are solving alignment fixups in hardware in the Bus Interface Unit, so the problems won't show up in kernel stats.
Such faults are very expensive in terms of CPU cycles, and can generally only result from wrong code (for example, C/C++ code which violates the relevant language standards, assembler which makes invalid assumptions, or functions called with misaligned pointers due to other bugs).
Agreed it's usually evidence of something broken and / or evil in the code.
There is still going to be a small cost even in hardware fixup so this is very much worth solving despite it's "becoming invisible" because the chips are hiding / solving it already.
But I believe that h/w feature is turned off in Linux by default. You have to add noalign to the kernel command line to enable.
I think you'll find the hardware fixups are enabled by default on CPUs with that design, quite possibly it can't be turned off.
This test was done on a Panda:
root@linaro:~# cat /proc/cmdline console=tty0 console=ttyO2,115200n8 earlycon=ttyO2,115200n8 earlyprintk=1 root=/dev/mmcblk0p2 rootwait ro fixrtc vram=32M omapfb.vram=0:16M,1:16M mem=456M
ie, nothing about "noalign".
Test code crafted to blow alignment faults on the dereference:
#include <stdio.h> #include <string.h>
int main(int argc, char * argv[]) { char buf[8]; void *v = &buf[1]; unsigned int *p = (unsigned int *)v;
strcpy(buf, "abcdefg");
printf("0x%08x\n", *p);
return 0; }
Default case with soft fixup enabled:
root@linaro:~# cat /proc/cpu/alignment User: 0 System: 0 Skipped: 0 Half: 0 Word: 0 DWord: 0 Multi: 0 User faults: 2 (fixup)
root@linaro:~# gcc test.c root@linaro:~# ./a.out 0x65646362
Test case with soft fixup disabled:
root@linaro:~# echo 0 > /proc/cpu/alignment root@linaro:~# cat /proc/cpu/alignment User: 0 System: 0 Skipped: 0 Half: 0 Word: 0 DWord: 0 Multi: 0 User faults: 0 (ignored)
root@linaro:~# ./a.out 0x65646362
ie, the result is always fixed up on OMAP4 and kernel fixup code never gets an exception even.
-Andy