]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
y2038: parisc: Extend sysvipc data structures
authorArnd Bergmann <arnd@arndb.de>
Tue, 5 May 2015 21:19:43 +0000 (23:19 +0200)
committerArnd Bergmann <arnd@arndb.de>
Fri, 20 Apr 2018 14:20:07 +0000 (16:20 +0200)
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 <arnd@arndb.de>
arch/parisc/include/asm/compat.h
arch/parisc/include/uapi/asm/msgbuf.h
arch/parisc/include/uapi/asm/sembuf.h
arch/parisc/include/uapi/asm/shmbuf.h

index 0cdfec8857bd9144678e3c1af537c8a1b82ad3f3..ab8a54771507a1f0f7a42b66a6754b24fbe54744 100644 (file)
@@ -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;
index b48b810e626b7be14b77457e5a6fa71070c5e0fb..6a2e9ab2ef8d44a7de33c2d63b40b76075cc343d 100644 (file)
  * 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 */
index 746c5d86a9b1588814a0ed64a50762a10c243396..3c31163b1241d88194f97ef41bd33d1f8bd50473 100644 (file)
  * 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;
 };
index cd4dbce55d0be0143366063a1d598c8166d47d5c..c89b3dd8db21b229abb425256387ee7534763f0d 100644 (file)
  * 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) */