Skip site navigation (1)Skip section navigation (2)
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>