Commit ba252f16 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'timers-2038-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull time/Y2038 updates from Thomas Gleixner:

 - Consolidate SySV IPC UAPI headers

 - Convert SySV IPC to the new COMPAT_32BIT_TIME mechanism

 - Cleanup the core interfaces and standardize on the ktime_get_* naming
   convention.

 - Convert the X86 platform ops to timespec64

 - Remove the ugly temporary timespec64 hack

* 'timers-2038-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (22 commits)
  x86: Convert x86_platform_ops to timespec64
  timekeeping: Add more coarse clocktai/boottime interfaces
  timekeeping: Add ktime_get_coarse_with_offset
  timekeeping: Standardize on ktime_get_*() naming
  timekeeping: Clean up ktime_get_real_ts64
  timekeeping: Remove timespec64 hack
  y2038: ipc: Redirect ipc(SEMTIMEDOP, ...) to compat_ksys_semtimedop
  y2038: ipc: Enable COMPAT_32BIT_TIME
  y2038: ipc: Use __kernel_timespec
  y2038: ipc: Report long times to user space
  y2038: ipc: Use ktime_get_real_seconds consistently
  y2038: xtensa: Extend sysvipc data structures
  y2038: powerpc: Extend sysvipc data structures
  y2038: sparc: Extend sysvipc data structures
  y2038: parisc: Extend sysvipc data structures
  y2038: mips: Extend sysvipc data structures
  y2038: arm64: Extend sysvipc compat data structures
  y2038: s390: Remove unneeded ipc uapi header files
  y2038: ia64: Remove unneeded ipc uapi header files
  y2038: alpha: Remove unneeded ipc uapi header files
  ...
parents 0bbcce5d e27c4929
...@@ -2,4 +2,8 @@ ...@@ -2,4 +2,8 @@
include include/uapi/asm-generic/Kbuild.asm include include/uapi/asm-generic/Kbuild.asm
generic-y += bpf_perf_event.h generic-y += bpf_perf_event.h
generic-y += ipcbuf.h
generic-y += msgbuf.h
generic-y += poll.h generic-y += poll.h
generic-y += sembuf.h
generic-y += shmbuf.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#include <asm-generic/ipcbuf.h>
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ALPHA_MSGBUF_H
#define _ALPHA_MSGBUF_H
/*
* The msqid64_ds structure for alpha architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 2 miscellaneous 64-bit values
*/
struct msqid64_ds {
struct ipc64_perm msg_perm;
__kernel_time_t msg_stime; /* last msgsnd time */
__kernel_time_t msg_rtime; /* last msgrcv time */
__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;
};
#endif /* _ALPHA_MSGBUF_H */
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ALPHA_SEMBUF_H
#define _ALPHA_SEMBUF_H
/*
* The semid64_ds structure for alpha architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 2 miscellaneous 64-bit values
*/
struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
__kernel_time_t sem_otime; /* last semop time */
__kernel_time_t sem_ctime; /* last change time */
unsigned long sem_nsems; /* no. of semaphores in array */
unsigned long __unused1;
unsigned long __unused2;
};
#endif /* _ALPHA_SEMBUF_H */
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ALPHA_SHMBUF_H
#define _ALPHA_SHMBUF_H
/*
* The shmid64_ds structure for alpha architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 2 miscellaneous 64-bit values
*/
struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
__kernel_time_t shm_dtime; /* last detach time */
__kernel_time_t shm_ctime; /* last change time */
__kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */
unsigned long shm_nattch; /* no. of current attaches */
unsigned long __unused1;
unsigned long __unused2;
};
struct shminfo64 {
unsigned long shmmax;
unsigned long shmmin;
unsigned long shmmni;
unsigned long shmseg;
unsigned long shmall;
unsigned long __unused1;
unsigned long __unused2;
unsigned long __unused3;
unsigned long __unused4;
};
#endif /* _ALPHA_SHMBUF_H */
...@@ -181,10 +181,10 @@ struct compat_ipc64_perm { ...@@ -181,10 +181,10 @@ struct compat_ipc64_perm {
struct compat_semid64_ds { struct compat_semid64_ds {
struct compat_ipc64_perm sem_perm; struct compat_ipc64_perm sem_perm;
compat_time_t sem_otime; compat_ulong_t sem_otime;
compat_ulong_t __unused1; compat_ulong_t sem_otime_high;
compat_time_t sem_ctime; compat_ulong_t sem_ctime;
compat_ulong_t __unused2; compat_ulong_t sem_ctime_high;
compat_ulong_t sem_nsems; compat_ulong_t sem_nsems;
compat_ulong_t __unused3; compat_ulong_t __unused3;
compat_ulong_t __unused4; compat_ulong_t __unused4;
...@@ -192,12 +192,12 @@ struct compat_semid64_ds { ...@@ -192,12 +192,12 @@ struct compat_semid64_ds {
struct compat_msqid64_ds { struct compat_msqid64_ds {
struct compat_ipc64_perm msg_perm; struct compat_ipc64_perm msg_perm;
compat_time_t msg_stime; compat_ulong_t msg_stime;
compat_ulong_t __unused1; compat_ulong_t msg_stime_high;
compat_time_t msg_rtime; compat_ulong_t msg_rtime;
compat_ulong_t __unused2; compat_ulong_t msg_rtime_high;
compat_time_t msg_ctime; compat_ulong_t msg_ctime;
compat_ulong_t __unused3; compat_ulong_t msg_ctime_high;
compat_ulong_t msg_cbytes; compat_ulong_t msg_cbytes;
compat_ulong_t msg_qnum; compat_ulong_t msg_qnum;
compat_ulong_t msg_qbytes; compat_ulong_t msg_qbytes;
...@@ -210,12 +210,12 @@ struct compat_msqid64_ds { ...@@ -210,12 +210,12 @@ struct compat_msqid64_ds {
struct compat_shmid64_ds { struct compat_shmid64_ds {
struct compat_ipc64_perm shm_perm; struct compat_ipc64_perm shm_perm;
compat_size_t shm_segsz; compat_size_t shm_segsz;
compat_time_t shm_atime; compat_ulong_t shm_atime;
compat_ulong_t __unused1; compat_ulong_t shm_atime_high;
compat_time_t shm_dtime; compat_ulong_t shm_dtime;
compat_ulong_t __unused2; compat_ulong_t shm_dtime_high;
compat_time_t shm_ctime; compat_ulong_t shm_ctime;
compat_ulong_t __unused3; compat_ulong_t shm_ctime_high;
compat_pid_t shm_cpid; compat_pid_t shm_cpid;
compat_pid_t shm_lpid; compat_pid_t shm_lpid;
compat_ulong_t shm_nattch; compat_ulong_t shm_nattch;
......
...@@ -2,5 +2,9 @@ ...@@ -2,5 +2,9 @@
include include/uapi/asm-generic/Kbuild.asm include include/uapi/asm-generic/Kbuild.asm
generic-y += bpf_perf_event.h generic-y += bpf_perf_event.h
generic-y += ipcbuf.h
generic-y += kvm_para.h generic-y += kvm_para.h
generic-y += msgbuf.h
generic-y += poll.h generic-y += poll.h
generic-y += sembuf.h
generic-y += shmbuf.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#include <asm-generic/ipcbuf.h>
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_IA64_MSGBUF_H
#define _ASM_IA64_MSGBUF_H
/*
* The msqid64_ds structure for IA-64 architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 2 miscellaneous 64-bit values
*/
struct msqid64_ds {
struct ipc64_perm msg_perm;
__kernel_time_t msg_stime; /* last msgsnd time */
__kernel_time_t msg_rtime; /* last msgrcv time */
__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;
};
#endif /* _ASM_IA64_MSGBUF_H */
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_IA64_SEMBUF_H
#define _ASM_IA64_SEMBUF_H
/*
* The semid64_ds structure for IA-64 architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 2 miscellaneous 64-bit values
*/
struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
__kernel_time_t sem_otime; /* last semop time */
__kernel_time_t sem_ctime; /* last change time */
unsigned long sem_nsems; /* no. of semaphores in array */
unsigned long __unused1;
unsigned long __unused2;
};
#endif /* _ASM_IA64_SEMBUF_H */
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_IA64_SHMBUF_H
#define _ASM_IA64_SHMBUF_H
/*
* The shmid64_ds structure for IA-64 architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 2 miscellaneous 64-bit values
*/
struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
__kernel_time_t shm_dtime; /* last detach time */
__kernel_time_t shm_ctime; /* last change time */
__kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */
unsigned long shm_nattch; /* no. of current attaches */
unsigned long __unused1;
unsigned long __unused2;
};
struct shminfo64 {
unsigned long shmmax;
unsigned long shmmin;
unsigned long shmmni;
unsigned long shmseg;
unsigned long shmall;
unsigned long __unused1;
unsigned long __unused2;
unsigned long __unused3;
unsigned long __unused4;
};
#endif /* _ASM_IA64_SHMBUF_H */
...@@ -37,9 +37,11 @@ typedef struct { ...@@ -37,9 +37,11 @@ typedef struct {
typedef s32 compat_timer_t; typedef s32 compat_timer_t;
typedef s32 compat_key_t; typedef s32 compat_key_t;
typedef s16 compat_short_t;
typedef s32 compat_int_t; typedef s32 compat_int_t;
typedef s32 compat_long_t; typedef s32 compat_long_t;
typedef s64 compat_s64; typedef s64 compat_s64;
typedef u16 compat_ushort_t;
typedef u32 compat_uint_t; typedef u32 compat_uint_t;
typedef u32 compat_ulong_t; typedef u32 compat_ulong_t;
typedef u64 compat_u64; typedef u64 compat_u64;
...@@ -157,35 +159,35 @@ struct compat_ipc64_perm { ...@@ -157,35 +159,35 @@ struct compat_ipc64_perm {
struct compat_semid64_ds { struct compat_semid64_ds {
struct compat_ipc64_perm sem_perm; struct compat_ipc64_perm sem_perm;
compat_time_t sem_otime; compat_ulong_t sem_otime;
compat_time_t sem_ctime; compat_ulong_t sem_ctime;
compat_ulong_t sem_nsems; compat_ulong_t sem_nsems;
compat_ulong_t __unused1; compat_ulong_t sem_otime_high;
compat_ulong_t __unused2; compat_ulong_t sem_ctime_high;
}; };
struct compat_msqid64_ds { struct compat_msqid64_ds {
struct compat_ipc64_perm msg_perm; struct compat_ipc64_perm msg_perm;
#ifndef CONFIG_CPU_LITTLE_ENDIAN #ifndef CONFIG_CPU_LITTLE_ENDIAN
compat_ulong_t __unused1; compat_ulong_t msg_stime_high;
#endif #endif
compat_time_t msg_stime; compat_ulong_t msg_stime;
#ifdef CONFIG_CPU_LITTLE_ENDIAN #ifdef CONFIG_CPU_LITTLE_ENDIAN
compat_ulong_t __unused1; compat_ulong_t msg_stime_high;
#endif #endif
#ifndef CONFIG_CPU_LITTLE_ENDIAN #ifndef CONFIG_CPU_LITTLE_ENDIAN
compat_ulong_t __unused2; compat_ulong_t msg_rtime_high;
#endif #endif
compat_time_t msg_rtime; compat_ulong_t msg_rtime;
#ifdef CONFIG_CPU_LITTLE_ENDIAN #ifdef CONFIG_CPU_LITTLE_ENDIAN
compat_ulong_t __unused2; compat_ulong_t msg_rtime_high;
#endif #endif
#ifndef CONFIG_CPU_LITTLE_ENDIAN #ifndef CONFIG_CPU_LITTLE_ENDIAN
compat_ulong_t __unused3; compat_ulong_t msg_ctime_high;
#endif #endif
compat_time_t msg_ctime; compat_ulong_t msg_ctime;
#ifdef CONFIG_CPU_LITTLE_ENDIAN #ifdef CONFIG_CPU_LITTLE_ENDIAN
compat_ulong_t __unused3; compat_ulong_t msg_ctime_high;
#endif #endif
compat_ulong_t msg_cbytes; compat_ulong_t msg_cbytes;
compat_ulong_t msg_qnum; compat_ulong_t msg_qnum;
...@@ -199,14 +201,16 @@ struct compat_msqid64_ds { ...@@ -199,14 +201,16 @@ struct compat_msqid64_ds {
struct compat_shmid64_ds { struct compat_shmid64_ds {
struct compat_ipc64_perm shm_perm; struct compat_ipc64_perm shm_perm;
compat_size_t shm_segsz; compat_size_t shm_segsz;
compat_time_t shm_atime; compat_ulong_t shm_atime;
compat_time_t shm_dtime; compat_ulong_t shm_dtime;
compat_time_t shm_ctime; compat_ulong_t shm_ctime;
compat_pid_t shm_cpid; compat_pid_t shm_cpid;
compat_pid_t shm_lpid; compat_pid_t shm_lpid;
compat_ulong_t shm_nattch; compat_ulong_t shm_nattch;
compat_ulong_t __unused1; compat_ushort_t shm_atime_high;
compat_ulong_t __unused2; compat_ushort_t shm_dtime_high;
compat_ushort_t shm_ctime_high;
compat_ushort_t __unused2;
}; };
/* MIPS has unusual order of fields in stack_t */ /* MIPS has unusual order of fields in stack_t */
......
...@@ -9,33 +9,15 @@ ...@@ -9,33 +9,15 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - extension of time_t to 64-bit on 32-bitsystem to solve the y2038 problem
* - 2 miscellaneous unsigned long values * - 2 miscellaneous unsigned long values
*/ */
#if defined(__mips64)
struct msqid64_ds { struct msqid64_ds {
struct ipc64_perm msg_perm; struct ipc64_perm msg_perm;
#if !defined(__mips64) && defined(__MIPSEB__)
unsigned long __unused1;
#endif
__kernel_time_t msg_stime; /* last msgsnd time */ __kernel_time_t msg_stime; /* last msgsnd time */
#if !defined(__mips64) && defined(__MIPSEL__)
unsigned long __unused1;
#endif
#if !defined(__mips64) && defined(__MIPSEB__)
unsigned long __unused2;
#endif
__kernel_time_t msg_rtime; /* last msgrcv time */ __kernel_time_t msg_rtime; /* last msgrcv time */
#if !defined(__mips64) && defined(__MIPSEL__)
unsigned long __unused2;
#endif
#if !defined(__mips64) && defined(__MIPSEB__)
unsigned long __unused3;
#endif
__kernel_time_t msg_ctime; /* last change time */ __kernel_time_t msg_ctime; /* last change time */
#if !defined(__mips64) && defined(__MIPSEL__)
unsigned long __unused3;
#endif
unsigned long msg_cbytes; /* current number of bytes on queue */ unsigned long msg_cbytes; /* current number of bytes on queue */
unsigned long msg_qnum; /* number of messages in queue */ unsigned long msg_qnum; /* number of messages in queue */
unsigned long msg_qbytes; /* max number of bytes on queue */ unsigned long msg_qbytes; /* max number of bytes on queue */
...@@ -44,5 +26,42 @@ struct msqid64_ds { ...@@ -44,5 +26,42 @@ struct msqid64_ds {
unsigned long __unused4; unsigned long __unused4;
unsigned long __unused5; unsigned long __unused5;
}; };
#elif defined (__MIPSEB__)
struct msqid64_ds {
struct ipc64_perm msg_perm;
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 */
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 __unused4;
unsigned long __unused5;
};
#elif defined (__MIPSEL__)
struct msqid64_ds {
struct ipc64_perm msg_perm;
unsigned long msg_stime; /* last msgsnd time */
unsigned long msg_stime_high;
unsigned long msg_rtime; /* last msgrcv time */
unsigned long msg_rtime_high;
unsigned long msg_ctime; /* last change time */
unsigned long msg_ctime_high;
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 __unused4;
unsigned long __unused5;
};
#else
#warning no endianess set
#endif
#endif /* _ASM_MSGBUF_H */ #endif /* _ASM_MSGBUF_H */
...@@ -7,10 +7,11 @@ ...@@ -7,10 +7,11 @@
* Note extra padding because this structure is passed back and forth * Note extra padding because this structure is passed back and forth
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for 2 miscellaneous 64-bit values on mips64,
* - 2 miscellaneous 64-bit values * but used for the upper 32 bit of the time values on mips32.
*/ */
#ifdef __mips64
struct semid64_ds { struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
__kernel_time_t sem_otime; /* last semop time */ __kernel_time_t sem_otime; /* last semop time */
...@@ -19,5 +20,15 @@ struct semid64_ds { ...@@ -19,5 +20,15 @@ struct semid64_ds {
unsigned long __unused1; unsigned long __unused1;
unsigned long __unused2; unsigned long __unused2;
}; };
#else
struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
unsigned long sem_otime; /* last semop time */
unsigned long sem_ctime; /* last change time */
unsigned long sem_nsems; /* no. of semaphores in array */
unsigned long sem_otime_high;
unsigned long sem_ctime_high;
};
#endif
#endif /* _ASM_SEMBUF_H */ #endif /* _ASM_SEMBUF_H */
...@@ -7,10 +7,13 @@ ...@@ -7,10 +7,13 @@
* Note extra padding because this structure is passed back and forth * Note extra padding because this structure is passed back and forth
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * As MIPS was lacking proper padding after shm_?time, we use 48 bits
* - 2 miscellaneous 32-bit rsp. 64-bit values * of the padding at the end to store a few additional bits of the time.
* libc implementations need to take care to convert this into a proper
* data structure when moving to 64-bit time_t.
*/ */
#ifdef __mips64
struct shmid64_ds { struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */ struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */ size_t shm_segsz; /* size of segment (bytes) */
...@@ -23,6 +26,22 @@ struct shmid64_ds { ...@@ -23,6 +26,22 @@ struct shmid64_ds {
unsigned long __unused1; unsigned long __unused1;
unsigned long __unused2; unsigned long __unused2;
}; };
#else
struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */
unsigned long shm_atime; /* last attach time */
unsigned long shm_dtime; /* last detach time */
unsigned long shm_ctime; /* last change time */
__kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */
unsigned long shm_nattch; /* no. of current attaches */
unsigned short shm_atime_high;
unsigned short shm_dtime_high;
unsigned short shm_ctime_high;
unsigned short __unused1;
};
#endif
struct shminfo64 { struct shminfo64 {
unsigned long shmmax; unsigned long shmmax;
......
...@@ -138,10 +138,10 @@ struct compat_ipc64_perm { ...@@ -138,10 +138,10 @@ struct compat_ipc64_perm {
struct compat_semid64_ds { struct compat_semid64_ds {
struct compat_ipc64_perm sem_perm; struct compat_ipc64_perm sem_perm;
unsigned int __unused1; unsigned int sem_otime_high;
compat_time_t sem_otime; unsigned int sem_otime;
unsigned int __unused2; unsigned int sem_ctime_high;
compat_time_t sem_ctime; unsigned int sem_ctime;
compat_ulong_t sem_nsems; compat_ulong_t sem_nsems;
compat_ulong_t __unused3; compat_ulong_t __unused3;
compat_ulong_t __unused4; compat_ulong_t __unused4;
...@@ -149,12 +149,12 @@ struct compat_semid64_ds { ...@@ -149,12 +149,12 @@ struct compat_semid64_ds {
struct compat_msqid64_ds { struct compat_msqid64_ds {
struct compat_ipc64_perm msg_perm; struct compat_ipc64_perm msg_perm;
unsigned int __unused1; unsigned int msg_stime_high;
compat_time_t msg_stime; unsigned int msg_stime;
unsigned int __unused2; unsigned int msg_rtime_high;
compat_time_t msg_rtime; unsigned int msg_rtime;
unsigned int __unused3; unsigned int msg_ctime_high;
compat_time_t msg_ctime; unsigned int msg_ctime;
compat_ulong_t msg_cbytes; compat_ulong_t msg_cbytes;
compat_ulong_t msg_qnum; compat_ulong_t msg_qnum;
compat_ulong_t msg_qbytes; compat_ulong_t msg_qbytes;
...@@ -166,12 +166,12 @@ struct compat_msqid64_ds { ...@@ -166,12 +166,12 @@ struct compat_msqid64_ds {
struct compat_shmid64_ds { struct compat_shmid64_ds {
struct compat_ipc64_perm shm_perm; struct compat_ipc64_perm shm_perm;
unsigned int __unused1; unsigned int shm_atime_high;
compat_time_t shm_atime; unsigned int shm_atime;
unsigned int __unused2; unsigned int shm_dtime_high;
compat_time_t shm_dtime; unsigned int shm_dtime;
unsigned int __unused3; unsigned int shm_ctime_high;
compat_time_t shm_ctime; unsigned int shm_ctime;
unsigned int __unused4; unsigned int __unused4;
compat_size_t shm_segsz; compat_size_t shm_segsz;
compat_pid_t shm_cpid; compat_pid_t shm_cpid;
......
...@@ -10,31 +10,30 @@ ...@@ -10,31 +10,30 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
*/ */
struct msqid64_ds { struct msqid64_ds {
struct ipc64_perm msg_perm; struct ipc64_perm msg_perm;
#if __BITS_PER_LONG != 64 #if __BITS_PER_LONG == 64
unsigned int __pad1;
#endif
__kernel_time_t msg_stime; /* last msgsnd time */ __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 */ __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 */ __kernel_time_t msg_ctime; /* last change time */
unsigned long msg_cbytes; /* current number of bytes on queue */ #else
unsigned long msg_qnum; /* number of messages in queue */ unsigned long msg_stime_high;
unsigned long msg_qbytes; /* max number of bytes on queue */ unsigned long msg_stime; /* last msgsnd time */
__kernel_pid_t msg_lspid; /* pid of last msgsnd */ unsigned long msg_rtime_high;
__kernel_pid_t msg_lrpid; /* last receive pid */ unsigned long msg_rtime; /* last msgrcv time */
unsigned long __unused1; unsigned long msg_ctime_high;
unsigned long __unused2; 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 */ #endif /* _PARISC_MSGBUF_H */
...@@ -10,21 +10,21 @@ ...@@ -10,21 +10,21 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
*/ */
struct semid64_ds { struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
#if __BITS_PER_LONG != 64 #if __BITS_PER_LONG == 64
unsigned int __pad1;
#endif
__kernel_time_t sem_otime; /* last semop time */ __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 */ __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 __unused1;
unsigned long __unused2; unsigned long __unused2;
}; };
......
...@@ -10,25 +10,22 @@ ...@@ -10,25 +10,22 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
*/ */
struct shmid64_ds { struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */ struct ipc64_perm shm_perm; /* operation perms */
#if __BITS_PER_LONG != 64 #if __BITS_PER_LONG == 64
unsigned int __pad1;
#endif
__kernel_time_t shm_atime; /* last attach time */ __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 */ __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 */ __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; unsigned int __pad4;
#endif #endif
__kernel_size_t shm_segsz; /* size of segment (bytes) */ __kernel_size_t shm_segsz; /* size of segment (bytes) */
......
...@@ -162,10 +162,10 @@ struct compat_ipc64_perm { ...@@ -162,10 +162,10 @@ struct compat_ipc64_perm {
struct compat_semid64_ds { struct compat_semid64_ds {
struct compat_ipc64_perm sem_perm; struct compat_ipc64_perm sem_perm;
unsigned int __unused1; unsigned int sem_otime_high;
compat_time_t sem_otime; unsigned int sem_otime;
unsigned int __unused2; unsigned int sem_ctime_high;
compat_time_t sem_ctime; unsigned int sem_ctime;
compat_ulong_t sem_nsems; compat_ulong_t sem_nsems;
compat_ulong_t __unused3; compat_ulong_t __unused3;
compat_ulong_t __unused4; compat_ulong_t __unused4;
...@@ -173,12 +173,12 @@ struct compat_semid64_ds { ...@@ -173,12 +173,12 @@ struct compat_semid64_ds {
struct compat_msqid64_ds { struct compat_msqid64_ds {
struct compat_ipc64_perm msg_perm; struct compat_ipc64_perm msg_perm;
unsigned int __unused1; unsigned int msg_stime_high;
compat_time_t msg_stime; unsigned int msg_stime;
unsigned int __unused2; unsigned int msg_rtime_high;
compat_time_t msg_rtime; unsigned int msg_rtime;
unsigned int __unused3; unsigned int msg_ctime_high;
compat_time_t msg_ctime; unsigned int msg_ctime;
compat_ulong_t msg_cbytes; compat_ulong_t msg_cbytes;
compat_ulong_t msg_qnum; compat_ulong_t msg_qnum;
compat_ulong_t msg_qbytes; compat_ulong_t msg_qbytes;
...@@ -190,12 +190,12 @@ struct compat_msqid64_ds { ...@@ -190,12 +190,12 @@ struct compat_msqid64_ds {
struct compat_shmid64_ds { struct compat_shmid64_ds {
struct compat_ipc64_perm shm_perm; struct compat_ipc64_perm shm_perm;
unsigned int __unused1; unsigned int shm_atime_high;
compat_time_t shm_atime; unsigned int shm_atime;
unsigned int __unused2; unsigned int shm_dtime_high;
compat_time_t shm_dtime; unsigned int shm_dtime;
unsigned int __unused3; unsigned int shm_ctime_high;
compat_time_t shm_ctime; unsigned int shm_ctime;
unsigned int __unused4; unsigned int __unused4;
compat_size_t shm_segsz; compat_size_t shm_segsz;
compat_pid_t shm_cpid; compat_pid_t shm_cpid;
......
...@@ -10,18 +10,18 @@ ...@@ -10,18 +10,18 @@
struct msqid64_ds { struct msqid64_ds {
struct ipc64_perm msg_perm; struct ipc64_perm msg_perm;
#ifndef __powerpc64__ #ifdef __powerpc64__
unsigned int __unused1;
#endif
__kernel_time_t msg_stime; /* last msgsnd time */ __kernel_time_t msg_stime; /* last msgsnd time */
#ifndef __powerpc64__
unsigned int __unused2;
#endif
__kernel_time_t msg_rtime; /* last msgrcv time */ __kernel_time_t msg_rtime; /* last msgrcv time */
#ifndef __powerpc64__
unsigned int __unused3;
#endif
__kernel_time_t msg_ctime; /* last change time */ __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_cbytes; /* current number of bytes on queue */
unsigned long msg_qnum; /* number of messages in queue */ unsigned long msg_qnum; /* number of messages in queue */
unsigned long msg_qbytes; /* max number of bytes on queue */ unsigned long msg_qbytes; /* max number of bytes on queue */
......
...@@ -15,20 +15,20 @@ ...@@ -15,20 +15,20 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem * - 2 miscellaneous 32/64-bit values
* - 2 miscellaneous 32-bit values
*/ */
struct semid64_ds { struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
#ifndef __powerpc64__ #ifndef __powerpc64__
unsigned long __unused1; unsigned long sem_otime_high;
#endif unsigned long sem_otime; /* last semop time */
unsigned long sem_ctime_high;
unsigned long sem_ctime; /* last change time */
#else
__kernel_time_t sem_otime; /* last semop time */ __kernel_time_t sem_otime; /* last semop time */
#ifndef __powerpc64__
unsigned long __unused2;
#endif
__kernel_time_t sem_ctime; /* last change time */ __kernel_time_t sem_ctime; /* last change time */
#endif
unsigned long sem_nsems; /* no. of semaphores in array */ unsigned long sem_nsems; /* no. of semaphores in array */
unsigned long __unused3; unsigned long __unused3;
unsigned long __unused4; unsigned long __unused4;
......
...@@ -16,25 +16,22 @@ ...@@ -16,25 +16,22 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
*/ */
struct shmid64_ds { struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */ struct ipc64_perm shm_perm; /* operation perms */
#ifndef __powerpc64__ #ifdef __powerpc64__
unsigned long __unused1;
#endif
__kernel_time_t shm_atime; /* last attach time */ __kernel_time_t shm_atime; /* last attach time */
#ifndef __powerpc64__
unsigned long __unused2;
#endif
__kernel_time_t shm_dtime; /* last detach time */ __kernel_time_t shm_dtime; /* last detach time */
#ifndef __powerpc64__
unsigned long __unused3;
#endif
__kernel_time_t shm_ctime; /* last change time */ __kernel_time_t shm_ctime; /* last change time */
#ifndef __powerpc64__ #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 long __unused4; unsigned long __unused4;
#endif #endif
size_t shm_segsz; /* size of segment (bytes) */ size_t shm_segsz; /* size of segment (bytes) */
......
...@@ -232,10 +232,10 @@ struct compat_ipc64_perm { ...@@ -232,10 +232,10 @@ struct compat_ipc64_perm {
struct compat_semid64_ds { struct compat_semid64_ds {
struct compat_ipc64_perm sem_perm; struct compat_ipc64_perm sem_perm;
compat_time_t sem_otime; compat_ulong_t sem_otime;
compat_ulong_t __pad1; compat_ulong_t sem_otime_high;
compat_time_t sem_ctime; compat_ulong_t sem_ctime;
compat_ulong_t __pad2; compat_ulong_t sem_ctime_high;
compat_ulong_t sem_nsems; compat_ulong_t sem_nsems;
compat_ulong_t __unused1; compat_ulong_t __unused1;
compat_ulong_t __unused2; compat_ulong_t __unused2;
...@@ -243,12 +243,12 @@ struct compat_semid64_ds { ...@@ -243,12 +243,12 @@ struct compat_semid64_ds {
struct compat_msqid64_ds { struct compat_msqid64_ds {
struct compat_ipc64_perm msg_perm; struct compat_ipc64_perm msg_perm;
compat_time_t msg_stime; compat_ulong_t msg_stime;
compat_ulong_t __pad1; compat_ulong_t msg_stime_high;
compat_time_t msg_rtime; compat_ulong_t msg_rtime;
compat_ulong_t __pad2; compat_ulong_t msg_rtime_high;
compat_time_t msg_ctime; compat_ulong_t msg_ctime;
compat_ulong_t __pad3; compat_ulong_t msg_ctime_high;
compat_ulong_t msg_cbytes; compat_ulong_t msg_cbytes;
compat_ulong_t msg_qnum; compat_ulong_t msg_qnum;
compat_ulong_t msg_qbytes; compat_ulong_t msg_qbytes;
...@@ -261,12 +261,12 @@ struct compat_msqid64_ds { ...@@ -261,12 +261,12 @@ struct compat_msqid64_ds {
struct compat_shmid64_ds { struct compat_shmid64_ds {
struct compat_ipc64_perm shm_perm; struct compat_ipc64_perm shm_perm;
compat_size_t shm_segsz; compat_size_t shm_segsz;
compat_time_t shm_atime; compat_ulong_t shm_atime;
compat_ulong_t __pad1; compat_ulong_t shm_atime_high;
compat_time_t shm_dtime; compat_ulong_t shm_dtime;
compat_ulong_t __pad2; compat_ulong_t shm_dtime_high;
compat_time_t shm_ctime; compat_ulong_t shm_ctime;
compat_ulong_t __pad3; compat_ulong_t shm_ctime_high;
compat_pid_t shm_cpid; compat_pid_t shm_cpid;
compat_pid_t shm_lpid; compat_pid_t shm_lpid;
compat_ulong_t shm_nattch; compat_ulong_t shm_nattch;
......
...@@ -9,9 +9,12 @@ generic-y += errno.h ...@@ -9,9 +9,12 @@ generic-y += errno.h
generic-y += fcntl.h generic-y += fcntl.h
generic-y += ioctl.h generic-y += ioctl.h
generic-y += mman.h generic-y += mman.h
generic-y += msgbuf.h
generic-y += param.h generic-y += param.h
generic-y += poll.h generic-y += poll.h
generic-y += resource.h generic-y += resource.h
generic-y += sembuf.h
generic-y += shmbuf.h
generic-y += sockios.h generic-y += sockios.h
generic-y += swab.h generic-y += swab.h
generic-y += termbits.h generic-y += termbits.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _S390_MSGBUF_H
#define _S390_MSGBUF_H
/*
* The msqid64_ds structure for S/390 architecture.
* Note extra padding because this structure is passed back and forth
* 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;
__kernel_time_t msg_stime; /* last msgsnd time */
#ifndef __s390x__
unsigned long __unused1;
#endif /* ! __s390x__ */
__kernel_time_t msg_rtime; /* last msgrcv time */
#ifndef __s390x__
unsigned long __unused2;
#endif /* ! __s390x__ */
__kernel_time_t msg_ctime; /* last change time */
#ifndef __s390x__
unsigned long __unused3;
#endif /* ! __s390x__ */
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 __unused4;
unsigned long __unused5;
};
#endif /* _S390_MSGBUF_H */
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _S390_SEMBUF_H
#define _S390_SEMBUF_H
/*
* The semid64_ds structure for S/390 architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 64-bit time_t to solve y2038 problem (for !__s390x__)
* - 2 miscellaneous 32-bit values
*/
struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
__kernel_time_t sem_otime; /* last semop time */
#ifndef __s390x__
unsigned long __unused1;
#endif /* ! __s390x__ */
__kernel_time_t sem_ctime; /* last change time */
#ifndef __s390x__
unsigned long __unused2;
#endif /* ! __s390x__ */
unsigned long sem_nsems; /* no. of semaphores in array */
unsigned long __unused3;
unsigned long __unused4;
};
#endif /* _S390_SEMBUF_H */
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _S390_SHMBUF_H
#define _S390_SHMBUF_H
/*
* The shmid64_ds structure for S/390 architecture.
* Note extra padding because this structure is passed back and forth
* between kernel and user space.
*
* Pad space is left for:
* - 64-bit time_t to solve y2038 problem (for !__s390x__)
* - 2 miscellaneous 32-bit values
*/
struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
#ifndef __s390x__
unsigned long __unused1;
#endif /* ! __s390x__ */
__kernel_time_t shm_dtime; /* last detach time */
#ifndef __s390x__
unsigned long __unused2;
#endif /* ! __s390x__ */
__kernel_time_t shm_ctime; /* last change time */
#ifndef __s390x__
unsigned long __unused3;
#endif /* ! __s390x__ */
__kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */
unsigned long shm_nattch; /* no. of current attaches */
unsigned long __unused4;
unsigned long __unused5;
};
struct shminfo64 {
unsigned long shmmax;
unsigned long shmmin;
unsigned long shmmni;
unsigned long shmseg;
unsigned long shmall;
unsigned long __unused1;
unsigned long __unused2;
unsigned long __unused3;
unsigned long __unused4;
};
#endif /* _S390_SHMBUF_H */
...@@ -192,10 +192,10 @@ struct compat_ipc64_perm { ...@@ -192,10 +192,10 @@ struct compat_ipc64_perm {
struct compat_semid64_ds { struct compat_semid64_ds {
struct compat_ipc64_perm sem_perm; struct compat_ipc64_perm sem_perm;
unsigned int __pad1; unsigned int sem_otime_high;
compat_time_t sem_otime; unsigned int sem_otime;
unsigned int __pad2; unsigned int sem_ctime_high;
compat_time_t sem_ctime; unsigned int sem_ctime;
u32 sem_nsems; u32 sem_nsems;
u32 __unused1; u32 __unused1;
u32 __unused2; u32 __unused2;
...@@ -203,12 +203,12 @@ struct compat_semid64_ds { ...@@ -203,12 +203,12 @@ struct compat_semid64_ds {
struct compat_msqid64_ds { struct compat_msqid64_ds {
struct compat_ipc64_perm msg_perm; struct compat_ipc64_perm msg_perm;
unsigned int __pad1; unsigned int msg_stime_high;
compat_time_t msg_stime; unsigned int msg_stime;
unsigned int __pad2; unsigned int msg_rtime_high;
compat_time_t msg_rtime; unsigned int msg_rtime;
unsigned int __pad3; unsigned int msg_ctime_high;
compat_time_t msg_ctime; unsigned int msg_ctime;
unsigned int msg_cbytes; unsigned int msg_cbytes;
unsigned int msg_qnum; unsigned int msg_qnum;
unsigned int msg_qbytes; unsigned int msg_qbytes;
...@@ -220,12 +220,12 @@ struct compat_msqid64_ds { ...@@ -220,12 +220,12 @@ struct compat_msqid64_ds {
struct compat_shmid64_ds { struct compat_shmid64_ds {
struct compat_ipc64_perm shm_perm; struct compat_ipc64_perm shm_perm;
unsigned int __pad1; unsigned int shm_atime_high;
compat_time_t shm_atime; unsigned int shm_atime;
unsigned int __pad2; unsigned int shm_dtime_high;
compat_time_t shm_dtime; unsigned int shm_dtime;
unsigned int __pad3; unsigned int shm_ctime_high;
compat_time_t shm_ctime; unsigned int shm_ctime;
compat_size_t shm_segsz; compat_size_t shm_segsz;
compat_pid_t shm_cpid; compat_pid_t shm_cpid;
compat_pid_t shm_lpid; compat_pid_t shm_lpid;
......
...@@ -8,25 +8,22 @@ ...@@ -8,25 +8,22 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 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 msqid64_ds {
struct ipc64_perm msg_perm; struct ipc64_perm msg_perm;
PADDING(__pad1) #if defined(__sparc__) && defined(__arch64__)
__kernel_time_t msg_stime; /* last msgsnd time */ __kernel_time_t msg_stime; /* last msgsnd time */
PADDING(__pad2)
__kernel_time_t msg_rtime; /* last msgrcv time */ __kernel_time_t msg_rtime; /* last msgrcv time */
PADDING(__pad3)
__kernel_time_t msg_ctime; /* last change time */ __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_cbytes; /* current number of bytes on queue */
unsigned long msg_qnum; /* number of messages in queue */ unsigned long msg_qnum; /* number of messages in queue */
unsigned long msg_qbytes; /* max number of bytes on queue */ unsigned long msg_qbytes; /* max number of bytes on queue */
...@@ -35,5 +32,4 @@ struct msqid64_ds { ...@@ -35,5 +32,4 @@ struct msqid64_ds {
unsigned long __unused1; unsigned long __unused1;
unsigned long __unused2; unsigned long __unused2;
}; };
#undef PADDING
#endif /* _SPARC_MSGBUF_H */ #endif /* _SPARC_MSGBUF_H */
...@@ -8,25 +8,23 @@ ...@@ -8,25 +8,23 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 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 semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
PADDING(__pad1) #if defined(__sparc__) && defined(__arch64__)
__kernel_time_t sem_otime; /* last semop time */ __kernel_time_t sem_otime; /* last semop time */
PADDING(__pad2)
__kernel_time_t sem_ctime; /* last change time */ __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 sem_nsems; /* no. of semaphores in array */
unsigned long __unused1; unsigned long __unused1;
unsigned long __unused2; unsigned long __unused2;
}; };
#undef PADDING
#endif /* _SPARC64_SEMBUF_H */ #endif /* _SPARC64_SEMBUF_H */
...@@ -8,24 +8,23 @@ ...@@ -8,24 +8,23 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 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 shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */ struct ipc64_perm shm_perm; /* operation perms */
PADDING(__pad1) #if defined(__sparc__) && defined(__arch64__)
__kernel_time_t shm_atime; /* last attach time */ __kernel_time_t shm_atime; /* last attach time */
PADDING(__pad2)
__kernel_time_t shm_dtime; /* last detach time */ __kernel_time_t shm_dtime; /* last detach time */
PADDING(__pad3)
__kernel_time_t shm_ctime; /* last change time */ __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) */ size_t shm_segsz; /* size of segment (bytes) */
__kernel_pid_t shm_cpid; /* pid of creator */ __kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */ __kernel_pid_t shm_lpid; /* pid of last operator */
...@@ -46,6 +45,4 @@ struct shminfo64 { ...@@ -46,6 +45,4 @@ struct shminfo64 {
unsigned long __unused4; unsigned long __unused4;
}; };
#undef PADDING
#endif /* _SPARC_SHMBUF_H */ #endif /* _SPARC_SHMBUF_H */
...@@ -134,10 +134,10 @@ struct compat_ipc64_perm { ...@@ -134,10 +134,10 @@ struct compat_ipc64_perm {
struct compat_semid64_ds { struct compat_semid64_ds {
struct compat_ipc64_perm sem_perm; struct compat_ipc64_perm sem_perm;
compat_time_t sem_otime; compat_ulong_t sem_otime;
compat_ulong_t __unused1; compat_ulong_t sem_otime_high;
compat_time_t sem_ctime; compat_ulong_t sem_ctime;
compat_ulong_t __unused2; compat_ulong_t sem_ctime_high;
compat_ulong_t sem_nsems; compat_ulong_t sem_nsems;
compat_ulong_t __unused3; compat_ulong_t __unused3;
compat_ulong_t __unused4; compat_ulong_t __unused4;
...@@ -145,12 +145,12 @@ struct compat_semid64_ds { ...@@ -145,12 +145,12 @@ struct compat_semid64_ds {
struct compat_msqid64_ds { struct compat_msqid64_ds {
struct compat_ipc64_perm msg_perm; struct compat_ipc64_perm msg_perm;
compat_time_t msg_stime; compat_ulong_t msg_stime;
compat_ulong_t __unused1; compat_ulong_t msg_stime_high;
compat_time_t msg_rtime; compat_ulong_t msg_rtime;
compat_ulong_t __unused2; compat_ulong_t msg_rtime_high;
compat_time_t msg_ctime; compat_ulong_t msg_ctime;
compat_ulong_t __unused3; compat_ulong_t msg_ctime_high;
compat_ulong_t msg_cbytes; compat_ulong_t msg_cbytes;
compat_ulong_t msg_qnum; compat_ulong_t msg_qnum;
compat_ulong_t msg_qbytes; compat_ulong_t msg_qbytes;
...@@ -163,12 +163,12 @@ struct compat_msqid64_ds { ...@@ -163,12 +163,12 @@ struct compat_msqid64_ds {
struct compat_shmid64_ds { struct compat_shmid64_ds {
struct compat_ipc64_perm shm_perm; struct compat_ipc64_perm shm_perm;
compat_size_t shm_segsz; compat_size_t shm_segsz;
compat_time_t shm_atime; compat_ulong_t shm_atime;
compat_ulong_t __unused1; compat_ulong_t shm_atime_high;
compat_time_t shm_dtime; compat_ulong_t shm_dtime;
compat_ulong_t __unused2; compat_ulong_t shm_dtime_high;
compat_time_t shm_ctime; compat_ulong_t shm_ctime;
compat_ulong_t __unused3; compat_ulong_t shm_ctime_high;
compat_pid_t shm_cpid; compat_pid_t shm_cpid;
compat_pid_t shm_lpid; compat_pid_t shm_lpid;
compat_ulong_t shm_nattch; compat_ulong_t shm_nattch;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
extern unsigned char vrtc_cmos_read(unsigned char reg); extern unsigned char vrtc_cmos_read(unsigned char reg);
extern void vrtc_cmos_write(unsigned char val, unsigned char reg); extern void vrtc_cmos_write(unsigned char val, unsigned char reg);
extern void vrtc_get_time(struct timespec *now); extern void vrtc_get_time(struct timespec64 *now);
extern int vrtc_set_mmss(const struct timespec *now); extern int vrtc_set_mmss(const struct timespec64 *now);
#endif #endif
...@@ -95,8 +95,8 @@ static inline unsigned char current_lock_cmos_reg(void) ...@@ -95,8 +95,8 @@ static inline unsigned char current_lock_cmos_reg(void)
unsigned char rtc_cmos_read(unsigned char addr); unsigned char rtc_cmos_read(unsigned char addr);
void rtc_cmos_write(unsigned char val, unsigned char addr); void rtc_cmos_write(unsigned char val, unsigned char addr);
extern int mach_set_rtc_mmss(const struct timespec *now); extern int mach_set_rtc_mmss(const struct timespec64 *now);
extern void mach_get_cmos_time(struct timespec *now); extern void mach_get_cmos_time(struct timespec64 *now);
#define RTC_IRQ 8 #define RTC_IRQ 8
......
...@@ -12,7 +12,7 @@ void pvclock_set_flags(u8 flags); ...@@ -12,7 +12,7 @@ void pvclock_set_flags(u8 flags);
unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src); unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
void pvclock_read_wallclock(struct pvclock_wall_clock *wall, void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
struct pvclock_vcpu_time_info *vcpu, struct pvclock_vcpu_time_info *vcpu,
struct timespec *ts); struct timespec64 *ts);
void pvclock_resume(void); void pvclock_resume(void);
void pvclock_touch_watchdogs(void); void pvclock_touch_watchdogs(void);
......
...@@ -170,7 +170,7 @@ struct x86_cpuinit_ops { ...@@ -170,7 +170,7 @@ struct x86_cpuinit_ops {
void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node); void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node);
}; };
struct timespec; struct timespec64;
/** /**
* struct x86_legacy_devices - legacy x86 devices * struct x86_legacy_devices - legacy x86 devices
...@@ -264,8 +264,8 @@ struct x86_hyper_runtime { ...@@ -264,8 +264,8 @@ struct x86_hyper_runtime {
struct x86_platform_ops { struct x86_platform_ops {
unsigned long (*calibrate_cpu)(void); unsigned long (*calibrate_cpu)(void);
unsigned long (*calibrate_tsc)(void); unsigned long (*calibrate_tsc)(void);
void (*get_wallclock)(struct timespec *ts); void (*get_wallclock)(struct timespec64 *ts);
int (*set_wallclock)(const struct timespec *ts); int (*set_wallclock)(const struct timespec64 *ts);
void (*iommu_shutdown)(void); void (*iommu_shutdown)(void);
bool (*is_untracked_pat_range)(u64 start, u64 end); bool (*is_untracked_pat_range)(u64 start, u64 end);
void (*nmi_init)(void); void (*nmi_init)(void);
......
...@@ -8,15 +8,24 @@ ...@@ -8,15 +8,24 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
*
* x86_64 and x32 incorrectly added padding here, so the structures
* are still incompatible with the padding on x86.
*/ */
struct semid64_ds { struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
#ifdef __i386__
unsigned long sem_otime; /* last semop time */
unsigned long sem_otime_high;
unsigned long sem_ctime; /* last change time */
unsigned long sem_ctime_high;
#else
__kernel_time_t sem_otime; /* last semop time */ __kernel_time_t sem_otime; /* last semop time */
__kernel_ulong_t __unused1; __kernel_ulong_t __unused1;
__kernel_time_t sem_ctime; /* last change time */ __kernel_time_t sem_ctime; /* last change time */
__kernel_ulong_t __unused2; __kernel_ulong_t __unused2;
#endif
__kernel_ulong_t sem_nsems; /* no. of semaphores in array */ __kernel_ulong_t sem_nsems; /* no. of semaphores in array */
__kernel_ulong_t __unused3; __kernel_ulong_t __unused3;
__kernel_ulong_t __unused4; __kernel_ulong_t __unused4;
......
...@@ -37,7 +37,7 @@ static uint32_t __init jailhouse_detect(void) ...@@ -37,7 +37,7 @@ static uint32_t __init jailhouse_detect(void)
return jailhouse_cpuid_base(); return jailhouse_cpuid_base();
} }
static void jailhouse_get_wallclock(struct timespec *now) static void jailhouse_get_wallclock(struct timespec64 *now)
{ {
memset(now, 0, sizeof(*now)); memset(now, 0, sizeof(*now));
} }
......
...@@ -53,7 +53,7 @@ static struct pvclock_wall_clock *wall_clock; ...@@ -53,7 +53,7 @@ static struct pvclock_wall_clock *wall_clock;
* have elapsed since the hypervisor wrote the data. So we try to account for * have elapsed since the hypervisor wrote the data. So we try to account for
* that with system time * that with system time
*/ */
static void kvm_get_wallclock(struct timespec *now) static void kvm_get_wallclock(struct timespec64 *now)
{ {
struct pvclock_vcpu_time_info *vcpu_time; struct pvclock_vcpu_time_info *vcpu_time;
int low, high; int low, high;
...@@ -72,7 +72,7 @@ static void kvm_get_wallclock(struct timespec *now) ...@@ -72,7 +72,7 @@ static void kvm_get_wallclock(struct timespec *now)
put_cpu(); put_cpu();
} }
static int kvm_set_wallclock(const struct timespec *now) static int kvm_set_wallclock(const struct timespec64 *now)
{ {
return -ENODEV; return -ENODEV;
} }
......
...@@ -123,28 +123,35 @@ u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) ...@@ -123,28 +123,35 @@ u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock, void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
struct pvclock_vcpu_time_info *vcpu_time, struct pvclock_vcpu_time_info *vcpu_time,
struct timespec *ts) struct timespec64 *ts)
{ {
u32 version; u32 version;
u64 delta; u64 delta;
struct timespec now; struct timespec64 now;
/* get wallclock at system boot */ /* get wallclock at system boot */
do { do {
version = wall_clock->version; version = wall_clock->version;
rmb(); /* fetch version before time */ rmb(); /* fetch version before time */
/*
* Note: wall_clock->sec is a u32 value, so it can
* only store dates between 1970 and 2106. To allow
* times beyond that, we need to create a new hypercall
* interface with an extended pvclock_wall_clock structure
* like ARM has.
*/
now.tv_sec = wall_clock->sec; now.tv_sec = wall_clock->sec;
now.tv_nsec = wall_clock->nsec; now.tv_nsec = wall_clock->nsec;
rmb(); /* fetch time before checking version */ rmb(); /* fetch time before checking version */
} while ((wall_clock->version & 1) || (version != wall_clock->version)); } while ((wall_clock->version & 1) || (version != wall_clock->version));
delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */ delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */
delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec; delta += now.tv_sec * NSEC_PER_SEC + now.tv_nsec;
now.tv_nsec = do_div(delta, NSEC_PER_SEC); now.tv_nsec = do_div(delta, NSEC_PER_SEC);
now.tv_sec = delta; now.tv_sec = delta;
set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); set_normalized_timespec64(ts, now.tv_sec, now.tv_nsec);
} }
void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti) void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti)
......
...@@ -39,7 +39,7 @@ EXPORT_SYMBOL(rtc_lock); ...@@ -39,7 +39,7 @@ EXPORT_SYMBOL(rtc_lock);
* jump to the next second precisely 500 ms later. Check the Motorola * jump to the next second precisely 500 ms later. Check the Motorola
* MC146818A or Dallas DS12887 data sheet for details. * MC146818A or Dallas DS12887 data sheet for details.
*/ */
int mach_set_rtc_mmss(const struct timespec *now) int mach_set_rtc_mmss(const struct timespec64 *now)
{ {
unsigned long long nowtime = now->tv_sec; unsigned long long nowtime = now->tv_sec;
struct rtc_time tm; struct rtc_time tm;
...@@ -60,7 +60,7 @@ int mach_set_rtc_mmss(const struct timespec *now) ...@@ -60,7 +60,7 @@ int mach_set_rtc_mmss(const struct timespec *now)
return retval; return retval;
} }
void mach_get_cmos_time(struct timespec *now) void mach_get_cmos_time(struct timespec64 *now)
{ {
unsigned int status, year, mon, day, hour, min, sec, century = 0; unsigned int status, year, mon, day, hour, min, sec, century = 0;
unsigned long flags; unsigned long flags;
...@@ -118,7 +118,7 @@ void mach_get_cmos_time(struct timespec *now) ...@@ -118,7 +118,7 @@ void mach_get_cmos_time(struct timespec *now)
} else } else
year += CMOS_YEARS_OFFS; year += CMOS_YEARS_OFFS;
now->tv_sec = mktime(year, mon, day, hour, min, sec); now->tv_sec = mktime64(year, mon, day, hour, min, sec);
now->tv_nsec = 0; now->tv_nsec = 0;
} }
...@@ -145,13 +145,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr) ...@@ -145,13 +145,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr)
} }
EXPORT_SYMBOL(rtc_cmos_write); EXPORT_SYMBOL(rtc_cmos_write);
int update_persistent_clock(struct timespec now) int update_persistent_clock64(struct timespec64 now)
{ {
return x86_platform.set_wallclock(&now); return x86_platform.set_wallclock(&now);
} }
/* not static: needed by APM */ /* not static: needed by APM */
void read_persistent_clock(struct timespec *ts) void read_persistent_clock64(struct timespec64 *ts)
{ {
x86_platform.get_wallclock(ts); x86_platform.get_wallclock(ts);
} }
......
...@@ -57,7 +57,7 @@ void vrtc_cmos_write(unsigned char val, unsigned char reg) ...@@ -57,7 +57,7 @@ void vrtc_cmos_write(unsigned char val, unsigned char reg)
} }
EXPORT_SYMBOL_GPL(vrtc_cmos_write); EXPORT_SYMBOL_GPL(vrtc_cmos_write);
void vrtc_get_time(struct timespec *now) void vrtc_get_time(struct timespec64 *now)
{ {
u8 sec, min, hour, mday, mon; u8 sec, min, hour, mday, mon;
unsigned long flags; unsigned long flags;
...@@ -83,18 +83,18 @@ void vrtc_get_time(struct timespec *now) ...@@ -83,18 +83,18 @@ void vrtc_get_time(struct timespec *now)
pr_info("vRTC: sec: %d min: %d hour: %d day: %d " pr_info("vRTC: sec: %d min: %d hour: %d day: %d "
"mon: %d year: %d\n", sec, min, hour, mday, mon, year); "mon: %d year: %d\n", sec, min, hour, mday, mon, year);
now->tv_sec = mktime(year, mon, mday, hour, min, sec); now->tv_sec = mktime64(year, mon, mday, hour, min, sec);
now->tv_nsec = 0; now->tv_nsec = 0;
} }
int vrtc_set_mmss(const struct timespec *now) int vrtc_set_mmss(const struct timespec64 *now)
{ {
unsigned long flags; unsigned long flags;
struct rtc_time tm; struct rtc_time tm;
int year; int year;
int retval = 0; int retval = 0;
rtc_time_to_tm(now->tv_sec, &tm); rtc_time64_to_tm(now->tv_sec, &tm);
if (!rtc_valid_tm(&tm) && tm.tm_year >= 72) { if (!rtc_valid_tm(&tm) && tm.tm_year >= 72) {
/* /*
* tm.year is the number of years since 1900, and the * tm.year is the number of years since 1900, and the
...@@ -110,8 +110,8 @@ int vrtc_set_mmss(const struct timespec *now) ...@@ -110,8 +110,8 @@ int vrtc_set_mmss(const struct timespec *now)
vrtc_cmos_write(tm.tm_sec, RTC_SECONDS); vrtc_cmos_write(tm.tm_sec, RTC_SECONDS);
spin_unlock_irqrestore(&rtc_lock, flags); spin_unlock_irqrestore(&rtc_lock, flags);
} else { } else {
pr_err("%s: Invalid vRTC value: write of %lx to vRTC failed\n", pr_err("%s: Invalid vRTC value: write of %llx to vRTC failed\n",
__func__, now->tv_sec); __func__, (s64)now->tv_sec);
retval = -EINVAL; retval = -EINVAL;
} }
return retval; return retval;
......
...@@ -57,7 +57,7 @@ static u64 xen_clocksource_get_cycles(struct clocksource *cs) ...@@ -57,7 +57,7 @@ static u64 xen_clocksource_get_cycles(struct clocksource *cs)
return xen_clocksource_read(); return xen_clocksource_read();
} }
static void xen_read_wallclock(struct timespec *ts) static void xen_read_wallclock(struct timespec64 *ts)
{ {
struct shared_info *s = HYPERVISOR_shared_info; struct shared_info *s = HYPERVISOR_shared_info;
struct pvclock_wall_clock *wall_clock = &(s->wc); struct pvclock_wall_clock *wall_clock = &(s->wc);
...@@ -68,12 +68,12 @@ static void xen_read_wallclock(struct timespec *ts) ...@@ -68,12 +68,12 @@ static void xen_read_wallclock(struct timespec *ts)
put_cpu_var(xen_vcpu); put_cpu_var(xen_vcpu);
} }
static void xen_get_wallclock(struct timespec *now) static void xen_get_wallclock(struct timespec64 *now)
{ {
xen_read_wallclock(now); xen_read_wallclock(now);
} }
static int xen_set_wallclock(const struct timespec *now) static int xen_set_wallclock(const struct timespec64 *now)
{ {
return -ENODEV; return -ENODEV;
} }
...@@ -461,7 +461,7 @@ static void __init xen_time_init(void) ...@@ -461,7 +461,7 @@ static void __init xen_time_init(void)
{ {
struct pvclock_vcpu_time_info *pvti; struct pvclock_vcpu_time_info *pvti;
int cpu = smp_processor_id(); int cpu = smp_processor_id();
struct timespec tp; struct timespec64 tp;
/* As Dom0 is never moved, no penalty on using TSC there */ /* As Dom0 is never moved, no penalty on using TSC there */
if (xen_initial_domain()) if (xen_initial_domain())
...@@ -479,7 +479,7 @@ static void __init xen_time_init(void) ...@@ -479,7 +479,7 @@ static void __init xen_time_init(void)
/* Set initial system time with full resolution */ /* Set initial system time with full resolution */
xen_read_wallclock(&tp); xen_read_wallclock(&tp);
do_settimeofday(&tp); do_settimeofday64(&tp);
setup_force_cpu_cap(X86_FEATURE_TSC); setup_force_cpu_cap(X86_FEATURE_TSC);
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
* *
* This file is subject to the terms and conditions of the GNU General * This file is subject to the terms and conditions of the GNU General
...@@ -21,19 +20,19 @@ ...@@ -21,19 +20,19 @@
struct msqid64_ds { struct msqid64_ds {
struct ipc64_perm msg_perm; struct ipc64_perm msg_perm;
#ifdef __XTENSA_EB__ #ifdef __XTENSA_EB__
unsigned int __unused1; unsigned long msg_stime_high;
__kernel_time_t msg_stime; /* last msgsnd time */ unsigned long msg_stime; /* last msgsnd time */
unsigned int __unused2; unsigned long msg_rtime_high;
__kernel_time_t msg_rtime; /* last msgrcv time */ unsigned long msg_rtime; /* last msgrcv time */
unsigned int __unused3; unsigned long msg_ctime_high;
__kernel_time_t msg_ctime; /* last change time */ unsigned long msg_ctime; /* last change time */
#elif defined(__XTENSA_EL__) #elif defined(__XTENSA_EL__)
__kernel_time_t msg_stime; /* last msgsnd time */ unsigned long msg_stime; /* last msgsnd time */
unsigned int __unused1; unsigned long msg_stime_high;
__kernel_time_t msg_rtime; /* last msgrcv time */ unsigned long msg_rtime; /* last msgrcv time */
unsigned int __unused2; unsigned long msg_rtime_high;
__kernel_time_t msg_ctime; /* last change time */ unsigned long msg_ctime; /* last change time */
unsigned int __unused3; unsigned long msg_ctime_high;
#else #else
# error processor byte order undefined! # error processor byte order undefined!
#endif #endif
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
* between kernel and user space. * between kernel and user space.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
* *
*/ */
...@@ -27,15 +26,15 @@ ...@@ -27,15 +26,15 @@
struct semid64_ds { struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
#ifdef __XTENSA_EL__ #ifdef __XTENSA_EL__
__kernel_time_t sem_otime; /* last semop time */ unsigned long sem_otime; /* last semop time */
unsigned long __unused1; unsigned long sem_otime_high;
__kernel_time_t sem_ctime; /* last change time */ unsigned long sem_ctime; /* last change time */
unsigned long __unused2; unsigned long sem_ctime_high;
#else #else
unsigned long __unused1; unsigned long sem_otime_high;
__kernel_time_t sem_otime; /* last semop time */ unsigned long sem_otime; /* last semop time */
unsigned long __unused2; unsigned long sem_ctime_high;
__kernel_time_t sem_ctime; /* last change time */ unsigned long sem_ctime; /* last change time */
#endif #endif
unsigned long sem_nsems; /* no. of semaphores in array */ unsigned long sem_nsems; /* no. of semaphores in array */
unsigned long __unused3; unsigned long __unused3;
......
...@@ -4,10 +4,10 @@ ...@@ -4,10 +4,10 @@
* *
* The shmid64_ds structure for Xtensa architecture. * The shmid64_ds structure for Xtensa architecture.
* Note extra padding because this structure is passed back and forth * Note extra padding because this structure is passed back and forth
* between kernel and user space. * between kernel and user space, but the padding is on the wrong
* side for big-endian xtensa, for historic reasons.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
* *
* This file is subject to the terms and conditions of the GNU General Public * This file is subject to the terms and conditions of the GNU General Public
...@@ -20,42 +20,21 @@ ...@@ -20,42 +20,21 @@
#ifndef _XTENSA_SHMBUF_H #ifndef _XTENSA_SHMBUF_H
#define _XTENSA_SHMBUF_H #define _XTENSA_SHMBUF_H
#if defined (__XTENSA_EL__)
struct shmid64_ds { struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */ struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */ size_t shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */ unsigned long shm_atime; /* last attach time */
unsigned long __unused1; unsigned long shm_atime_high;
__kernel_time_t shm_dtime; /* last detach time */ unsigned long shm_dtime; /* last detach time */
unsigned long __unused2; unsigned long shm_dtime_high;
__kernel_time_t shm_ctime; /* last change time */ unsigned long shm_ctime; /* last change time */
unsigned long __unused3; unsigned long shm_ctime_high;
__kernel_pid_t shm_cpid; /* pid of creator */ __kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */ __kernel_pid_t shm_lpid; /* pid of last operator */
unsigned long shm_nattch; /* no. of current attaches */ unsigned long shm_nattch; /* no. of current attaches */
unsigned long __unused4; unsigned long __unused4;
unsigned long __unused5; unsigned long __unused5;
}; };
#elif defined (__XTENSA_EB__)
struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
unsigned long __unused1;
__kernel_time_t shm_dtime; /* last detach time */
unsigned long __unused2;
__kernel_time_t shm_ctime; /* last change time */
unsigned long __unused3;
__kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */
unsigned long shm_nattch; /* no. of current attaches */
unsigned long __unused4;
unsigned long __unused5;
};
#else
# error endian order not defined
#endif
struct shminfo64 { struct shminfo64 {
unsigned long shmmax; unsigned long shmmax;
......
...@@ -686,8 +686,8 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info); ...@@ -686,8 +686,8 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info);
/* ipc/mqueue.c */ /* ipc/mqueue.c */
asmlinkage long sys_mq_open(const char __user *name, int oflag, umode_t mode, struct mq_attr __user *attr); asmlinkage long sys_mq_open(const char __user *name, int oflag, umode_t mode, struct mq_attr __user *attr);
asmlinkage long sys_mq_unlink(const char __user *name); asmlinkage long sys_mq_unlink(const char __user *name);
asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec __user *abs_timeout); asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct __kernel_timespec __user *abs_timeout);
asmlinkage long sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct timespec __user *abs_timeout); asmlinkage long sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct __kernel_timespec __user *abs_timeout);
asmlinkage long sys_mq_notify(mqd_t mqdes, const struct sigevent __user *notification); asmlinkage long sys_mq_notify(mqd_t mqdes, const struct sigevent __user *notification);
asmlinkage long sys_mq_getsetattr(mqd_t mqdes, const struct mq_attr __user *mqstat, struct mq_attr __user *omqstat); asmlinkage long sys_mq_getsetattr(mqd_t mqdes, const struct mq_attr __user *mqstat, struct mq_attr __user *omqstat);
...@@ -704,7 +704,7 @@ asmlinkage long sys_semget(key_t key, int nsems, int semflg); ...@@ -704,7 +704,7 @@ asmlinkage long sys_semget(key_t key, int nsems, int semflg);
asmlinkage long sys_semctl(int semid, int semnum, int cmd, unsigned long arg); asmlinkage long sys_semctl(int semid, int semnum, int cmd, unsigned long arg);
asmlinkage long sys_semtimedop(int semid, struct sembuf __user *sops, asmlinkage long sys_semtimedop(int semid, struct sembuf __user *sops,
unsigned nsops, unsigned nsops,
const struct timespec __user *timeout); const struct __kernel_timespec __user *timeout);
asmlinkage long sys_semop(int semid, struct sembuf __user *sops, asmlinkage long sys_semop(int semid, struct sembuf __user *sops,
unsigned nsops); unsigned nsops);
......
...@@ -18,25 +18,14 @@ ...@@ -18,25 +18,14 @@
/* timespec64 is defined as timespec here */ /* timespec64 is defined as timespec here */
static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64) static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64)
{ {
return ts64; return *(const struct timespec *)&ts64;
} }
static inline struct timespec64 timespec_to_timespec64(const struct timespec ts) static inline struct timespec64 timespec_to_timespec64(const struct timespec ts)
{ {
return ts; return *(const struct timespec64 *)&ts;
} }
# define timespec_equal timespec64_equal
# define timespec_compare timespec64_compare
# define set_normalized_timespec set_normalized_timespec64
# define timespec_add timespec64_add
# define timespec_sub timespec64_sub
# define timespec_valid timespec64_valid
# define timespec_valid_strict timespec64_valid_strict
# define timespec_to_ns timespec64_to_ns
# define ns_to_timespec ns_to_timespec64
# define timespec_add_ns timespec64_add_ns
#else #else
static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64) static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64)
{ {
...@@ -55,6 +44,7 @@ static inline struct timespec64 timespec_to_timespec64(const struct timespec ts) ...@@ -55,6 +44,7 @@ static inline struct timespec64 timespec_to_timespec64(const struct timespec ts)
ret.tv_nsec = ts.tv_nsec; ret.tv_nsec = ts.tv_nsec;
return ret; return ret;
} }
#endif
static inline int timespec_equal(const struct timespec *a, static inline int timespec_equal(const struct timespec *a,
const struct timespec *b) const struct timespec *b)
...@@ -159,8 +149,6 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) ...@@ -159,8 +149,6 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
a->tv_nsec = ns; a->tv_nsec = ns;
} }
#endif
/** /**
* time_to_tm - converts the calendar time to local broken-down time * time_to_tm - converts the calendar time to local broken-down time
* *
......
...@@ -16,11 +16,6 @@ typedef __u64 timeu64_t; ...@@ -16,11 +16,6 @@ typedef __u64 timeu64_t;
#include <uapi/linux/time.h> #include <uapi/linux/time.h>
#if __BITS_PER_LONG == 64
/* this trick allows us to optimize out timespec64_to_timespec */
# define timespec64 timespec
#define itimerspec64 itimerspec
#else
struct timespec64 { struct timespec64 {
time64_t tv_sec; /* seconds */ time64_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */ long tv_nsec; /* nanoseconds */
...@@ -31,8 +26,6 @@ struct itimerspec64 { ...@@ -31,8 +26,6 @@ struct itimerspec64 {
struct timespec64 it_value; struct timespec64 it_value;
}; };
#endif
/* Parameters used to convert the timespec values: */ /* Parameters used to convert the timespec values: */
#define MSEC_PER_SEC 1000L #define MSEC_PER_SEC 1000L
#define USEC_PER_MSEC 1000L #define USEC_PER_MSEC 1000L
......
...@@ -19,27 +19,25 @@ extern void xtime_update(unsigned long ticks); ...@@ -19,27 +19,25 @@ extern void xtime_update(unsigned long ticks);
extern int do_settimeofday64(const struct timespec64 *ts); extern int do_settimeofday64(const struct timespec64 *ts);
extern int do_sys_settimeofday64(const struct timespec64 *tv, extern int do_sys_settimeofday64(const struct timespec64 *tv,
const struct timezone *tz); const struct timezone *tz);
/*
* Kernel time accessors
*/
struct timespec64 current_kernel_time64(void);
/* /*
* timespec64 based interfaces * timespec64 based interfaces
*/ */
struct timespec64 get_monotonic_coarse64(void); extern void ktime_get_raw_ts64(struct timespec64 *ts);
extern void getrawmonotonic64(struct timespec64 *ts);
extern void ktime_get_ts64(struct timespec64 *ts); extern void ktime_get_ts64(struct timespec64 *ts);
extern void ktime_get_real_ts64(struct timespec64 *tv);
extern void ktime_get_coarse_ts64(struct timespec64 *ts);
extern void ktime_get_coarse_real_ts64(struct timespec64 *ts);
void getboottime64(struct timespec64 *ts);
/*
* time64_t base interfaces
*/
extern time64_t ktime_get_seconds(void); extern time64_t ktime_get_seconds(void);
extern time64_t __ktime_get_real_seconds(void); extern time64_t __ktime_get_real_seconds(void);
extern time64_t ktime_get_real_seconds(void); extern time64_t ktime_get_real_seconds(void);
extern int __getnstimeofday64(struct timespec64 *tv);
extern void getnstimeofday64(struct timespec64 *tv);
extern void getboottime64(struct timespec64 *ts);
#define ktime_get_real_ts64(ts) getnstimeofday64(ts)
/* /*
* ktime_t based interfaces * ktime_t based interfaces
*/ */
...@@ -53,6 +51,7 @@ enum tk_offsets { ...@@ -53,6 +51,7 @@ enum tk_offsets {
extern ktime_t ktime_get(void); extern ktime_t ktime_get(void);
extern ktime_t ktime_get_with_offset(enum tk_offsets offs); extern ktime_t ktime_get_with_offset(enum tk_offsets offs);
extern ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs);
extern ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs); extern ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs);
extern ktime_t ktime_get_raw(void); extern ktime_t ktime_get_raw(void);
extern u32 ktime_get_resolution_ns(void); extern u32 ktime_get_resolution_ns(void);
...@@ -65,6 +64,11 @@ static inline ktime_t ktime_get_real(void) ...@@ -65,6 +64,11 @@ static inline ktime_t ktime_get_real(void)
return ktime_get_with_offset(TK_OFFS_REAL); return ktime_get_with_offset(TK_OFFS_REAL);
} }
static inline ktime_t ktime_get_coarse_real(void)
{
return ktime_get_coarse_with_offset(TK_OFFS_REAL);
}
/** /**
* ktime_get_boottime - Returns monotonic time since boot in ktime_t format * ktime_get_boottime - Returns monotonic time since boot in ktime_t format
* *
...@@ -76,6 +80,11 @@ static inline ktime_t ktime_get_boottime(void) ...@@ -76,6 +80,11 @@ static inline ktime_t ktime_get_boottime(void)
return ktime_get_with_offset(TK_OFFS_BOOT); return ktime_get_with_offset(TK_OFFS_BOOT);
} }
static inline ktime_t ktime_get_coarse_boottime(void)
{
return ktime_get_coarse_with_offset(TK_OFFS_BOOT);
}
/** /**
* ktime_get_clocktai - Returns the TAI time of day in ktime_t format * ktime_get_clocktai - Returns the TAI time of day in ktime_t format
*/ */
...@@ -84,6 +93,11 @@ static inline ktime_t ktime_get_clocktai(void) ...@@ -84,6 +93,11 @@ static inline ktime_t ktime_get_clocktai(void)
return ktime_get_with_offset(TK_OFFS_TAI); return ktime_get_with_offset(TK_OFFS_TAI);
} }
static inline ktime_t ktime_get_coarse_clocktai(void)
{
return ktime_get_coarse_with_offset(TK_OFFS_TAI);
}
/** /**
* ktime_mono_to_real - Convert monotonic time to clock realtime * ktime_mono_to_real - Convert monotonic time to clock realtime
*/ */
...@@ -123,18 +137,40 @@ extern u64 ktime_get_boot_fast_ns(void); ...@@ -123,18 +137,40 @@ extern u64 ktime_get_boot_fast_ns(void);
extern u64 ktime_get_real_fast_ns(void); extern u64 ktime_get_real_fast_ns(void);
/* /*
* timespec64 interfaces utilizing the ktime based ones * timespec64/time64_t interfaces utilizing the ktime based ones
* for API completeness, these could be implemented more efficiently
* if needed.
*/ */
static inline void get_monotonic_boottime64(struct timespec64 *ts) static inline void ktime_get_boottime_ts64(struct timespec64 *ts)
{ {
*ts = ktime_to_timespec64(ktime_get_boottime()); *ts = ktime_to_timespec64(ktime_get_boottime());
} }
static inline void timekeeping_clocktai64(struct timespec64 *ts) static inline void ktime_get_coarse_boottime_ts64(struct timespec64 *ts)
{
*ts = ktime_to_timespec64(ktime_get_coarse_boottime());
}
static inline time64_t ktime_get_boottime_seconds(void)
{
return ktime_divns(ktime_get_coarse_boottime(), NSEC_PER_SEC);
}
static inline void ktime_get_clocktai_ts64(struct timespec64 *ts)
{ {
*ts = ktime_to_timespec64(ktime_get_clocktai()); *ts = ktime_to_timespec64(ktime_get_clocktai());
} }
static inline void ktime_get_coarse_clocktai_ts64(struct timespec64 *ts)
{
*ts = ktime_to_timespec64(ktime_get_coarse_clocktai());
}
static inline time64_t ktime_get_clocktai_seconds(void)
{
return ktime_divns(ktime_get_coarse_clocktai(), NSEC_PER_SEC);
}
/* /*
* RTC specific * RTC specific
*/ */
...@@ -210,5 +246,30 @@ extern void read_persistent_clock64(struct timespec64 *ts); ...@@ -210,5 +246,30 @@ extern void read_persistent_clock64(struct timespec64 *ts);
extern void read_boot_clock64(struct timespec64 *ts); extern void read_boot_clock64(struct timespec64 *ts);
extern int update_persistent_clock64(struct timespec64 now); extern int update_persistent_clock64(struct timespec64 now);
/*
* deprecated aliases, don't use in new code
*/
#define getnstimeofday64(ts) ktime_get_real_ts64(ts)
#define get_monotonic_boottime64(ts) ktime_get_boottime_ts64(ts)
#define getrawmonotonic64(ts) ktime_get_raw_ts64(ts)
#define timekeeping_clocktai64(ts) ktime_get_clocktai_ts64(ts)
static inline struct timespec64 current_kernel_time64(void)
{
struct timespec64 ts;
ktime_get_coarse_real_ts64(&ts);
return ts;
}
static inline struct timespec64 get_monotonic_coarse64(void)
{
struct timespec64 ts;
ktime_get_coarse_ts64(&ts);
return ts;
}
#endif #endif
...@@ -11,55 +11,13 @@ unsigned long get_seconds(void); ...@@ -11,55 +11,13 @@ unsigned long get_seconds(void);
static inline struct timespec current_kernel_time(void) static inline struct timespec current_kernel_time(void)
{ {
struct timespec64 now = current_kernel_time64(); struct timespec64 ts64;
return timespec64_to_timespec(now);
}
#if BITS_PER_LONG == 64
/**
* Deprecated. Use do_settimeofday64().
*/
static inline int do_settimeofday(const struct timespec *ts)
{
return do_settimeofday64(ts);
}
static inline int __getnstimeofday(struct timespec *ts)
{
return __getnstimeofday64(ts);
}
static inline void getnstimeofday(struct timespec *ts)
{
getnstimeofday64(ts);
}
static inline void ktime_get_ts(struct timespec *ts)
{
ktime_get_ts64(ts);
}
static inline void ktime_get_real_ts(struct timespec *ts)
{
getnstimeofday64(ts);
}
static inline void getrawmonotonic(struct timespec *ts) ktime_get_coarse_real_ts64(&ts64);
{
getrawmonotonic64(ts);
}
static inline struct timespec get_monotonic_coarse(void) return timespec64_to_timespec(ts64);
{
return get_monotonic_coarse64();
} }
static inline void getboottime(struct timespec *ts)
{
return getboottime64(ts);
}
#else
/** /**
* Deprecated. Use do_settimeofday64(). * Deprecated. Use do_settimeofday64().
*/ */
...@@ -71,20 +29,11 @@ static inline int do_settimeofday(const struct timespec *ts) ...@@ -71,20 +29,11 @@ static inline int do_settimeofday(const struct timespec *ts)
return do_settimeofday64(&ts64); return do_settimeofday64(&ts64);
} }
static inline int __getnstimeofday(struct timespec *ts)
{
struct timespec64 ts64;
int ret = __getnstimeofday64(&ts64);
*ts = timespec64_to_timespec(ts64);
return ret;
}
static inline void getnstimeofday(struct timespec *ts) static inline void getnstimeofday(struct timespec *ts)
{ {
struct timespec64 ts64; struct timespec64 ts64;
getnstimeofday64(&ts64); ktime_get_real_ts64(&ts64);
*ts = timespec64_to_timespec(ts64); *ts = timespec64_to_timespec(ts64);
} }
...@@ -100,7 +49,7 @@ static inline void ktime_get_real_ts(struct timespec *ts) ...@@ -100,7 +49,7 @@ static inline void ktime_get_real_ts(struct timespec *ts)
{ {
struct timespec64 ts64; struct timespec64 ts64;
getnstimeofday64(&ts64); ktime_get_real_ts64(&ts64);
*ts = timespec64_to_timespec(ts64); *ts = timespec64_to_timespec(ts64);
} }
...@@ -108,13 +57,17 @@ static inline void getrawmonotonic(struct timespec *ts) ...@@ -108,13 +57,17 @@ static inline void getrawmonotonic(struct timespec *ts)
{ {
struct timespec64 ts64; struct timespec64 ts64;
getrawmonotonic64(&ts64); ktime_get_raw_ts64(&ts64);
*ts = timespec64_to_timespec(ts64); *ts = timespec64_to_timespec(ts64);
} }
static inline struct timespec get_monotonic_coarse(void) static inline struct timespec get_monotonic_coarse(void)
{ {
return timespec64_to_timespec(get_monotonic_coarse64()); struct timespec64 ts64;
ktime_get_coarse_ts64(&ts64);
return timespec64_to_timespec(ts64);
} }
static inline void getboottime(struct timespec *ts) static inline void getboottime(struct timespec *ts)
...@@ -124,7 +77,6 @@ static inline void getboottime(struct timespec *ts) ...@@ -124,7 +77,6 @@ static inline void getboottime(struct timespec *ts)
getboottime64(&ts64); getboottime64(&ts64);
*ts = timespec64_to_timespec(ts64); *ts = timespec64_to_timespec(ts64);
} }
#endif
/* /*
* Timespec interfaces utilizing the ktime based ones * Timespec interfaces utilizing the ktime based ones
......
...@@ -18,31 +18,30 @@ ...@@ -18,31 +18,30 @@
* On big-endian systems, the padding is in the wrong place. * On big-endian systems, the padding is in the wrong place.
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
*/ */
struct msqid64_ds { struct msqid64_ds {
struct ipc64_perm msg_perm; struct ipc64_perm msg_perm;
#if __BITS_PER_LONG == 64
__kernel_time_t msg_stime; /* last msgsnd time */ __kernel_time_t msg_stime; /* last msgsnd time */
#if __BITS_PER_LONG != 64
unsigned long __unused1;
#endif
__kernel_time_t msg_rtime; /* last msgrcv time */ __kernel_time_t msg_rtime; /* last msgrcv time */
#if __BITS_PER_LONG != 64
unsigned long __unused2;
#endif
__kernel_time_t msg_ctime; /* last change time */ __kernel_time_t msg_ctime; /* last change time */
#if __BITS_PER_LONG != 64 #else
unsigned long __unused3; unsigned long msg_stime; /* last msgsnd time */
unsigned long msg_stime_high;
unsigned long msg_rtime; /* last msgrcv time */
unsigned long msg_rtime_high;
unsigned long msg_ctime; /* last change time */
unsigned long msg_ctime_high;
#endif #endif
__kernel_ulong_t msg_cbytes; /* current number of bytes on queue */ unsigned long msg_cbytes; /* current number of bytes on queue */
__kernel_ulong_t msg_qnum; /* number of messages in queue */ unsigned long msg_qnum; /* number of messages in queue */
__kernel_ulong_t msg_qbytes; /* max number of bytes on queue */ unsigned long msg_qbytes; /* max number of bytes on queue */
__kernel_pid_t msg_lspid; /* pid of last msgsnd */ __kernel_pid_t msg_lspid; /* pid of last msgsnd */
__kernel_pid_t msg_lrpid; /* last receive pid */ __kernel_pid_t msg_lrpid; /* last receive pid */
__kernel_ulong_t __unused4; unsigned long __unused4;
__kernel_ulong_t __unused5; unsigned long __unused5;
}; };
#endif /* __ASM_GENERIC_MSGBUF_H */ #endif /* __ASM_GENERIC_MSGBUF_H */
...@@ -13,23 +13,29 @@ ...@@ -13,23 +13,29 @@
* everyone just ended up making identical copies without specific * everyone just ended up making identical copies without specific
* optimizations, so we may just as well all use the same one. * optimizations, so we may just as well all use the same one.
* *
* 64 bit architectures typically define a 64 bit __kernel_time_t, * 64 bit architectures use a 64-bit __kernel_time_t here, while
* 32 bit architectures have a pair of unsigned long values.
* so they do not need the first two padding words. * so they do not need the first two padding words.
* On big-endian systems, the padding is in the wrong place.
* *
* Pad space is left for: * On big-endian systems, the padding is in the wrong place for
* - 64-bit time_t to solve y2038 problem * historic reasons, so user space has to reconstruct a time_t
* - 2 miscellaneous 32-bit values * value using
*
* user_semid_ds.sem_otime = kernel_semid64_ds.sem_otime +
* ((long long)kernel_semid64_ds.sem_otime_high << 32)
*
* Pad space is left for 2 miscellaneous 32-bit values
*/ */
struct semid64_ds { struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
#if __BITS_PER_LONG == 64
__kernel_time_t sem_otime; /* last semop time */ __kernel_time_t sem_otime; /* last semop time */
#if __BITS_PER_LONG != 64
unsigned long __unused1;
#endif
__kernel_time_t sem_ctime; /* last change time */ __kernel_time_t sem_ctime; /* last change time */
#if __BITS_PER_LONG != 64 #else
unsigned long __unused2; unsigned long sem_otime; /* last semop time */
unsigned long sem_otime_high;
unsigned long sem_ctime; /* last change time */
unsigned long sem_ctime_high;
#endif #endif
unsigned long sem_nsems; /* no. of semaphores in array */ unsigned long sem_nsems; /* no. of semaphores in array */
unsigned long __unused3; unsigned long __unused3;
......
...@@ -19,42 +19,41 @@ ...@@ -19,42 +19,41 @@
* *
* *
* Pad space is left for: * Pad space is left for:
* - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values * - 2 miscellaneous 32-bit values
*/ */
struct shmid64_ds { struct shmid64_ds {
struct ipc64_perm shm_perm; /* operation perms */ struct ipc64_perm shm_perm; /* operation perms */
size_t shm_segsz; /* size of segment (bytes) */ size_t shm_segsz; /* size of segment (bytes) */
#if __BITS_PER_LONG == 64
__kernel_time_t shm_atime; /* last attach time */ __kernel_time_t shm_atime; /* last attach time */
#if __BITS_PER_LONG != 64
unsigned long __unused1;
#endif
__kernel_time_t shm_dtime; /* last detach time */ __kernel_time_t shm_dtime; /* last detach time */
#if __BITS_PER_LONG != 64
unsigned long __unused2;
#endif
__kernel_time_t shm_ctime; /* last change time */ __kernel_time_t shm_ctime; /* last change time */
#if __BITS_PER_LONG != 64 #else
unsigned long __unused3; unsigned long shm_atime; /* last attach time */
unsigned long shm_atime_high;
unsigned long shm_dtime; /* last detach time */
unsigned long shm_dtime_high;
unsigned long shm_ctime; /* last change time */
unsigned long shm_ctime_high;
#endif #endif
__kernel_pid_t shm_cpid; /* pid of creator */ __kernel_pid_t shm_cpid; /* pid of creator */
__kernel_pid_t shm_lpid; /* pid of last operator */ __kernel_pid_t shm_lpid; /* pid of last operator */
__kernel_ulong_t shm_nattch; /* no. of current attaches */ unsigned long shm_nattch; /* no. of current attaches */
__kernel_ulong_t __unused4; unsigned long __unused4;
__kernel_ulong_t __unused5; unsigned long __unused5;
}; };
struct shminfo64 { struct shminfo64 {
__kernel_ulong_t shmmax; unsigned long shmmax;
__kernel_ulong_t shmmin; unsigned long shmmin;
__kernel_ulong_t shmmni; unsigned long shmmni;
__kernel_ulong_t shmseg; unsigned long shmseg;
__kernel_ulong_t shmall; unsigned long shmall;
__kernel_ulong_t __unused1; unsigned long __unused1;
__kernel_ulong_t __unused2; unsigned long __unused2;
__kernel_ulong_t __unused3; unsigned long __unused3;
__kernel_ulong_t __unused4; unsigned long __unused4;
}; };
#endif /* __ASM_GENERIC_SHMBUF_H */ #endif /* __ASM_GENERIC_SHMBUF_H */
...@@ -691,7 +691,7 @@ static void __do_notify(struct mqueue_inode_info *info) ...@@ -691,7 +691,7 @@ static void __do_notify(struct mqueue_inode_info *info)
wake_up(&info->wait_q); wake_up(&info->wait_q);
} }
static int prepare_timeout(const struct timespec __user *u_abs_timeout, static int prepare_timeout(const struct __kernel_timespec __user *u_abs_timeout,
struct timespec64 *ts) struct timespec64 *ts)
{ {
if (get_timespec64(ts, u_abs_timeout)) if (get_timespec64(ts, u_abs_timeout))
...@@ -1128,7 +1128,7 @@ static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr, ...@@ -1128,7 +1128,7 @@ static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr,
SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
size_t, msg_len, unsigned int, msg_prio, size_t, msg_len, unsigned int, msg_prio,
const struct timespec __user *, u_abs_timeout) const struct __kernel_timespec __user *, u_abs_timeout)
{ {
struct timespec64 ts, *p = NULL; struct timespec64 ts, *p = NULL;
if (u_abs_timeout) { if (u_abs_timeout) {
...@@ -1142,7 +1142,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, ...@@ -1142,7 +1142,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr, SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
size_t, msg_len, unsigned int __user *, u_msg_prio, size_t, msg_len, unsigned int __user *, u_msg_prio,
const struct timespec __user *, u_abs_timeout) const struct __kernel_timespec __user *, u_abs_timeout)
{ {
struct timespec64 ts, *p = NULL; struct timespec64 ts, *p = NULL;
if (u_abs_timeout) { if (u_abs_timeout) {
...@@ -1420,6 +1420,47 @@ COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name, ...@@ -1420,6 +1420,47 @@ COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name,
return do_mq_open(u_name, oflag, mode, p); return do_mq_open(u_name, oflag, mode, p);
} }
COMPAT_SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
const struct compat_sigevent __user *, u_notification)
{
struct sigevent n, *p = NULL;
if (u_notification) {
if (get_compat_sigevent(&n, u_notification))
return -EFAULT;
if (n.sigev_notify == SIGEV_THREAD)
n.sigev_value.sival_ptr = compat_ptr(n.sigev_value.sival_int);
p = &n;
}
return do_mq_notify(mqdes, p);
}
COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
const struct compat_mq_attr __user *, u_mqstat,
struct compat_mq_attr __user *, u_omqstat)
{
int ret;
struct mq_attr mqstat, omqstat;
struct mq_attr *new = NULL, *old = NULL;
if (u_mqstat) {
new = &mqstat;
if (get_compat_mq_attr(new, u_mqstat))
return -EFAULT;
}
if (u_omqstat)
old = &omqstat;
ret = do_mq_getsetattr(mqdes, new, old);
if (ret || !old)
return ret;
if (put_compat_mq_attr(old, u_omqstat))
return -EFAULT;
return 0;
}
#endif
#ifdef CONFIG_COMPAT_32BIT_TIME
static int compat_prepare_timeout(const struct compat_timespec __user *p, static int compat_prepare_timeout(const struct compat_timespec __user *p,
struct timespec64 *ts) struct timespec64 *ts)
{ {
...@@ -1459,45 +1500,6 @@ COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, ...@@ -1459,45 +1500,6 @@ COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes,
} }
return do_mq_timedreceive(mqdes, u_msg_ptr, msg_len, u_msg_prio, p); return do_mq_timedreceive(mqdes, u_msg_ptr, msg_len, u_msg_prio, p);
} }
COMPAT_SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
const struct compat_sigevent __user *, u_notification)
{
struct sigevent n, *p = NULL;
if (u_notification) {
if (get_compat_sigevent(&n, u_notification))
return -EFAULT;
if (n.sigev_notify == SIGEV_THREAD)
n.sigev_value.sival_ptr = compat_ptr(n.sigev_value.sival_int);
p = &n;
}
return do_mq_notify(mqdes, p);
}
COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
const struct compat_mq_attr __user *, u_mqstat,
struct compat_mq_attr __user *, u_omqstat)
{
int ret;
struct mq_attr mqstat, omqstat;
struct mq_attr *new = NULL, *old = NULL;
if (u_mqstat) {
new = &mqstat;
if (get_compat_mq_attr(new, u_mqstat))
return -EFAULT;
}
if (u_omqstat)
old = &omqstat;
ret = do_mq_getsetattr(mqdes, new, old);
if (ret || !old)
return ret;
if (put_compat_mq_attr(old, u_omqstat))
return -EFAULT;
return 0;
}
#endif #endif
static const struct inode_operations mqueue_dir_inode_operations = { static const struct inode_operations mqueue_dir_inode_operations = {
......
...@@ -537,6 +537,11 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid, ...@@ -537,6 +537,11 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
p->msg_stime = msq->q_stime; p->msg_stime = msq->q_stime;
p->msg_rtime = msq->q_rtime; p->msg_rtime = msq->q_rtime;
p->msg_ctime = msq->q_ctime; p->msg_ctime = msq->q_ctime;
#ifndef CONFIG_64BIT
p->msg_stime_high = msq->q_stime >> 32;
p->msg_rtime_high = msq->q_rtime >> 32;
p->msg_ctime_high = msq->q_ctime >> 32;
#endif
p->msg_cbytes = msq->q_cbytes; p->msg_cbytes = msq->q_cbytes;
p->msg_qnum = msq->q_qnum; p->msg_qnum = msq->q_qnum;
p->msg_qbytes = msq->q_qbytes; p->msg_qbytes = msq->q_qbytes;
...@@ -646,9 +651,12 @@ static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in, ...@@ -646,9 +651,12 @@ static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in,
struct compat_msqid64_ds v; struct compat_msqid64_ds v;
memset(&v, 0, sizeof(v)); memset(&v, 0, sizeof(v));
to_compat_ipc64_perm(&v.msg_perm, &in->msg_perm); to_compat_ipc64_perm(&v.msg_perm, &in->msg_perm);
v.msg_stime = in->msg_stime; v.msg_stime = lower_32_bits(in->msg_stime);
v.msg_rtime = in->msg_rtime; v.msg_stime_high = upper_32_bits(in->msg_stime);
v.msg_ctime = in->msg_ctime; v.msg_rtime = lower_32_bits(in->msg_rtime);
v.msg_rtime_high = upper_32_bits(in->msg_rtime);
v.msg_ctime = lower_32_bits(in->msg_ctime);
v.msg_ctime_high = upper_32_bits(in->msg_ctime);
v.msg_cbytes = in->msg_cbytes; v.msg_cbytes = in->msg_cbytes;
v.msg_qnum = in->msg_qnum; v.msg_qnum = in->msg_qnum;
v.msg_qbytes = in->msg_qbytes; v.msg_qbytes = in->msg_qbytes;
...@@ -758,7 +766,7 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg, ...@@ -758,7 +766,7 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
WRITE_ONCE(msr->r_msg, ERR_PTR(-E2BIG)); WRITE_ONCE(msr->r_msg, ERR_PTR(-E2BIG));
} else { } else {
ipc_update_pid(&msq->q_lrpid, task_pid(msr->r_tsk)); ipc_update_pid(&msq->q_lrpid, task_pid(msr->r_tsk));
msq->q_rtime = get_seconds(); msq->q_rtime = ktime_get_real_seconds();
wake_q_add(wake_q, msr->r_tsk); wake_q_add(wake_q, msr->r_tsk);
WRITE_ONCE(msr->r_msg, msg); WRITE_ONCE(msr->r_msg, msg);
...@@ -859,7 +867,7 @@ static long do_msgsnd(int msqid, long mtype, void __user *mtext, ...@@ -859,7 +867,7 @@ static long do_msgsnd(int msqid, long mtype, void __user *mtext,
} }
ipc_update_pid(&msq->q_lspid, task_tgid(current)); ipc_update_pid(&msq->q_lspid, task_tgid(current));
msq->q_stime = get_seconds(); msq->q_stime = ktime_get_real_seconds();
if (!pipelined_send(msq, msg, &wake_q)) { if (!pipelined_send(msq, msg, &wake_q)) {
/* no one is waiting for this message, enqueue it */ /* no one is waiting for this message, enqueue it */
...@@ -1087,7 +1095,7 @@ static long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, in ...@@ -1087,7 +1095,7 @@ static long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, in
list_del(&msg->m_list); list_del(&msg->m_list);
msq->q_qnum--; msq->q_qnum--;
msq->q_rtime = get_seconds(); msq->q_rtime = ktime_get_real_seconds();
ipc_update_pid(&msq->q_lrpid, task_tgid(current)); ipc_update_pid(&msq->q_lrpid, task_tgid(current));
msq->q_cbytes -= msg->m_ts; msq->q_cbytes -= msg->m_ts;
atomic_sub(msg->m_ts, &ns->msg_bytes); atomic_sub(msg->m_ts, &ns->msg_bytes);
......
...@@ -70,6 +70,7 @@ ...@@ -70,6 +70,7 @@
* The worst-case behavior is nevertheless O(N^2) for N wakeups. * The worst-case behavior is nevertheless O(N^2) for N wakeups.
*/ */
#include <linux/compat.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -104,7 +105,7 @@ struct sem { ...@@ -104,7 +105,7 @@ struct sem {
/* that alter the semaphore */ /* that alter the semaphore */
struct list_head pending_const; /* pending single-sop operations */ struct list_head pending_const; /* pending single-sop operations */
/* that do not alter the semaphore*/ /* that do not alter the semaphore*/
time_t sem_otime; /* candidate for sem_otime */ time64_t sem_otime; /* candidate for sem_otime */
} ____cacheline_aligned_in_smp; } ____cacheline_aligned_in_smp;
/* One sem_array data structure for each set of semaphores in the system. */ /* One sem_array data structure for each set of semaphores in the system. */
...@@ -984,10 +985,10 @@ static int update_queue(struct sem_array *sma, int semnum, struct wake_q_head *w ...@@ -984,10 +985,10 @@ static int update_queue(struct sem_array *sma, int semnum, struct wake_q_head *w
static void set_semotime(struct sem_array *sma, struct sembuf *sops) static void set_semotime(struct sem_array *sma, struct sembuf *sops)
{ {
if (sops == NULL) { if (sops == NULL) {
sma->sems[0].sem_otime = get_seconds(); sma->sems[0].sem_otime = ktime_get_real_seconds();
} else { } else {
sma->sems[sops[0].sem_num].sem_otime = sma->sems[sops[0].sem_num].sem_otime =
get_seconds(); ktime_get_real_seconds();
} }
} }
...@@ -1214,6 +1215,7 @@ static int semctl_stat(struct ipc_namespace *ns, int semid, ...@@ -1214,6 +1215,7 @@ static int semctl_stat(struct ipc_namespace *ns, int semid,
int cmd, struct semid64_ds *semid64) int cmd, struct semid64_ds *semid64)
{ {
struct sem_array *sma; struct sem_array *sma;
time64_t semotime;
int id = 0; int id = 0;
int err; int err;
...@@ -1257,8 +1259,13 @@ static int semctl_stat(struct ipc_namespace *ns, int semid, ...@@ -1257,8 +1259,13 @@ static int semctl_stat(struct ipc_namespace *ns, int semid,
} }
kernel_to_ipc64_perm(&sma->sem_perm, &semid64->sem_perm); kernel_to_ipc64_perm(&sma->sem_perm, &semid64->sem_perm);
semid64->sem_otime = get_semotime(sma); semotime = get_semotime(sma);
semid64->sem_otime = semotime;
semid64->sem_ctime = sma->sem_ctime; semid64->sem_ctime = sma->sem_ctime;
#ifndef CONFIG_64BIT
semid64->sem_otime_high = semotime >> 32;
semid64->sem_ctime_high = sma->sem_ctime >> 32;
#endif
semid64->sem_nsems = sma->sem_nsems; semid64->sem_nsems = sma->sem_nsems;
ipc_unlock_object(&sma->sem_perm); ipc_unlock_object(&sma->sem_perm);
...@@ -1704,8 +1711,10 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in, ...@@ -1704,8 +1711,10 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,
struct compat_semid64_ds v; struct compat_semid64_ds v;
memset(&v, 0, sizeof(v)); memset(&v, 0, sizeof(v));
to_compat_ipc64_perm(&v.sem_perm, &in->sem_perm); to_compat_ipc64_perm(&v.sem_perm, &in->sem_perm);
v.sem_otime = in->sem_otime; v.sem_otime = lower_32_bits(in->sem_otime);
v.sem_ctime = in->sem_ctime; v.sem_otime_high = upper_32_bits(in->sem_otime);
v.sem_ctime = lower_32_bits(in->sem_ctime);
v.sem_ctime_high = upper_32_bits(in->sem_ctime);
v.sem_nsems = in->sem_nsems; v.sem_nsems = in->sem_nsems;
return copy_to_user(buf, &v, sizeof(v)); return copy_to_user(buf, &v, sizeof(v));
} else { } else {
...@@ -2168,7 +2177,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops, ...@@ -2168,7 +2177,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
} }
long ksys_semtimedop(int semid, struct sembuf __user *tsops, long ksys_semtimedop(int semid, struct sembuf __user *tsops,
unsigned int nsops, const struct timespec __user *timeout) unsigned int nsops, const struct __kernel_timespec __user *timeout)
{ {
if (timeout) { if (timeout) {
struct timespec64 ts; struct timespec64 ts;
...@@ -2180,12 +2189,12 @@ long ksys_semtimedop(int semid, struct sembuf __user *tsops, ...@@ -2180,12 +2189,12 @@ long ksys_semtimedop(int semid, struct sembuf __user *tsops,
} }
SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
unsigned int, nsops, const struct timespec __user *, timeout) unsigned int, nsops, const struct __kernel_timespec __user *, timeout)
{ {
return ksys_semtimedop(semid, tsops, nsops, timeout); return ksys_semtimedop(semid, tsops, nsops, timeout);
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT_32BIT_TIME
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems, long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned int nsops, unsigned int nsops,
const struct compat_timespec __user *timeout) const struct compat_timespec __user *timeout)
......
...@@ -1002,6 +1002,11 @@ static int shmctl_stat(struct ipc_namespace *ns, int shmid, ...@@ -1002,6 +1002,11 @@ static int shmctl_stat(struct ipc_namespace *ns, int shmid,
tbuf->shm_atime = shp->shm_atim; tbuf->shm_atime = shp->shm_atim;
tbuf->shm_dtime = shp->shm_dtim; tbuf->shm_dtime = shp->shm_dtim;
tbuf->shm_ctime = shp->shm_ctim; tbuf->shm_ctime = shp->shm_ctim;
#ifndef CONFIG_64BIT
tbuf->shm_atime_high = shp->shm_atim >> 32;
tbuf->shm_dtime_high = shp->shm_dtim >> 32;
tbuf->shm_ctime_high = shp->shm_ctim >> 32;
#endif
tbuf->shm_cpid = pid_vnr(shp->shm_cprid); tbuf->shm_cpid = pid_vnr(shp->shm_cprid);
tbuf->shm_lpid = pid_vnr(shp->shm_lprid); tbuf->shm_lpid = pid_vnr(shp->shm_lprid);
tbuf->shm_nattch = shp->shm_nattch; tbuf->shm_nattch = shp->shm_nattch;
...@@ -1233,9 +1238,12 @@ static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in, ...@@ -1233,9 +1238,12 @@ static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,
struct compat_shmid64_ds v; struct compat_shmid64_ds v;
memset(&v, 0, sizeof(v)); memset(&v, 0, sizeof(v));
to_compat_ipc64_perm(&v.shm_perm, &in->shm_perm); to_compat_ipc64_perm(&v.shm_perm, &in->shm_perm);
v.shm_atime = in->shm_atime; v.shm_atime = lower_32_bits(in->shm_atime);
v.shm_dtime = in->shm_dtime; v.shm_atime_high = upper_32_bits(in->shm_atime);
v.shm_ctime = in->shm_ctime; v.shm_dtime = lower_32_bits(in->shm_dtime);
v.shm_dtime_high = upper_32_bits(in->shm_dtime);
v.shm_ctime = lower_32_bits(in->shm_ctime);
v.shm_ctime_high = upper_32_bits(in->shm_ctime);
v.shm_segsz = in->shm_segsz; v.shm_segsz = in->shm_segsz;
v.shm_nattch = in->shm_nattch; v.shm_nattch = in->shm_nattch;
v.shm_cpid = in->shm_cpid; v.shm_cpid = in->shm_cpid;
......
...@@ -30,9 +30,14 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second, ...@@ -30,9 +30,14 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
return ksys_semtimedop(first, (struct sembuf __user *)ptr, return ksys_semtimedop(first, (struct sembuf __user *)ptr,
second, NULL); second, NULL);
case SEMTIMEDOP: case SEMTIMEDOP:
return ksys_semtimedop(first, (struct sembuf __user *)ptr, if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
second, return ksys_semtimedop(first, ptr, second,
(const struct timespec __user *)fifth); (const struct __kernel_timespec __user *)fifth);
else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
return compat_ksys_semtimedop(first, ptr, second,
(const struct compat_timespec __user *)fifth);
else
return -ENOSYS;
case SEMGET: case SEMGET:
return ksys_semget(first, second, third); return ksys_semget(first, second, third);
...@@ -130,6 +135,8 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second, ...@@ -130,6 +135,8 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
/* struct sembuf is the same on 32 and 64bit :)) */ /* struct sembuf is the same on 32 and 64bit :)) */
return ksys_semtimedop(first, compat_ptr(ptr), second, NULL); return ksys_semtimedop(first, compat_ptr(ptr), second, NULL);
case SEMTIMEDOP: case SEMTIMEDOP:
if (!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
return -ENOSYS;
return compat_ksys_semtimedop(first, compat_ptr(ptr), second, return compat_ksys_semtimedop(first, compat_ptr(ptr), second,
compat_ptr(fifth)); compat_ptr(fifth));
case SEMGET: case SEMGET:
......
...@@ -251,7 +251,7 @@ static inline int compat_ipc_parse_version(int *cmd) ...@@ -251,7 +251,7 @@ static inline int compat_ipc_parse_version(int *cmd)
/* for __ARCH_WANT_SYS_IPC */ /* for __ARCH_WANT_SYS_IPC */
long ksys_semtimedop(int semid, struct sembuf __user *tsops, long ksys_semtimedop(int semid, struct sembuf __user *tsops,
unsigned int nsops, unsigned int nsops,
const struct timespec __user *timeout); const struct __kernel_timespec __user *timeout);
long ksys_semget(key_t key, int nsems, int semflg); long ksys_semget(key_t key, int nsems, int semflg);
long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg); long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg);
long ksys_msgget(key_t key, int msgflg); long ksys_msgget(key_t key, int msgflg);
...@@ -265,10 +265,10 @@ long ksys_shmdt(char __user *shmaddr); ...@@ -265,10 +265,10 @@ long ksys_shmdt(char __user *shmaddr);
long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf); long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */ /* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
#ifdef CONFIG_COMPAT
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems, long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned int nsops, unsigned int nsops,
const struct compat_timespec __user *timeout); const struct compat_timespec __user *timeout);
#ifdef CONFIG_COMPAT
long compat_ksys_semctl(int semid, int semnum, int cmd, int arg); long compat_ksys_semctl(int semid, int semnum, int cmd, int arg);
long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr); long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr);
long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz, long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
......
...@@ -407,7 +407,6 @@ time64_t mktime64(const unsigned int year0, const unsigned int mon0, ...@@ -407,7 +407,6 @@ time64_t mktime64(const unsigned int year0, const unsigned int mon0,
} }
EXPORT_SYMBOL(mktime64); EXPORT_SYMBOL(mktime64);
#if __BITS_PER_LONG == 32
/** /**
* set_normalized_timespec - set timespec sec and nsec parts and normalize * set_normalized_timespec - set timespec sec and nsec parts and normalize
* *
...@@ -468,7 +467,6 @@ struct timespec ns_to_timespec(const s64 nsec) ...@@ -468,7 +467,6 @@ struct timespec ns_to_timespec(const s64 nsec)
return ts; return ts;
} }
EXPORT_SYMBOL(ns_to_timespec); EXPORT_SYMBOL(ns_to_timespec);
#endif
/** /**
* ns_to_timeval - Convert nanoseconds to timeval * ns_to_timeval - Convert nanoseconds to timeval
......
...@@ -705,18 +705,19 @@ static void timekeeping_forward_now(struct timekeeper *tk) ...@@ -705,18 +705,19 @@ static void timekeeping_forward_now(struct timekeeper *tk)
} }
/** /**
* __getnstimeofday64 - Returns the time of day in a timespec64. * ktime_get_real_ts64 - Returns the time of day in a timespec64.
* @ts: pointer to the timespec to be set * @ts: pointer to the timespec to be set
* *
* Updates the time of day in the timespec. * Returns the time of day in a timespec64 (WARN if suspended).
* Returns 0 on success, or -ve when suspended (timespec will be undefined).
*/ */
int __getnstimeofday64(struct timespec64 *ts) void ktime_get_real_ts64(struct timespec64 *ts)
{ {
struct timekeeper *tk = &tk_core.timekeeper; struct timekeeper *tk = &tk_core.timekeeper;
unsigned long seq; unsigned long seq;
u64 nsecs; u64 nsecs;
WARN_ON(timekeeping_suspended);
do { do {
seq = read_seqcount_begin(&tk_core.seq); seq = read_seqcount_begin(&tk_core.seq);
...@@ -727,28 +728,8 @@ int __getnstimeofday64(struct timespec64 *ts) ...@@ -727,28 +728,8 @@ int __getnstimeofday64(struct timespec64 *ts)
ts->tv_nsec = 0; ts->tv_nsec = 0;
timespec64_add_ns(ts, nsecs); timespec64_add_ns(ts, nsecs);
/*
* Do not bail out early, in case there were callers still using
* the value, even in the face of the WARN_ON.
*/
if (unlikely(timekeeping_suspended))
return -EAGAIN;
return 0;
}
EXPORT_SYMBOL(__getnstimeofday64);
/**
* getnstimeofday64 - Returns the time of day in a timespec64.
* @ts: pointer to the timespec64 to be set
*
* Returns the time of day in a timespec64 (WARN if suspended).
*/
void getnstimeofday64(struct timespec64 *ts)
{
WARN_ON(__getnstimeofday64(ts));
} }
EXPORT_SYMBOL(getnstimeofday64); EXPORT_SYMBOL(ktime_get_real_ts64);
ktime_t ktime_get(void) ktime_t ktime_get(void)
{ {
...@@ -814,6 +795,25 @@ ktime_t ktime_get_with_offset(enum tk_offsets offs) ...@@ -814,6 +795,25 @@ ktime_t ktime_get_with_offset(enum tk_offsets offs)
} }
EXPORT_SYMBOL_GPL(ktime_get_with_offset); EXPORT_SYMBOL_GPL(ktime_get_with_offset);
ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs)
{
struct timekeeper *tk = &tk_core.timekeeper;
unsigned int seq;
ktime_t base, *offset = offsets[offs];
WARN_ON(timekeeping_suspended);
do {
seq = read_seqcount_begin(&tk_core.seq);
base = ktime_add(tk->tkr_mono.base, *offset);
} while (read_seqcount_retry(&tk_core.seq, seq));
return base;
}
EXPORT_SYMBOL_GPL(ktime_get_coarse_with_offset);
/** /**
* ktime_mono_to_any() - convert mononotic time to any other time * ktime_mono_to_any() - convert mononotic time to any other time
* @tmono: time to convert. * @tmono: time to convert.
...@@ -1410,12 +1410,12 @@ int timekeeping_notify(struct clocksource *clock) ...@@ -1410,12 +1410,12 @@ int timekeeping_notify(struct clocksource *clock)
} }
/** /**
* getrawmonotonic64 - Returns the raw monotonic time in a timespec * ktime_get_raw_ts64 - Returns the raw monotonic time in a timespec
* @ts: pointer to the timespec64 to be set * @ts: pointer to the timespec64 to be set
* *
* Returns the raw monotonic time (completely un-modified by ntp) * Returns the raw monotonic time (completely un-modified by ntp)
*/ */
void getrawmonotonic64(struct timespec64 *ts) void ktime_get_raw_ts64(struct timespec64 *ts)
{ {
struct timekeeper *tk = &tk_core.timekeeper; struct timekeeper *tk = &tk_core.timekeeper;
unsigned long seq; unsigned long seq;
...@@ -1431,7 +1431,7 @@ void getrawmonotonic64(struct timespec64 *ts) ...@@ -1431,7 +1431,7 @@ void getrawmonotonic64(struct timespec64 *ts)
ts->tv_nsec = 0; ts->tv_nsec = 0;
timespec64_add_ns(ts, nsecs); timespec64_add_ns(ts, nsecs);
} }
EXPORT_SYMBOL(getrawmonotonic64); EXPORT_SYMBOL(ktime_get_raw_ts64);
/** /**
...@@ -2133,23 +2133,20 @@ unsigned long get_seconds(void) ...@@ -2133,23 +2133,20 @@ unsigned long get_seconds(void)
} }
EXPORT_SYMBOL(get_seconds); EXPORT_SYMBOL(get_seconds);
struct timespec64 current_kernel_time64(void) void ktime_get_coarse_real_ts64(struct timespec64 *ts)
{ {
struct timekeeper *tk = &tk_core.timekeeper; struct timekeeper *tk = &tk_core.timekeeper;
struct timespec64 now;
unsigned long seq; unsigned long seq;
do { do {
seq = read_seqcount_begin(&tk_core.seq); seq = read_seqcount_begin(&tk_core.seq);
now = tk_xtime(tk); *ts = tk_xtime(tk);
} while (read_seqcount_retry(&tk_core.seq, seq)); } while (read_seqcount_retry(&tk_core.seq, seq));
return now;
} }
EXPORT_SYMBOL(current_kernel_time64); EXPORT_SYMBOL(ktime_get_coarse_real_ts64);
struct timespec64 get_monotonic_coarse64(void) void ktime_get_coarse_ts64(struct timespec64 *ts)
{ {
struct timekeeper *tk = &tk_core.timekeeper; struct timekeeper *tk = &tk_core.timekeeper;
struct timespec64 now, mono; struct timespec64 now, mono;
...@@ -2162,12 +2159,10 @@ struct timespec64 get_monotonic_coarse64(void) ...@@ -2162,12 +2159,10 @@ struct timespec64 get_monotonic_coarse64(void)
mono = tk->wall_to_monotonic; mono = tk->wall_to_monotonic;
} while (read_seqcount_retry(&tk_core.seq, seq)); } while (read_seqcount_retry(&tk_core.seq, seq));
set_normalized_timespec64(&now, now.tv_sec + mono.tv_sec, set_normalized_timespec64(ts, now.tv_sec + mono.tv_sec,
now.tv_nsec + mono.tv_nsec); now.tv_nsec + mono.tv_nsec);
return now;
} }
EXPORT_SYMBOL(get_monotonic_coarse64); EXPORT_SYMBOL(ktime_get_coarse_ts64);
/* /*
* Must hold jiffies_lock * Must hold jiffies_lock
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment