[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Getting rid of alignment faults in userspace



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


Reply to: