This is the mail archive of the
libc-ports@sources.redhat.com
mailing list for the libc-ports project.
Re: [PATCH] RE: msgctl() on MIPS, n32 ABI.
On Tue, Jan 23, 2007 at 09:38:43AM -0500, Daniel Jacobowitz wrote:
> On Wed, Jan 10, 2007 at 06:52:56PM +0900, Atsushi Nemoto wrote:
> > The __IPC_64 problem on {shm,sem,msg}ctl is not only for N32. N64
> > also suffers this problem. Certainly glibc can provide wrappers for
> > these system calls, as ARM EABI does. A patch attached.
>
> This patch, unfortunately, is not OK. Before:
> 176: 000d98fc 28 FUNC WEAK DEFAULT 9 shmctl@@GLIBC_2.0
>
> After:
> 1548: 000d9930 72 FUNC GLOBAL DEFAULT 9 shmctl@@GLIBC_2.2
>
> If there isn't a handy version of the file somewhere we can reuse, then
> we'll have to copy it. I'll investigate later today.
Could someone test this version? I'll commit the necessary build fixes
for HEAD in a second.
--
Daniel Jacobowitz
CodeSourcery
2007-01-23 Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Daniel Jacobowitz <dan@codesourcery.com>
* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list: Remove msgctl,
shmctl, and semctl.
* sysdeps/unix/sysv/linux/mips/misp64/semctl.c,
sysdeps/unix/sysv/linux/mips/mips64/shmctl.c,
sysdeps/unix/sysv/linux/mips/mips64/msgctl.c: New files.
Index: sysdeps/unix/sysv/linux/mips/mips64/msgctl.c
===================================================================
RCS file: sysdeps/unix/sysv/linux/mips/mips64/msgctl.c
diff -N sysdeps/unix/sysv/linux/mips/mips64/msgctl.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ sysdeps/unix/sysv/linux/mips/mips64/msgctl.c 23 Jan 2007 16:43:55 -0000
@@ -0,0 +1,35 @@
+/* Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <sys/msg.h>
+#include <ipc_priv.h>
+#include <sysdep.h>
+
+#include <bp-checks.h>
+
+int __msgctl (int msqid, int cmd, struct msqid_ds *buf);
+
+int
+__msgctl (int msqid, int cmd, struct msqid_ds *buf)
+{
+ return INLINE_SYSCALL (msgctl, 3, msqid, cmd | __IPC_64, CHECK_1 (buf));
+}
+
+#include <shlib-compat.h>
+versioned_symbol (libc, __msgctl, msgctl, GLIBC_2_0);
Index: sysdeps/unix/sysv/linux/mips/mips64/semctl.c
===================================================================
RCS file: sysdeps/unix/sysv/linux/mips/mips64/semctl.c
diff -N sysdeps/unix/sysv/linux/mips/mips64/semctl.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ sysdeps/unix/sysv/linux/mips/mips64/semctl.c 23 Jan 2007 16:43:55 -0000
@@ -0,0 +1,57 @@
+/* Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <stdarg.h>
+#include <sys/sem.h>
+#include <ipc_priv.h>
+#include <sysdep.h>
+
+/* Define a `union semun' suitable for Linux here. */
+union semun
+{
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
+ unsigned short int *array; /* array for GETALL & SETALL */
+ struct seminfo *__buf; /* buffer for IPC_INFO */
+};
+
+#include <bp-checks.h>
+#include <bp-semctl.h> /* definition of CHECK_SEMCTL needs union semum */
+
+int __semctl (int semid, int semnum, int cmd, ...);
+
+int
+__semctl (int semid, int semnum, int cmd, ...)
+{
+ union semun arg;
+ va_list ap;
+
+ va_start (ap, cmd);
+
+ /* Get the argument. */
+ arg = va_arg (ap, union semun);
+
+ va_end (ap);
+
+ return INLINE_SYSCALL (semctl, 4, semid, semnum, cmd | __IPC_64,
+ CHECK_SEMCTL (&arg, semid, cmd | __IPC_64)->array);
+}
+
+#include <shlib-compat.h>
+versioned_symbol (libc, __semctl, semctl, GLIBC_2_0);
Index: sysdeps/unix/sysv/linux/mips/mips64/shmctl.c
===================================================================
RCS file: sysdeps/unix/sysv/linux/mips/mips64/shmctl.c
diff -N sysdeps/unix/sysv/linux/mips/mips64/shmctl.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ sysdeps/unix/sysv/linux/mips/mips64/shmctl.c 23 Jan 2007 16:43:55 -0000
@@ -0,0 +1,35 @@
+/* Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <sys/shm.h>
+#include <ipc_priv.h>
+#include <sysdep.h>
+
+#include <bp-checks.h>
+
+int __shmctl (int shmid, int cmd, struct shmid_ds *buf);
+
+int
+__shmctl (int shmid, int cmd, struct shmid_ds *buf)
+{
+ return INLINE_SYSCALL (shmctl, 3, shmid, cmd | __IPC_64, CHECK_1 (buf));
+}
+
+#include <shlib-compat.h>
+versioned_symbol (libc, __shmctl, shmctl, GLIBC_2_0);
Index: sysdeps/unix/sysv/linux/mips/mips64/syscalls.list
===================================================================
RCS file: /cvs/glibc/ports/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list,v
retrieving revision 1.4
diff -u -p -r1.4 syscalls.list
--- sysdeps/unix/sysv/linux/mips/mips64/syscalls.list 3 Mar 2006 01:06:47 -0000 1.4
+++ sysdeps/unix/sysv/linux/mips/mips64/syscalls.list 23 Jan 2007 16:43:55 -0000
@@ -2,16 +2,14 @@
lseek - lseek Ci:iii __libc_lseek __lseek lseek __llseek llseek __libc_lseek64 __lseek64 lseek64
-# semaphore and shm system calls
-msgctl - msgctl i:iip __msgctl msgctl
+# Semaphore and shm system calls. msgctl, shmctl, and semctl have C
+# wrappers (to set __IPC_64).
msgget - msgget i:ii __msgget msgget
msgrcv - msgrcv Ci:ibnii __msgrcv msgrcv
msgsnd - msgsnd Ci:ibni __msgsnd msgsnd
shmat - shmat i:ipi __shmat shmat
-shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semop - semop i:ipi __semop semop
semtimedop - semtimedop i:ipip semtimedop
semget - semget i:iii __semget semget
-semctl - semctl i:iiii __semctl semctl