y2038: sparc: 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:10 +0000 (16:20 +0200)
sparc, 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, sparc 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/sparc/include/asm/compat.h
arch/sparc/include/uapi/asm/msgbuf.h
arch/sparc/include/uapi/asm/sembuf.h
arch/sparc/include/uapi/asm/shmbuf.h

index 1910c44..4eb51d2 100644 (file)
@@ -192,10 +192,10 @@ struct compat_ipc64_perm {
 
 struct compat_semid64_ds {
        struct compat_ipc64_perm sem_perm;
-       unsigned int    __pad1;
-       compat_time_t   sem_otime;
-       unsigned int    __pad2;
-       compat_time_t   sem_ctime;
+       unsigned int    sem_otime_high;
+       unsigned int    sem_otime;
+       unsigned int    sem_ctime_high;
+       unsigned int    sem_ctime;
        u32             sem_nsems;
        u32             __unused1;
        u32             __unused2;
@@ -203,12 +203,12 @@ struct compat_semid64_ds {
 
 struct compat_msqid64_ds {
        struct compat_ipc64_perm msg_perm;
-       unsigned int    __pad1;
-       compat_time_t   msg_stime;
-       unsigned int    __pad2;
-       compat_time_t   msg_rtime;
-       unsigned int    __pad3;
-       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;
        unsigned int    msg_cbytes;
        unsigned int    msg_qnum;
        unsigned int    msg_qbytes;
@@ -220,12 +220,12 @@ struct compat_msqid64_ds {
 
 struct compat_shmid64_ds {
        struct compat_ipc64_perm shm_perm;
-       unsigned int    __pad1;
-       compat_time_t   shm_atime;
-       unsigned int    __pad2;
-       compat_time_t   shm_dtime;
-       unsigned int    __pad3;
-       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;
        compat_size_t   shm_segsz;
        compat_pid_t    shm_cpid;
        compat_pid_t    shm_lpid;
index b601c4f..ffc46c2 100644 (file)
@@ -8,25 +8,22 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  */
-
-#if defined(__sparc__) && defined(__arch64__)
-# define PADDING(x)
-#else
-# define PADDING(x) unsigned int x;
-#endif
-
-
 struct msqid64_ds {
        struct ipc64_perm msg_perm;
-       PADDING(__pad1)
+#if defined(__sparc__) && defined(__arch64__)
        __kernel_time_t msg_stime;      /* last msgsnd time */
-       PADDING(__pad2)
        __kernel_time_t msg_rtime;      /* last msgrcv time */
-       PADDING(__pad3)
        __kernel_time_t msg_ctime;      /* last change time */
+#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 */
@@ -35,5 +32,4 @@ struct msqid64_ds {
        unsigned long  __unused1;
        unsigned long  __unused2;
 };
-#undef PADDING
 #endif /* _SPARC_MSGBUF_H */
index f49b0ff..f3d309c 100644 (file)
@@ -8,25 +8,23 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  */
-#if defined(__sparc__) && defined(__arch64__)
-# define PADDING(x)
-#else
-# define PADDING(x) unsigned int x;
-#endif
 
 struct semid64_ds {
        struct ipc64_perm sem_perm;             /* permissions .. see ipc.h */
-       PADDING(__pad1)
+#if defined(__sparc__) && defined(__arch64__)
        __kernel_time_t sem_otime;              /* last semop time */
-       PADDING(__pad2)
        __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 long   sem_nsems;              /* no. of semaphores in array */
        unsigned long   __unused1;
        unsigned long   __unused2;
 };
-#undef PADDING
 
 #endif /* _SPARC64_SEMBUF_H */
index 286631d..06618b8 100644 (file)
@@ -8,24 +8,23 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  */
 
-#if defined(__sparc__) && defined(__arch64__)
-# define PADDING(x)
-#else
-# define PADDING(x) unsigned int x;
-#endif
-
 struct shmid64_ds {
        struct ipc64_perm       shm_perm;       /* operation perms */
-       PADDING(__pad1)
+#if defined(__sparc__) && defined(__arch64__)
        __kernel_time_t         shm_atime;      /* last attach time */
-       PADDING(__pad2)
        __kernel_time_t         shm_dtime;      /* last detach time */
-       PADDING(__pad3)
        __kernel_time_t         shm_ctime;      /* last change time */
+#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 */
+#endif
        size_t                  shm_segsz;      /* size of segment (bytes) */
        __kernel_pid_t          shm_cpid;       /* pid of creator */
        __kernel_pid_t          shm_lpid;       /* pid of last operator */
@@ -46,6 +45,4 @@ struct shminfo64 {
        unsigned long   __unused4;
 };
 
-#undef PADDING
-
 #endif /* _SPARC_SHMBUF_H */