From ab95290c787fb6e22bf03f23059b97559e1ad7d7 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 13 Jun 2000 07:33:12 +0000 Subject: Update. 2000-06-13 Ulrich Drepper * misc/sys/cdefs.h: Define __bounded and __unbounded if __BOUNDED_POINTERS__ is not defined. 2000-06-07 Greg McGary * 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 * 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 * 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. --- sysdeps/generic/bp-start.h | 70 +++++++++ sysdeps/generic/bp-sym.h | 28 ++++ sysdeps/generic/bp-thunks.h | 225 +++++++++++++++++++++++++++++ sysdeps/generic/libc-start.c | 25 +++- sysdeps/i386/elf/start.S | 8 +- sysdeps/unix/common/syscalls.list | 30 ++-- sysdeps/unix/inet/syscalls.list | 42 +++--- sysdeps/unix/make-syscalls.sh | 111 +++++++++----- sysdeps/unix/mman/syscalls.list | 10 +- sysdeps/unix/syscalls.list | 128 ++++++++-------- sysdeps/unix/sysv/linux/i386/syscalls.list | 10 +- sysdeps/unix/sysv/linux/syscalls.list | 108 +++++++------- sysdeps/unix/sysv/syscalls.list | 28 ++-- 13 files changed, 599 insertions(+), 224 deletions(-) create mode 100644 sysdeps/generic/bp-start.h create mode 100644 sysdeps/generic/bp-sym.h create mode 100644 sysdeps/generic/bp-thunks.h (limited to 'sysdeps') 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 + + 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 + + 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 + +#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 #include #include +#include +#include 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 "; + 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 -@@@ 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 '; \\ 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 '; \\ + 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 -- cgit v1.2.3