aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-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
13 files changed, 599 insertions, 224 deletions
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