svn commit: r195460 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at freebsd.org
Fri Jul 10 10:28:39 UTC 2009
On 10 Jul 2009, at 08:26, M. Warner Losh wrote:
> It isn't a compiler bug. It is an ABI requirement for ARM. At least
> for the ABI we use. there are others that might be better, and not
> suffer from this surprise. We[*] should investigate them.
Verbatim copy from gcc/config/arm/netbsd-elf.h:
/* VERY BIG NOTE: Change of structure alignment for NetBSD/arm.
There are consequences you should be aware of...
Normally GCC/arm uses a structure alignment of 32 for compatibility
with armcc. This means that structures are padded to a word
boundary. However this causes problems with bugged NetBSD kernel
code (possibly userland code as well - I have not checked every
binary). The nature of this bugged code is to rely on sizeof()
returning the correct size of various structures rounded to the
nearest byte (SCSI and ether code are two examples, the vm system
is another). This code breaks when the structure alignment is 32
as sizeof() will report a word=rounded size. By changing the
structure alignment to 8. GCC will conform to what is expected by
NetBSD.
This has several side effects that should be considered.
1. Structures will only be aligned to the size of the largest
member.
i.e. structures containing only bytes will be byte aligned.
structures containing shorts will be half word aligned.
structures containing ints will be word aligned.
This means structures should be padded to a word boundary if
alignment of 32 is required for byte structures etc.
2. A potential performance penalty may exist if strings are no
longer
word aligned. GCC will not be able to use word load/stores to
copy
short strings.
This modification is not encouraged but with the present state of
the
NetBSD source tree it is currently the only solution that meets the
requirements. */
#undef DEFAULT_STRUCTURE_SIZE_BOUNDARY
#define DEFAULT_STRUCTURE_SIZE_BOUNDARY 8
--
So, this is how NetBSD avoided it, don't know if it's the best way to
do it. We have DEFAULT_STRUCTURE_SIZE_BOUNDARY equal to 32 (the
default), so our case is different and this is the reason why
alignment will always be done on a word basis.
--
Rui Paulo
More information about the svn-src-projects
mailing list