lkml.org 
[lkml]   [2018]   [Apr]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 08/16] y2038: parisc: Extend sysvipc data structures
    Date
    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 | 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 0cdfec8857bd..ab8a54771507 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
    \
     
     \ /
      Last update: 2018-04-25 17:14    [W:2.817 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site