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 <a...@arndb.de>
---
 arch/parisc/include/asm/compat.h      | 32 ++++++++++++++++----------------
 arch/parisc/include/uapi/asm/msgbuf.h | 33 ++++++++++++++++-----------------
 arch/parisc/include/uapi/asm/sembuf.h | 16 ++++++++--------
 arch/parisc/include/uapi/asm/shmbuf.h | 19 ++++++++-----------
 4 files changed, 48 insertions(+), 52 deletions(-)

diff --git a/arch/parisc/include/asm/compat.h b/arch/parisc/include/asm/compat.h
index 6f256e7b95e3..e9b391ea1dfc 100644
--- a/arch/parisc/include/asm/compat.h
+++ b/arch/parisc/include/asm/compat.h
@@ -138,10 +138,10 @@ struct compat_ipc64_perm {
 
 struct compat_semid64_ds {
        struct compat_ipc64_perm sem_perm;
-       unsigned int __unused1;
-       compat_time_t sem_otime;
-       unsigned int __unused2;
-       compat_time_t sem_ctime;
+       unsigned int sem_otime_high;
+       unsigned int sem_otime;
+       unsigned int sem_ctime_high;
+       unsigned int sem_ctime;
        compat_ulong_t sem_nsems;
        compat_ulong_t __unused3;
        compat_ulong_t __unused4;
@@ -149,12 +149,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;
@@ -166,12 +166,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 b48b810e626b..6a2e9ab2ef8d 100644
--- a/arch/parisc/include/uapi/asm/msgbuf.h
+++ b/arch/parisc/include/uapi/asm/msgbuf.h
@@ -10,31 +10,30 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  */
 
 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 long msg_cbytes;       /* current number of bytes on queue */
-       unsigned long msg_qnum;         /* number of messages in queue */
-       unsigned long 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 long __unused1;
-       unsigned long __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 long   msg_cbytes;     /* current number of bytes on queue */
+       unsigned long   msg_qnum;       /* number of messages in queue */
+       unsigned long   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 long   __unused1;
+       unsigned long   __unused2;
 };
 
 #endif /* _PARISC_MSGBUF_H */
diff --git a/arch/parisc/include/uapi/asm/sembuf.h 
b/arch/parisc/include/uapi/asm/sembuf.h
index 746c5d86a9b1..3c31163b1241 100644
--- a/arch/parisc/include/uapi/asm/sembuf.h
+++ b/arch/parisc/include/uapi/asm/sembuf.h
@@ -10,21 +10,21 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  */
 
 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 */
-       unsigned long   sem_nsems;              /* no. of semaphores in array */
+#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 long   sem_nsems;              /* no. of semaphores in array */
        unsigned long   __unused1;
        unsigned long   __unused2;
 };
diff --git a/arch/parisc/include/uapi/asm/shmbuf.h 
b/arch/parisc/include/uapi/asm/shmbuf.h
index cd4dbce55d0b..c89b3dd8db21 100644
--- a/arch/parisc/include/uapi/asm/shmbuf.h
+++ b/arch/parisc/include/uapi/asm/shmbuf.h
@@ -10,25 +10,22 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  */
 
 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
        __kernel_size_t         shm_segsz;      /* size of segment (bytes) */
-- 
2.9.0

Reply via email to