mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
* sysdeps/generic/bp-checks.h: New file.
* sysdeps/generic/bp-thunks.h: Replace generic thunk definitions with list of #include files. * sysdeps/unix/make-syscalls.sh: Handle new arg signature keyletters a, b, B, f, n, N, P, v, V. Fixup some indentation. Don't generate BP thunk if `V' appears in signature. Generate thunks with complete bounds checks. * sysdeps/unix/syscalls.list: Refine signatures using new keyletters. * sysdeps/unix/inet/syscalls.list: Likewise. * sysdeps/unix/mman/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/powerpc/syscalls.list: Likewise. 2000-07-05 Greg McGary <greg@mcgary.org> * sysdeps/generic/bp-checks.h: New file. * sysdeps/generic/bp-thunks.h: Replace generic thunk definitions with list of #include files. * sysdeps/unix/make-syscalls.sh: Handle new arg signature keyletters a, b, B, f, n, N, P, v, V. Fixup some indentation. Don't generate BP thunk if `V' appears in signature. Generate thunks with complete bounds checks. * sysdeps/unix/syscalls.list: Refine signatures using new keyletters. * sysdeps/unix/inet/syscalls.list: Likewise. * sysdeps/unix/mman/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/powerpc/syscalls.list: Likewise.
This commit is contained in:
parent
77432371ac
commit
34173b51e7
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
||||
2000-07-05 Greg McGary <greg@mcgary.org>
|
||||
|
||||
* sysdeps/generic/bp-checks.h: New file.
|
||||
* sysdeps/generic/bp-thunks.h: Replace generic thunk definitions
|
||||
with list of #include files.
|
||||
* sysdeps/unix/make-syscalls.sh: Handle new arg signature
|
||||
keyletters a, b, B, f, n, N, P, v, V. Fixup some indentation.
|
||||
Don't generate BP thunk if `V' appears in signature.
|
||||
Generate thunks with complete bounds checks.
|
||||
* sysdeps/unix/syscalls.list: Refine signatures using new keyletters.
|
||||
* sysdeps/unix/inet/syscalls.list: Likewise.
|
||||
* sysdeps/unix/mman/syscalls.list: Likewise.
|
||||
* sysdeps/unix/sysv/linux/syscalls.list: Likewise.
|
||||
* sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise.
|
||||
* sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/syscalls.list: Likewise.
|
||||
|
||||
2000-07-05 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/getsysstats.c (get_proc_path): Cache
|
||||
|
98
sysdeps/generic/bp-checks.h
Normal file
98
sysdeps/generic/bp-checks.h
Normal file
@ -0,0 +1,98 @@
|
||||
/* Bounded-pointer checking macros for C.
|
||||
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 _bp_checks_h_
|
||||
# define _bp_checks_h_ 1
|
||||
|
||||
# if !__ASSEMBLER__
|
||||
|
||||
# if __BOUNDED_POINTERS__
|
||||
|
||||
/* GKM FIXME: when gcc is ready, add real bounds checks */
|
||||
# define BOUNDS_VIOLATED (__builtin_trap (), 0)
|
||||
extern int __ubp_memchr (const char *__unbounded, int, unsigned);
|
||||
|
||||
/* Verify that pointer's value >= low. Return pointer value. */
|
||||
# define CHECK_BOUNDS_LOW(ARG) \
|
||||
(((__ptrvalue (ARG) < __ptrlow (ARG)) && BOUNDS_VIOLATED), \
|
||||
__ptrvalue (ARG))
|
||||
|
||||
/* Verify that pointer's value < high. Return pointer value. */
|
||||
# define CHECK_BOUNDS_HIGH(ARG) \
|
||||
(((__ptrvalue (ARG) > __ptrhigh (ARG)) && BOUNDS_VIOLATED), \
|
||||
__ptrvalue (ARG))
|
||||
|
||||
/* Check bounds of a pointer seated to a single object. */
|
||||
# define CHECK_1(ARG) CHECK_N ((ARG), 1)
|
||||
|
||||
/* Same as CHECK_1, but tolerate ARG == NULL. */
|
||||
# define CHECK_1opt(ARG) CHECK_Nopt ((ARG), 1)
|
||||
|
||||
/* Check bounds of a pointer seated to an array of N objects. */
|
||||
# define CHECK_N(ARG, N) \
|
||||
(((__ptrvalue (ARG) < __ptrlow (ARG) \
|
||||
|| __ptrvalue (ARG) + (N) > __ptrhigh (ARG)) \
|
||||
&& BOUNDS_VIOLATED), __ptrvalue (ARG))
|
||||
|
||||
/* Same as CHECK_N, but tolerate ARG == NULL. */
|
||||
# define CHECK_Nopt(ARG, N) \
|
||||
(((__ptrvalue (ARG) \
|
||||
&& (__ptrvalue (ARG) < __ptrlow (ARG) \
|
||||
|| __ptrvalue (ARG) + (N) > __ptrhigh (ARG))) \
|
||||
&& BOUNDS_VIOLATED), __ptrvalue (ARG))
|
||||
|
||||
/* Check for NUL-terminator within string's bounds. */
|
||||
# define CHECK_STRING(ARG) \
|
||||
(((__ptrvalue (ARG) < __ptrlow (ARG) \
|
||||
|| !__ubp_memchr (__ptrvalue (ARG), '\0', \
|
||||
(__ptrhigh (ARG) - __ptrvalue (ARG)))) \
|
||||
&& BOUNDS_VIOLATED), \
|
||||
__ptrvalue (ARG))
|
||||
|
||||
# else /* !__BOUNDED_POINTERS__ */
|
||||
|
||||
/* Do nothing if not compiling with -fbounded-pointers. */
|
||||
|
||||
# define BOUNDS_VIOLATED
|
||||
# define CHECK_BOUNDS_LOW(ARG) (ARG)
|
||||
# define CHECK_BOUNDS_HIGH(ARG) (ARG)
|
||||
# define CHECK_1(ARG) (ARG)
|
||||
# define CHECK_1opt(ARG) (ARG)
|
||||
# define CHECK_N(ARG, N) (ARG)
|
||||
# define CHECK_Nopt(ARG, N) (ARG)
|
||||
# define CHECK_STRING(ARG) (ARG)
|
||||
|
||||
# endif /* !__BOUNDED_POINTERS__ */
|
||||
|
||||
# if defined (_IOC_SIZESHIFT) && defined (_IOC_SIZEBITS)
|
||||
|
||||
/* Extract the size of the ioctl parameter argument and check its bounds. */
|
||||
# define CHECK_IOCTL(ARG, CMD) \
|
||||
CHECK_N ((ARG), (((CMD) >> _IOC_SIZESHIFT) & ((1 << _IOC_SIZEBITS) - 1)))
|
||||
|
||||
# else
|
||||
# define CHECK_IOCTL(ARG, CMD) __ptrvalue (ARG)
|
||||
# endif
|
||||
|
||||
# endif /* !__ASSEMBLER__ */
|
||||
|
||||
#endif /* _bp_checks_h_ */
|
@ -1,4 +1,4 @@
|
||||
/* Bounded-pointer thunk definitions.
|
||||
/* Bounded-pointer syscall thunk support.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Greg McGary <greg@mcgary.org>
|
||||
|
||||
@ -23,203 +23,39 @@
|
||||
#ifndef _bpthunks_h_
|
||||
#define _bpthunks_h_
|
||||
|
||||
/* This header is included by the syscall BP thunks defined in
|
||||
sysd-syscalls, as created by sysdeps/unix/make-syscalls.sh. It
|
||||
includes all headers that contain prototype declarations for system
|
||||
call functions. */
|
||||
|
||||
#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; } }
|
||||
#include <bp-sym.h>
|
||||
#include <bp-checks.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
#include <utime.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/klog.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/quota.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/sendfile.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statfs.h>
|
||||
#include <sys/swap.h>
|
||||
#include <sys/sysinfo.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/timex.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/vm86.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#endif /* _bpthunks_h_ */
|
||||
|
@ -1,23 +1,23 @@
|
||||
# File name Caller Syscall name # args Strong name Weak names
|
||||
|
||||
accept - accept i:ipp __libc_accept accept
|
||||
accept - accept i:ibN __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:ipp getpeername
|
||||
getsockname - getsockname i:ipp getsockname
|
||||
getsockopt - getsockopt i:iiipp getsockopt
|
||||
gethostname - gethostname i:bn __gethostname gethostname
|
||||
getpeername - getpeername i:ibN getpeername
|
||||
getsockname - getsockname i:ibN getsockname
|
||||
getsockopt - getsockopt i:iiiBN getsockopt
|
||||
listen - listen i:ii listen
|
||||
recv - recv i:ipii __libc_recv recv
|
||||
recvfrom - recvfrom i:ipiipp __libc_recvfrom recvfrom
|
||||
recv - recv i:ibni __libc_recv recv
|
||||
recvfrom - recvfrom i:ibnibN __libc_recvfrom recvfrom
|
||||
recvmsg - recvmsg i:ipi __libc_recvmsg recvmsg
|
||||
send - send i:ipii __libc_send __send send
|
||||
send - send i:ibni __libc_send __send send
|
||||
sendmsg - sendmsg i:ipi __libc_sendmsg sendmsg
|
||||
sendto - sendto i:ipiipi __libc_sendto sendto
|
||||
sendto - sendto i:ibnibn __libc_sendto sendto
|
||||
sethostid - sethostid i:i sethostid
|
||||
sethostname - sethostname i:pi sethostname
|
||||
setsockopt - setsockopt i:iiipi setsockopt
|
||||
setsockopt - setsockopt i:iiibn setsockopt
|
||||
shutdown - shutdown i:ii shutdown
|
||||
socket - socket i:iii socket
|
||||
socketpair - socketpair i:iiip socketpair
|
||||
socketpair - socketpair i:iiif socketpair
|
||||
|
@ -3,6 +3,37 @@
|
||||
# Usage: make-syscalls.sh ../sysdeps/unix/common
|
||||
# Expects $sysdirs in environment.
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Syscall Signature Key Letters for BP Thunks:
|
||||
#
|
||||
# a: unchecked address (e.g., 1st arg to mmap)
|
||||
# b: non-NULL buffer (e.g., 2nd arg to read)
|
||||
# B: optionally-NULL buffer (e.g., 4th arg to getsockopt)
|
||||
# f: buffer of 2 ints (e.g., 4th arg to socketpair)
|
||||
# i: scalar (any signedness & size: int, long, long long, enum, whatever)
|
||||
# n: scalar buffer length (e.g., 3rd arg to read)
|
||||
# N: pointer to value/return scalar buffer length (e.g., 6th arg to recvfrom)
|
||||
# p: pointer to typed object (e.g., any non-void* arg)
|
||||
# P: pointer return value (e.g., return value from mmap)
|
||||
# s: string (e.g., 1st arg to open)
|
||||
# v: vararg scalar (e.g., optional 3rd arg to open)
|
||||
# V: vararg pointer (e.g., 3rd arg to fcntl & ioctl)
|
||||
|
||||
ptrlet='[abBfNpPs]'
|
||||
argdig='[1-9]'
|
||||
fixarg='[^vV]'$argdig # fixed args (declare extern)
|
||||
strarg=s$argdig # string arg (check with CHECK_STRING)
|
||||
twoarg=f$argdig # fd pair arg (check with CHECK_N (..., 2)
|
||||
objarg=p$argdig # object arg (check with CHECK_1)
|
||||
ptrarg=$ptrlet$argdig # pointer arg (toss bounds)
|
||||
rtnarg='P'$argdig # pointer return value (add bounds)
|
||||
bufarg='[bB]'$argdig # buffer arg (check with CHECK_N)
|
||||
intarg='[inv]'$argdig # scalar arg
|
||||
borarg='[iv]'$argdig # boring arg (just pass it through)
|
||||
|
||||
##############################################################################
|
||||
|
||||
thisdir=$1; shift
|
||||
|
||||
echo ''
|
||||
@ -40,11 +71,12 @@ done`
|
||||
test -n "$calls" || exit 0
|
||||
|
||||
# Emit rules to compile the syscalls remaining in $calls.
|
||||
echo "$calls" | while read file srcfile caller syscall args 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>";
|
||||
# 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 - |sed -n -e "/^callnum=.*$syscall/d" \
|
||||
-e "/^\(callnum=\)[ ]*\(.*\)/s//\1'\2'/p"`
|
||||
@ -66,7 +98,9 @@ eval `{ echo "#include <sysdep.h>";
|
||||
|
||||
# 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"
|
||||
echo ''
|
||||
echo "#### CALL=$file NUMBER=$callnum ARGS=$args SOURCE=$srcfile"
|
||||
|
||||
case x$srcfile"$callnum" in
|
||||
x*-) ;; ### Do nothing for undefined callnum
|
||||
x-*)
|
||||
@ -156,23 +190,102 @@ shared-only-routines += $file
|
||||
esac
|
||||
|
||||
case x"$callnum",$srcfile,$args in
|
||||
x-,-,*) ;;
|
||||
x*,-,*[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)'; \\"
|
||||
x-,-,* | x*,*.[sS],*V*) ;;
|
||||
x*,-,*$ptrlet* | x*,*.[sS],*$ptrlet*)
|
||||
|
||||
for name in $weak; do
|
||||
case $name in
|
||||
*@*) ;;
|
||||
*) echo " echo 'BP_ALIAS ($strong, $name)'; \\" ;;
|
||||
# find the name without leading underscores
|
||||
set `echo $strong $weak |tr -s ' \t' '\12' |sed '/^_/d'`
|
||||
callname=$1
|
||||
|
||||
# convert signature string to individual numbered arg names
|
||||
# e.g., i:ipbN -> i0 i1 p2 b3 N4
|
||||
set `echo $args |
|
||||
sed -e 's/^\(.\):\(.*\)/\2 \10/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \11/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \12/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \13/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \14/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \15/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \16/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \17/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \18/' \
|
||||
-e 's/^\([^ ]\)\(.*\)/\2 \19/'`
|
||||
rtn=$1; shift
|
||||
args=$*
|
||||
arglist=`echo $* |sed 's/ /, /g'`
|
||||
|
||||
# The best way to understand what's going on here is to examine
|
||||
# the output in BUILDDIR/sysd-syscalls.
|
||||
|
||||
# generate makefile envelope & rule head
|
||||
echo "ifeq (,\$(filter $file,\$(bp-thunks)))"
|
||||
echo "bp-thunks += $file"
|
||||
echo "\$(objpfx)\$(bppfx)$file.ob: \$(common-objpfx)s-proto.d"
|
||||
|
||||
# generate macro head & thunk prologue
|
||||
echo "\
|
||||
(echo '#define $callname($arglist) r0, $rtn; \\'; \\
|
||||
echo '`echo $args | \
|
||||
sed -e 's/\('$fixarg'\)/extern \1, \1v;/g' \
|
||||
-e 's/\(v'$argdig'\)/extern int \1v;/g'` \\'; \\
|
||||
echo '__typeof (r0) BP_SYM ($strong) (`echo $args | \
|
||||
sed -e 's/ /, /g' \
|
||||
-e 's/\('$ptrarg'\)/__typeof (\1v) *__bounded \1a/g' \
|
||||
-e 's/\('$intarg'\)/__typeof (\1v) \1a/g'`) { \\'; \\
|
||||
echo ' extern __typeof (r0) ($callname) (`echo $args | \
|
||||
sed -e 's/ /, /g' \
|
||||
-e 's/\('$ptrarg'\)/__typeof (\1v) *__unbounded/g' \
|
||||
-e 's/\('$intarg'\)/__typeof (\1v)/g'`); \\'; \\"
|
||||
|
||||
# generate thunk bounds checks
|
||||
for arg; do
|
||||
next=$2; shift
|
||||
case $arg in
|
||||
B$argdig) echo " echo ' __ptrvalue (${arg}a) && \\'; \\" ;;
|
||||
esac
|
||||
case $arg in
|
||||
n$argdig) len=$arg ;; ### save for possible use with return value.
|
||||
$strarg) echo " echo ' CHECK_STRING (${arg}a); \\'; \\" ;;
|
||||
$objarg) echo " echo ' CHECK_1 (${arg}a); \\'; \\" ;;
|
||||
$twoarg) echo " echo ' CHECK_N (${arg}a, 2); \\'; \\" ;;
|
||||
$bufarg)
|
||||
case $next in
|
||||
n$argdig) echo " echo ' CHECK_N (${arg}a, ${next}a); \\'; \\" ;;
|
||||
N$argdig) echo " echo ' CHECK_N (${arg}a, *CHECK_1 (${next}a)); \\'; \\" ;;
|
||||
*) echo "### BP Thunk Error: Expected length after buffer ###" ;;
|
||||
esac ;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo ' ) | $(COMPILE.c) -x c -o $@ -'
|
||||
# generate thunk epilogue
|
||||
funcall="($callname) (`echo $args | \
|
||||
sed -e 's/ /, /g' \
|
||||
-e 's/\('$ptrarg'\)/__ptrvalue (\1a)/g' \
|
||||
-e 's/\('$intarg'\)/\1a/g'`)"
|
||||
case $rtn in
|
||||
P*) echo " echo '{ __typeof ($rtn) *__bounded rtn; \\'; \\
|
||||
echo ' __ptrlow (rtn) = __ptrvalue (rtn) = $funcall; \\'; \\
|
||||
echo ' __ptrhigh (rtn) = __ptrlow (rtn) + ${len}a; return rtn; } \\'; \\" ;;
|
||||
*) echo " echo ' return $funcall; \\'; \\" ;;
|
||||
esac
|
||||
echo " echo '} \\'; \\"
|
||||
|
||||
# generate thunk aliases
|
||||
for name in $weak; do
|
||||
case $name in
|
||||
*@*) ;;
|
||||
*) echo " echo 'weak_alias (BP_SYM ($strong), BP_SYM ($name)) \\'; \\" ;;
|
||||
esac
|
||||
done
|
||||
# wrap up
|
||||
echo "\
|
||||
echo ''; \\
|
||||
echo '#include <bp-thunks.h>'; \\
|
||||
) | \$(COMPILE.c) -x c -o \$@ -"
|
||||
### Use this for debugging intermediate output:
|
||||
### echo ' ) >$(@:.ob=.c)
|
||||
### $(subst -c,-E,$(COMPILE.c)) -o $(@:.ob=.ib) $(@:.ob=.c)
|
||||
### $(COMPILE.c) -x cpp-output -o $@ $(@:.ob=.ib)'
|
||||
echo endif
|
||||
;;
|
||||
esac
|
||||
|
@ -5,7 +5,7 @@
|
||||
# File name Caller Syscall name # args Strong name Weak names
|
||||
|
||||
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
|
||||
mmap - mmap P:aniiii __mmap mmap
|
||||
mprotect - mprotect i:aii __mprotect mprotect
|
||||
msync - msync i:aii __libc_msync msync
|
||||
munmap - munmap i:ai __munmap munmap
|
||||
|
@ -10,7 +10,7 @@ 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
|
||||
fcntl - fcntl i:iiV __libc_fcntl __fcntl fcntl
|
||||
fstatfs - fstatfs i:ip __fstatfs fstatfs
|
||||
fsync - fsync i:i __libc_fsync fsync
|
||||
getdomain - getdomainname i:si getdomainname
|
||||
@ -21,15 +21,15 @@ 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
|
||||
ioctl - ioctl i:iiV __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
|
||||
open - open i:siv __libc_open __open open
|
||||
profil - profil i:piii profil
|
||||
ptrace - ptrace i:iiii ptrace
|
||||
read - read i:ipi __libc_read __read read
|
||||
read - read i:ibn __libc_read __read read
|
||||
readlink - readlink i:spi __readlink readlink
|
||||
readv - readv i:ipi __readv readv
|
||||
reboot - reboot i:i reboot
|
||||
@ -61,5 +61,5 @@ 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
|
||||
write - write i:ibn __libc_write __write write
|
||||
writev - writev i:ipi __writev writev
|
||||
|
@ -8,15 +8,15 @@ pread - pread 4 __syscall_pread __syscall_pread64 __pread pread __pread64 prea
|
||||
pwrite - pwrite 4 __syscall_pwrite __syscall_pwrite64 __pwrite pwrite __pwrite64 pwrite64
|
||||
fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64
|
||||
statfs - statfs i:sp __statfs statfs statfs64
|
||||
mmap - mmap 6 __mmap mmap __mmap64 mmap64
|
||||
mmap - mmap P:aniiii __mmap mmap __mmap64 mmap64
|
||||
getpeername - getpeername i:ipp __getpeername getpeername
|
||||
getpriority - getpriority i:ii __getpriority getpriority
|
||||
|
||||
# semaphore and shm system calls
|
||||
msgctl - msgctl i:iip __msgctl msgctl
|
||||
msgget - msgget i:ii __msgget msgget
|
||||
msgrcv - msgrcv i:ipiii __msgrcv msgrcv
|
||||
msgsnd - msgsnd i:ipii __msgsnd msgsnd
|
||||
msgrcv - msgrcv i:ibnii __msgrcv msgrcv
|
||||
msgsnd - msgsnd i:ibni __msgsnd msgsnd
|
||||
shmat - shmat i:ipi __shmat shmat
|
||||
shmctl - shmctl i:iip __shmctl shmctl
|
||||
shmdt - shmdt i:s __shmdt shmdt
|
||||
@ -31,18 +31,18 @@ bind - bind i:ipi __bind bind
|
||||
connect - connect i:ipi __libc_connect __connect connect
|
||||
getpeername - getpeername i:ipp __getpeername getpeername
|
||||
getsockname - getsockname i:ipp __getsockname getsockname
|
||||
getsockopt - getsockopt i:iiipp __getsockopt getsockopt
|
||||
getsockopt - getsockopt i:iiiBN __getsockopt getsockopt
|
||||
listen - listen i:ii __listen listen
|
||||
recv - recv i:ipii __libc_recv __recv recv
|
||||
recvfrom - recvfrom i:ipiipp __libc_recvfrom __recvfrom recvfrom
|
||||
recv - recv i:ibni __libc_recv __recv recv
|
||||
recvfrom - recvfrom i:ibnibN __libc_recvfrom __recvfrom recvfrom
|
||||
recvmsg - recvmsg i:ipi __libc_recvmsg recvmsg
|
||||
send - send i:ipii __libc_send __send send
|
||||
send - send i:ibni __libc_send __send send
|
||||
sendmsg - sendmsg i:ipi __libc_sendmsg sendmsg
|
||||
sendto - sendto i:ipiipi __libc_sendto __sendto sendto
|
||||
setsockopt - setsockopt i:iiipi __setsockopt setsockopt
|
||||
sendto - sendto i:ibnibn __libc_sendto __sendto sendto
|
||||
setsockopt - setsockopt i:iiibn __setsockopt setsockopt
|
||||
shutdown - shutdown i:ii __shutdown shutdown
|
||||
socket - socket i:iii __socket socket
|
||||
socketpair - socketpair i:iiip __socketpair socketpair
|
||||
socketpair - socketpair i:iiif __socketpair socketpair
|
||||
|
||||
# DIG-compliant access to PCI configuration space:
|
||||
pciconfig_read EXTRA pciconfig_read 5 pciconfig_read
|
||||
@ -57,7 +57,7 @@ getresgid - getresgid i:ppp getresgid
|
||||
rt_sigaction EXTRA rt_sigaction i:ippi __syscall_rt_sigaction rt_sigaction
|
||||
rt_sigpending EXTRA rt_sigpending i:pi __syscall_rt_sigpending rt_sigpending
|
||||
rt_sigprocmask EXTRA rt_sigprocmask i:ippi __syscall_rt_sigprocmask rt_sigprocmask
|
||||
rt_sigqueueinfo EXTRA rt_sigqueueinfo i:iip __syscall_rt_sigqueueinfo rt_sigqueueinfo
|
||||
rt_sigqueueinfo EXTRA rt_sigqueueinfo i:iip __syscall_rt_sigqueueinfo rt_sigqueueinfo
|
||||
rt_sigsuspend EXTRA rt_sigsuspend i:pi __syscall_rt_sigsuspend rt_sigsuspend
|
||||
rt_sigtimedwait EXTRA rt_sigtimedwait i:pppi __syscall_rt_sigtimedwait rt_sigtimedwait
|
||||
|
||||
|
@ -21,18 +21,18 @@ bind - bind i:ipi __bind bind
|
||||
connect - connect i:ipi __libc_connect __connect connect
|
||||
getpeername - getpeername i:ipp __getpeername getpeername
|
||||
getsockname - getsockname i:ipp __getsockname getsockname
|
||||
getsockopt - getsockopt i:iiipp __getsockopt getsockopt
|
||||
getsockopt - getsockopt i:iiiBN __getsockopt getsockopt
|
||||
listen - listen i:ii __listen listen
|
||||
recv - recv i:ipii __libc_recv __recv recv
|
||||
recvfrom - recvfrom i:ipiipp __libc_recvfrom __recvfrom recvfrom
|
||||
recv - recv i:ibni __libc_recv __recv recv
|
||||
recvfrom - recvfrom i:ibnibN __libc_recvfrom __recvfrom recvfrom
|
||||
recvmsg - recvmsg i:ipi __libc_recvmsg __recvmsg recvmsg
|
||||
send - send i:ipii __libc_send __send send
|
||||
send - send i:ibni __libc_send __send send
|
||||
sendmsg - sendmsg i:ipi __libc_sendmsg __sendmsg sendmsg
|
||||
sendto - sendto i:ipiipi __libc_sendto __sendto sendto
|
||||
setsockopt - setsockopt i:iiipi __setsockopt setsockopt
|
||||
sendto - sendto i:ibnibn __libc_sendto __sendto sendto
|
||||
setsockopt - setsockopt i:iiibn __setsockopt setsockopt
|
||||
shutdown - shutdown i:ii __shutdown shutdown
|
||||
socket - socket i:iii __socket socket
|
||||
socketpair - socketpair i:iiip __socketpair socketpair
|
||||
socketpair - socketpair i:iiif __socketpair socketpair
|
||||
|
||||
#
|
||||
# These are defined locally because the caller is also defined in this dir.
|
||||
@ -61,10 +61,10 @@ getresuid - getresuid i:ppp getresuid
|
||||
s_ipc msgget ipc i:iiiip __syscall_ipc
|
||||
s_lstat64 lxstat64 lstat64 i:sp __syscall_lstat64
|
||||
s_poll poll poll i:pii __syscall_poll
|
||||
s_pread64 pread64 pread i:ipiiii __syscall_pread
|
||||
s_pread64 pread64 pread i:ibniii __syscall_pread
|
||||
s_putpmsg putpmsg putpmsg i:ippii __syscall_putpmsg
|
||||
s_ptrace ptrace ptrace i:iipp __syscall_ptrace
|
||||
s_pwrite64 pwrite64 pwrite i:ipiiii __syscall_pwrite
|
||||
s_pwrite64 pwrite64 pwrite i:ibniii __syscall_pwrite
|
||||
s_reboot reboot reboot i:iii __syscall_reboot
|
||||
s_setrlimit setrlimit setrlimit i:ip __syscall_setrlimit
|
||||
s_sigpending sigpending sigpending i:p __syscall_sigpending
|
||||
|
@ -22,12 +22,12 @@ getresgid - getresgid i:ppp getresgid
|
||||
getresuid - getresuid i:ppp getresuid
|
||||
s_getrlimit getrlimit getrlimit i:ip __syscall_getrlimit
|
||||
s_lstat64 lxstat64 lstat64 i:sp __syscall_lstat64
|
||||
s_mmap2 mmap64 mmap2 p:piiiii __syscall_mmap2
|
||||
s_mmap2 mmap64 mmap2 P:aniiii __syscall_mmap2
|
||||
s_poll poll poll i:pii __syscall_poll
|
||||
s_pread64 pread64 pread i:ipiii __syscall_pread
|
||||
s_pread64 pread64 pread i:ibnii __syscall_pread
|
||||
s_ptrace ptrace ptrace i:iipp __syscall_ptrace
|
||||
s_putpmsg putpmsg putpmsg i:ippii __syscall_putpmsg
|
||||
s_pwrite64 pwrite64 pwrite i:ipiii __syscall_pwrite
|
||||
s_pwrite64 pwrite64 pwrite i:ibnii __syscall_pwrite
|
||||
s_reboot reboot reboot i:iii __syscall_reboot
|
||||
s_setrlimit setrlimit setrlimit i:ip __syscall_setrlimit
|
||||
s_sigaction sigaction sigaction i:ipp __syscall_sigaction
|
||||
|
@ -23,18 +23,18 @@ klogctl EXTRA syslog i:isi klogctl
|
||||
lchown - lchown i:sii __lchown lchown
|
||||
madvise - madvise i:pii posix_madvise madvise
|
||||
mincore - mincore i:iip mincore
|
||||
mlock EXTRA mlock i:pi __mlock mlock
|
||||
mlock EXTRA mlock i:bn __mlock mlock
|
||||
mlockall EXTRA mlockall i:i __mlockall mlockall
|
||||
mmap - mmap p:piiiii __mmap mmap
|
||||
mmap - mmap P:aniiii __mmap mmap
|
||||
mount EXTRA mount i:sssip __mount mount
|
||||
mremap EXTRA mremap p:piii __mremap mremap
|
||||
munlock EXTRA munlock i:pi __munlock munlock
|
||||
mremap EXTRA mremap P:aini __mremap mremap
|
||||
munlock EXTRA munlock i:ai __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
|
||||
pipe - pipe i:f __pipe pipe
|
||||
prctl EXTRA prctl i:iiiii prctl
|
||||
query_module EXTRA query_module i:sipip query_module
|
||||
quotactl EXTRA quotactl i:isip quotactl
|
||||
|
Loading…
Reference in New Issue
Block a user