[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 ]