1999-02-19 03:21:36 +03:00
/*
* Copyright ( c ) 1991 , 1992 Paul Kranenburg < pk @ cs . few . eur . nl >
* Copyright ( c ) 1993 Branko Lankester < branko @ hacktic . nl >
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* $ Id $
*/
2005-02-02 07:44:57 +03:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
2008-05-20 05:11:56 +04:00
# ifdef MIPS
# include <sgidefs.h>
# endif
1999-04-19 02:50:50 +04:00
# ifdef linux
# include <features.h>
# endif
2003-01-14 12:46:18 +03:00
# ifdef _LARGEFILE64_SOURCE
/* This is the macro everything checks before using foo64 names. */
# ifndef _LFS64_LARGEFILE
# define _LFS64_LARGEFILE 1
# endif
# endif
1999-02-19 03:21:36 +03:00
/* configuration section */
# ifndef MAX_QUALS
2002-12-30 03:25:36 +03:00
# if defined(LINUX) && defined(MIPS)
2008-05-20 05:11:56 +04:00
# define MAX_QUALS 7000 /* maximum number of syscalls, signals, etc. */
2000-04-13 21:06:09 +04:00
# else
2000-02-04 00:58:30 +03:00
# define MAX_QUALS 2048 /* maximum number of syscalls, signals, etc. */
1999-02-19 03:21:36 +03:00
# endif
2000-05-01 05:53:59 +04:00
# endif
1999-02-19 03:21:36 +03:00
# ifndef DEFAULT_STRLEN
# define DEFAULT_STRLEN 32 / * default maximum # of bytes printed in
` printstr ' , change with ` - s ' switch */
# endif
# ifndef DEFAULT_ACOLUMN
# define DEFAULT_ACOLUMN 40 /* default alignment column for results */
# endif
# ifndef MAX_ARGS
# define MAX_ARGS 32 /* maximum number of args to a syscall */
# endif
# ifndef DEFAULT_SORTBY
# define DEFAULT_SORTBY "time" /* default sorting method for call profiling */
# endif
# include <sys/types.h>
# include <unistd.h>
# include <stdlib.h>
# include <stdio.h>
# include <ctype.h>
# include <string.h>
2001-02-16 22:59:55 +03:00
# include <time.h>
1999-02-19 03:21:36 +03:00
# include <sys/time.h>
# include <errno.h>
2008-08-01 05:06:31 +04:00
# ifdef HAVE_STDBOOL_H
# include <stdbool.h>
# endif
1999-02-19 03:21:36 +03:00
# ifdef STDC_HEADERS
# include <stddef.h>
# endif /* STDC_HEADERS */
2001-10-18 19:13:53 +04:00
# ifdef HAVE_SIGINFO_T
# include <signal.h>
# endif
1999-11-18 20:09:47 +03:00
# if defined(LINUX)
2004-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# if defined(SPARC) || defined(SPARC64)
1999-11-18 20:09:47 +03:00
# define LINUXSPARC
# endif
# if defined(ALPHA)
# define LINUX_64BIT
# endif
2002-09-23 19:41:01 +04:00
# if defined(X86_64)
# define LINUX_X86_64
# endif
2008-05-20 05:11:56 +04:00
# if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_ABI32
# define LINUX_MIPSO32
# endif
# if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_NABI32
# define LINUX_MIPSN32
# define LINUX_MIPS64
# endif
# if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_ABI64
# define LINUX_MIPSN64
# define LINUX_MIPS64
# endif
2008-12-30 20:50:46 +03:00
# if defined(ARM)
# define LINUX_ARM
# endif
2002-12-18 07:16:10 +03:00
# endif
1999-02-19 03:21:36 +03:00
2000-09-02 01:03:06 +04:00
# if defined(SVR4) || defined(FREEBSD)
# define USE_PROCFS
# else
# undef USE_PROCFS
# endif
# ifdef FREEBSD
# ifndef I386
# error "FreeBSD support is only for i386 arch right now."
# endif
# include <machine/psl.h>
# include <machine/reg.h>
# include <sys/syscall.h>
# endif
# ifdef USE_PROCFS
1999-02-19 03:21:36 +03:00
# include <sys/procfs.h>
1999-11-29 18:34:02 +03:00
# ifdef HAVE_MP_PROCFS
1999-08-30 03:15:07 +04:00
# include <sys/uio.h>
# endif
2000-09-02 01:03:06 +04:00
# ifdef FREEBSD
# include <sys/pioctl.h>
# endif /* FREEBSD */
# else /* !USE_PROCFS */
2008-12-30 20:50:46 +03:00
# if (defined(LINUXSPARC) || defined(LINUX_X86_64) || defined(LINUX_ARM)) && defined(__GLIBC__)
1999-02-19 03:21:36 +03:00
# include <sys/ptrace.h>
# else
/* Work around awkward prototype in ptrace.h. */
# define ptrace xptrace
# include <sys/ptrace.h>
# undef ptrace
# ifdef POWERPC
# define __KERNEL__
# include <asm/ptrace.h>
# undef __KERNEL__
# endif
# ifdef __STDC__
# ifdef LINUX
extern long ptrace ( int , int , char * , long ) ;
# else /* !LINUX */
extern int ptrace ( int , int , char * , int , . . . ) ;
# endif /* !LINUX */
# else /* !__STDC__ */
extern int ptrace ( ) ;
# endif /* !__STDC__ */
# endif /* !LINUXSPARC */
# endif /* !SVR4 */
# ifdef LINUX
1999-04-19 02:50:50 +04:00
# if !defined(__GLIBC__)
1999-02-19 03:21:36 +03:00
# define PTRACE_PEEKUSER PTRACE_PEEKUSR
# define PTRACE_POKEUSER PTRACE_POKEUSR
# endif
# ifdef ALPHA
1999-11-01 00:15:38 +03:00
# define REG_R0 0
# define REG_A0 16
# define REG_A3 19
# define REG_FP 30
# define REG_PC 64
1999-02-19 03:21:36 +03:00
# endif /* ALPHA */
1999-11-01 00:15:38 +03:00
# ifdef MIPS
# define REG_V0 2
# define REG_A0 4
# define REG_A3 7
# define REG_SP 29
# define REG_EPC 64
# endif /* MIPS */
2001-03-27 16:17:16 +04:00
# ifdef HPPA
# define PT_GR20 (20*4)
# define PT_GR26 (26*4)
# define PT_GR28 (28*4)
# define PT_IAOQ0 (106*4)
# define PT_IAOQ1 (107*4)
# endif /* HPPA */
2003-06-27 02:40:42 +04:00
# ifdef SH64
/* SH64 Linux - this code assumes the following kernel API for system calls:
2003-06-02 23:18:58 +04:00
PC Offset 0
System Call Offset 16 ( actually , ( syscall no . ) | ( 0x1 n < < 16 ) ,
where n = no . of parameters .
Other regs Offset 24 +
On entry : R2 - 7 = parameters 1 - 6 ( as many as necessary )
On return : R9 = result . */
/* Offset for peeks of registers */
# define REG_OFFSET (24)
# define REG_GENERAL(x) (8*(x)+REG_OFFSET)
# define REG_PC (0*8)
# define REG_SYSCALL (2*8)
2003-06-27 02:40:42 +04:00
# endif /* SH64 */
1999-02-19 03:21:36 +03:00
# endif /* LINUX */
# define SUPPORTED_PERSONALITIES 1
# define DEFAULT_PERSONALITY 0
# ifdef LINUXSPARC
2006-01-12 13:18:53 +03:00
# define PERSONALITY0_WORDSIZE 4
# define PERSONALITY1_WORDSIZE 4
1999-02-19 03:21:36 +03:00
# undef SUPPORTED_PERSONALITIES
2004-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# if defined(SPARC64)
2007-09-12 05:26:26 +04:00
# include <asm/psrcompat.h>
2004-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# define SUPPORTED_PERSONALITIES 3
2006-01-12 13:18:53 +03:00
# define PERSONALITY2_WORDSIZE 8
2004-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# else
2007-09-12 05:26:26 +04:00
# include <asm/psr.h>
1999-04-19 02:50:50 +04:00
# define SUPPORTED_PERSONALITIES 2
2004-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# endif /* SPARC64 */
1999-02-19 03:21:36 +03:00
# endif /* LINUXSPARC */
2002-09-23 19:41:01 +04:00
# ifdef X86_64
# undef SUPPORTED_PERSONALITIES
# define SUPPORTED_PERSONALITIES 2
2006-01-12 13:18:53 +03:00
# define PERSONALITY0_WORDSIZE 8
# define PERSONALITY1_WORDSIZE 4
2002-12-18 07:16:10 +03:00
# endif
2008-05-20 05:35:55 +04:00
# ifdef ARM
# undef SUPPORTED_PERSONALITIES
# define SUPPORTED_PERSONALITIES 2
# define PERSONALITY0_WORDSIZE 4
# define PERSONALITY1_WORDSIZE 4
# endif
1999-08-30 03:15:07 +04:00
# ifdef SVR4
1999-11-29 18:34:02 +03:00
# ifdef HAVE_MP_PROCFS
1999-08-30 03:15:07 +04:00
extern int mp_ioctl ( int f , int c , void * a , int s ) ;
# define IOCTL(f,c,a) mp_ioctl (f, c, a, sizeof *a)
# define IOCTL_STATUS(t) \
pread ( t - > pfd_stat , & t - > status , sizeof t - > status , 0 )
# define IOCTL_WSTOP(t) \
2000-08-10 06:14:04 +04:00
( IOCTL ( t - > pfd , PCWSTOP , ( char * ) NULL ) < 0 ? - 1 : \
1999-08-30 03:15:07 +04:00
IOCTL_STATUS ( t ) )
# define PR_WHY pr_lwp.pr_why
# define PR_WHAT pr_lwp.pr_what
# define PR_REG pr_lwp.pr_context.uc_mcontext.gregs
# define PR_FLAGS pr_lwp.pr_flags
2001-03-06 13:10:06 +03:00
# define PR_SYSCALL pr_lwp.pr_syscall
2001-10-18 19:13:53 +04:00
# define PR_INFO pr_lwp.pr_info
1999-08-30 03:15:07 +04:00
# define PIOCSTIP PCSTOP
# define PIOCSET PCSET
# define PIOCRESET PCRESET
# define PIOCSTRACE PCSTRACE
# define PIOCSFAULT PCSFAULT
# define PIOCWSTOP PCWSTOP
# define PIOCSTOP PCSTOP
# define PIOCSENTRY PCSENTRY
# define PIOCSEXIT PCSEXIT
# define PIOCRUN PCRUN
# else
# define IOCTL ioctl
# define IOCTL_STATUS(t) ioctl (t->pfd, PIOCSTATUS, &t->status)
2002-12-18 07:16:10 +03:00
# define IOCTL_WSTOP(t) ioctl (t->pfd, PIOCWSTOP, &t->status)
1999-08-30 03:15:07 +04:00
# define PR_WHY pr_why
# define PR_WHAT pr_what
# define PR_REG pr_reg
# define PR_FLAGS pr_flags
2001-03-06 13:10:06 +03:00
# define PR_SYSCALL pr_syscall
2001-10-18 19:13:53 +04:00
# define PR_INFO pr_info
1999-08-30 03:15:07 +04:00
# endif
# endif
2000-09-02 01:03:06 +04:00
# ifdef FREEBSD
# define IOCTL ioctl
# define IOCTL_STATUS(t) ioctl (t->pfd, PIOCSTATUS, &t->status)
# define IOCTL_WSTOP(t) ioctl (t->pfd, PIOCWAIT, &t->status)
# define PIOCRUN PIOCCONT
# define PIOCWSTOP PIOCWAIT
# define PR_WHY why
# define PR_WHAT val
2000-09-04 03:57:48 +04:00
# define PR_FLAGS state
2000-09-02 01:03:06 +04:00
/* from /usr/src/sys/miscfs/procfs/procfs_vnops.c,
status . state = 0 for running , 1 for stopped */
2000-09-04 03:57:48 +04:00
# define PR_ASLEEP 1
2000-09-02 01:03:06 +04:00
# define PR_SYSENTRY S_SCE
# define PR_SYSEXIT S_SCX
# define PR_SIGNALLED S_SIG
# define PR_FAULTED S_CORE
# endif
1999-08-30 03:15:07 +04:00
1999-02-19 03:21:36 +03:00
/* Trace Control Block */
struct tcb {
short flags ; /* See below for TCB_ values */
int pid ; /* Process Id of this entry */
long scno ; /* System call number */
int u_nargs ; /* System call arguments */
long u_arg [ MAX_ARGS ] ; /* System call arguments */
2008-05-20 05:11:56 +04:00
# if defined (LINUX_MIPSN32)
long long ext_arg [ MAX_ARGS ] ; /* System call arguments */
# endif
1999-02-19 03:21:36 +03:00
int u_error ; /* Error code */
long u_rval ; /* (first) return value */
2000-08-10 06:14:04 +04:00
# ifdef HAVE_LONG_LONG
long long u_lrval ; /* long long return value */
# endif
1999-02-19 03:21:36 +03:00
FILE * outf ; /* Output file for this process */
2000-06-27 21:33:32 +04:00
const char * auxstr ; /* Auxiliary info from syscall (see RVAL_STR) */
1999-02-19 03:21:36 +03:00
struct timeval stime ; /* System time usage as of last process wait */
struct timeval dtime ; /* Delta for system time usage */
struct timeval etime ; /* Syscall entry time */
/* Support for tracing forked processes */
struct tcb * parent ; /* Parent of this process */
int nchildren ; /* # of traced children */
int waitpid ; /* pid(s) this process is waiting for */
2003-05-23 06:27:13 +04:00
int nzombies ; /* # of formerly traced children now dead */
2003-01-09 09:53:27 +03:00
# ifdef LINUX
int nclone_threads ; /* # of nchildren with CLONE_THREAD */
int nclone_detached ; /* # of nchildren with CLONE_DETACHED */
int nclone_waiting ; /* clone threads in wait4 (TCB_SUSPENDED) */
1999-02-19 03:21:36 +03:00
/* (1st arg of wait4()) */
2008-12-22 22:14:47 +03:00
# endif
1999-02-19 03:21:36 +03:00
long baddr ; /* `Breakpoint' address */
long inst [ 2 ] ; /* Instructions on above */
int pfd ; /* proc file descriptor */
# ifdef SVR4
1999-11-29 18:34:02 +03:00
# ifdef HAVE_MP_PROCFS
1999-08-30 03:15:07 +04:00
int pfd_stat ;
int pfd_as ;
pstatus_t status ;
# else
1999-02-19 03:21:36 +03:00
prstatus_t status ; /* procfs status structure */
# endif
1999-08-30 03:15:07 +04:00
# endif
2008-12-17 22:21:59 +03:00
int ptrace_errno ;
2000-09-02 01:03:06 +04:00
# ifdef FREEBSD
struct procfs_status status ;
int pfd_reg ;
int pfd_status ;
# endif
1999-02-19 03:21:36 +03:00
} ;
/* TCB flags */
# define TCB_STARTUP 00001 /* We have just begun ptracing this process */
# define TCB_INUSE 00002 /* This table entry is in use */
# define TCB_INSYSCALL 00004 /* A system call is in progress */
# define TCB_ATTACHED 00010 /* Process is not our own child */
# define TCB_EXITING 00020 /* As far as we know, this process is exiting */
# define TCB_SUSPENDED 00040 / * Process has done a wait(4), that can
not be allowed to complete just now */
# define TCB_BPTSET 00100 /* "Breakpoint" set after fork(2) */
# define TCB_SIGTRAPPED 00200 /* Process wanted to block SIGTRAP */
# define TCB_FOLLOWFORK 00400 /* Process should have forks followed */
# define TCB_REPRINT 01000 /* We should reprint this syscall on exit */
# ifdef LINUX
2008-11-11 01:21:41 +03:00
# if defined(ALPHA) || defined(SPARC) || defined(SPARC64) || defined(POWERPC) || defined(IA64) || defined(HPPA) || defined(SH) || defined(SH64) || defined(S390) || defined(S390X) || defined(ARM) || defined(MIPS) || defined(BFIN)
2001-10-10 03:47:38 +04:00
# define TCB_WAITEXECVE 02000 /* ignore SIGTRAP after exceve */
# endif
2003-01-09 09:53:27 +03:00
# define TCB_CLONE_DETACHED 04000 /* CLONE_DETACHED set in creating syscall */
# define TCB_CLONE_THREAD 010000 /* CLONE_THREAD set in creating syscall */
# define TCB_GROUP_EXITING 020000 /* TCB_EXITING was exit_group, not _exit */
# include <sys / syscall.h>
# ifndef __NR_exit_group
# /* Hack: Most headers around are too old to have __NR_exit_group. */
# ifdef ALPHA
# define __NR_exit_group 405
# elif defined I386
# define __NR_exit_group 252
2006-10-12 02:56:49 +04:00
# elif defined X86_64
# define __NR_exit_group 231
2003-01-09 09:53:27 +03:00
# elif defined IA64
# define __NR_exit_group 1236
# elif defined POWERPC
# define __NR_exit_group 234
# elif defined S390 || defined S390X
# define __NR_exit_group 248
2004-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# elif defined SPARC || defined SPARC64
2003-01-09 09:53:27 +03:00
# define __NR_exit_group 188
2005-07-19 11:42:17 +04:00
# elif defined M68K
# define __NR_exit_group 247
2003-01-09 09:53:27 +03:00
# endif /* ALPHA et al */
# endif /* !__NR_exit_group */
1999-02-19 03:21:36 +03:00
# endif /* LINUX */
/* qualifier flags */
# define QUAL_TRACE 0001 /* this system call should be traced */
# define QUAL_ABBREV 0002 /* abbreviate the structures of this syscall */
# define QUAL_VERBOSE 0004 /* decode the structures of this syscall */
# define QUAL_RAW 0010 /* print all args in hex for this syscall */
# define QUAL_SIGNAL 0020 /* report events with this signal */
# define QUAL_FAULT 0040 /* report events with this fault */
# define QUAL_READ 0100 /* dump data read on this file descriptor */
# define QUAL_WRITE 0200 /* dump data written to this file descriptor */
# define entering(tcp) (!((tcp)->flags & TCB_INSYSCALL))
# define exiting(tcp) ((tcp)->flags & TCB_INSYSCALL)
# define syserror(tcp) ((tcp)->u_error != 0)
# define verbose(tcp) (qual_flags[(tcp)->scno] & QUAL_VERBOSE)
# define abbrev(tcp) (qual_flags[(tcp)->scno] & QUAL_ABBREV)
struct xlat {
int val ;
char * str ;
} ;
/* Format of syscall return values */
# define RVAL_DECIMAL 000 /* decimal format */
# define RVAL_HEX 001 /* hex format */
# define RVAL_OCTAL 002 /* octal format */
# define RVAL_UDECIMAL 003 /* unsigned decimal format */
2000-09-02 01:03:06 +04:00
# define RVAL_LDECIMAL 004 /* long decimal format */
# define RVAL_LHEX 005 /* long hex format */
# define RVAL_LOCTAL 006 /* long octal format */
# define RVAL_LUDECIMAL 007 /* long unsigned decimal format */
1999-02-19 03:21:36 +03:00
# define RVAL_MASK 007 /* mask for these values */
# define RVAL_STR 010 /* Print `auxstr' field after return val */
# define RVAL_NONE 020 /* Print nothing */
# ifndef offsetof
# define offsetof(type, member) (((char *) &(((type *) NULL)->member)) - \
( ( char * ) ( type * ) NULL ) )
# endif /* !offsetof */
/* get offset of member within a user struct */
# define uoff(member) offsetof(struct user, member)
# define TRACE_FILE 001 /* Trace file-related syscalls. */
# define TRACE_IPC 002 /* Trace IPC-related syscalls. */
# define TRACE_NETWORK 004 /* Trace network-related syscalls. */
# define TRACE_PROCESS 010 /* Trace process-related syscalls. */
# define TRACE_SIGNAL 020 /* Trace signal-related syscalls. */
2005-07-05 07:25:35 +04:00
# define TRACE_DESC 040 /* Trace file descriptor-related syscalls. */
1999-02-19 03:21:36 +03:00
2002-12-18 07:16:10 +03:00
extern struct tcb * * tcbtab ;
2006-01-12 12:50:49 +03:00
extern int * qual_flags ;
2008-07-18 04:25:10 +04:00
extern int debug , followfork ;
2006-12-13 19:59:44 +03:00
extern int dtime , cflag , xflag , qflag ;
1999-02-19 03:21:36 +03:00
extern int acolumn ;
2002-12-18 07:16:10 +03:00
extern unsigned int nprocs , tcbtabsize ;
1999-02-19 03:21:36 +03:00
extern int max_strlen ;
extern struct tcb * tcp_last ;
# ifdef __STDC__
# define P(args) args
# else
# define P(args) ()
# endif
2006-12-13 20:10:11 +03:00
enum bitness_t { BITNESS_CURRENT = 0 , BITNESS_32 } ;
1999-02-19 03:21:36 +03:00
extern int set_personality P ( ( int personality ) ) ;
2007-01-12 01:05:04 +03:00
extern const char * xlookup P ( ( const struct xlat * , int ) ) ;
2006-12-14 00:45:31 +03:00
extern struct tcb * alloc_tcb P ( ( int , int ) ) ;
2003-01-09 09:53:27 +03:00
extern struct tcb * pid2tcb P ( ( int ) ) ;
1999-02-19 03:21:36 +03:00
extern void droptcb P ( ( struct tcb * ) ) ;
2004-06-04 05:50:45 +04:00
extern int expand_tcbtab P ( ( void ) ) ;
1999-02-19 03:21:36 +03:00
2006-12-14 00:45:31 +03:00
# define alloctcb(pid) alloc_tcb((pid), 1)
1999-02-19 03:21:36 +03:00
extern void set_sortby P ( ( char * ) ) ;
extern void set_overhead P ( ( int ) ) ;
extern void qualify P ( ( char * ) ) ;
2000-09-02 01:03:06 +04:00
extern int get_scno P ( ( struct tcb * ) ) ;
2005-06-08 03:21:31 +04:00
extern long known_scno P ( ( struct tcb * ) ) ;
2008-12-17 22:21:59 +03:00
extern long do_ptrace P ( ( int request , struct tcb * tcp , void * addr , void * data ) ) ;
extern int ptrace_restart P ( ( int request , struct tcb * tcp , int sig ) ) ;
1999-02-19 03:21:36 +03:00
extern int trace_syscall P ( ( struct tcb * ) ) ;
2006-12-21 Dmitry V. Levin <ldv@altlinux.org>
Move counts code to separate file.
* count.c: New file.
* Makefile.am (strace_SOURCES): Add count.c.
* syscall.c (call_counts, countv, counts, shortest, time_cmp,
syscall_cmp, count_cmp, sortfun, overhead, set_sortby,
set_overhead, call_summary_pers, call_summary): Move to count.c
* count.c (count_syscall): New function.
* defs.h (count_syscall): Declare it.
* syscall.c (trace_syscall): Use it.
2006-12-22 00:15:04 +03:00
extern int count_syscall P ( ( struct tcb * , struct timeval * ) ) ;
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
extern void printxval P ( ( const struct xlat * , int , const char * ) ) ;
1999-02-19 03:21:36 +03:00
extern int printargs P ( ( struct tcb * ) ) ;
2004-09-04 07:39:20 +04:00
extern int addflags P ( ( const struct xlat * , int ) ) ;
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
extern int printflags P ( ( const struct xlat * , int , const char * ) ) ;
2007-11-02 00:46:22 +03:00
extern const char * sprintflags P ( ( const char * , const struct xlat * , int ) ) ;
1999-02-19 03:21:36 +03:00
extern int umoven P ( ( struct tcb * , long , int , char * ) ) ;
extern int umovestr P ( ( struct tcb * , long , int , char * ) ) ;
2008-12-16 21:18:40 +03:00
extern int upeek P ( ( struct tcb * , long , long * ) ) ;
2001-07-10 17:48:44 +04:00
extern void dumpiov P ( ( struct tcb * , int , long ) ) ;
1999-02-19 03:21:36 +03:00
extern void dumpstr P ( ( struct tcb * , long , int ) ) ;
extern void printstr P ( ( struct tcb * , long , int ) ) ;
extern void printnum P ( ( struct tcb * , long , char * ) ) ;
2005-07-05 03:28:10 +04:00
extern void printnum_int P ( ( struct tcb * , long , char * ) ) ;
1999-02-19 03:21:36 +03:00
extern void printpath P ( ( struct tcb * , long ) ) ;
extern void printpathn P ( ( struct tcb * , long , int ) ) ;
2007-07-24 05:57:11 +04:00
extern void printtv_bitness P ( ( struct tcb * , long , enum bitness_t , int ) ) ;
2006-12-13 20:10:11 +03:00
extern void sprinttv P ( ( struct tcb * , long , enum bitness_t , char * ) ) ;
2007-11-02 00:50:54 +03:00
extern void print_timespec P ( ( struct tcb * , long ) ) ;
extern void sprint_timespec P ( ( char * , struct tcb * , long ) ) ;
2001-10-18 19:13:53 +04:00
# ifdef HAVE_SIGINFO_T
extern void printsiginfo P ( ( siginfo_t * , int ) ) ;
# endif
1999-11-18 20:09:47 +03:00
extern void printsock P ( ( struct tcb * , long , int ) ) ;
2002-05-23 15:48:58 +04:00
extern void print_sock_optmgmt P ( ( struct tcb * , long , int ) ) ;
1999-02-19 03:21:36 +03:00
extern void printrusage P ( ( struct tcb * , long ) ) ;
2003-11-14 01:32:27 +03:00
extern void printuid P ( ( const char * , unsigned long ) ) ;
1999-02-19 03:21:36 +03:00
extern int clearbpt P ( ( struct tcb * ) ) ;
extern int setbpt P ( ( struct tcb * ) ) ;
extern int sigishandled P ( ( struct tcb * , int ) ) ;
extern void printcall P ( ( struct tcb * ) ) ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const char * signame P ( ( int ) ) ;
2006-10-13 Ulrich Drepper <drepper@redhat.com>
Bernhard Kaindl <bk@suse.de>
Dmitry V. Levin <ldv@altlinux.org>
Michael Holzheu <holzheu@de.ibm.com>
Add hooks for new syscalls. Add decoders for *at, inotify*,
pselect6, ppoll and unshare syscalls.
* defs.h: Declare print_sigset.
* desc.c (sys_pselect6): New function.
* file.c (decode_open, decode_access, decode_mkdir,
decode_readlink, decode_chmod, decode_utimes, decode_mknod):
New functions.
(sys_open, sys_access, sys_mkdir, sys_readlink, sys_chmod,
sys_utimes, sys_mknod): Use them.
[LINUX] (fstatatflags, unlinkatflags, inotify_modes): New
variables.
[LINUX] (print_dirfd, sys_openat, sys_faccessat,
sys_newfstatat, sys_mkdirat, sys_linkat, sys_unlinkat,
sys_symlinkat, sys_readlinkat, sys_renameat, sys_fchownat,
sys_fchmodat, sys_futimesat, sys_mknodat, sys_inotify_add_watch,
sys_inotify_rm_watch): New functions.
* process.c [LINUX] (sys_unshare): New function.
* signal.c (print_sigset): New function.
(sys_sigprocmask): Use it.
* stream.c (decode_poll): New function.
(sys_poll): Use it.
[LINUX] (sys_ppoll): New function.
* linux/syscall.h: Delcare new syscall handlers.
* linux/syscallent.h: Hook up new syscalls.
* linux/alpha/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/mips/syscallent.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
Fixes RH#178633.
2006-10-14 00:25:12 +04:00
extern void print_sigset P ( ( struct tcb * , long , int ) ) ;
1999-02-19 03:21:36 +03:00
extern void printsignal P ( ( int ) ) ;
extern void printleader P ( ( struct tcb * ) ) ;
extern void printtrailer P ( ( struct tcb * ) ) ;
extern void tabto P ( ( int ) ) ;
extern void call_summary P ( ( FILE * ) ) ;
2005-06-01 23:22:06 +04:00
extern void tprint_iov P ( ( struct tcb * , unsigned long , unsigned long ) ) ;
2007-01-12 02:19:55 +03:00
extern void tprint_open_modes P ( ( struct tcb * , mode_t ) ) ;
2008-09-03 05:02:46 +04:00
extern int is_restart_error P ( ( struct tcb * ) ) ;
1999-02-19 03:21:36 +03:00
1999-12-23 18:08:17 +03:00
# ifdef LINUX
extern int internal_clone P ( ( struct tcb * ) ) ;
# endif
1999-02-19 03:21:36 +03:00
extern int internal_fork P ( ( struct tcb * ) ) ;
extern int internal_exec P ( ( struct tcb * ) ) ;
2004-09-01 23:39:46 +04:00
extern int internal_wait P ( ( struct tcb * , int ) ) ;
1999-02-19 03:21:36 +03:00
extern int internal_exit P ( ( struct tcb * ) ) ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const struct ioctlent * ioctl_lookup P ( ( long ) ) ;
extern const struct ioctlent * ioctl_next_match P ( ( const struct ioctlent * ) ) ;
1999-02-19 03:21:36 +03:00
extern int ioctl_decode P ( ( struct tcb * , long , long ) ) ;
extern int term_ioctl P ( ( struct tcb * , long , long ) ) ;
extern int sock_ioctl P ( ( struct tcb * , long , long ) ) ;
extern int proc_ioctl P ( ( struct tcb * , int , int ) ) ;
extern int stream_ioctl P ( ( struct tcb * , int , int ) ) ;
2004-10-07 02:27:43 +04:00
# ifdef LINUX
extern int rtc_ioctl P ( ( struct tcb * , long , long ) ) ;
2007-06-30 15:37:09 +04:00
extern int scsi_ioctl P ( ( struct tcb * , long , long ) ) ;
2004-10-07 02:27:43 +04:00
# endif
1999-02-19 03:21:36 +03:00
extern void tv_tv P ( ( struct timeval * , int , int ) ) ;
extern int tv_nz P ( ( struct timeval * ) ) ;
extern int tv_cmp P ( ( struct timeval * , struct timeval * ) ) ;
extern double tv_float P ( ( struct timeval * ) ) ;
extern void tv_add P ( ( struct timeval * , struct timeval * , struct timeval * ) ) ;
extern void tv_sub P ( ( struct timeval * , struct timeval * , struct timeval * ) ) ;
extern void tv_mul P ( ( struct timeval * , struct timeval * , int ) ) ;
extern void tv_div P ( ( struct timeval * , struct timeval * , int ) ) ;
# ifdef SUNOS4
extern int fixvfork P ( ( struct tcb * ) ) ;
# endif
2004-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# if !(defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(IA64))
1999-02-19 03:21:36 +03:00
extern long getrval2 P ( ( struct tcb * ) ) ;
# endif
2000-09-02 01:03:06 +04:00
# ifdef USE_PROCFS
1999-02-19 03:21:36 +03:00
extern int proc_open P ( ( struct tcb * tcp , int attaching ) ) ;
# endif
# define umove(pid, addr, objp) \
umoven ( ( pid ) , ( addr ) , sizeof * ( objp ) , ( char * ) ( objp ) )
2006-12-13 20:10:11 +03:00
# define printtv(tcp, addr) \
2007-07-24 05:57:11 +04:00
printtv_bitness ( ( tcp ) , ( addr ) , BITNESS_CURRENT , 0 )
# define printtv_special(tcp, addr) \
printtv_bitness ( ( tcp ) , ( addr ) , BITNESS_CURRENT , 1 )
2006-12-13 20:10:11 +03:00
1999-02-19 03:21:36 +03:00
# ifdef __STDC__
# ifdef __GNUC__
extern void tprintf ( const char * fmt , . . . )
__attribute__ ( ( format ( printf , 1 , 2 ) ) ) ;
# else
extern void tprintf ( const char * fmt , . . . ) ;
# endif
# else
extern void tprintf ( ) ;
# endif
# ifndef HAVE_STRERROR
const char * strerror P ( ( int ) ) ;
# endif
# ifndef HAVE_STRSIGNAL
const char * strsignal P ( ( int ) ) ;
# endif
extern int current_personality ;
2006-12-13 20:08:08 +03:00
extern const int personality_wordsize [ ] ;
1999-02-19 03:21:36 +03:00
struct sysent {
int nargs ;
int sys_flags ;
int ( * sys_func ) ( ) ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const char * sys_name ;
2005-06-08 03:21:31 +04:00
long native_scno ; /* Match against SYS_* constants. */
1999-02-19 03:21:36 +03:00
} ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const struct sysent * sysent ;
1999-02-19 03:21:36 +03:00
extern int nsyscalls ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const char * const * errnoent ;
1999-02-19 03:21:36 +03:00
extern int nerrnos ;
struct ioctlent {
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const char * doth ;
const char * symbol ;
1999-02-19 03:21:36 +03:00
unsigned long code ;
} ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const struct ioctlent * ioctlent ;
1999-02-19 03:21:36 +03:00
extern int nioctlents ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const char * const * signalent ;
1999-02-19 03:21:36 +03:00
extern int nsignals ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const struct ioctlent ioctlent0 [ ] ;
extern const int nioctlents0 ;
extern const char * const signalent0 [ ] ;
extern const int nsignals0 ;
1999-02-19 03:21:36 +03:00
# if SUPPORTED_PERSONALITIES >= 2
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const struct ioctlent ioctlent1 [ ] ;
2004-09-07 18:06:03 +04:00
extern const int nioctlents1 ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const char * const signalent1 [ ] ;
extern const int nsignals1 ;
1999-02-19 03:21:36 +03:00
# endif /* SUPPORTED_PERSONALITIES >= 2 */
# if SUPPORTED_PERSONALITIES >= 3
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
extern const struct ioctlent ioctlent2 [ ] ;
extern const int nioctlents2 ;
extern const char * const signalent2 [ ] ;
2004-09-07 18:06:03 +04:00
extern const int nsignals2 ;
1999-02-19 03:21:36 +03:00
# endif /* SUPPORTED_PERSONALITIES >= 3 */
2001-03-06 18:08:09 +03:00
2003-01-14 12:46:18 +03:00
# if defined(FREEBSD) || (defined(LINUX) \
2003-08-21 13:58:00 +04:00
& & defined ( POWERPC ) & & ! defined ( __powerpc64__ ) ) \
2008-05-20 05:11:56 +04:00
| | defined ( LINUX_MIPSO32 )
2001-03-07 16:21:24 +03:00
/* ARRGH! off_t args are aligned on 64 bit boundaries! */
# define ALIGN64(tcp,arg) \
do { \
if ( arg % 2 ) \
memmove ( & tcp - > u_arg [ arg ] , & tcp - > u_arg [ arg + 1 ] , \
( tcp - > u_nargs - arg - 1 ) * sizeof tcp - > u_arg [ 0 ] ) ; \
} while ( 0 )
# else
# define ALIGN64(tcp,arg) do { } while (0)
# endif
2001-03-08 17:40:06 +03:00
# if HAVE_LONG_LONG
2001-03-07 16:21:24 +03:00
2001-03-06 18:08:09 +03:00
/* _l refers to the lower numbered u_arg,
* _h refers to the higher numbered u_arg
*/
2001-03-07 16:21:24 +03:00
2001-03-28 12:05:27 +04:00
# if HAVE_LITTLE_ENDIAN_LONG_LONG
2001-03-08 17:40:06 +03:00
# define LONG_LONG(_l,_h) \
2002-03-31 23:00:02 +04:00
( ( long long ) ( ( unsigned long long ) ( unsigned ) ( _l ) | ( ( unsigned long long ) ( _h ) < < 32 ) ) )
2001-03-06 18:08:09 +03:00
# else
2001-03-08 17:40:06 +03:00
# define LONG_LONG(_l,_h) \
2002-03-31 23:00:02 +04:00
( ( long long ) ( ( unsigned long long ) ( unsigned ) ( _h ) | ( ( unsigned long long ) ( _l ) < < 32 ) ) )
2001-03-06 18:08:09 +03:00
# endif
# endif
2001-10-10 03:47:38 +04:00
# ifdef IA64
extern long ia32 ;
# endif
2002-11-06 16:17:21 +03:00
extern int not_failing_only ;