Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91b9b0d7 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

y2038: sparc: Extend sysvipc data structures



sparc, uses a nonstandard variation of the generic sysvipc
data structures, intended to have the padding moved around
so it can deal with big-endian 32-bit user space that has
64-bit time_t.

Unlike most architectures, sparc actually succeeded in
defining this right for big-endian CPUs, but as everyone else
got it wrong, we just use the same hack everywhere.

This takes just take the same approach here that we have for
the asm-generic headers and adds separate 32-bit fields for the
upper halves of the timestamps, to let libc deal with the mess
in user space.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent f69c97f6
Loading
Loading
Loading
Loading
+16 −16
Original line number Diff line number Diff line
@@ -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;
+9 −13
Original line number Diff line number Diff line
@@ -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 */
+7 −9
Original line number Diff line number Diff line
@@ -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 */
+9 −12
Original line number Diff line number Diff line
@@ -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 */