Subject: Re: struct netbsd32_statvfs and packed attribute
To: Markus Mayer <mmayer@redback.com>
From: David Laight <david@l8s.co.uk>
List: tech-kern
Date: 09/08/2007 14:22:30
On Fri, Sep 07, 2007 at 04:36:21PM -0700, Markus Mayer wrote:
> Hi,
>
> I just noticed an issue with netbsd32_statvfs and the getvfsstat()
> syscall. This is for a MIPS platform with 64 bit kernel and (some) 32
> bit userland applications. However, I am assuming it'll affect other
> platforms, as well.
...
> I traced the problem to the attribute "packed" that is specified for
> struct netbsd32_statvfs. netbsd32_statvfs is 2228 bytes in the kernel.
> However, struct statvfs, which is not packed, is 2232 bytes in 32 bit
> userland.
IIRC the 'problem' is that struct statvfs has a 64bit integer that
isn't (by default) aligned on an 8 byte boundary.
On i386 (I'm not sure about sparc) 64bit types only have 4 byte alignment,
so an amd64 kernel (where they have 8 byte alignment) incorrectly
maps the statvfs structure.
Adding 'base' types netbsd32_int64 and netbsd32_uint64 (which have 4byte
alignemnt when needed) may be necessary. Packing the whole structure
gives a massive performance penalty on cpus that can't do misaligned
access.
David
--
David Laight: david@l8s.co.uk