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
2009-10-06 03:32:39 +04:00
# ifdef HPPA
# define MAX_ARGS 6 /* maximum number of args to a syscall */
# else
# define MAX_ARGS 32 /* maximum number of args to a syscall */
# endif
1999-02-19 03:21:36 +03:00
# 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
2009-02-27 23:32:52 +03:00
# if defined(AVR32)
# define LINUX_AVR32
# 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 */
2009-02-27 23:32:52 +03:00
# if (defined(LINUXSPARC) || defined(LINUX_X86_64) || defined(LINUX_ARM) || defined(LINUX_AVR32)) && 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 LINUX
extern long ptrace ( int , int , char * , long ) ;
# else /* !LINUX */
extern int ptrace ( int , int , char * , int , . . . ) ;
# endif /* !LINUX */
# 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
sparc/linux: Rewrite to use asm/ptrace.h
The current sparc/linux code uses asm/reg.h, but recent Linux kernels
dropped that header completely. So switch over to the ptrace headers
as those should stick around indefinitely as part of the ABI.
* defs.h [LINUXSPARC] (U_REG_G1, U_REG_O0, U_REG_O1): Define.
* process.c: Drop asm/regs.h include.
[SPARC || SPARC64] (change_syscall): Change struct regs to struct pt_regs.
* signal.c: Drop asm/regs.h include.
(m_siginfo_t): Unify [SPARC || SPARC64] and [MIPS].
[SPARC || SPARC64] (sys_sigreturn): Change struct regs to struct pt_regs.
* syscall.c: Drop asm/regs.h include.
[SPARC || SPARC64] (internal_syscall, get_scno, get_error, force_result,
syscall_enter): Change struct regs to struct pt_regs.
* util.c: Drop asm/regs.h include.
(_hack_syscall5, _ptrace): Delete.
[SPARC || SPARC64] (getpc, printcall, arg_setup_state): Change
struct regs to struct pt_regs.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2009-10-12 19:05:14 +04:00
/* Indexes into the pt_regs.u_reg[] array -- UREG_XX from kernel are all off
* by 1 and use Ix instead of Ox . These work for both 32 and 64 bit Linux . */
# define U_REG_G1 0
# define U_REG_O0 7
# define U_REG_O1 8
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
2010-07-12 23:39:57 +04:00
# ifdef POWERPC64
# undef SUPPORTED_PERSONALITIES
# define SUPPORTED_PERSONALITIES 2
# define PERSONALITY0_WORDSIZE 8
# 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-06-03 03:49:22 +04:00
short flags ; /* See below for TCB_ values */
1999-02-19 03:21:36 +03:00
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 */
2009-10-27 18:27:13 +03:00
int curcol ; /* Output column 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_waiting ; /* clone threads in wait4 (TCB_SUSPENDED) */
2008-12-22 22:14:47 +03:00
# endif
2009-06-03 03:49:22 +04:00
/* (1st arg of wait4()) */
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 */
2009-06-03 03:49:22 +04:00
# define TCB_FOLLOWFORK 00400 /* Process should have forks followed */
1999-02-19 03:21:36 +03:00
# define TCB_REPRINT 01000 /* We should reprint this syscall on exit */
# ifdef LINUX
2009-06-03 03:49:22 +04:00
/* 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-03-06 03:33:24 +03:00
# if defined(ALPHA) || defined(AVR32) || defined(SPARC) || defined(SPARC64) \
| | defined ( POWERPC ) | | defined ( IA64 ) | | defined ( HPPA ) \
| | defined ( SH ) | | defined ( SH64 ) | | defined ( S390 ) | | defined ( S390X ) \
2009-12-28 18:00:15 +03:00
| | defined ( ARM ) | | defined ( MIPS ) | | defined ( BFIN ) | | defined ( TILE )
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_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 ;
2010-09-07 02:08:24 +04:00
const char * str ;
1999-02-19 03:21:36 +03:00
} ;
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 [ ] ;
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
2010-03-28 23:24:54 +04:00
typedef enum {
CFLAG_NONE = 0 ,
CFLAG_ONLY_STATS ,
CFLAG_BOTH
} cflag_t ;
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 ;
2010-03-28 23:24:54 +04:00
extern int dtime , xflag , qflag ;
extern cflag_t cflag ;
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 ;
2006-12-13 20:10:11 +03:00
enum bitness_t { BITNESS_CURRENT = 0 , BITNESS_32 } ;
2009-10-27 18:56:43 +03:00
extern int set_personality ( int personality ) ;
extern const char * xlookup ( const struct xlat * , int ) ;
extern struct tcb * alloc_tcb ( int , int ) ;
extern struct tcb * pid2tcb ( int ) ;
extern void droptcb ( struct tcb * ) ;
extern void expand_tcbtab ( void ) ;
1999-02-19 03:21:36 +03:00
2006-12-14 00:45:31 +03:00
# define alloctcb(pid) alloc_tcb((pid), 1)
2010-09-07 02:08:24 +04:00
extern void set_sortby ( const char * ) ;
2009-10-27 18:56:43 +03:00
extern void set_overhead ( int ) ;
2010-09-07 02:08:24 +04:00
extern void qualify ( const char * ) ;
2009-10-27 18:56:43 +03:00
extern int get_scno ( struct tcb * ) ;
extern long known_scno ( struct tcb * ) ;
extern long do_ptrace ( int request , struct tcb * tcp , void * addr , void * data ) ;
extern int ptrace_restart ( int request , struct tcb * tcp , int sig ) ;
2010-07-03 23:40:09 +04:00
extern int force_result ( struct tcb * , int , long ) ;
2009-10-27 18:56:43 +03:00
extern int trace_syscall ( struct tcb * ) ;
extern int count_syscall ( struct tcb * , struct timeval * ) ;
extern void printxval ( const struct xlat * , int , const char * ) ;
extern int printargs ( struct tcb * ) ;
extern int addflags ( const struct xlat * , int ) ;
extern int printflags ( const struct xlat * , int , const char * ) ;
extern const char * sprintflags ( const char * , const struct xlat * , int ) ;
extern int umoven ( struct tcb * , long , int , char * ) ;
extern int umovestr ( struct tcb * , long , int , char * ) ;
extern int upeek ( struct tcb * , long , long * ) ;
extern void dumpiov ( struct tcb * , int , long ) ;
extern void dumpstr ( struct tcb * , long , int ) ;
extern void printstr ( struct tcb * , long , int ) ;
2010-09-07 02:08:24 +04:00
extern void printnum ( struct tcb * , long , const char * ) ;
extern void printnum_int ( struct tcb * , long , const char * ) ;
2009-10-27 18:56:43 +03:00
extern void printpath ( struct tcb * , long ) ;
extern void printpathn ( struct tcb * , long , int ) ;
extern void printtv_bitness ( struct tcb * , long , enum bitness_t , int ) ;
extern void sprinttv ( struct tcb * , long , enum bitness_t , char * ) ;
extern void print_timespec ( struct tcb * , long ) ;
extern void sprint_timespec ( char * , struct tcb * , long ) ;
2001-10-18 19:13:53 +04:00
# ifdef HAVE_SIGINFO_T
2009-10-27 18:56:43 +03:00
extern void printsiginfo ( siginfo_t * , int ) ;
# endif
extern void printsock ( struct tcb * , long , int ) ;
extern void print_sock_optmgmt ( struct tcb * , long , int ) ;
extern void printrusage ( struct tcb * , long ) ;
extern void printuid ( const char * , unsigned long ) ;
extern int clearbpt ( struct tcb * ) ;
extern int setbpt ( struct tcb * ) ;
extern int sigishandled ( struct tcb * , int ) ;
extern void printcall ( struct tcb * ) ;
extern const char * signame ( int ) ;
extern void print_sigset ( struct tcb * , long , int ) ;
extern void printsignal ( int ) ;
extern void printleader ( struct tcb * ) ;
extern void printtrailer ( void ) ;
extern void tabto ( int ) ;
extern void call_summary ( FILE * ) ;
extern void tprint_iov ( struct tcb * , unsigned long , unsigned long ) ;
extern void tprint_open_modes ( mode_t ) ;
extern const char * sprint_open_modes ( mode_t ) ;
extern int is_restart_error ( struct tcb * ) ;
extern int change_syscall ( struct tcb * , int ) ;
extern int internal_fork ( struct tcb * ) ;
extern int internal_exec ( struct tcb * ) ;
extern int internal_wait ( struct tcb * , int ) ;
extern int internal_exit ( struct tcb * ) ;
extern const struct ioctlent * ioctl_lookup ( long ) ;
extern const struct ioctlent * ioctl_next_match ( const struct ioctlent * ) ;
extern int ioctl_decode ( struct tcb * , long , long ) ;
extern int term_ioctl ( struct tcb * , long , long ) ;
extern int sock_ioctl ( struct tcb * , long , long ) ;
extern int proc_ioctl ( struct tcb * , int , int ) ;
extern int stream_ioctl ( struct tcb * , int , int ) ;
2004-10-07 02:27:43 +04:00
# ifdef LINUX
2009-10-27 18:56:43 +03:00
extern int rtc_ioctl ( struct tcb * , long , long ) ;
extern int scsi_ioctl ( struct tcb * , long , long ) ;
2004-10-07 02:27:43 +04:00
# endif
1999-02-19 03:21:36 +03:00
2009-10-27 18:56:43 +03:00
extern int tv_nz ( struct timeval * ) ;
extern int tv_cmp ( struct timeval * , struct timeval * ) ;
extern double tv_float ( struct timeval * ) ;
extern void tv_add ( struct timeval * , struct timeval * , struct timeval * ) ;
extern void tv_sub ( struct timeval * , struct timeval * , struct timeval * ) ;
extern void tv_mul ( struct timeval * , struct timeval * , int ) ;
extern void tv_div ( struct timeval * , struct timeval * , int ) ;
1999-02-19 03:21:36 +03:00
# ifdef SUNOS4
2009-10-27 18:56:43 +03:00
extern int fixvfork ( struct tcb * ) ;
1999-02-19 03:21:36 +03:00
# 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))
2009-10-27 18:56:43 +03:00
extern long getrval2 ( struct tcb * ) ;
1999-02-19 03:21:36 +03:00
# endif
2000-09-02 01:03:06 +04:00
# ifdef USE_PROCFS
2009-10-27 18:56:43 +03:00
extern int proc_open ( struct tcb * tcp , int attaching ) ;
1999-02-19 03:21:36 +03:00
# 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 __GNUC__
extern void tprintf ( const char * fmt , . . . )
__attribute__ ( ( format ( printf , 1 , 2 ) ) ) ;
# else
extern void tprintf ( const char * fmt , . . . ) ;
# endif
# ifndef HAVE_STRERROR
2009-10-27 18:56:43 +03:00
const char * strerror ( int ) ;
1999-02-19 03:21:36 +03:00
# endif
# ifndef HAVE_STRSIGNAL
2009-10-27 18:56:43 +03:00
const char * strsignal ( int ) ;
1999-02-19 03:21:36 +03:00
# 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
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
2009-11-04 19:08:34 +03:00
extern int printllval ( struct tcb * , const char * , int ) ;
2001-03-06 18:08:09 +03:00
# 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 ;