[head tinderbox] failure on mips/mips

Marcel Moolenaar xcllnt at mac.com
Tue Feb 17 22:26:11 PST 2009


On Feb 17, 2009, at 9:21 PM, M. Warner Losh wrote:

> In message: <20090217.203647.-1518647466.imp at bsdimp.com>
>            "M. Warner Losh" <imp at bsdimp.com> writes:
> : In message: <20090218023328.227617302F at freebsd-current.sentex.ca>
> :             FreeBSD Tinderbox <tinderbox at freebsd.org> writes:
> : : /src/usr.sbin/bsnmpd/modules/snmp_mibII/../../../../contrib/ 
> bsnmp/snmp_mibII/mibII.c:1016: warning: cast increases required  
> alignment of target type
> :
> : there's still 3 or 4 of these in the tree that I'm trying to track
> : back to root cause.  A simple (void *) fixes the problem, but I want
> : to understand the issues before I slap that bad-boy in there...
>
> The first one is:
>
> 	  case RTM_IFINFO:
> 		ifm = (struct if_msghdr *)rtm;
> 		mib_extract_addrs(ifm->ifm_addrs, (u_char *)(ifm + 1), addrs);
> 		if ((ifp = mib_find_if_sys(ifm->ifm_index)) == NULL)
> 			break;
>
> rtm is of type struct rt_msghdr.  This has an alignment requirement of
> 4 on mips, at least on 32-bit mips (the biggest data element is a
> u_long).  struct if_msghdr has an alignment requirement of 8, because
> time_t is int64_t on MIPS, which is 8-bytes in size.

Normally on 32-bit architectures, 64-bit data types have a 32-bit
alignment requirement by virtue of needing 2 32-bit loads/stores
to read/write them. Does 32-bit MIPS use 64-bit wide registers?

> One way to fix this is to add __aligned(8) to struct rt_msghdr to
> compensate for this.  Otherwise, if the time_t element is referenced
> in ifm_data we'll core dump.

A safer approach is to mark ifi_epoch as packed or put differently,
define time_t as a 64-bit integral with 32-bit alignment. This can
avoid a lot of unexpected internal padding as well (e.g. struct
timeval).

Just a thought.

-- 
Marcel Moolenaar
xcllnt at mac.com





More information about the freebsd-current mailing list