On Sunday 15 April 2007 01:23, Stefan Reinauer wrote:
- Aurelien Jarno aurelien@aurel32.net [070401 22:05]:
Hi all,
The current SVN version currently fails to work on machines that have strict alignment requirements, for example the SPARC target. This is due to the way the struct fat_bpb in fs/grubfs/fat.h is defined and accessed (through FAT_CVT_U16) to avoid padding. Some 16 bits fields like bytes_per_sect are thus accessed unaligned.
Why is this causing trouble? bytes_per_sect was defined as an array of u8, which you would not need to access aligned anyways. Is gcc doing some assumptions here?
It was accessed through a (uint16_t *) though.
gcc only generates special code to handle misaligned accesses when the access if a member of an explicitly packed (ie. misaligned) structure.
Because compensating for a misaligned access is so expensive the only sane option is to assume that normal pointers are properly aligned.
By taking the address and casting to (uint16_t *) you're hiding the member access, and allowing gcc to assume it is a properly aligned 16-bit value.
Paul