Browse Source

fix sysvipc structures on powerpc

these have been wrong for a long time and were never detected or
corrected. powerpc needs some gratuitous extra padding/reserved slots
in ipc_perm, big-endian ordering for the padding of time_t slots that
was intended by the kernel folks to allow a transition to 64-bit
time_t, and some minor gratuitous reordering of struct members.
Rich Felker 11 years ago
parent
commit
ad66ae93d0
4 changed files with 16 additions and 20 deletions
  1. 3 2
      arch/powerpc/bits/ipc.h
  2. 3 3
      arch/powerpc/bits/msg.h
  3. 5 11
      arch/powerpc/bits/sem.h
  4. 5 4
      arch/powerpc/bits/shm.h

+ 3 - 2
arch/powerpc/bits/ipc.h

@@ -7,8 +7,9 @@ struct ipc_perm
 	gid_t cgid;
 	mode_t mode;
 	int __ipc_perm_seq;
-	long __pad1;
-	long __pad2;
+	int __pad1;
+	long long __pad2;
+	long long __pad3;
 };
 
 #define IPC_64 0x100

+ 3 - 3
arch/powerpc/bits/msg.h

@@ -1,12 +1,12 @@
 struct msqid_ds
 {
 	struct ipc_perm msg_perm;
-	time_t msg_stime;
 	int __unused1;
-	time_t msg_rtime;
+	time_t msg_stime;
 	int __unused2;
-	time_t msg_ctime;
+	time_t msg_rtime;
 	int __unused3;
+	time_t msg_ctime;
 	unsigned long msg_cbytes;
 	msgqnum_t msg_qnum;
 	msglen_t msg_qbytes;

+ 5 - 11
arch/powerpc/bits/sem.h

@@ -1,16 +1,10 @@
 struct semid_ds {
 	struct ipc_perm sem_perm;
+	int __unused1;
 	time_t sem_otime;
-	time_t __unused1;
+	int  __unused2;
 	time_t sem_ctime;
-	time_t __unused2;
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-	unsigned short sem_nsems;
-	char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
-#else
-	char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
-	unsigned short sem_nsems;
-#endif
-	time_t __unused3;
-	time_t __unused4;
+	unsigned short __sem_nsems_pad, sem_nsems;
+	long __unused3;
+	long __unused4;
 };

+ 5 - 4
arch/powerpc/bits/shm.h

@@ -3,13 +3,14 @@
 struct shmid_ds
 {
 	struct ipc_perm shm_perm;
-	size_t shm_segsz;
-	time_t shm_atime;
 	int __unused1;
-	time_t shm_dtime;
+	time_t shm_atime;
 	int __unused2;
-	time_t shm_ctime;
+	time_t shm_dtime;
 	int __unused3;
+	time_t shm_ctime;
+	int __unused4;
+	size_t shm_segsz;
 	pid_t shm_cpid;
 	pid_t shm_lpid;
 	unsigned long shm_nattch;