y2038: IPC system call conversion
This is a follow-up to Deepa's work on the timekeeping system calls, providing a y2038-safe syscall API for SYSVIPC. It uses a combination of two strategies: For sys_msgctl, sys_semctl and sys_shmctl, I do not introduce a completely new set of replacement system calls, but instead extend the existing ones to return data in the reserved fields of the normal data structure. This should be completely transparent to any existing user space, and only after the 32-bit time_t wraps, it will make a difference in the returned data. libc implementations will consequently have to provide their own data structures when they move to 64-bit time_t, and convert the structures in user space from the ones returned by the kernel. In contrast, mq_timedsend, mq_timedreceive and and semtimedop all do need to change because having a libc redefine the timespec type breaks the ABI, so with this series there will be two separate entry points for 32-bit architectures. There are three cases here: - little-endian architectures (except powerpc and mips) can use the normal layout and just cast the data structure to the user space type that contains 64-bit numbers. - parisc and sparc can do the same thing with big-endian user space - little-endian powerpc and most big-endian architectures have to flip the upper and lower 32-bit halves of the time_t value in memory, but can otherwise keep using the normal layout - mips and big-endian xtensa need to be more careful because they are not consistent in their definitions, and they have to provide custom libc implementations for the system calls to use 64-bit time_t. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJa4HbTAAoJEGCrR//JCVIniiUP/0mXR18lDCROYoVHgGwDHUas 9CjdGk+GvFFzRYvcoOgBjf8RhiUcYITyn2t9Kv52fZRv6RRaxD+qHWMXs8rnpmnm 59v/GWi4qdbrliCgxrUU6LMsRom4mjTXuZLqCoOrs7F2pGurQ3bq75m4IM7wsx/+ cucSSxLb+qmCeT5HF/7LbvVLm2X10RGW6iI+UeU267sitymUaGmuJGcF6WxioXB2 0u6mwlj62nlc07vSBJQQgSOuw+U095q6hS62uaNr7ZMByckbiPbVV9M4H5OFflqI Y70UohSue2LIYvJOhu70wQWs832W7sYb+Ia3fnMaX1AEIErtmGoBiIJ1lio1vYpb jVCPPsR0jWMg2MxGEGAEmEXQ7MZLme6yRmd08IFNJmRzuuzzuwXyz5hwz53ZJtIX dw0BZnw49b1Hy2oW03w6tbrnW7MlEkMMHM0wOSYGd0K8zJQUOSlW6p1m/UTTpsJQ G5CSaFWPtEfNPiS+E+w+C8TUtTs6SEZXn8/pIrXSnUjEu9QJvsCmxOroEW7D8pdD d4+13U5VzIXNlzf+/K1YZ2PIMmorDXkr2otMyi44naksWqc/p4NaikoINgq8QVm2 aoZ0ddlIbyTmiXvWfL7AVjmi7w2ACML8OoapITdWCr1Bfs+DUFNdOrFbdFA7psq7 L98FqbtoHwFLM7b3veF5 =7FX4 -----END PGP SIGNATURE----- Merge tag 'y2038-ipc' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground into timers/2038 Pull 'y2038: IPC system call conversion' from Arnd Bergmann: "This is a follow-up to Deepa's work on the timekeeping system calls, providing a y2038-safe syscall API for SYSVIPC. It uses a combination of two strategies: For sys_msgctl, sys_semctl and sys_shmctl, I do not introduce a completely new set of replacement system calls, but instead extend the existing ones to return data in the reserved fields of the normal data structure. This should be completely transparent to any existing user space, and only after the 32-bit time_t wraps, it will make a difference in the returned data. libc implementations will consequently have to provide their own data structures when they move to 64-bit time_t, and convert the structures in user space from the ones returned by the kernel. In contrast, mq_timedsend, mq_timedreceive and and semtimedop all do need to change because having a libc redefine the timespec type breaks the ABI, so with this series there will be two separate entry points for 32-bit architectures. There are three cases here: - little-endian architectures (except powerpc and mips) can use the normal layout and just cast the data structure to the user space type that contains 64-bit numbers. - parisc and sparc can do the same thing with big-endian user space - little-endian powerpc and most big-endian architectures have to flip the upper and lower 32-bit halves of the time_t value in memory, but can otherwise keep using the normal layout - mips and big-endian xtensa need to be more careful because they are not consistent in their definitions, and they have to provide custom libc implementations for the system calls to use 64-bit time_t."
This commit is contained in:
commit
4fe581d7f1
|
@ -2,4 +2,8 @@
|
|||
include include/uapi/asm-generic/Kbuild.asm
|
||||
|
||||
generic-y += bpf_perf_event.h
|
||||
generic-y += ipcbuf.h
|
||||
generic-y += msgbuf.h
|
||||
generic-y += poll.h
|
||||
generic-y += sembuf.h
|
||||
generic-y += shmbuf.h
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#include <asm-generic/ipcbuf.h>
|
|
@ -1,28 +0,0 @@
|
|||
/* 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 */
|
|
@ -1,23 +0,0 @@
|
|||
/* 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 */
|
|
@ -1,39 +0,0 @@
|
|||
/* 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 {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -192,12 +192,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_stime;
|
||||
compat_ulong_t msg_stime_high;
|
||||
compat_ulong_t msg_rtime;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
compat_ulong_t msg_ctime;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -210,12 +210,12 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t shm_dtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_atime_high;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_dtime_high;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_ulong_t shm_ctime_high;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
|
|
|
@ -2,5 +2,9 @@
|
|||
include include/uapi/asm-generic/Kbuild.asm
|
||||
|
||||
generic-y += bpf_perf_event.h
|
||||
generic-y += ipcbuf.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += msgbuf.h
|
||||
generic-y += poll.h
|
||||
generic-y += sembuf.h
|
||||
generic-y += shmbuf.h
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#include <asm-generic/ipcbuf.h>
|
|
@ -1,28 +0,0 @@
|
|||
/* 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 */
|
|
@ -1,23 +0,0 @@
|
|||
/* 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 */
|
|
@ -1,39 +0,0 @@
|
|||
/* 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 {
|
|||
typedef s32 compat_timer_t;
|
||||
typedef s32 compat_key_t;
|
||||
|
||||
typedef s16 compat_short_t;
|
||||
typedef s32 compat_int_t;
|
||||
typedef s32 compat_long_t;
|
||||
typedef s64 compat_s64;
|
||||
typedef u16 compat_ushort_t;
|
||||
typedef u32 compat_uint_t;
|
||||
typedef u32 compat_ulong_t;
|
||||
typedef u64 compat_u64;
|
||||
|
@ -157,35 +159,35 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
};
|
||||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
#ifndef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t msg_stime_high;
|
||||
#endif
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t msg_stime;
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t msg_stime_high;
|
||||
#endif
|
||||
#ifndef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
#endif
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t msg_rtime;
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
#endif
|
||||
#ifndef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
#endif
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t msg_ctime;
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
#endif
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
|
@ -199,14 +201,16 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_time_t shm_dtime;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ushort_t shm_atime_high;
|
||||
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 */
|
||||
|
|
|
@ -9,33 +9,15 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#if defined(__mips64)
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if !defined(__mips64) && defined(__MIPSEB__)
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
__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 */
|
||||
#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 */
|
||||
#if !defined(__mips64) && defined(__MIPSEL__)
|
||||
unsigned long __unused3;
|
||||
#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 */
|
||||
|
@ -44,5 +26,42 @@ struct msqid64_ds {
|
|||
unsigned long __unused4;
|
||||
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 */
|
||||
|
|
|
@ -7,10 +7,11 @@
|
|||
* 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
|
||||
* Pad space is left for 2 miscellaneous 64-bit values on mips64,
|
||||
* but used for the upper 32 bit of the time values on mips32.
|
||||
*/
|
||||
|
||||
#ifdef __mips64
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
|
@ -19,5 +20,15 @@ struct semid64_ds {
|
|||
unsigned long __unused1;
|
||||
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 */
|
||||
|
|
|
@ -7,10 +7,13 @@
|
|||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 32-bit rsp. 64-bit values
|
||||
* As MIPS was lacking proper padding after shm_?time, we use 48 bits
|
||||
* 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 ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
|
@ -23,6 +26,22 @@ struct shmid64_ds {
|
|||
unsigned long __unused1;
|
||||
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 {
|
||||
unsigned long shmmax;
|
||||
|
|
|
@ -138,10 +138,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t sem_otime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t sem_ctime;
|
||||
unsigned int sem_otime_high;
|
||||
unsigned int sem_otime;
|
||||
unsigned int sem_ctime_high;
|
||||
unsigned int sem_ctime;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -149,12 +149,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t msg_stime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t msg_rtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t msg_ctime;
|
||||
unsigned int msg_stime_high;
|
||||
unsigned int msg_stime;
|
||||
unsigned int msg_rtime_high;
|
||||
unsigned int msg_rtime;
|
||||
unsigned int msg_ctime_high;
|
||||
unsigned int msg_ctime;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -166,12 +166,12 @@ struct compat_msqid64_ds {
|
|||
|
||||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t shm_atime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t shm_dtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t shm_ctime;
|
||||
unsigned int shm_atime_high;
|
||||
unsigned int shm_atime;
|
||||
unsigned int shm_dtime_high;
|
||||
unsigned int shm_dtime;
|
||||
unsigned int shm_ctime_high;
|
||||
unsigned int shm_ctime;
|
||||
unsigned int __unused4;
|
||||
compat_size_t shm_segsz;
|
||||
compat_pid_t shm_cpid;
|
||||
|
|
|
@ -10,31 +10,30 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad1;
|
||||
#endif
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad2;
|
||||
#endif
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad3;
|
||||
#endif
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
#endif /* _PARISC_MSGBUF_H */
|
||||
|
|
|
@ -10,21 +10,21 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad1;
|
||||
#endif
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad2;
|
||||
#endif
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
#else
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_ctime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
|
|
@ -10,25 +10,22 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad1;
|
||||
#endif
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad2;
|
||||
#endif
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad3;
|
||||
#endif
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_dtime_high;
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_ctime_high;
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
unsigned int __pad4;
|
||||
#endif
|
||||
__kernel_size_t shm_segsz; /* size of segment (bytes) */
|
||||
|
|
|
@ -162,10 +162,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t sem_otime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t sem_ctime;
|
||||
unsigned int sem_otime_high;
|
||||
unsigned int sem_otime;
|
||||
unsigned int sem_ctime_high;
|
||||
unsigned int sem_ctime;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -173,12 +173,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t msg_stime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t msg_rtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t msg_ctime;
|
||||
unsigned int msg_stime_high;
|
||||
unsigned int msg_stime;
|
||||
unsigned int msg_rtime_high;
|
||||
unsigned int msg_rtime;
|
||||
unsigned int msg_ctime_high;
|
||||
unsigned int msg_ctime;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -190,12 +190,12 @@ struct compat_msqid64_ds {
|
|||
|
||||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t shm_atime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t shm_dtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t shm_ctime;
|
||||
unsigned int shm_atime_high;
|
||||
unsigned int shm_atime;
|
||||
unsigned int shm_dtime_high;
|
||||
unsigned int shm_dtime;
|
||||
unsigned int shm_ctime_high;
|
||||
unsigned int shm_ctime;
|
||||
unsigned int __unused4;
|
||||
compat_size_t shm_segsz;
|
||||
compat_pid_t shm_cpid;
|
||||
|
|
|
@ -10,18 +10,18 @@
|
|||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#ifndef __powerpc64__
|
||||
unsigned int __unused1;
|
||||
#endif
|
||||
#ifdef __powerpc64__
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned int __unused2;
|
||||
#endif
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned int __unused3;
|
||||
#endif
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
|
|
|
@ -15,20 +15,20 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
* - 2 miscellaneous 32/64-bit values
|
||||
*/
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
unsigned long sem_otime_high;
|
||||
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 */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused3;
|
||||
unsigned long __unused4;
|
||||
|
|
|
@ -16,25 +16,22 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
#ifdef __powerpc64__
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused3;
|
||||
#endif
|
||||
__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;
|
||||
#endif
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
|
|
|
@ -232,10 +232,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
|
@ -243,12 +243,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t __pad3;
|
||||
compat_ulong_t msg_stime;
|
||||
compat_ulong_t msg_stime_high;
|
||||
compat_ulong_t msg_rtime;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
compat_ulong_t msg_ctime;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -261,12 +261,12 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t shm_dtime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t __pad3;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_atime_high;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_dtime_high;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_ulong_t shm_ctime_high;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
|
|
|
@ -9,9 +9,12 @@ generic-y += errno.h
|
|||
generic-y += fcntl.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += mman.h
|
||||
generic-y += msgbuf.h
|
||||
generic-y += param.h
|
||||
generic-y += poll.h
|
||||
generic-y += resource.h
|
||||
generic-y += sembuf.h
|
||||
generic-y += shmbuf.h
|
||||
generic-y += sockios.h
|
||||
generic-y += swab.h
|
||||
generic-y += termbits.h
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
/* 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 */
|
|
@ -1,30 +0,0 @@
|
|||
/* 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 */
|
|
@ -1,49 +0,0 @@
|
|||
/* 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 {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
unsigned int __pad1;
|
||||
compat_time_t sem_otime;
|
||||
unsigned int __pad2;
|
||||
compat_time_t sem_ctime;
|
||||
unsigned int sem_otime_high;
|
||||
unsigned int sem_otime;
|
||||
unsigned int sem_ctime_high;
|
||||
unsigned int sem_ctime;
|
||||
u32 sem_nsems;
|
||||
u32 __unused1;
|
||||
u32 __unused2;
|
||||
|
@ -203,12 +203,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
unsigned int __pad1;
|
||||
compat_time_t msg_stime;
|
||||
unsigned int __pad2;
|
||||
compat_time_t msg_rtime;
|
||||
unsigned int __pad3;
|
||||
compat_time_t msg_ctime;
|
||||
unsigned int msg_stime_high;
|
||||
unsigned int msg_stime;
|
||||
unsigned int msg_rtime_high;
|
||||
unsigned int msg_rtime;
|
||||
unsigned int msg_ctime_high;
|
||||
unsigned int msg_ctime;
|
||||
unsigned int msg_cbytes;
|
||||
unsigned int msg_qnum;
|
||||
unsigned int msg_qbytes;
|
||||
|
@ -220,12 +220,12 @@ struct compat_msqid64_ds {
|
|||
|
||||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
unsigned int __pad1;
|
||||
compat_time_t shm_atime;
|
||||
unsigned int __pad2;
|
||||
compat_time_t shm_dtime;
|
||||
unsigned int __pad3;
|
||||
compat_time_t shm_ctime;
|
||||
unsigned int shm_atime_high;
|
||||
unsigned int shm_atime;
|
||||
unsigned int shm_dtime_high;
|
||||
unsigned int shm_dtime;
|
||||
unsigned int shm_ctime_high;
|
||||
unsigned int shm_ctime;
|
||||
compat_size_t shm_segsz;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
|
|
|
@ -8,25 +8,22 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
# define PADDING(x)
|
||||
#else
|
||||
# define PADDING(x) unsigned int x;
|
||||
#endif
|
||||
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
PADDING(__pad1)
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
PADDING(__pad2)
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
PADDING(__pad3)
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
|
@ -35,5 +32,4 @@ struct msqid64_ds {
|
|||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
#undef PADDING
|
||||
#endif /* _SPARC_MSGBUF_H */
|
||||
|
|
|
@ -8,25 +8,23 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
# define PADDING(x)
|
||||
#else
|
||||
# define PADDING(x) unsigned int x;
|
||||
#endif
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
PADDING(__pad1)
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
PADDING(__pad2)
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_ctime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
#undef PADDING
|
||||
|
||||
#endif /* _SPARC64_SEMBUF_H */
|
||||
|
|
|
@ -8,24 +8,23 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
# define PADDING(x)
|
||||
#else
|
||||
# define PADDING(x) unsigned int x;
|
||||
#endif
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
PADDING(__pad1)
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
PADDING(__pad2)
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
PADDING(__pad3)
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_dtime_high;
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_ctime_high;
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
#endif
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
|
@ -46,6 +45,4 @@ struct shminfo64 {
|
|||
unsigned long __unused4;
|
||||
};
|
||||
|
||||
#undef PADDING
|
||||
|
||||
#endif /* _SPARC_SHMBUF_H */
|
||||
|
|
|
@ -134,10 +134,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -145,12 +145,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_stime;
|
||||
compat_ulong_t msg_stime_high;
|
||||
compat_ulong_t msg_rtime;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
compat_ulong_t msg_ctime;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -163,12 +163,12 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t shm_dtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_atime_high;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_dtime_high;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_ulong_t shm_ctime_high;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
|
|
|
@ -8,15 +8,24 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 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 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_ulong_t __unused1;
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
__kernel_ulong_t __unused2;
|
||||
#endif
|
||||
__kernel_ulong_t sem_nsems; /* no. of semaphores in array */
|
||||
__kernel_ulong_t __unused3;
|
||||
__kernel_ulong_t __unused4;
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General
|
||||
|
@ -21,19 +20,19 @@
|
|||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#ifdef __XTENSA_EB__
|
||||
unsigned int __unused1;
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
unsigned int __unused2;
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
unsigned int __unused3;
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
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 */
|
||||
#elif defined(__XTENSA_EL__)
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
unsigned int __unused1;
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
unsigned int __unused2;
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
unsigned int __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;
|
||||
#else
|
||||
# error processor byte order undefined!
|
||||
#endif
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*
|
||||
*/
|
||||
|
@ -27,15 +26,15 @@
|
|||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#ifdef __XTENSA_EL__
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
unsigned long __unused1;
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
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;
|
||||
#else
|
||||
unsigned long __unused1;
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
unsigned long __unused2;
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
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 __unused3;
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
*
|
||||
* The shmid64_ds structure for Xtensa architecture.
|
||||
* 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:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
|
@ -20,42 +20,21 @@
|
|||
#ifndef _XTENSA_SHMBUF_H
|
||||
#define _XTENSA_SHMBUF_H
|
||||
|
||||
#if defined (__XTENSA_EL__)
|
||||
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;
|
||||
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;
|
||||
__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;
|
||||
};
|
||||
#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 {
|
||||
unsigned long shmmax;
|
||||
|
|
|
@ -680,8 +680,8 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info);
|
|||
/* 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_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_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_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 __kernel_timespec __user *abs_timeout);
|
||||
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);
|
||||
|
||||
|
@ -698,7 +698,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_semtimedop(int semid, struct sembuf __user *sops,
|
||||
unsigned nsops,
|
||||
const struct timespec __user *timeout);
|
||||
const struct __kernel_timespec __user *timeout);
|
||||
asmlinkage long sys_semop(int semid, struct sembuf __user *sops,
|
||||
unsigned nsops);
|
||||
|
||||
|
|
|
@ -18,31 +18,30 @@
|
|||
* On big-endian systems, the padding is in the wrong place.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if __BITS_PER_LONG == 64
|
||||
__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 */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused3;
|
||||
#else
|
||||
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
|
||||
__kernel_ulong_t msg_cbytes; /* current number of bytes on queue */
|
||||
__kernel_ulong_t msg_qnum; /* number of messages in queue */
|
||||
__kernel_ulong_t msg_qbytes; /* max 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_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
__kernel_ulong_t __unused4;
|
||||
__kernel_ulong_t __unused5;
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
|
||||
#endif /* __ASM_GENERIC_MSGBUF_H */
|
||||
|
|
|
@ -13,23 +13,29 @@
|
|||
* everyone just ended up making identical copies without specific
|
||||
* 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.
|
||||
* On big-endian systems, the padding is in the wrong place.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
* On big-endian systems, the padding is in the wrong place for
|
||||
* historic reasons, so user space has to reconstruct a time_t
|
||||
* 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 ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__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 */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused2;
|
||||
#else
|
||||
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
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused3;
|
||||
|
|
|
@ -19,42 +19,41 @@
|
|||
*
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__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 */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused3;
|
||||
#else
|
||||
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
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
__kernel_ulong_t shm_nattch; /* no. of current attaches */
|
||||
__kernel_ulong_t __unused4;
|
||||
__kernel_ulong_t __unused5;
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
|
||||
struct shminfo64 {
|
||||
__kernel_ulong_t shmmax;
|
||||
__kernel_ulong_t shmmin;
|
||||
__kernel_ulong_t shmmni;
|
||||
__kernel_ulong_t shmseg;
|
||||
__kernel_ulong_t shmall;
|
||||
__kernel_ulong_t __unused1;
|
||||
__kernel_ulong_t __unused2;
|
||||
__kernel_ulong_t __unused3;
|
||||
__kernel_ulong_t __unused4;
|
||||
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_GENERIC_SHMBUF_H */
|
||||
|
|
86
ipc/mqueue.c
86
ipc/mqueue.c
|
@ -691,7 +691,7 @@ static void __do_notify(struct mqueue_inode_info *info)
|
|||
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)
|
||||
{
|
||||
if (get_timespec64(ts, u_abs_timeout))
|
||||
|
@ -1128,7 +1128,7 @@ out:
|
|||
|
||||
SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
|
||||
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;
|
||||
if (u_abs_timeout) {
|
||||
|
@ -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,
|
||||
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;
|
||||
if (u_abs_timeout) {
|
||||
|
@ -1420,6 +1420,47 @@ COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name,
|
|||
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,
|
||||
struct timespec64 *ts)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
static const struct inode_operations mqueue_dir_inode_operations = {
|
||||
|
|
20
ipc/msg.c
20
ipc/msg.c
|
@ -537,6 +537,11 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
|
|||
p->msg_stime = msq->q_stime;
|
||||
p->msg_rtime = msq->q_rtime;
|
||||
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_qnum = msq->q_qnum;
|
||||
p->msg_qbytes = msq->q_qbytes;
|
||||
|
@ -646,9 +651,12 @@ static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in,
|
|||
struct compat_msqid64_ds v;
|
||||
memset(&v, 0, sizeof(v));
|
||||
to_compat_ipc64_perm(&v.msg_perm, &in->msg_perm);
|
||||
v.msg_stime = in->msg_stime;
|
||||
v.msg_rtime = in->msg_rtime;
|
||||
v.msg_ctime = in->msg_ctime;
|
||||
v.msg_stime = lower_32_bits(in->msg_stime);
|
||||
v.msg_stime_high = upper_32_bits(in->msg_stime);
|
||||
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_qnum = in->msg_qnum;
|
||||
v.msg_qbytes = in->msg_qbytes;
|
||||
|
@ -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));
|
||||
} else {
|
||||
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);
|
||||
WRITE_ONCE(msr->r_msg, msg);
|
||||
|
@ -859,7 +867,7 @@ static long do_msgsnd(int msqid, long mtype, void __user *mtext,
|
|||
}
|
||||
|
||||
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)) {
|
||||
/* 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
|
|||
|
||||
list_del(&msg->m_list);
|
||||
msq->q_qnum--;
|
||||
msq->q_rtime = get_seconds();
|
||||
msq->q_rtime = ktime_get_real_seconds();
|
||||
ipc_update_pid(&msq->q_lrpid, task_tgid(current));
|
||||
msq->q_cbytes -= msg->m_ts;
|
||||
atomic_sub(msg->m_ts, &ns->msg_bytes);
|
||||
|
|
27
ipc/sem.c
27
ipc/sem.c
|
@ -70,6 +70,7 @@
|
|||
* The worst-case behavior is nevertheless O(N^2) for N wakeups.
|
||||
*/
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -104,7 +105,7 @@ struct sem {
|
|||
/* that alter the semaphore */
|
||||
struct list_head pending_const; /* pending single-sop operations */
|
||||
/* 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;
|
||||
|
||||
/* One sem_array data structure for each set of semaphores in the system. */
|
||||
|
@ -984,10 +985,10 @@ again:
|
|||
static void set_semotime(struct sem_array *sma, struct sembuf *sops)
|
||||
{
|
||||
if (sops == NULL) {
|
||||
sma->sems[0].sem_otime = get_seconds();
|
||||
sma->sems[0].sem_otime = ktime_get_real_seconds();
|
||||
} else {
|
||||
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,
|
|||
int cmd, struct semid64_ds *semid64)
|
||||
{
|
||||
struct sem_array *sma;
|
||||
time64_t semotime;
|
||||
int id = 0;
|
||||
int err;
|
||||
|
||||
|
@ -1257,8 +1259,13 @@ static int semctl_stat(struct ipc_namespace *ns, int semid,
|
|||
}
|
||||
|
||||
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;
|
||||
#ifndef CONFIG_64BIT
|
||||
semid64->sem_otime_high = semotime >> 32;
|
||||
semid64->sem_ctime_high = sma->sem_ctime >> 32;
|
||||
#endif
|
||||
semid64->sem_nsems = sma->sem_nsems;
|
||||
|
||||
ipc_unlock_object(&sma->sem_perm);
|
||||
|
@ -1704,8 +1711,10 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,
|
|||
struct compat_semid64_ds v;
|
||||
memset(&v, 0, sizeof(v));
|
||||
to_compat_ipc64_perm(&v.sem_perm, &in->sem_perm);
|
||||
v.sem_otime = in->sem_otime;
|
||||
v.sem_ctime = in->sem_ctime;
|
||||
v.sem_otime = lower_32_bits(in->sem_otime);
|
||||
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;
|
||||
return copy_to_user(buf, &v, sizeof(v));
|
||||
} else {
|
||||
|
@ -2168,7 +2177,7 @@ out_free:
|
|||
}
|
||||
|
||||
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) {
|
||||
struct timespec64 ts;
|
||||
|
@ -2180,12 +2189,12 @@ long ksys_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);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned int nsops,
|
||||
const struct compat_timespec __user *timeout)
|
||||
|
|
14
ipc/shm.c
14
ipc/shm.c
|
@ -1002,6 +1002,11 @@ static int shmctl_stat(struct ipc_namespace *ns, int shmid,
|
|||
tbuf->shm_atime = shp->shm_atim;
|
||||
tbuf->shm_dtime = shp->shm_dtim;
|
||||
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_lpid = pid_vnr(shp->shm_lprid);
|
||||
tbuf->shm_nattch = shp->shm_nattch;
|
||||
|
@ -1233,9 +1238,12 @@ static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,
|
|||
struct compat_shmid64_ds v;
|
||||
memset(&v, 0, sizeof(v));
|
||||
to_compat_ipc64_perm(&v.shm_perm, &in->shm_perm);
|
||||
v.shm_atime = in->shm_atime;
|
||||
v.shm_dtime = in->shm_dtime;
|
||||
v.shm_ctime = in->shm_ctime;
|
||||
v.shm_atime = lower_32_bits(in->shm_atime);
|
||||
v.shm_atime_high = upper_32_bits(in->shm_atime);
|
||||
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_nattch = in->shm_nattch;
|
||||
v.shm_cpid = in->shm_cpid;
|
||||
|
|
|
@ -30,9 +30,14 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
|
|||
return ksys_semtimedop(first, (struct sembuf __user *)ptr,
|
||||
second, NULL);
|
||||
case SEMTIMEDOP:
|
||||
return ksys_semtimedop(first, (struct sembuf __user *)ptr,
|
||||
second,
|
||||
(const struct timespec __user *)fifth);
|
||||
if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
|
||||
return ksys_semtimedop(first, ptr, second,
|
||||
(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:
|
||||
return ksys_semget(first, second, third);
|
||||
|
@ -130,6 +135,8 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
|
|||
/* struct sembuf is the same on 32 and 64bit :)) */
|
||||
return ksys_semtimedop(first, compat_ptr(ptr), second, NULL);
|
||||
case SEMTIMEDOP:
|
||||
if (!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
|
||||
return -ENOSYS;
|
||||
return compat_ksys_semtimedop(first, compat_ptr(ptr), second,
|
||||
compat_ptr(fifth));
|
||||
case SEMGET:
|
||||
|
|
|
@ -251,7 +251,7 @@ static inline int compat_ipc_parse_version(int *cmd)
|
|||
/* for __ARCH_WANT_SYS_IPC */
|
||||
long ksys_semtimedop(int semid, struct sembuf __user *tsops,
|
||||
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_semctl(int semid, int semnum, int cmd, unsigned long arg);
|
||||
long ksys_msgget(key_t key, int msgflg);
|
||||
|
@ -265,10 +265,10 @@ long ksys_shmdt(char __user *shmaddr);
|
|||
long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
|
||||
|
||||
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
|
||||
#ifdef CONFIG_COMPAT
|
||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned int nsops,
|
||||
const struct compat_timespec __user *timeout);
|
||||
#ifdef CONFIG_COMPAT
|
||||
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_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
|
||||
|
|
Loading…
Reference in New Issue