about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-06-13 07:33:12 +0000
committerUlrich Drepper <drepper@redhat.com>2000-06-13 07:33:12 +0000
commitab95290c787fb6e22bf03f23059b97559e1ad7d7 (patch)
tree892cff92b6d49d7c99a6d99c077882642fe6eda7
parenta5c88158b6170149fa1b98e1704ed9dcab457314 (diff)
downloadglibc-ab95290c787fb6e22bf03f23059b97559e1ad7d7.tar.gz
glibc-ab95290c787fb6e22bf03f23059b97559e1ad7d7.tar.xz
glibc-ab95290c787fb6e22bf03f23059b97559e1ad7d7.zip
Update.
2000-06-13  Ulrich Drepper  <drepper@redhat.com>

	* misc/sys/cdefs.h: Define __bounded and __unbounded if
	__BOUNDED_POINTERS__ is not defined.

2000-06-07  Greg McGary  <greg@mcgary.org>

	* sysdeps/generic/bp-sym.h: New file.
	* sysdeps/generic/bp-start.h: New file.
	* sysdeps/i386/elf/start.S: Designate BP symbols.
	* sysdeps/generic/libc-start.c: Wrap bounds around
	argv & envp and each of their string members.

2000-06-07  Greg McGary  <greg@mcgary.org>

	* sysdeps/unix/make-syscalls.sh: Add comments to
	output that aid debugging & comprehension.
	Map simple syscall signatures to number of args.
	Generate BP syscall thunk definitions.
	* sysdeps/generic/bp-thunks.h: New file.
	* sysdeps/unix/syscalls.list: Replace arg-count with
	simple return+arg signature.
	* sysdeps/unix/common/syscalls.list: Likewise.
	* sysdeps/unix/inet/syscalls.list: Likewise.
	* sysdeps/unix/mman/syscalls.list: Likewise.
	* sysdeps/unix/sysv/syscalls.list: Likewise.
	* sysdeps/unix/sysv/linux/syscalls.list: Likewise.
	* sysdeps/unix/sysv/linux/i386/syscalls.list: Likewise.

2000-06-07  Greg McGary  <greg@mcgary.org>

	* Makeconfig (CPPFLAGS-.ob): pass -fbounded-pointers for all files
	*.[cS].
	(CFLAGS-.ob): Don't optimize sibling calls.
	(bppfx): New variable.
	* Makerules (elide-bp-thunks): New variable.
	(elide-routines.*): Elide BP-* files for all but *.ob.
	(sources): Include bp-thunks.

	* iconv/gconv_simple.c: Remove unnecessary prototype.

	* iconv/gconv_trans.c: Pretty print.
-rw-r--r--ChangeLog43
-rw-r--r--Makeconfig8
-rw-r--r--Makerules24
-rw-r--r--iconv/gconv_simple.c7
-rw-r--r--iconv/gconv_trans.c6
-rw-r--r--misc/sys/cdefs.h8
-rw-r--r--sysdeps/generic/bp-start.h70
-rw-r--r--sysdeps/generic/bp-sym.h28
-rw-r--r--sysdeps/generic/bp-thunks.h225
-rw-r--r--sysdeps/generic/libc-start.c25
-rw-r--r--sysdeps/i386/elf/start.S8
-rw-r--r--sysdeps/unix/common/syscalls.list30
-rw-r--r--sysdeps/unix/inet/syscalls.list42
-rw-r--r--sysdeps/unix/make-syscalls.sh111
-rw-r--r--sysdeps/unix/mman/syscalls.list10
-rw-r--r--sysdeps/unix/syscalls.list128
-rw-r--r--sysdeps/unix/sysv/linux/i386/syscalls.list10
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list108
-rw-r--r--sysdeps/unix/sysv/syscalls.list28
19 files changed, 674 insertions, 245 deletions
diff --git a/ChangeLog b/ChangeLog
index 18d80d3556..c27dff195f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,48 @@
+2000-06-13  Ulrich Drepper  <drepper@redhat.com>
+
+	* misc/sys/cdefs.h: Define __bounded and __unbounded if
+	__BOUNDED_POINTERS__ is not defined.
+
+2000-06-07  Greg McGary  <greg@mcgary.org>
+
+	* sysdeps/generic/bp-sym.h: New file.
+	* sysdeps/generic/bp-start.h: New file.
+	* sysdeps/i386/elf/start.S: Designate BP symbols.
+	* sysdeps/generic/libc-start.c: Wrap bounds around
+	argv & envp and each of their string members.
+
+2000-06-07  Greg McGary  <greg@mcgary.org>
+
+	* sysdeps/unix/make-syscalls.sh: Add comments to
+	output that aid debugging & comprehension.
+	Map simple syscall signatures to number of args.
+	Generate BP syscall thunk definitions.
+	* sysdeps/generic/bp-thunks.h: New file.
+	* sysdeps/unix/syscalls.list: Replace arg-count with
+	simple return+arg signature.
+	* sysdeps/unix/common/syscalls.list: Likewise.
+	* sysdeps/unix/inet/syscalls.list: Likewise.
+	* sysdeps/unix/mman/syscalls.list: Likewise.
+	* sysdeps/unix/sysv/syscalls.list: Likewise.
+	* sysdeps/unix/sysv/linux/syscalls.list: Likewise.
+	* sysdeps/unix/sysv/linux/i386/syscalls.list: Likewise.
+
+2000-06-07  Greg McGary  <greg@mcgary.org>
+
+	* Makeconfig (CPPFLAGS-.ob): pass -fbounded-pointers for all files
+	*.[cS].
+	(CFLAGS-.ob): Don't optimize sibling calls.
+	(bppfx): New variable.
+	* Makerules (elide-bp-thunks): New variable.
+	(elide-routines.*): Elide BP-* files for all but *.ob.
+	(sources): Include bp-thunks.
+
 2000-06-12  Ulrich Drepper  <drepper@redhat.com>
 
+	* iconv/gconv_simple.c: Remove unnecessary prototype.
+
+	* iconv/gconv_trans.c: Pretty print.
+
 	* elf/elf.h (R_SH_NUM): Got accidently dropped.
 
 	* sysdeps/unix/sysv/linux/configure.in: Improve handling of
diff --git a/Makeconfig b/Makeconfig
index 441ee06273..f087137d1b 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -619,7 +619,7 @@ CFLAGS-.op = -pg
 libtype.op = lib%_p.a
 endif
 ifeq (yes,$(build-omitfp))
-# Under --enable-omitfp, we build an the library optimized without
+# Under --enable-omitfp, we build the library optimized without
 # debugging information using -fomit-frame-pointer, and build an extra
 # library with debugging information.  The debuggable objects are named foo.og.
 object-suffixes += .og
@@ -629,12 +629,14 @@ CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) -g0 -O99 -fomit-frame-pointer -D
 CFLAGS-.os += -g0 -O99 -fomit-frame-pointer -D__USE_STRING_INLINES
 libtype.og = lib%_g.a
 endif
+
+bppfx = BP-
 ifeq (yes,$(build-bounded))
 # Under --enable-bounded, we build the library with `-fbounded-pointers -g'
 # to runtime bounds checking.  The bounded-pointer objects are named foo.ob.
 object-suffixes += .ob
-CPPFLAGS-.ob = -DBOUNDED_POINTERS $(pic-default)
-CFLAGS-.ob = -g -fbounded-pointers
+CPPFLAGS-.ob = -fbounded-pointers $(pic-default)
+CFLAGS-.ob = -g -O2 -fno-optimize-sibling-calls
 libtype.ob = lib%_b.a
 endif
 
diff --git a/Makerules b/Makerules
index baeb9b6ab0..f334c8c171 100644
--- a/Makerules
+++ b/Makerules
@@ -418,15 +418,19 @@ ifndef libc.so-version
 static-only-routines =
 endif
 
+# Bounded pointer thunks are only built for *.ob
+elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+
 elide-routines.oS += $(filter-out $(static-only-routines),\
-				  $(routines) $(aux) $(sysdep_routines))
-elide-routines.os += $(static-only-routines)
+				  $(routines) $(aux) $(sysdep_routines)) \
+		     $(elide-bp-thunks)
+elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
 
 # If we have versioned code we don't need the old versions in any of the
 # static libraries.
-elide-routines.o  += $(shared-only-routines)
-elide-routines.op += $(shared-only-routines)
-elide-routines.og += $(shared-only-routines)
+elide-routines.o  += $(shared-only-routines) $(elide-bp-thunks)
+elide-routines.op += $(shared-only-routines) $(elide-bp-thunks)
+elide-routines.og += $(shared-only-routines) $(elide-bp-thunks)
 elide-routines.ob += $(shared-only-routines)
 
 # Don't try to use -lc when making libc.so itself.
@@ -466,9 +470,13 @@ endif
 
 # Figure out the source filenames in this directory.
 
-override sources	:= $(addsuffix .c,$(filter-out $(elided-routines),\
-						       $(routines) $(aux) \
-						       $(sysdep_routines)))
+override sources := $(addsuffix .c,\
+			$(filter-out $(elided-routines),\
+			    $(routines) $(aux) \
+			    $(sysdep_routines)) \
+			    $(addprefix $(bppfx),\
+				$(filter $(routines) $(sysdep_routines),\
+				    $(bp-thunks))))
 sysdep_routines := $(sysdep_routines)
 
 headers := $(headers) $(sysdep_headers)
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index 188fc04c0e..5033f3ef83 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -789,13 +789,6 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
 #define FUNCTION_NAME		__gconv_transform_internal_ascii
 #define ONE_DIRECTION		1
 
-extern int FUNCTION_NAME (struct __gconv_step *step,
-			  struct __gconv_step_data *data,
-			  const unsigned char **inptrp,
-			  const unsigned char *inend,
-			  unsigned char *outbufstart, size_t *irreversible,
-			  int do_flush, int consume_incomplete);
-
 #define MIN_NEEDED_INPUT	MIN_NEEDED_FROM
 #define MIN_NEEDED_OUTPUT	MIN_NEEDED_TO
 #define LOOPFCT			FROM_LOOP
diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c
index 11c542e744..56c3ff6be6 100644
--- a/iconv/gconv_trans.c
+++ b/iconv/gconv_trans.c
@@ -27,9 +27,9 @@
 int
 gconv_transliterate (struct __gconv_step *step,
 		     struct __gconv_step_data *step_data,
-		     __const unsigned char *inbufstart,
-		     __const unsigned char **inbufp,
-		     __const unsigned char *inbufend,
+		     const unsigned char *inbufstart,
+		     const unsigned char **inbufp,
+		     const unsigned char *inbufend,
 		     unsigned char *outbufstart,
 		     unsigned char **outbufp, unsigned char *outbufend,
 		     size_t *irreversible)
diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index 4d2f8a064a..aaba8a47f8 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -83,6 +83,14 @@
 # define __END_DECLS
 #endif
 
+
+/* Support for bounded pointers.  */
+#ifndef __BOUNDED_POINTERS__
+# define __bounded	/* nothing */
+# define __unbounded	/* nothing */
+#endif
+
+
 /* __asm__ ("xyz") is used throughout the headers to rename functions
    at the assembly language level.  This is wrapped by the __REDIRECT
    macro, in order to support compilers that can do this some other
diff --git a/sysdeps/generic/bp-start.h b/sysdeps/generic/bp-start.h
new file mode 100644
index 0000000000..3c440fdaba
--- /dev/null
+++ b/sysdeps/generic/bp-start.h
@@ -0,0 +1,70 @@
+/* Copyright (C) 2000 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 Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
+#if __BOUNDED_POINTERS__
+
+  /* The command-line arg vector and environment vector come to us from
+     the OS as an unbounded pointer to an array of unbounded strings.
+     The user's main expects argv and __environ to be bounded pointers
+     to arrays of bounded strings.  */
+# define INIT_ARGV_and_ENVIRON \
+  do {									      \
+    int envc;								      \
+    for (envc = 0; *ubp_ev; ubp_ev++, envc++)				      \
+      ;									      \
+    ubp_ev -= envc;							      \
+									      \
+    /* GKM FIXME: we could save some space by allocating only enough for      \
+       the additional low & high words, and destructively rewriting	      \
+       argv in place.  */						      \
+    __ptrvalue (argv) = __ptrlow (argv)					      \
+      = alloca ((argc + envc + 2) * sizeof (*argv));			      \
+    __ptrhigh (argv) = __ptrvalue (argv) + argc + 1;			      \
+    __ptrvalue (__environ) = __ptrlow (__environ) = __ptrhigh (argv);	      \
+    __ptrhigh (__environ) = __ptrvalue (__environ) + envc + 1;		      \
+    boundify_vector (__environ, ubp_ev);				      \
+    boundify_vector (argv, ubp_av);					      \
+  } while (0)
+
+
+/* Copy an unbounded vector of unbounded strings into a bounded
+   counterpart.  */
+
+static void
+boundify_vector (char **dest, char *__unbounded *__unbounded src)
+{
+  char *__unbounded s;
+  for (; *src; src++, dest++)
+    {
+      __ptrvalue (*dest) = __ptrlow (*dest) = *src;
+      __ptrhigh (*dest) = src[1];
+    }
+  *dest = 0;
+  /* The OS lays out strings contiguously in vector order,
+     so  */
+  for (s = __ptrvalue (dest[-1]); *s; s++)
+    ;
+  __ptrhigh (dest[-1]) = ++s;
+}
+
+#else
+
+# define INIT_ARGV_and_ENVIRON __environ = ubp_ev
+
+#endif
diff --git a/sysdeps/generic/bp-sym.h b/sysdeps/generic/bp-sym.h
new file mode 100644
index 0000000000..d2b3bd06c5
--- /dev/null
+++ b/sysdeps/generic/bp-sym.h
@@ -0,0 +1,28 @@
+/* Bounded-pointer symbol modifier.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Greg McGary <greg@mcgary.org>
+
+   This file is part of the GNU C Library.  Its master source is NOT part of
+   the C library, however.  The master source lives in the GNU MP Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#define BP_SYM(name) _BP_SYM (name)
+#if __BOUNDED_POINTERS__
+# define _BP_SYM(name) __BP_##name
+#else
+# define _BP_SYM(name) name
+#endif
diff --git a/sysdeps/generic/bp-thunks.h b/sysdeps/generic/bp-thunks.h
new file mode 100644
index 0000000000..eb0a47b2c1
--- /dev/null
+++ b/sysdeps/generic/bp-thunks.h
@@ -0,0 +1,225 @@
+/* Bounded-pointer thunk definitions.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   Contributed by Greg McGary <greg@mcgary.org>
+
+   This file is part of the GNU C Library.  Its master source is NOT part of
+   the C library, however.  The master source lives in the GNU MP Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _bpthunks_h_
+#define _bpthunks_h_
+
+#include <libc-symbols.h>
+
+#define BP_ALIAS(STRONG, ALIAS) weak_alias (__BP_##STRONG, __BP_##ALIAS)
+
+#define PV(P) __ptrvalue (P)
+#define SV(S) __ptrvalue (S)
+#define PB(P) __ptrlow (P)
+#define PE(P) __ptrhigh (P)
+#define voidp void *__bounded
+#define charp char *__bounded
+
+/* GKM FIXME: Add code to check bounds.  Right now, they only strip bounds, */
+
+#define BP_THUNK_i_iiip(NAME) __unbounded { \
+  extern int NAME (int, int, int, void *); \
+  int __BP_##NAME (int i0, int i1, int i2, voidp p3) \
+    { return NAME (i0, i1, i2, PV (p3)); } }
+
+#define BP_THUNK_i_iiipi(NAME) __unbounded { \
+  extern int NAME (int, int, int, void *, int); \
+  int __BP_##NAME (int i0, int i1, int i2, voidp p3, int i4) \
+    { return NAME (i0, i1, i2, PV (p3), i4); } }
+
+#define BP_THUNK_i_iiipp(NAME) __unbounded { \
+  extern int NAME (int, int, int, void *, void *); \
+  int __BP_##NAME (int i0, int i1, int i2, voidp p3, voidp p4) \
+    { return NAME (i0, i1, i2, PV (p3), PV (p4)); } }
+
+#define BP_THUNK_i_iip(NAME) __unbounded { \
+  extern int NAME (int, int, void *); \
+  int __BP_##NAME (int i0, int i1, voidp p2) \
+    { return NAME (i0, i1, PV (p2)); } }
+
+#define BP_THUNK_i_iipi(NAME) __unbounded { \
+  extern int NAME (int, int, void *, int); \
+  int __BP_##NAME (int i0, int i1, voidp p2, int i3) \
+    { return NAME (i0, i1, PV (p2), i3); } }
+
+#define BP_THUNK_i_iipp(NAME) __unbounded { \
+  extern int NAME (int, int, void *, void *); \
+  int __BP_##NAME (int i0, int i1, voidp p2, voidp p3) \
+    { return NAME (i0, i1, PV (p2), PV (p3)); } }
+
+#define BP_THUNK_i_ip(NAME) __unbounded { \
+  extern int NAME (int, void *); \
+  int __BP_##NAME (int i0, voidp p1) \
+    { return NAME (i0, PV (p1)); } }
+
+#define BP_THUNK_i_ipi(NAME) __unbounded { \
+  extern int NAME (int, void *, int); \
+  int __BP_##NAME (int i0, voidp p1, int i2) \
+    { return NAME (i0, PV (p1), i2); } }
+
+#define BP_THUNK_i_ipii(NAME) __unbounded { \
+  extern int NAME (int, void *, int, int); \
+  int __BP_##NAME (int i0, voidp p1, int i2, int i3) \
+    { return NAME (i0, PV (p1), i2, i3); } }
+
+#define BP_THUNK_i_ipiii(NAME) __unbounded { \
+  extern int NAME (int, void *, int, int, int); \
+  int __BP_##NAME (int i0, voidp p1, int i2, int i3, int i4) \
+    { return NAME (i0, PV (p1), i2, i3, i4); } }
+
+#define BP_THUNK_i_ipiipi(NAME) __unbounded { \
+  extern int NAME (int, void *, int, int, void *, int); \
+  int __BP_##NAME (int i0, voidp p1, int i2, int i3, voidp p4, int i5) \
+    { return NAME (i0, PV (p1), i2, i3, PV (p4), i5); } }
+
+#define BP_THUNK_i_ipiipp(NAME) __unbounded { \
+  extern int NAME (int, void *, int, int, void *, void *); \
+  int __BP_##NAME (int i0, voidp p1, int i2, int i3, voidp p4, voidp p5) \
+    { return NAME (i0, PV (p1), i2, i3, PV (p4), PV (p5)); } }
+
+#define BP_THUNK_i_ipip(NAME) __unbounded { \
+  extern int NAME (int, void *, int, void *); \
+  int __BP_##NAME (int i0, voidp p1, int i2, voidp p3) \
+    { return NAME (i0, PV (p1), i2, PV (p3)); } }
+
+#define BP_THUNK_i_ipp(NAME) __unbounded { \
+  extern int NAME (int, void *, void *); \
+  int __BP_##NAME (int i0, voidp p1, voidp p2) \
+    { return NAME (i0, PV (p1), PV (p2)); } }
+
+#define BP_THUNK_i_ippi(NAME) __unbounded { \
+  extern int NAME (int, void *, void *, int); \
+  int __BP_##NAME (int i0, voidp p1, voidp p2, int i3) \
+    { return NAME (i0, PV (p1), PV (p2), i3); } }
+
+#define BP_THUNK_i_ipppp(NAME) __unbounded { \
+  extern int NAME (int, void *, void *, void *, void *); \
+  int __BP_##NAME (int i0, voidp p1, voidp p2, voidp p3, voidp p4) \
+    { return NAME (i0, PV (p1), PV (p2), PV (p3), PV (p4)); } }
+
+#define BP_THUNK_i_isi(NAME) __unbounded { \
+  extern int NAME (int, char *, int); \
+  int __BP_##NAME (int i0, charp s1, int i2) \
+    { return NAME (i0, SV (s1), i2); } }
+
+#define BP_THUNK_i_isip(NAME) __unbounded { \
+  extern int NAME (int, char *, int, void *); \
+  int __BP_##NAME (int i0, charp s1, int i2, voidp p3) \
+    { return NAME (i0, SV (s1), i2, PV (p3)); } }
+
+#define BP_THUNK_i_p(NAME) __unbounded { \
+  extern int NAME (void *); \
+  int __BP_##NAME (voidp p0) \
+    { return NAME (PV (p0)); } }
+
+#define BP_THUNK_i_pi(NAME) __unbounded { \
+  extern int NAME (void *, int); \
+  int __BP_##NAME (voidp p0, int i1) \
+    { return NAME (PV (p0), i1); } }
+
+#define BP_THUNK_i_pii(NAME) __unbounded { \
+  extern int NAME (void *, int, int); \
+  int __BP_##NAME (voidp p0, int i1, int i2) \
+    { return NAME (PV (p0), i1, i2); } }
+
+#define BP_THUNK_i_piii(NAME) __unbounded { \
+  extern int NAME (void *, int, int, int); \
+  int __BP_##NAME (voidp p0, int i1, int i2, int i3) \
+    { return NAME (PV (p0), i1, i2, i3); } }
+
+#define BP_THUNK_i_pp(NAME) __unbounded { \
+  extern int NAME (void *, void *); \
+  int __BP_##NAME (voidp p0, voidp p1) \
+    { return NAME (PV (p0), PV (p1)); } }
+
+#define BP_THUNK_i_pppi(NAME) __unbounded { \
+  extern int NAME (void *, void *, void *, int); \
+  int __BP_##NAME (voidp p0, voidp p1, voidp p2, int i3) \
+    { return NAME (PV (p0), PV (p1), PV (p2), i3); } }
+
+#define BP_THUNK_i_s(NAME) __unbounded { \
+  extern int NAME (char *); \
+  int __BP_##NAME (charp s0) \
+    { return NAME (SV (s0)); } }
+
+#define BP_THUNK_i_si(NAME) __unbounded { \
+  extern int NAME (char *, int); \
+  int __BP_##NAME (charp s0, int i1) \
+    { return NAME (SV (s0), i1); } }
+
+#define BP_THUNK_i_sii(NAME) __unbounded { \
+  extern int NAME (char *, int, int); \
+  int __BP_##NAME (charp s0, int i1, int i2) \
+    { return NAME (SV (s0), i1, i2); } }
+
+#define BP_THUNK_i_sipip(NAME) __unbounded { \
+  extern int NAME (char *, int, void *, int, void *); \
+  int __BP_##NAME (charp s0, int i1, voidp p2, int i3, voidp p4) \
+    { return NAME (SV (s0), i1, PV (p2), i3, PV (p4)); } }
+
+#define BP_THUNK_i_sp(NAME) __unbounded { \
+  extern int NAME (char *, void *); \
+  int __BP_##NAME (charp s0, voidp p1) \
+    { return NAME (SV (s0), PV (p1)); } }
+
+#define BP_THUNK_i_spi(NAME) __unbounded { \
+  extern int NAME (char *, void *, int); \
+  int __BP_##NAME (charp s0, voidp p1, int i2) \
+    { return NAME (SV (s0), PV (p1), i2); } }
+
+#define BP_THUNK_i_spp(NAME) __unbounded { \
+  extern int NAME (char *, void *, void *); \
+  int __BP_##NAME (charp s0, voidp p1, voidp p2) \
+    { return NAME (SV (s0), PV (p1), PV (p2)); } }
+
+#define BP_THUNK_i_ss(NAME) __unbounded { \
+  extern int NAME (char *, char *); \
+  int __BP_##NAME (charp s0, charp s1) \
+    { return NAME (SV (s0), s1); } }
+
+#define BP_THUNK_i_sssip(NAME) __unbounded { \
+  extern int NAME (char *, char *, char *, int, void *); \
+  int __BP_##NAME (charp s0, charp s1, charp s2, int i3, voidp p4) \
+    { return NAME (SV (s0), SV (s1), SV (s2), i3, PV (p4)); } }
+
+/* sstk */
+#define BP_THUNK_p_i(NAME) __unbounded { \
+  extern void *NAME (int); \
+  voidp __BP_##NAME (int i0) \
+    { charp m; PV (m) = PB (m) = NAME (i0); \
+      PE (m) = PV (m) + i0; return m; } }
+
+/* mremap */
+#define BP_THUNK_p_piii(NAME) __unbounded { \
+  extern void *NAME (void *, int, int, int); \
+  voidp __BP_##NAME (voidp p0, int i1, int i2, int i3) \
+    { charp m; PV (m) = PB (m) = NAME (PV (p0), i1, i2, i3); \
+      PE (m) = PV (m) + i2; return m; } }
+
+/* mmap */
+#define BP_THUNK_p_piiiii(NAME) __unbounded { \
+  extern void *NAME (void *, int, int, int, int, int); \
+  voidp __BP_##NAME (voidp p0, int i1, int i2, int i3, int i4, int i5) \
+    { charp m; PV (m) = PB (m) = NAME (PV (p0), i1, i2, i3, i4, i5); \
+      PE (m) = PV (m) + i1; return m; } }
+
+#endif /* _bpthunks_h_ */
diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c
index f5486f91e1..a9517c3218 100644
--- a/sysdeps/generic/libc-start.c
+++ b/sysdeps/generic/libc-start.c
@@ -19,22 +19,34 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <ldsodefs.h>
+#include <bp-start.h>
+#include <bp-sym.h>
 
 extern void __libc_init_first (int argc, char **argv, char **envp);
 
 extern int _dl_starting_up;
 weak_extern (_dl_starting_up)
 extern int __libc_multiple_libcs;
-extern void *__libc_stack_end;
+extern void *__unbounded __libc_stack_end;
 
 /* Prototype for local function.  */
 extern void __libc_check_standard_fds (void);
 
 int
-__libc_start_main (int (*main) (int, char **, char **), int argc,
-		   char **argv, void (*init) (void), void (*fini) (void),
-		   void (*rtld_fini) (void), void *stack_end)
+/* GKM FIXME: GCC: this should get __BP_ prefix by virtue of the
+   BPs in the arglist of startup_info.main and startup_info.init. */
+BP_SYM (__libc_start_main) (int (*main) (int, char **, char **),
+		   int argc, char *__unbounded *__unbounded ubp_av,
+		   void (*init) (void), void (*fini) (void),
+		   void (*rtld_fini) (void), void *__unbounded stack_end)
 {
+  char *__unbounded *__unbounded ubp_ev = &ubp_av[argc + 1];
+#if __BOUNDED_POINTERS__
+  char **argv;
+#else
+# define argv ubp_av
+#endif
+
 #ifndef SHARED
   /* The next variable is only here to work around a bug in gcc <= 2.7.2.2.
      If the address would be taken inside the expression the optimizer
@@ -44,12 +56,11 @@ __libc_start_main (int (*main) (int, char **, char **), int argc,
   __libc_multiple_libcs = dummy_addr && !_dl_starting_up;
 #endif
 
+  INIT_ARGV_and_ENVIRON;
+
   /* Store the lowest stack address.  */
   __libc_stack_end = stack_end;
 
-  /* Set the global _environ variable correctly.  */
-  __environ = &argv[argc + 1];
-
 #ifndef SHARED
   /* Some security at this point.  Prevent starting a SUID binary where
      the standard file descriptors are not opened.  We have to do this
diff --git a/sysdeps/i386/elf/start.S b/sysdeps/i386/elf/start.S
index b5b5f013ef..868323b1b9 100644
--- a/sysdeps/i386/elf/start.S
+++ b/sysdeps/i386/elf/start.S
@@ -1,5 +1,5 @@
 /* Startup code compliant to the ELF i386 ABI.
-   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 2000 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
@@ -36,6 +36,8 @@
 					NULL
 */
 
+#include "bp-sym.h"
+
 	.text
 	.globl _start
 _start:
@@ -70,11 +72,11 @@ _start:
 	pushl %ecx		/* Push second argument: argv.  */
 	pushl %esi		/* Push first argument: argc.  */
 
-	pushl $main
+	pushl $BP_SYM (main)
 
 	/* Call the user's main function, and exit with its value.
 	   But let the libc call main.    */
-	call __libc_start_main
+	call BP_SYM (__libc_start_main)
 
 	hlt			/* Crash if somehow `exit' does return.  */
 
diff --git a/sysdeps/unix/common/syscalls.list b/sysdeps/unix/common/syscalls.list
index 328b395310..899d3b9103 100644
--- a/sysdeps/unix/common/syscalls.list
+++ b/sysdeps/unix/common/syscalls.list
@@ -1,17 +1,17 @@
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
-adjtime		-	adjtime		2	__adjtime	adjtime
-fchmod		-	fchmod		2	__fchmod	fchmod
-fchown		-	fchown		3	__fchown	fchown
-ftruncate	-	ftruncate	2	__ftruncate	ftruncate
-getpgid		-	getpgrp		1	__getpgid	getpgid
-getrusage	-	getrusage	2	__getrusage	getrusage
-gettimeofday	-	gettimeofday	2	__gettimeofday	gettimeofday
-settimeofday	-	settimeofday	2	__settimeofday	settimeofday
-setpgid		-	setpgrp		2	__setpgid	setpgid
-setregid	-	setregid	2	__setregid	setregid
-setreuid	-	setreuid	2	__setreuid	setreuid
-sigaction	-	sigaction	3	__sigaction	sigaction
-sys_lstat	lxstat	lstat		2	__syscall_lstat
-truncate	-	truncate	2	truncate
-vhangup		-	vhangup		1	vhangup
+adjtime		-	adjtime		i:pp	__adjtime	adjtime
+fchmod		-	fchmod		i:ii	__fchmod	fchmod
+fchown		-	fchown		i:iii	__fchown	fchown
+ftruncate	-	ftruncate	i:ii	__ftruncate	ftruncate
+getpgid		-	getpgrp		i:i	__getpgid	getpgid
+getrusage	-	getrusage	i:ip	__getrusage	getrusage
+gettimeofday	-	gettimeofday	i:pp	__gettimeofday	gettimeofday
+settimeofday	-	settimeofday	i:pp	__settimeofday	settimeofday
+setpgid		-	setpgrp		i:ii	__setpgid	setpgid
+setregid	-	setregid	i:ii	__setregid	setregid
+setreuid	-	setreuid	i:ii	__setreuid	setreuid
+sigaction	-	sigaction	i:ipp	__sigaction	sigaction
+sys_lstat	lxstat	lstat		i:sp	__syscall_lstat
+truncate	-	truncate	i:si	truncate
+vhangup		-	vhangup		i:i	vhangup
diff --git a/sysdeps/unix/inet/syscalls.list b/sysdeps/unix/inet/syscalls.list
index 772d2390b5..93ca33ae52 100644
--- a/sysdeps/unix/inet/syscalls.list
+++ b/sysdeps/unix/inet/syscalls.list
@@ -1,23 +1,23 @@
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
-accept		-	accept		3	__libc_accept	accept
-bind		-	bind		3	bind
-connect		-	connect		3	__libc_connect	__connect connect
-gethostid	-	gethostid	0	gethostid
-gethostname	-	gethostname	2	__gethostname	gethostname
-getpeername	-	getpeername	3	getpeername
-getsockname	-	getsockname	3	getsockname
-getsockopt	-	getsockopt	5	getsockopt
-listen		-	listen		2	listen
-recv		-	recv		4	__libc_recv	recv
-recvfrom	-	recvfrom	6	__libc_recvfrom	recvfrom
-recvmsg		-	recvmsg		3	__libc_recvmsg	recvmsg
-send		-	send		4	__libc_send	__send send
-sendmsg		-	sendmsg		3	__libc_sendmsg	sendmsg
-sendto		-	sendto		6	__libc_sendto	sendto
-sethostid	-	sethostid	1	sethostid
-sethostname	-	sethostname	2	sethostname
-setsockopt	-	setsockopt	5	setsockopt
-shutdown	-	shutdown	2	shutdown
-socket		-	socket		3	socket
-socketpair	-	socketpair	4	socketpair
+accept		-	accept		i:ipi	__libc_accept	accept
+bind		-	bind		i:ipi	bind
+connect		-	connect		i:ipi	__libc_connect	__connect connect
+gethostid	-	gethostid	i:	gethostid
+gethostname	-	gethostname	i:si	__gethostname	gethostname
+getpeername	-	getpeername	i:ipi	getpeername
+getsockname	-	getsockname	i:ipi	getsockname
+getsockopt	-	getsockopt	i:iiipp	getsockopt
+listen		-	listen		i:ii	listen
+recv		-	recv		i:ipii	__libc_recv	recv
+recvfrom	-	recvfrom	i:ipiipp	__libc_recvfrom	recvfrom
+recvmsg		-	recvmsg		i:ipi	__libc_recvmsg	recvmsg
+send		-	send		i:ipii	__libc_send	__send send
+sendmsg		-	sendmsg		i:ipi	__libc_sendmsg	sendmsg
+sendto		-	sendto		i:ipiipi	__libc_sendto	sendto
+sethostid	-	sethostid	i:i	sethostid
+sethostname	-	sethostname	i:pi	sethostname
+setsockopt	-	setsockopt	i:iiipi	setsockopt
+shutdown	-	shutdown	i:ii	shutdown
+socket		-	socket		i:iii	socket
+socketpair	-	socketpair	i:iiip	socketpair
diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
index 7aa4b3ea0d..387df6799e 100644
--- a/sysdeps/unix/make-syscalls.sh
+++ b/sysdeps/unix/make-syscalls.sh
@@ -5,47 +5,68 @@
 
 thisdir=$1; shift
 
-# Get the list of system calls for this directory.
-calls=`sed 's/#.*$//
-/^[ 	]*$/d' $thisdir/syscalls.list`
-
+echo ''
+echo \#### DIRECTORY = $thisdir
 # Check each sysdep dir with higher priority than this one,
 # and remove from $calls all the functions found in other dirs.
-for dir in $sysdirs; do
+# Punt when we reach the directory defining these syscalls.
+sysdirs=`for dir in $sysdirs; do
+	 test $dir = $thisdir && break; echo $dir; done`
+echo \#### SYSDIRS = $sysdirs
 
-  # Punt when we reach the directory defining these syscalls.
-  test $dir = $thisdir && break
+# Get the list of system calls for this directory.
+calls=`sed 's/#.*$//
+/^[ 	]*$/d' $thisdir/syscalls.list`
 
+calls=`echo "$calls" |
+while read file caller rest; do
   # Remove each syscall that is implemented by a file in $dir.
   # If a syscall specified a "caller", then only compile that syscall
   # if the caller function is also implemented in this directory.
-  calls=`echo "$calls" | while read file caller rest; do
-	   test -f $dir/$file.c && continue
-	   test -f $dir/$file.S && continue
-	   test -f $dir/$file.s && continue
-	   if test x$caller != x-; then
-	     test -f $dir/$caller.c && continue
-	     test -f $dir/$caller.S && continue
-	     test -f $dir/$caller.s && continue
-	   fi
-	   echo $file $caller $rest
-         done`
-
-done
+  srcfile=-;
+  for dir in $sysdirs; do
+     { test -f $dir/$file.c && srcfile=$dir/$file.c; } ||
+     { test -f $dir/$file.S && srcfile=$dir/$file.S; } ||
+     { test -f $dir/$file.s && srcfile=$dir/$file.s; } ||
+     { test x$caller != x- &&
+	{ { test -f $dir/$caller.c && srcfile=$dir/$caller.c; } ||
+	  { test -f $dir/$caller.S && srcfile=$dir/$caller.S; } ||
+	  { test -f $dir/$caller.s && srcfile=$dir/$caller.s; }; }; } && break;
+  done;
+  echo $file $srcfile $caller $rest;
+done`
 
 # Any calls left?
 test -n "$calls" || exit 0
 
-files=
-
 # Emit rules to compile the syscalls remaining in $calls.
-echo "$calls" | while read file caller syscall nargs strong weak; do
+echo "$calls" | while read file srcfile caller syscall args strong weak; do
+
+# Figure out if $syscall is defined with a number in syscall.h.
+callnum=-
+eval `{ echo "#include <sysdep.h>";
+	echo "callnum=SYS_ify ($syscall)"; } |
+	  $asm_CPP - |grep "^callnum=" |grep -v $syscall`
+
+  # Derive the number of arguments from the argument signature
+  case $args in
+  [0-9]) nargs=$args;;
+  ?:) nargs=0;;
+  ?:?) nargs=1;;
+  ?:??) nargs=2;;
+  ?:???) nargs=3;;
+  ?:????) nargs=4;;
+  ?:?????) nargs=5;;
+  ?:??????) nargs=6;;
+  esac
 
-  # Figure out if $syscall is defined with a number in syscall.h.
-  $asm_CPP - << EOF | grep "^@@@ .*$syscall" >/dev/null && continue
-#include <sysdep.h>
-@@@ SYS_ify ($syscall)
-EOF
+  # Make sure only the first syscall rule is used, if multiple dirs
+  # define the same syscall.
+ echo "#### CALL=$file NUMBER=$callnum ARGS=$args SOURCE=$srcfile"
+ case x$srcfile$callnum in
+ x*-) ;; ### Do nothing for undefined callnum
+ x-*)
+  echo "ifeq (,\$(filter $file,\$(unix-syscalls)))"
 
   case $weak in
   *@*)
@@ -53,11 +74,6 @@ EOF
     echo "ifneq (,\$(filter .os,\$(object-suffixes)))"
     ;;
   esac
-
-  # Make sure only the first syscall rule is used, if multiple dirs
-  # define the same syscall.
-  echo "ifeq (,\$(filter $file,\$(unix-syscalls)))"
-
   # Accumulate the list of syscall files for this directory.
   echo "unix-syscalls += $file"
   test x$caller = x- || echo "unix-extra-syscalls += $file"
@@ -75,7 +91,7 @@ shared-only-routines += $file
 \$(foreach o,\$(object-suffixes),\$(objpfx)$file\$o): \\"
     ;;
   esac
-  echo "\$(common-objpfx)s-proto.d
+  echo "		\$(common-objpfx)s-proto.d
 	(echo '#include <sysdep.h>'; \\
 	 echo 'PSEUDO ($strong, $syscall, $nargs)'; \\
 	 echo '	ret'; \\
@@ -124,8 +140,6 @@ shared-only-routines += $file
   # And finally, pipe this all into the compiler.
   echo '	) | $(COMPILE.S) -x assembler-with-cpp -o $@ -'
 
-  echo endif
-
   case $weak in
   *@*)
     # The versioned symbols are only in the shared library.
@@ -133,4 +147,29 @@ shared-only-routines += $file
     ;;
   esac
 
+  echo endif
+ ;;
+ esac
+
+  case x$callnum,$srcfile,$args in
+  x[0-9]*,-,*[sp]* | x*,*.[sS],*[sp]*)
+    echo "ifeq (,\$(filter $file,\$(bp-thunks)))"
+    echo "bp-thunks += $file";
+    echo "\
+\$(objpfx)\$(bppfx)$file.ob: \$(common-objpfx)s-proto.d
+	(echo '#include <bp-thunks.h>'; \\
+	 echo 'BP_THUNK_`echo $args |tr : _` ($strong)'; \\"
+
+    for name in $weak; do
+      case $name in
+	*@*) ;;
+	*) echo "	 echo 'BP_ALIAS ($strong, $name)'; \\" ;;
+      esac
+    done
+
+    echo '	) | $(COMPILE.c) -x c -o $@ -'
+    echo endif
+    ;;
+  esac
+
 done
diff --git a/sysdeps/unix/mman/syscalls.list b/sysdeps/unix/mman/syscalls.list
index 1d3173eafd..67aa948915 100644
--- a/sysdeps/unix/mman/syscalls.list
+++ b/sysdeps/unix/mman/syscalls.list
@@ -4,8 +4,8 @@
 
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
-madvise		-	madvise		3	madvise
-mmap		-	mmap		6	__mmap		mmap
-mprotect	-	mprotect	3	__mprotect	mprotect
-msync		-	msync		3	__libc_msync	msync
-munmap		-	munmap		2	__munmap	munmap
+madvise		-	madvise		i:pii	madvise
+mmap		-	mmap		p:piiiii	__mmap		mmap
+mprotect	-	mprotect	i:pii	__mprotect	mprotect
+msync		-	msync		i:pii	__libc_msync	msync
+munmap		-	munmap		i:pi	__munmap	munmap
diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list
index 9a39b656b3..9e7c43e83c 100644
--- a/sysdeps/unix/syscalls.list
+++ b/sysdeps/unix/syscalls.list
@@ -1,65 +1,65 @@
-# File name	Caller	Syscall name	# args	Strong name	Weak names
+# File name	Caller	Syscall name	Args	Strong name	Weak names
 
-access		-	access		2	__access	access
-acct		-	acct		1	acct
-chdir		-	chdir		1	__chdir		chdir
-chmod		-	chmod		2	__chmod		chmod
-chown		-	chown		3	__chown		chown
-chroot		-	chroot		1	chroot
-close		-	close		1	__libc_close	__close close
-dup		-	dup		1	__dup		dup
-dup2		-	dup2		2	__dup2		dup2
-fchdir		-	fchdir		1	__fchdir	fchdir
-fcntl		-	fcntl		3	__libc_fcntl	__fcntl fcntl
-fstatfs		-	fstatfs		2	__fstatfs	fstatfs
-fsync		-	fsync		1	__libc_fsync	fsync
-getdomain	-	getdomainname	2	getdomainname
-getgid		-	getgid		0	__getgid	getgid
-getgroups	-	getgroups	2	__getgroups	getgroups
-getitimer	-	getitimer	2	__getitimer	getitimer
-getpid		-	getpid		0	__getpid	getpid
-getpriority	-	getpriority	2	getpriority
-getrlimit	-	getrlimit	2	__getrlimit	getrlimit
-getuid		-	getuid		0	__getuid	getuid
-ioctl		-	ioctl		3	__ioctl		ioctl
-kill		-	kill		2	__kill		kill
-link		-	link		2	__link		link
-lseek		-	lseek		3	__libc_lseek	__lseek lseek
-mkdir		-	mkdir		2	__mkdir		mkdir
-open		-	open		3	__libc_open	__open open
-profil		-	profil		4	profil
-ptrace		-	ptrace		4	ptrace
-read		-	read		3	__libc_read	__read read
-readlink	-	readlink	3	__readlink	readlink
-readv		-	readv		3	__readv		readv
-reboot		-	reboot		1	reboot
-rename		-	rename		2	rename
-rmdir		-	rmdir		1	__rmdir		rmdir
-select		-	select		5	__select	select
-setdomain	-	setdomainname	2	setdomainname
-setegid		-	setegid		1	__setegid	setegid
-seteuid		-	seteuid		1	__seteuid	seteuid
-setgid		-	setgid		1	__setgid	setgid
-setgroups	-	setgroups	2	setgroups
-setitimer	-	setitimer	3	__setitimer	setitimer
-setpriority	-	setpriority	3	setpriority
-setrlimit	-	setrlimit	2	setrlimit
-setsid		-	setsid		0	__setsid	setsid
-settimeofday	-	settimeofday	2	__settimeofday	settimeofday
-setuid		-	setuid		1	__setuid	setuid
-sigsuspend	-	sigsuspend	1	sigsuspend
-sstk		-	sstk		1	sstk
-statfs		-	statfs		2	__statfs	statfs
-swapoff		-	swapoff		1	swapoff
-swapon		-	swapon		1	swapon
-symlink		-	symlink		2	__symlink	symlink
-sync		-	sync		0	sync
-sys_fstat	fxstat	fstat		2	__syscall_fstat
-sys_mknod	xmknod	mknod		3	__syscall_mknod
-sys_stat	xstat	stat		2	__syscall_stat
-umask		-	umask		1	__umask		umask
-uname		-	uname		1	uname
-unlink		-	unlink		1	__unlink	unlink
-utimes		-	utimes		2	__utimes	utimes
-write		-	write		3	__libc_write	__write write
-writev		-	writev		3	__writev	writev
+access		-	access		i:si	__access	access
+acct		-	acct		i:s	acct
+chdir		-	chdir		i:s	__chdir		chdir
+chmod		-	chmod		i:si	__chmod		chmod
+chown		-	chown		i:sii	__chown		chown
+chroot		-	chroot		i:s	chroot
+close		-	close		i:i	__libc_close	__close close
+dup		-	dup		i:i	__dup		dup
+dup2		-	dup2		i:ii	__dup2		dup2
+fchdir		-	fchdir		i:i	__fchdir	fchdir
+fcntl		-	fcntl		i:iip	__libc_fcntl	__fcntl fcntl
+fstatfs		-	fstatfs		i:ip	__fstatfs	fstatfs
+fsync		-	fsync		i:i	__libc_fsync	fsync
+getdomain	-	getdomainname	i:si	getdomainname
+getgid		-	getgid		i:	__getgid	getgid
+getgroups	-	getgroups	i:ip	__getgroups	getgroups
+getitimer	-	getitimer	i:ip	__getitimer	getitimer
+getpid		-	getpid		i:	__getpid	getpid
+getpriority	-	getpriority	i:ii	getpriority
+getrlimit	-	getrlimit	i:ip	__getrlimit	getrlimit
+getuid		-	getuid		i:	__getuid	getuid
+ioctl		-	ioctl		i:iip	__ioctl		ioctl
+kill		-	kill		i:ii	__kill		kill
+link		-	link		i:ss	__link		link
+lseek		-	lseek		i:iii	__libc_lseek	__lseek lseek
+mkdir		-	mkdir		i:si	__mkdir		mkdir
+open		-	open		i:sii	__libc_open	__open open
+profil		-	profil		i:piii	profil
+ptrace		-	ptrace		i:iiii	ptrace
+read		-	read		i:ipi	__libc_read	__read read
+readlink	-	readlink	i:spi	__readlink	readlink
+readv		-	readv		i:ipi	__readv		readv
+reboot		-	reboot		i:i	reboot
+rename		-	rename		i:ss	rename
+rmdir		-	rmdir		i:s	__rmdir		rmdir
+select		-	select		i:ipppp	__select	select
+setdomain	-	setdomainname	i:si	setdomainname
+setegid		-	setegid		i:i	__setegid	setegid
+seteuid		-	seteuid		i:i	__seteuid	seteuid
+setgid		-	setgid		i:i	__setgid	setgid
+setgroups	-	setgroups	i:ip	setgroups
+setitimer	-	setitimer	i:ipp	__setitimer	setitimer
+setpriority	-	setpriority	i:iii	setpriority
+setrlimit	-	setrlimit	i:ip	setrlimit
+setsid		-	setsid		i:	__setsid	setsid
+settimeofday	-	settimeofday	i:pp	__settimeofday	settimeofday
+setuid		-	setuid		i:i	__setuid	setuid
+sigsuspend	-	sigsuspend	i:p	sigsuspend
+sstk		-	sstk		p:i	sstk
+statfs		-	statfs		i:sp	__statfs	statfs
+swapoff		-	swapoff		i:s	swapoff
+swapon		-	swapon		i:s	swapon
+symlink		-	symlink		i:ss	__symlink	symlink
+sync		-	sync		i:	sync
+sys_fstat	fxstat	fstat		i:ip	__syscall_fstat
+sys_mknod	xmknod	mknod		i:pii	__syscall_mknod
+sys_stat	xstat	stat		i:sp	__syscall_stat
+umask		-	umask		i:i	__umask		umask
+uname		-	uname		i:p	uname
+unlink		-	unlink		i:s	__unlink	unlink
+utimes		-	utimes		i:sp	__utimes	utimes
+write		-	write		i:ipi	__libc_write	__write write
+writev		-	writev		i:ipi	__writev	writev
diff --git a/sysdeps/unix/sysv/linux/i386/syscalls.list b/sysdeps/unix/sysv/linux/i386/syscalls.list
index 3cf0d30340..f87c4f7ff1 100644
--- a/sysdeps/unix/sysv/linux/i386/syscalls.list
+++ b/sysdeps/unix/sysv/linux/i386/syscalls.list
@@ -1,6 +1,6 @@
-# File name	Caller	Syscall name	# args	Strong name	Weak names
+# File name	Caller	Syscall name	Args	Strong name	Weak names
 
-modify_ldt	EXTRA	modify_ldt	3	__modify_ldt	modify_ldt
-vm86		-	vm86		1	__vm86		vm86
-oldgetrlimit	EXTRA	getrlimit	2	__old_getrlimit	getrlimit@GLIBC_2.0
-oldsetrlimit	EXTRA	setrlimit	2	__old_setrlimit	setrlimit@GLIBC_2.0
+modify_ldt	EXTRA	modify_ldt	i:ipi	__modify_ldt	modify_ldt
+vm86		-	vm86		i:p	__vm86		vm86
+oldgetrlimit	EXTRA	getrlimit	i:ip	__old_getrlimit	getrlimit@GLIBC_2.0
+oldsetrlimit	EXTRA	setrlimit	i:ip	__old_setrlimit	setrlimit@GLIBC_2.0
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index a0709d8b6b..db05d8766c 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -1,7 +1,7 @@
-# File name	Caller	Syscall name	# args	Strong name	Weak names
+# File name	Caller	Syscall name	Args	Strong name	Weak names
 
-adjtimex	adjtime	adjtimex	1	__adjtimex	adjtimex ntp_adjtime
-bdflush		EXTRA	bdflush		2	bdflush
+adjtimex	adjtime	adjtimex	i:p	__adjtimex	adjtimex ntp_adjtime
+bdflush		EXTRA	bdflush		i:ii	bdflush
 capget		EXTRA	capget		2	capget
 capset		EXTRA	capset		2	capset
 clock_getres	-	clock_getres	2	clock_getres
@@ -9,61 +9,61 @@ clock_gettime	-	clock_gettime	2	clock_gettime
 clock_settime	-	clock_settime	2	clock_settime
 create_module	EXTRA	create_module	3	create_module
 delete_module	EXTRA	delete_module	3	delete_module
-fdatasync	-	fdatasync	1	fdatasync
-flock		-	flock		2	__flock		flock
-fork		-	fork		0	__libc_fork	__fork fork
-get_kernel_syms	EXTRA	get_kernel_syms	1	get_kernel_syms
-getegid		-	getegid		0	__getegid	getegid
-geteuid		-	geteuid		0	__geteuid	geteuid
-getpgid		-	getpgid		1	__getpgid	getpgid
-getpgrp		-	getpgrp		0	getpgrp
-getppid		-	getppid		0	__getppid	getppid
-getsid		-	getsid		1	getsid
+fdatasync	-	fdatasync	i:i	fdatasync
+flock		-	flock		i:ii	__flock		flock
+fork		-	fork		i:	__libc_fork	__fork fork
+get_kernel_syms	EXTRA	get_kernel_syms	i:p	get_kernel_syms
+getegid		-	getegid		i:	__getegid	getegid
+geteuid		-	geteuid		i:	__geteuid	geteuid
+getpgid		-	getpgid		i:i	__getpgid	getpgid
+getpgrp		-	getpgrp		i:	getpgrp
+getppid		-	getppid		i:	__getppid	getppid
+getsid		-	getsid		i:i	getsid
 init_module	EXTRA	init_module	5	init_module
-ioperm		-	ioperm		3	ioperm
-iopl		-	iopl		1	iopl
-klogctl		EXTRA	syslog		3	klogctl
-lchown		-	lchown		3	__lchown	lchown
-madvise		-	madvise		3	posix_madvise	madvise
+ioperm		-	ioperm		i:iii	ioperm
+iopl		-	iopl		i:i	iopl
+klogctl		EXTRA	syslog		i:isi	klogctl
+lchown		-	lchown		i:sii	__lchown	lchown
+madvise		-	madvise		i:pii	posix_madvise	madvise
 mincore		-	mincore		3	mincore
-mlock		EXTRA	mlock		2	__mlock	mlock
-mlockall	EXTRA	mlockall	1	__mlockall	mlockall
-mmap		-	mmap		6	__mmap		mmap
-mount		EXTRA	mount		5	__mount	mount
-mremap		EXTRA	mremap		4	__mremap	mremap
-munlock		EXTRA	munlock		2	__munlock	munlock
-munlockall	EXTRA	munlockall	0	__munlockall	munlockall
-nanosleep	-	nanosleep	2	__libc_nanosleep	__nanosleep nanosleep
-nfsservctl	EXTRA	nfsservctl	3	nfsservctl
-pause		-	pause		0	__libc_pause	pause
-personality	init-first personality	1	__personality	personality
-pipe		-	pipe		1	__pipe		pipe
-prctl		EXTRA	prctl		5	prctl
-query_module	EXTRA	query_module	5	query_module
-quotactl	EXTRA	quotactl	4	quotactl
-sched_getp	-	sched_getparam	2	__sched_getparam	sched_getparam
-sched_gets	-	sched_getscheduler	1	__sched_getscheduler	sched_getscheduler
-sched_primax	-	sched_get_priority_max	1	__sched_get_priority_max	sched_get_priority_max
-sched_primin	-	sched_get_priority_min	1	__sched_get_priority_min	sched_get_priority_min
-sched_rr_gi	-	sched_rr_get_interval	2	__sched_rr_get_interval	sched_rr_get_interval
-sched_setp	-	sched_setparam	2	__sched_setparam	sched_setparam
-sched_sets	-	sched_setscheduler	3	__sched_setscheduler	sched_setscheduler
-sched_yield	-	sched_yield	0	__sched_yield	sched_yield
-select		-	_newselect	5	__select	select
-sendfile	EXTRA	sendfile	4	sendfile
-setfsgid	EXTRA	setfsgid	1	setfsgid
-setfsuid	EXTRA	setfsuid	1	setfsuid
-setpgid		-	setpgid		2	__setpgid	setpgid
-setresuid	EXTRA	setresuid	3	__setresuid	setresuid
-setresgid	EXTRA	setresgid	3	__setresgid	setresgid
-sigaltstack	-	sigaltstack	2	__sigaltstack	sigaltstack
-sysinfo		EXTRA	sysinfo		1	sysinfo
-swapon		-	swapon		2	__swapon	swapon
-swapoff		-	swapoff		1	__swapoff	swapoff
+mlock		EXTRA	mlock		i:pi	__mlock	mlock
+mlockall	EXTRA	mlockall	i:i	__mlockall	mlockall
+mmap		-	mmap		p:piiiii	__mmap		mmap
+mount		EXTRA	mount		i:sssip	__mount	mount
+mremap		EXTRA	mremap		p:piii	__mremap	mremap
+munlock		EXTRA	munlock		i:pi	__munlock	munlock
+munlockall	EXTRA	munlockall	i:	__munlockall	munlockall
+nanosleep	-	nanosleep	i:pp	__libc_nanosleep	__nanosleep nanosleep
+nfsservctl	EXTRA	nfsservctl	i:ipp	nfsservctl
+pause		-	pause		i:	__libc_pause	pause
+personality	init-first personality	i:i	__personality	personality
+pipe		-	pipe		i:p	__pipe		pipe
+prctl		EXTRA	prctl		i:iiiii	prctl
+query_module	EXTRA	query_module	i:sipip	query_module
+quotactl	EXTRA	quotactl	i:isip	quotactl
+sched_getp	-	sched_getparam	i:ip	__sched_getparam	sched_getparam
+sched_gets	-	sched_getscheduler	i:i	__sched_getscheduler	sched_getscheduler
+sched_primax	-	sched_get_priority_max	i:i	__sched_get_priority_max	sched_get_priority_max
+sched_primin	-	sched_get_priority_min	i:i	__sched_get_priority_min	sched_get_priority_min
+sched_rr_gi	-	sched_rr_get_interval	i:ip	__sched_rr_get_interval	sched_rr_get_interval
+sched_setp	-	sched_setparam	i:ip	__sched_setparam	sched_setparam
+sched_sets	-	sched_setscheduler	i:iip	__sched_setscheduler	sched_setscheduler
+sched_yield	-	sched_yield	i:	__sched_yield	sched_yield
+select		-	_newselect	i:ipppp	__select	select
+sendfile	EXTRA	sendfile	i:iipi	sendfile
+setfsgid	EXTRA	setfsgid	i:i	setfsgid
+setfsuid	EXTRA	setfsuid	i:i	setfsuid
+setpgid		-	setpgid		i:ii	__setpgid	setpgid
+setresuid	EXTRA	setresuid	i:iii	__setresuid	setresuid
+setresgid	EXTRA	setresgid	i:iii	__setresgid	setresgid
+sigaltstack	-	sigaltstack	i:pp	__sigaltstack	sigaltstack
+sysinfo		EXTRA	sysinfo		i:p	sysinfo
+swapon		-	swapon		i:si	__swapon	swapon
+swapoff		-	swapoff		i:s	__swapoff	swapoff
 timer_create	-	timer_create	3	timer_create
 timer_delete	-	timer_delete	1	timer_delete
 timer_getoverr	-	timer_getoverrun	1	timer_getoverrun
 timer_gettime	-	timer_gettime	2	timer_gettime
 timer_settime	-	timer_settime	4	timer_settime
-uselib		EXTRA	uselib		1	uselib
-wait4		-	wait4		4	__wait4		wait4
+uselib		EXTRA	uselib		i:s	uselib
+wait4		-	wait4		i:ipip	__wait4		wait4
diff --git a/sysdeps/unix/sysv/syscalls.list b/sysdeps/unix/sysv/syscalls.list
index 4ed36850e6..209d017d18 100644
--- a/sysdeps/unix/sysv/syscalls.list
+++ b/sysdeps/unix/sysv/syscalls.list
@@ -1,16 +1,16 @@
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
-alarm		-	alarm		1	alarm
-ftime		-	ftime		1	ftime
-nice		-	nice		1	nice
-pause		-	pause		0	pause
-poll		-	poll		3	poll
-s_getdents	getdents getdents	3	__getdents
-setrlimit	-	setrlimit	2	setrlimit
-settimeofday	-	settimeofday	2	__settimeofday	settimeofday
-signal		-	signal		2	signal
-stime		-	stime		1	stime
-time		-	time		1	time
-times		-	times		1	__times	times
-ulimit		-	ulimit		2	ulimit
-utime		-	utime		2	utime
+alarm		-	alarm		i:i	alarm
+ftime		-	ftime		i:p	ftime
+nice		-	nice		i:i	nice
+pause		-	pause		i:	pause
+poll		-	poll		i:pii	poll
+s_getdents	getdents getdents	i:ipi	__getdents
+setrlimit	-	setrlimit	i:ip	setrlimit
+settimeofday	-	settimeofday	i:pp	__settimeofday	settimeofday
+signal		-	signal		i:ii	signal
+stime		-	stime		i:p	stime
+time		-	time		i:p	time
+times		-	times		i:p	__times	times
+ulimit		-	ulimit		i:ii	ulimit
+utime		-	utime		i:pp	utime