On Thu, May 17, 2012 at 8:21 PM, H. Peter Anvin <hpa@xxxxxxxxxx> wrote: > On 05/17/2012 04:51 PM, H. Peter Anvin wrote: >> >> This patch and the one before it seems to have another problem: we >> currently define __BITS_PER_LONG as: >> >> #ifdef __x86_64__ >> # define __BITS_PER_LONG 64 >> #else >> # define __BITS_PER_LONG 32 >> #endif >> > > H.J., do you see any problem *other* than this wretched struct > msqid64_ds with changing the above from __x86_64__ to > > #if defined(__x86_64__) && !defined(__ILP32__) > > ... in the above? > > As far as struct msqid64_ds, I think we can fix it simply because x86 > is the only compat-aware architecture which has to deal with it. > > (Incidentally, if sh is ever expanded to 64 bits, it will have a problem > in the bigendian configuration...) That will be wrong. __BITS_PER_LONG defines # bits of long as seen by kernel. We don't use it in user space. Remember x32 uses the identical interface as x86-64. So #ifdef __x86_64__ # define __BITS_PER_LONG 64 #else # define __BITS_PER_LONG 32 #endif struct msqid64_ds { struct ipc64_perm msg_perm; __kernel_time_t msg_stime; /* last msgsnd time */ #if __BITS_PER_LONG != 64 unsigned long __unused1; #endif __kernel_time_t msg_rtime; /* last msgrcv time */ #if __BITS_PER_LONG != 64 unsigned long __unused2; #endif __kernel_time_t msg_ctime; /* last change time */ #if __BITS_PER_LONG != 64 unsigned long __unused3; #endif are absolutely correct for x32. You can think #if __BITS_PER_LONG != 64 as #ifndef __x86_64__ which is used in glibc. -- H.J. -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html