[parisc-linux] what's up with the ipc syscalls?

Thomas Bogendoerfer tsbogend@alpha.franken.de
Tue, 11 Nov 2003 00:44:14 +0100


On Mon, Nov 03, 2003 at 04:41:19PM -0500, Carlos O'Donell wrote:
> On Mon, Nov 03, 2003 at 09:56:01AM +0100, Thomas Bogendoerfer wrote:
[ stuff about broken ipc syscalls in 2.6 ...]

I had some thoughts about the conversion stuff, I've added to work
around problems introduced because of the change of some structures in
glibc/kernel. I finally realized, that these conversion only works,
if the "old glibc" is still installed together with the old binary.
That's because the newer glibcs don't set the IPC_64 bit when doing 
the syscall, but the old binary still uses the wrong structs, so the
conversion routine never triggers. I think it's really time to remove that
crap. Below is an compiled but not booted patch, which removes it and also
forward ports the necessary bits in ipc/util.c from 2.4. 

If someone also wants to change glibc, feel free. I still think changing
glibc is a bad idea, because this new glibc won't work with a current 2.4
kernel.

Thomas.


Index: arch/parisc/kernel/sys_parisc.c
===================================================================
RCS file: /home/cvs/parisc/linux-2.6/arch/parisc/kernel/sys_parisc.c,v
retrieving revision 1.15
diff -u -p -r1.15 sys_parisc.c
--- arch/parisc/kernel/sys_parisc.c	1 Nov 2003 23:44:02 -0000	1.15
+++ arch/parisc/kernel/sys_parisc.c	10 Nov 2003 23:17:53 -0000
@@ -241,108 +241,6 @@ asmlinkage ssize_t parisc_readahead(int 
 }
 
 /*
- * FIXME, please remove this crap as soon as possible
- *
- * This is here to fix up broken glibc structures, 
- * which are already fixed in newer glibcs
- */
-#include <linux/msg.h>
-#include <linux/sem.h>
-#include <linux/shm.h>
-#include "sys32.h"
-
-struct broken_ipc_perm
-{
-    key_t key;			/* Key.  */
-    uid_t uid;			/* Owner's user ID.  */
-    gid_t gid;			/* Owner's group ID.  */
-    uid_t cuid;			/* Creator's user ID.  */
-    gid_t cgid;			/* Creator's group ID.  */
-    unsigned short int mode;		/* Read/write permission.  */
-    unsigned short int __pad1;
-    unsigned short int seq;		/* Sequence number.  */
-    unsigned short int __pad2;
-    unsigned long int __unused1;
-    unsigned long int __unused2;
-};
-		    
-struct broken_shmid64_ds {
-	struct broken_ipc_perm	shm_perm;	/* operation perms */
-	size_t			shm_segsz;	/* size of segment (bytes) */
-#ifndef __LP64__
-	unsigned int		__pad1;
-#endif
-	__kernel_time_t		shm_atime;	/* last attach time */
-#ifndef __LP64__
-	unsigned int		__pad2;
-#endif
-	__kernel_time_t		shm_dtime;	/* last detach time */
-#ifndef __LP64__
-	unsigned int		__pad3;
-#endif
-	__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 int		shm_nattch;	/* no. of current attaches */
-	unsigned int		__unused1;
-	unsigned int		__unused2;
-};
-
-static void convert_broken_perm (struct broken_ipc_perm *out, struct ipc64_perm *in)
-{
-	out->key  = in->key;
-	out->uid  = in->uid;
-	out->gid  = in->gid;
-	out->cuid = in->cuid;
-	out->cgid = in->cgid;
-	out->mode = in->mode;
-	out->seq  = in->seq;
-}
-
-static int copyout_broken_shmid64(struct broken_shmid64_ds *buf, struct shmid64_ds *sbuf)
-{
-	struct broken_shmid64_ds tbuf;
-	
-	memset(&tbuf, 0, sizeof tbuf);
-	convert_broken_perm (&tbuf.shm_perm, &sbuf->shm_perm);
-	tbuf.shm_segsz = sbuf->shm_segsz;
-	tbuf.shm_atime = sbuf->shm_atime;
-	tbuf.shm_dtime = sbuf->shm_dtime;
-	tbuf.shm_ctime = sbuf->shm_ctime;
-	tbuf.shm_cpid = sbuf->shm_cpid;
-	tbuf.shm_lpid = sbuf->shm_lpid;
-	tbuf.shm_nattch = sbuf->shm_nattch;
-	return copy_to_user(buf, &tbuf, sizeof tbuf) ? -EFAULT : 0;
-}
-
-int sys_msgctl_broken(int msqid, int cmd, struct msqid_ds *buf)
-{
-	return sys_msgctl (msqid, cmd & ~IPC_64, buf);
-}
-
-int sys_semctl_broken(int semid, int semnum, int cmd, union semun arg)
-{
-	return sys_semctl (semid, semnum, cmd & ~IPC_64, arg);
-}
-
-int sys_shmctl_broken(int shmid, int cmd, struct shmid64_ds *buf)
-{
-	struct shmid64_ds sbuf;
-	int err;
-
-	if (cmd & IPC_64) {
-		cmd &= ~IPC_64;
-		if (cmd == IPC_STAT || cmd == SHM_STAT) {
-			KERNEL_SYSCALL(err, sys_shmctl, shmid, cmd, (struct shmid_ds *)&sbuf);
-			if (err == 0)
-				err = copyout_broken_shmid64((struct broken_shmid64_ds *)buf, &sbuf);
-			return err;
-		}
-	}
-	return sys_shmctl (shmid, cmd, (struct shmid_ds *)buf);
-}
-
-/*
  * This changes the io permissions bitmap in the current task.
  */
 asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on)
Index: arch/parisc/kernel/sys_parisc32.c
===================================================================
RCS file: /home/cvs/parisc/linux-2.6/arch/parisc/kernel/sys_parisc32.c,v
retrieving revision 1.11
diff -u -p -r1.11 sys_parisc32.c
--- arch/parisc/kernel/sys_parisc32.c	28 Sep 2003 04:04:52 -0000	1.11
+++ arch/parisc/kernel/sys_parisc32.c	10 Nov 2003 23:19:00 -0000
@@ -1352,12 +1352,10 @@ asmlinkage int sys32_lseek(unsigned int 
 	return sys_lseek(fd, offset, origin);
 }
 
-asmlinkage long sys32_semctl_broken(int semid, int semnum, int cmd, union semun arg)
+asmlinkage long sys32_semctl(int semid, int semnum, int cmd, union semun arg)
 {
         union semun u;
 	
-	cmd &= ~IPC_64; /* should be removed together with the _broken suffix */
-
         if (cmd == SETVAL) {
                 /* Ugh.  arg is a union of int,ptr,ptr,ptr, so is 8 bytes.
                  * The int should be in the first 4, but our argument
Index: arch/parisc/kernel/syscall_table.S
===================================================================
RCS file: /home/cvs/parisc/linux-2.6/arch/parisc/kernel/syscall_table.S,v
retrieving revision 1.2
diff -u -p -r1.2 syscall_table.S
--- arch/parisc/kernel/syscall_table.S	2 Nov 2003 04:40:50 -0000	1.2
+++ arch/parisc/kernel/syscall_table.S	10 Nov 2003 23:18:46 -0000
@@ -260,15 +260,15 @@
 	ENTRY_COMP(recvmsg)
 	ENTRY_SAME(semop)		/* 185 */
 	ENTRY_SAME(semget)
-	ENTRY_DIFF(semctl_broken)
+	ENTRY_DIFF(semctl)
 	ENTRY_DIFF(msgsnd)
 	ENTRY_DIFF(msgrcv)
 	ENTRY_SAME(msgget)		/* 190 */
-	ENTRY_SAME(msgctl_broken)
+	ENTRY_SAME(msgctl)
 	ENTRY_SAME(shmat_wrapper)
 	ENTRY_SAME(shmdt)
 	ENTRY_SAME(shmget)
-	ENTRY_SAME(shmctl_broken)	/* 195 */
+	ENTRY_SAME(shmctl)		/* 195 */
 	ENTRY_SAME(ni_syscall)		/* streams1 */
 	ENTRY_SAME(ni_syscall)		/* streams2 */
 	ENTRY_SAME(lstat64)
Index: ipc/util.c
===================================================================
RCS file: /home/cvs/parisc/linux-2.6/ipc/util.c,v
retrieving revision 1.3
diff -u -p -r1.3 util.c
--- ipc/util.c	8 Oct 2003 20:53:06 -0000	1.3
+++ ipc/util.c	10 Nov 2003 23:19:41 -0000
@@ -509,7 +509,7 @@ int ipc_checkid(struct ipc_ids* ids, str
 	return 0;
 }
 
-#if !defined(__ia64__) && !defined(__x86_64__)
+#if !defined(__ia64__) && !defined(__x86_64__) && !defined(__hppa__)
 
 /**
  *	ipc_parse_version	-	IPC call version
Index: ipc/util.h
===================================================================
RCS file: /home/cvs/parisc/linux-2.6/ipc/util.h,v
retrieving revision 1.1
diff -u -p -r1.1 util.h
--- ipc/util.h	29 Jul 2003 17:02:19 -0000	1.1
+++ ipc/util.h	10 Nov 2003 23:20:13 -0000
@@ -56,7 +56,7 @@ int ipc_checkid(struct ipc_ids* ids, str
 void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
 void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
 
-#if defined(__ia64__) || defined(__x86_64__)
+#if defined(__ia64__) || defined(__x86_64__) || defined(__hppa__)
   /* On IA-64, we always use the "64-bit version" of the IPC structures.  */ 
 # define ipc_parse_version(cmd)	IPC_64
 #else
-- 
Crap can work. Given enough thrust pigs will fly, but it's not necessary a
good idea.                                 [ Alexander Viro on linux-kernel ]