Date: Fri, 13 Nov 2015 14:10:20 +0000 From: David Chisnall <theraven@FreeBSD.org> To: Konstantin Belousov <kostikbel@gmail.com> Cc: Hans Petter Selasky <hps@selasky.org>, cem@FreeBSD.org, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r290711 - head/sys/ofed/drivers/infiniband/core Message-ID: <0330812D-2FB6-4490-BFB3-67F9E66975A7@FreeBSD.org> In-Reply-To: <20151113083543.GV2257@kib.kiev.ua> References: <201511121012.tACACKTI075143@repo.freebsd.org> <CAG6CVpWKsa3SwX27JpxBeQDikeDWJXyUGWG8sS=9DvzbML9xcA@mail.gmail.com> <56459CEE.4090007@selasky.org> <20151113083543.GV2257@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On 13 Nov 2015, at 08:35, Konstantin Belousov <kostikbel@gmail.com> = wrote: >=20 > On Fri, Nov 13, 2015 at 09:18:54AM +0100, Hans Petter Selasky wrote: >> Hi, >>=20 >> On 11/12/15 18:17, Conrad Meyer wrote: >>> These should cast through (u)intptr_t rather than unsigned long. >>>=20 >>=20 >> This is Linux code, and they use "unsigned long" for pointer casts=20 >> everywhere, trying to not break their style. >>=20 >> BTW: I added to linux_compat.c: >>=20 >> CTASSERT(sizeof(unsigned long) =3D=3D sizeof(uintptr_t)); >>=20 >> And it survived my "tinderbox" build and I was surprised! >=20 > FreeBSD (at least currently) runs on two kinds of ABIs: ILP32 and = LP64. > ILP32 means that sizeof(int) =3D=3D sizeof(long) =3D=3D sizeof(void *) = =3D=3D 4. > For LP64, sizeof(long) =3D=3D sizeof(void *) =3D=3D 8, while = sizeof(int) =3D=3D 4. > We do not support anything else. Note that this is not true of all downstreams. We currently have 128 = and 256-bit void*s with 64-bit longs on CHERI, and I believe that = bde=E2=80=99s version has 32-bit longs on all platforms. This kind of = code *is* broken for us and we=E2=80=99d greatly appreciate people not = writing new code that intentionally relies on undefined behaviour (round = tripping a pointer via any integer type other than intptr_t is undefined = in C), when a well-defined mechanism exists, just because Linux decides = to do the wrong thing. David
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?0330812D-2FB6-4490-BFB3-67F9E66975A7>