Subject: Re: Enabling alignment faults
To: Steve Woodford <scw@netbsd.org>
From: Richard Earnshaw <rearnsha@buzzard.freeserve.co.uk>
List: port-arm
Date: 10/24/2003 00:49:23
> While mucking around with a wi(4) card on an xscale board, and falling
> foul of kern/23238, it occurred to me that perhaps we should provide a
> kernel config file option to enable alignment faults.
>
> To that end, I rattled up "options ARM_ENABLE_ALIGNMENT_FAULTS" together
> with the necessary glue in fault.c, and cp15 frobbing (for xscale only
> right now) in cpufuncs.c.
>
> Running a kernel with this enabled immediately showed up a bug in memcmp
> (mea culpa ;-) which I have since fixed. Other than that, both kernel
> and userland are running fine.
>
> There is an old comment in an earlier version of fault.c which alludes
> to gcc taking advantage of misaligned accesses when dealing with short
> ints. I can see how this would be useful on ARM cpus which can't do
> 16-bit loads/stores, but is it really relevant for more recent cpus?
> Does gcc still emit such code if the target cpu can do 16-bit ldr/str?
> If not, then perhaps I should enable it by default and change the
> option to ARM_DISABLE_ALIGNMENT_FAULTS...
>
It should be safe to enable alignment faults unless COMPAT_15 is defined.
When we switched to ELF we made the compiler not generate word accesses
for doing half-word loads, unless the compiler could guarantee that the
word being loaded was aligned (eg, because it is part of a word-aligned
structure).
If you want to be really clever, a COMPAT_15 kernel could diddle with the
alignment configuration whenever an a.out format binary was being run.
It's just possible that some emulations may also require alignment faults
disabling. I don't think linux compatibility does; they've been using
strict alignment for a long time now.
R.