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
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 {
2009-01-09 20:22:56 +03:00
int flags ; /* See below for TCB_ values */
1999-02-19 03:21:36 +03:00
int pid ; /* Process Id of this entry */
2009-01-09 20:22:56 +03:00
int wait_status ; /* Status from last wait() */
struct tcb * next_need_service ;
/* Linked list of tracees found by wait()s */
1999-02-19 03:21:36 +03:00
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 */
2009-02-09 21:55:59 +03:00
# define TCB_SUSPENDED 00040 /* Process can not be allowed to resume just now */
1999-02-19 03:21:36 +03:00
# define TCB_BPTSET 00100 /* "Breakpoint" set after fork(2) */
# define TCB_SIGTRAPPED 00200 /* Process wanted to block SIGTRAP */
# define TCB_REPRINT 01000 /* We should reprint this syscall on exit */
# ifdef LINUX
2009-01-17 04:06:18 +03:00
/* TCB_WAITEXECVE bit means "ignore next SIGTRAP, it's execve exit stop".
* it is not reliable if traced program masks SIGTRAP .
*
* x86 does not need TCB_WAITEXECVE .
2009-01-02 21:02:45 +03:00
* It can detect execve ' s SIGTRAP by looking at eax / rax .
* See " stray syscall exit: eax = " message in syscall_fixup ( ) .
2009-01-17 04:06:18 +03:00
*
* Note that on newer kernels , we use ptrace options and therefore
* can filter out execve stops reliably on any architecture ,
* without using TCB_WAITEXECVE flag .
* I guess we can remove it from the source somewhere around year 2010 : )
2009-01-02 21:02:45 +03:00
*/
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 ;
} ;
2009-01-13 21:30:55 +03:00
extern const struct xlat open_mode_flags [ ] ;
extern const struct xlat addrfams [ ] ;
extern const struct xlat struct_user_offsets [ ] ;
extern const struct xlat open_access_modes [ ] ;
2009-02-24 18:17:53 +03:00
extern const struct xlat ptrace_cmds [ ] ;
2009-01-13 21:30:55 +03:00
1999-02-19 03:21:36 +03:00
/* 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 * ) ) ;
Two cleanups: tcb table expansion failure is not really a survivable
event, we do not have any viable way to continue. No wonder most
places where that is detected have FIXMEs.
It's way simpler to treat as fatal failure, and handle it inside
tcb table expansion finctions.
Second cleanup: tidy up haphazard locations of a few externs.
* defs.h: Change return type of expand_tcbtab() to void.
Declare change_syscall().
* process.c: Change all callsites of alloctcb(), alloc_tcb() and
fork_tcb(), removing now-redundant error checks.
(fork_tcb): Change return type to void - it can't fail now.
* strace.c: Move extern declarations out of function bodies.
Change all callsites of alloctcb(), alloc_tcb() and
fork_tcb(), removing now-redundant error checks.
(expand_tcbtab): Change return type to void - it can't fail now.
On failure to expand, print a message, clean up, and exit.
(alloc_tcb): On failure to expand, print a message, clean up, and exit.
* util.c (setbpt): Remove extern declaration from function body.
2009-01-17 04:52:54 +03:00
extern void 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 * ) ) ;
2009-02-24 18:17:53 +03:00
extern long do_ptrace P ( ( int request , struct tcb * tcp , void * addr , long data ) ) ;
2008-12-17 22:21:59 +03:00
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 * ) ) ;
2009-01-07 00:45:06 +03:00
extern void printtrailer P ( ( void ) ) ;
1999-02-19 03:21:36 +03:00
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
Two cleanups: tcb table expansion failure is not really a survivable
event, we do not have any viable way to continue. No wonder most
places where that is detected have FIXMEs.
It's way simpler to treat as fatal failure, and handle it inside
tcb table expansion finctions.
Second cleanup: tidy up haphazard locations of a few externs.
* defs.h: Change return type of expand_tcbtab() to void.
Declare change_syscall().
* process.c: Change all callsites of alloctcb(), alloc_tcb() and
fork_tcb(), removing now-redundant error checks.
(fork_tcb): Change return type to void - it can't fail now.
* strace.c: Move extern declarations out of function bodies.
Change all callsites of alloctcb(), alloc_tcb() and
fork_tcb(), removing now-redundant error checks.
(expand_tcbtab): Change return type to void - it can't fail now.
On failure to expand, print a message, clean up, and exit.
(alloc_tcb): On failure to expand, print a message, clean up, and exit.
* util.c (setbpt): Remove extern declaration from function body.
2009-01-17 04:52:54 +03:00
extern int change_syscall P ( ( struct tcb * , int ) ) ;
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 ;