From owner-freebsd-hackers@FreeBSD.ORG Mon Apr 16 12:34:46 2012 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C848A106564A; Mon, 16 Apr 2012 12:34:46 +0000 (UTC) (envelope-from sebastian.huber@embedded-brains.de) Received: from mail.embedded-brains.de (host-82-135-62-35.customer.m-online.net [82.135.62.35]) by mx1.freebsd.org (Postfix) with ESMTP id 7DC418FC0C; Mon, 16 Apr 2012 12:34:46 +0000 (UTC) Received: by mail.embedded-brains.de (Postfix, from userid 65534) id 748846528BD; Mon, 16 Apr 2012 14:28:55 +0200 (CEST) Received: from [192.168.96.31] (eb0011.eb.z [192.168.96.31]) by mail.embedded-brains.de (Postfix) with ESMTP id C73086528BE; Mon, 16 Apr 2012 14:28:50 +0200 (CEST) Message-ID: <4F8C1082.3020801@embedded-brains.de> Date: Mon, 16 Apr 2012 14:28:50 +0200 From: Sebastian Huber User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.23) Gecko/20110920 SUSE/3.1.15 Lightning/1.0b2 Thunderbird/3.1.15 MIME-Version: 1.0 To: freebsd-hackers@freebsd.org, freebsd-arm@freebsd.org Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Cc: Subject: XDR Library and Short Enums X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Apr 2012 12:34:46 -0000 Hi, the XDR library implementation of xdr_enum() is currently: /* * XDR enumerations */ bool_t xdr_enum(XDR *xdrs, enum_t *ep) { enum sizecheck { SIZEVAL }; /* used to find the size of an enum */ /* * enums are treated as ints */ /* LINTED */ if (sizeof (enum sizecheck) == sizeof (long)) { return (xdr_long(xdrs, (long *)(void *)ep)); } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (int)) { return (xdr_int(xdrs, (int *)(void *)ep)); } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (short)) { return (xdr_short(xdrs, (short *)(void *)ep)); } else { return (FALSE); } } The enum_t is defined as: typedef int32_t enum_t; This is problematic with short enums (variable sized enums). I case of short enums sizeof (enum sizecheck) would be 1. The ARM EABI lets you a choice between two alternatives described in the document issued by ARM. See also section 7.1.3 "Enumerated Types" http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf How would you implement and use the XDR library with short enums? The xdr_enum() can be easily changed to: /* * XDR enumerations */ bool_t xdr_enum(XDR *xdrs, enum_t *ep) { /* * enums are treated as ints */ /* LINTED */ if (sizeof (enum_t) == sizeof (long)) { return (xdr_long(xdrs, (long *)(void *)ep)); } else /* LINTED */ if (sizeof (enum_t) == sizeof (int)) { return (xdr_int(xdrs, (int *)(void *)ep)); } else /* LINTED */ if (sizeof (enum_t) == sizeof (short)) { return (xdr_short(xdrs, (short *)(void *)ep)); } else { return (FALSE); } } The problem is in the XDR library usage. An example is this (rpc_msg.h): enum msg_type { CALL=0, REPLY=1 }; How would you fix this? What about enum msg_type { CALL=0, REPLY=1, _MSG_TYPE_INVALID = 0xffffffff }; ? -- Sebastian Huber, embedded brains GmbH Address : Obere Lagerstr. 30, D-82178 Puchheim, Germany Phone : +49 89 18 90 80 79-6 Fax : +49 89 18 90 80 79-9 E-Mail : sebastian.huber@embedded-brains.de PGP : Public key available on request. Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.