On 03/07/2010 05:40 PM, Philip A. Prindeville wrote:
> I know we're well behind 0.9.30 (there are various issues relating to
> GCC bumps which in turn rely on libgsm fixes, etc that are slowly being
> worked out that stop us from running something more recent) on the
> astlinux project...  but we're trying workarounds to be able to make
> some progress rather than being roadblocked altogether.
>
> I was trying to add semtimedop() into 0.9.28 based on this posting:
>
> http://lists.busybox.net/pipermail/uclibc-cvs/2008-January/024561.html
>
> but changing __syscall_ipc to use _syscall6 instead of _syscall5 and
> adding an extra 0 parameter everywhere seemed a bit heavy-handed, so I
> tried to do something more lightweight.
>
> Unfortunately, I'm stalled on a couple of issues including how to add
> ASMFMT_6.
>
> Can someone help us out?  This is what we have.
>
> Thanks,
>
> -Philip
>   

Worked it out...


diff -urN ../a/uClibc-0.9.28/include/sys/sem.h uClibc-0.9.28/include/sys/sem.h
--- ../a/uClibc-0.9.28/include/sys/sem.h        2005-08-17 16:49:41.000000000 
-0600
+++ uClibc-0.9.28/include/sys/sem.h     2010-02-06 17:03:30.000000000 -0700
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000, 2003 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
@@ -30,6 +30,11 @@
 /* Get system dependent definition of `struct semid_ds' and more.  */
 #include <bits/sem.h>
 
+#ifdef __USE_GNU
+# define __need_timespec
+# include <time.h>
+#endif
+
 /* The following System V style IPC functions implement a semaphore
    handling.  The definition is found in XPG2.  */
 
@@ -53,6 +58,12 @@
 /* Operate on semaphore.  */
 extern int semop (int __semid, struct sembuf *__sops, size_t __nsops) __THROW;
 
+#ifdef __USE_GNU
+/* Operate on semaphore with timeout.  */
+extern int semtimedop (int __semid, struct sembuf *__sops, size_t __nsops,
+                      __const struct timespec *__timeout) __THROW;
+#endif
+
 __END_DECLS
 
 #endif /* sys/sem.h */
diff -urN ../a/uClibc-0.9.28/libc/misc/sysvipc/ipc.h 
uClibc-0.9.28/libc/misc/sysvipc/ipc.h
--- ../a/uClibc-0.9.28/libc/misc/sysvipc/ipc.h  2005-08-17 16:49:48.000000000 
-0600
+++ uClibc-0.9.28/libc/misc/sysvipc/ipc.h       2010-02-06 17:12:32.000000000 
-0700
@@ -9,12 +9,16 @@
 /* The actual system call: all functions are multiplexed by this.  */
 extern int __syscall_ipc __P((int __call, int __first, int __second,
                                          int __third, void *__ptr));
+extern int __syscall_ipc5 __P((int __call, int __first, int __second,
+                                          int __third, void *__ptr,
+                                          void *__fifth));
 
 
 /* The codes for the functions to use the multiplexer `__syscall_ipc'.  */
 #define IPCOP_semop     1
 #define IPCOP_semget    2
 #define IPCOP_semctl    3
+#define IPCOP_semtimedop 4
 #define IPCOP_msgsnd   11
 #define IPCOP_msgrcv   12
 #define IPCOP_msgget   13
diff -urN ../a/uClibc-0.9.28/libc/misc/sysvipc/Makefile 
uClibc-0.9.28/libc/misc/sysvipc/Makefile
--- ../a/uClibc-0.9.28/libc/misc/sysvipc/Makefile       2005-08-17 
16:49:48.000000000 -0600
+++ uClibc-0.9.28/libc/misc/sysvipc/Makefile    2010-03-07 17:23:13.000000000 
-0700
@@ -27,7 +27,7 @@
 DIRS=
 
 MSRC=sem.c
-MOBJ=semget.o semctl.o semop.o
+MOBJ=semget.o semctl.o semop.o semtimedop.o
 
 MSRC2=shm.c
 MOBJ2=shmat.o shmctl.o shmdt.o shmget.o
@@ -35,7 +35,7 @@
 MSRC3=msgq.c
 MOBJ3=msgctl.o msgget.o msgrcv.o msgsnd.o
 
-CSRC = ftok.c 
+CSRC = ftok.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 OBJS=$(MOBJ) $(MOBJ2) $(MOBJ3) $(COBJS)
diff -urN ../a/uClibc-0.9.28/libc/misc/sysvipc/sem.c 
uClibc-0.9.28/libc/misc/sysvipc/sem.c
--- ../a/uClibc-0.9.28/libc/misc/sysvipc/sem.c  2005-08-17 16:49:48.000000000 
-0600
+++ uClibc-0.9.28/libc/misc/sysvipc/sem.c       2010-02-13 17:58:08.000000000 
-0700
@@ -88,3 +88,18 @@
 }
 #endif
 #endif
+
+#ifdef L_semtimedop
+
+#ifdef __NR_semtimedop
+_syscall4(int, semtimedop, int, semid, struct sembuf *, sops, size_t, nsops, 
const struct timespec *, timeout);
+
+#else
+
+int semtimedop(int semid, struct sembuf *sops, size_t nsops,
+              const struct timespec *timeout)
+{
+    return __syscall_ipc5(IPCOP_semtimedop, semid, nsops, 0, sops, timeout);
+}
+#endif
+#endif
diff -urN ../a/uClibc-0.9.28/libc/misc/sysvipc/semtimedop.c 
uClibc-0.9.28/libc/misc/sysvipc/semtimedop.c
--- ../a/uClibc-0.9.28/libc/misc/sysvipc/semtimedop.c   1969-12-31 
17:00:00.000000000 -0700
+++ uClibc-0.9.28/libc/misc/sysvipc/semtimedop.c        2010-02-13 
17:59:57.000000000 -0700
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_semtimedop
+#include "sem.c"
diff -urN ../a/uClibc-0.9.28/libc/sysdeps/linux/common/bits/syscalls.h 
uClibc-0.9.28/libc/sysdeps/linux/common/bits/syscalls.h
--- ../a/uClibc-0.9.28/libc/sysdeps/linux/common/bits/syscalls.h        
2005-08-17 16:49:42.000000000 -0600
+++ uClibc-0.9.28/libc/sysdeps/linux/common/bits/syscalls.h     2010-03-07 
17:16:40.000000000 -0700
@@ -6,5 +6,5 @@
  */ 
 
 
-#error You have not provided architecture specific _syscall[0-5] macros
+#error You have not provided architecture specific _syscall[0-6] macros
 
diff -urN ../a/uClibc-0.9.28/libc/sysdeps/linux/common/__syscall_ipc.c 
uClibc-0.9.28/libc/sysdeps/linux/common/__syscall_ipc.c
--- ../a/uClibc-0.9.28/libc/sysdeps/linux/common/__syscall_ipc.c        
2005-08-17 16:49:42.000000000 -0600
+++ uClibc-0.9.28/libc/sysdeps/linux/common/__syscall_ipc.c     2010-03-09 
13:52:09.000000000 -0700
@@ -13,4 +13,8 @@
 #define __NR___syscall_ipc __NR_ipc
 _syscall5(int, __syscall_ipc, unsigned int, call, int, first, int, second, int,
                  third, void *, ptr);
+
+#define __NR___syscall_ipc5 __NR_ipc
+_syscall6(int, __syscall_ipc5, unsigned int, call, int, first, int, second, 
int,
+                 third, void *, ptr, void *, ptr2);
 #endif
diff -urN ../a/uClibc-0.9.28/libc/sysdeps/linux/i386/bits/syscalls.h 
uClibc-0.9.28/libc/sysdeps/linux/i386/bits/syscalls.h
--- ../a/uClibc-0.9.28/libc/sysdeps/linux/i386/bits/syscalls.h  2005-08-17 
16:49:43.000000000 -0600
+++ uClibc-0.9.28/libc/sysdeps/linux/i386/bits/syscalls.h       2010-03-09 
13:44:25.000000000 -0700
@@ -100,6 +100,14 @@
 return (type) (INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5)); \
 }
 
+#undef _syscall6
+#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
+         type5,arg5,type6,arg6) \
+type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6) 
\
+{ \
+return (type) (INLINE_SYSCALL(name, 6, arg1, arg2, arg3, arg4, arg5, arg6)); \
+}
+
 #define INLINE_SYSCALL(name, nr, args...) \
   ({                                                                         \
     unsigned int resultvar;                                                  \
@@ -125,6 +133,7 @@
 #define LOADARGS_3     LOADARGS_1
 #define LOADARGS_4     LOADARGS_1
 #define LOADARGS_5     LOADARGS_1
+#define LOADARGS_6     LOADARGS_1
 
 #define RESTOREARGS_0
 #define RESTOREARGS_1 \
@@ -133,6 +142,7 @@
 #define RESTOREARGS_3  RESTOREARGS_1
 #define RESTOREARGS_4  RESTOREARGS_1
 #define RESTOREARGS_5  RESTOREARGS_1
+#define RESTOREARGS_6  RESTOREARGS_1
 
 #define ASMFMT_0()
 #define ASMFMT_1(arg1) \
@@ -145,6 +155,8 @@
        , "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
 #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
        , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
+#define ASMFMT_6(arg1, arg2, arg3, arg4, arg5, arg6) \
+       , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5), "m" (arg6)
 
 
 #endif /* __ASSEMBLER__ */
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to