parisc, uses a nonstandard variation of the generic sysvipc
data structures, intended to have the padding moved around
so it can deal with big-endian 32-bit user space that has
64-bit time_t.

Unlike most architectures, parisc actually succeeded in
defining this right for big-endian CPUs, but as everyone else
got it wrong, we just use the same hack everywhere.

This takes just take the same approach here that we have for
the asm-generic headers and adds separate 32-bit fields for the
upper halves of the timestamps, to let libc deal with the mess
in user space.

Signed-off-by: Arnd Bergmann <[email protected]>
---
 arch/parisc/include/asm/compat.h      | 32 ++++++++++++++++----------------
 arch/parisc/include/uapi/asm/msgbuf.h | 32 ++++++++++++++++----------------
 arch/parisc/include/uapi/asm/sembuf.h | 13 +++++++------
 arch/parisc/include/uapi/asm/shmbuf.h | 18 ++++++++----------
 4 files changed, 47 insertions(+), 48 deletions(-)

diff --git a/arch/parisc/include/asm/compat.h b/arch/parisc/include/asm/compat.h
index cc20c7b203f4..3113a7f8e1be 100644
--- a/arch/parisc/include/asm/compat.h
+++ b/arch/parisc/include/asm/compat.h
@@ -195,10 +195,10 @@ struct compat_ipc64_perm {
 
 struct compat_semid64_ds {
        struct compat_ipc64_perm sem_perm;
-       compat_time_t sem_otime;
-       unsigned int __unused1;
-       compat_time_t sem_ctime;
-       unsigned int __unused2;
+       unsigned int sem_otime;
+       unsigned int sem_otime_high;
+       unsigned int sem_ctime;
+       unsigned int sem_ctime_high;
        compat_ulong_t sem_nsems;
        compat_ulong_t __unused3;
        compat_ulong_t __unused4;
@@ -206,12 +206,12 @@ struct compat_semid64_ds {
 
 struct compat_msqid64_ds {
        struct compat_ipc64_perm msg_perm;
-       unsigned int __unused1;
-       compat_time_t msg_stime;
-       unsigned int __unused2;
-       compat_time_t msg_rtime;
-       unsigned int __unused3;
-       compat_time_t msg_ctime;
+       unsigned int msg_stime_high;
+       unsigned int msg_stime;
+       unsigned int msg_rtime_high;
+       unsigned int msg_rtime;
+       unsigned int msg_ctime_high;
+       unsigned int msg_ctime;
        compat_ulong_t msg_cbytes;
        compat_ulong_t msg_qnum;
        compat_ulong_t msg_qbytes;
@@ -223,12 +223,12 @@ struct compat_msqid64_ds {
 
 struct compat_shmid64_ds {
        struct compat_ipc64_perm shm_perm;
-       unsigned int __unused1;
-       compat_time_t shm_atime;
-       unsigned int __unused2;
-       compat_time_t shm_dtime;
-       unsigned int __unused3;
-       compat_time_t shm_ctime;
+       unsigned int shm_atime_high;
+       unsigned int shm_atime;
+       unsigned int shm_dtime_high;
+       unsigned int shm_dtime;
+       unsigned int shm_ctime_high;
+       unsigned int shm_ctime;
        unsigned int __unused4;
        compat_size_t shm_segsz;
        compat_pid_t shm_cpid;
diff --git a/arch/parisc/include/uapi/asm/msgbuf.h 
b/arch/parisc/include/uapi/asm/msgbuf.h
index 342138983914..8f60abe9f2de 100644
--- a/arch/parisc/include/uapi/asm/msgbuf.h
+++ b/arch/parisc/include/uapi/asm/msgbuf.h
@@ -15,25 +15,25 @@
 
 struct msqid64_ds {
        struct ipc64_perm msg_perm;
-#if __BITS_PER_LONG != 64
-       unsigned int   __pad1;
-#endif
+#if __BITS_PER_LONG == 64
        __kernel_time_t msg_stime;      /* last msgsnd time */
-#if __BITS_PER_LONG != 64
-       unsigned int   __pad2;
-#endif
        __kernel_time_t msg_rtime;      /* last msgrcv time */
-#if __BITS_PER_LONG != 64
-       unsigned int   __pad3;
-#endif
        __kernel_time_t msg_ctime;      /* last change time */
-       unsigned int  msg_cbytes;       /* current number of bytes on queue */
-       unsigned int  msg_qnum; /* number of messages in queue */
-       unsigned int  msg_qbytes;       /* max number of bytes on queue */
-       __kernel_pid_t msg_lspid;       /* pid of last msgsnd */
-       __kernel_pid_t msg_lrpid;       /* last receive pid */
-       unsigned int  __unused1;
-       unsigned int  __unused2;
+#else
+       unsigned long   msg_stime_high;
+       unsigned long   msg_stime;      /* last msgsnd time */
+       unsigned long   msg_rtime_high;
+       unsigned long   msg_rtime;      /* last msgrcv time */
+       unsigned long   msg_ctime_high;
+       unsigned long   msg_ctime;      /* last change time */
+#endif
+       unsigned int    msg_cbytes;     /* current number of bytes on queue */
+       unsigned int    msg_qnum;       /* number of messages in queue */
+       unsigned int    msg_qbytes;     /* max number of bytes on queue */
+       __kernel_pid_t  msg_lspid;      /* pid of last msgsnd */
+       __kernel_pid_t  msg_lrpid;      /* last receive pid */
+       unsigned int    __unused1;
+       unsigned int    __unused2;
 };
 
 #endif /* _PARISC_MSGBUF_H */
diff --git a/arch/parisc/include/uapi/asm/sembuf.h 
b/arch/parisc/include/uapi/asm/sembuf.h
index f01d89e30d73..2a02cd19b74a 100644
--- a/arch/parisc/include/uapi/asm/sembuf.h
+++ b/arch/parisc/include/uapi/asm/sembuf.h
@@ -15,14 +15,15 @@
 
 struct semid64_ds {
        struct ipc64_perm sem_perm;             /* permissions .. see ipc.h */
-#if __BITS_PER_LONG != 64
-       unsigned int    __pad1;
-#endif
+#if __BITS_PER_LONG == 64
        __kernel_time_t sem_otime;              /* last semop time */
-#if __BITS_PER_LONG != 64
-       unsigned int    __pad2;
-#endif
        __kernel_time_t sem_ctime;              /* last change time */
+#else
+       unsigned long   sem_otime_high;
+       unsigned long   sem_otime;              /* last semop time */
+       unsigned long   sem_ctime_high;
+       unsigned long   sem_ctime;              /* last change time */
+#endif
        unsigned int    sem_nsems;              /* no. of semaphores in array */
        unsigned int    __unused1;
        unsigned int    __unused2;
diff --git a/arch/parisc/include/uapi/asm/shmbuf.h 
b/arch/parisc/include/uapi/asm/shmbuf.h
index 8496c38560c6..edc2553b00e8 100644
--- a/arch/parisc/include/uapi/asm/shmbuf.h
+++ b/arch/parisc/include/uapi/asm/shmbuf.h
@@ -15,19 +15,17 @@
 
 struct shmid64_ds {
        struct ipc64_perm       shm_perm;       /* operation perms */
-#if __BITS_PER_LONG != 64
-       unsigned int            __pad1;
-#endif
+#if __BITS_PER_LONG == 64
        __kernel_time_t         shm_atime;      /* last attach time */
-#if __BITS_PER_LONG != 64
-       unsigned int            __pad2;
-#endif
        __kernel_time_t         shm_dtime;      /* last detach time */
-#if __BITS_PER_LONG != 64
-       unsigned int            __pad3;
-#endif
        __kernel_time_t         shm_ctime;      /* last change time */
-#if __BITS_PER_LONG != 64
+#else
+       unsigned long           shm_atime_high;
+       unsigned long           shm_atime;      /* last attach time */
+       unsigned long           shm_dtime_high;
+       unsigned long           shm_dtime;      /* last detach time */
+       unsigned long           shm_ctime_high;
+       unsigned long           shm_ctime;      /* last change time */
        unsigned int            __pad4;
 #endif
        size_t                  shm_segsz;      /* size of segment (bytes) */
-- 
2.1.0.rc2

--
To unsubscribe from this list: send the line "unsubscribe linux-api" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to