From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:52026) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvPOX-000822-Na for qemu-devel@nongnu.org; Thu, 09 Feb 2012 03:30:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RvPOS-0006Kd-I2 for qemu-devel@nongnu.org; Thu, 09 Feb 2012 03:30:21 -0500 Received: from fmmailgate01.web.de ([217.72.192.221]:44229) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvPOS-0006KJ-6R for qemu-devel@nongnu.org; Thu, 09 Feb 2012 03:30:16 -0500 Received: from moweb002.kundenserver.de (moweb002.kundenserver.de [172.19.20.108]) by fmmailgate01.web.de (Postfix) with ESMTP id B0F901A9FD302 for ; Thu, 9 Feb 2012 09:30:13 +0100 (CET) Message-ID: <4F338411.20408@web.de> Date: Thu, 09 Feb 2012 09:30:09 +0100 From: Jan Kiszka MIME-Version: 1.0 References: <1328761361-23119-1-git-send-email-david@gibson.dropbear.id.au> In-Reply-To: <1328761361-23119-1-git-send-email-david@gibson.dropbear.id.au> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig835903917CA82C8634690BC5" Subject: Re: [Qemu-devel] [PATCH] ioctl() numbers are unsigned (the man page lies) List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson Cc: mtosatti@redhat.com, avi@redhat.com, qemu-devel@nongnu.org This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig835903917CA82C8634690BC5 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable Looks like the subject would warmly welcome a "kvm:" tag. On 2012-02-09 05:22, David Gibson wrote: > In kvm-all.c we store an ioctl cmd number in the irqchip_inject_ioctl f= ield > of KVMState, which has type 'int'. This seems to make sense since the > ioctl() man page says that the cmd parameter has type int. >=20 > However, the kernel treats ioctl numbers as unsigned - sys_ioctl() take= s an > unsigned int, and the macros which generate ioctl numbers expand to > unsigned expressions. Furthermore, some ioctls (IOC_READ ioctls on x86= > and IOC_WRITE ioctls on powerpc) have bit 31 set, and so would be negat= ive > if interpreted as an int. This has the surprising and compile-breaking > consequence that in kvm_irqchip_set_irq() where we do: > return (s->irqchip_inject_ioctl =3D=3D KVM_IRQ_LINE) ? 1 : event.st= atus; > We will get a "comparison is always false due to limited range of data > type" warning from gcc if KVM_IRQ_LINE is one of the bit-31-set ioctls,= > which it is on powerpc. >=20 > So, despite the fact that the man page and posix say ioctl numbers are > signed, they're actually unsigned. The kernel uses unsigned, the glibc= > header uses unsigned long, and FreeBSD, NetBSD and OSX also use unsigne= d > long ioctl numbers in the code. >=20 > Therefore, this patch changes the variable to be unsigned, fixing the > compile. >=20 > Signed-off-by: David Gibson > --- > kvm-all.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) >=20 > diff --git a/kvm-all.c b/kvm-all.c > index 0b87658..681ad15 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -78,7 +78,10 @@ struct KVMState > int pit_in_kernel; > int xsave, xcrs; > int many_ioeventfds; > - int irqchip_inject_ioctl; > + /* The man page (and posix) say ioctl numbers are signed int, but > + * they're not. Linux, glibc and *BSD all treat ioctl numbers as > + * unsigned, and treating them as signed here can break things */ What about naming the problem instead: /* Comparison with IOCTL macros on 32-bit hosts requires unsigned. */ > + unsigned irqchip_inject_ioctl; > #ifdef KVM_CAP_IRQ_ROUTING > struct kvm_irq_routing *irq_routes; > int nr_allocated_irq_routes; Jan --------------enig835903917CA82C8634690BC5 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk8zhBEACgkQitSsb3rl5xRblACfbtf8ZUySVPP/jCBqAc4z9cA0 Y+4An3wxhu58gFaDodJMIE8D595j9qlL =4VeL -----END PGP SIGNATURE----- --------------enig835903917CA82C8634690BC5--