process.c revision ca8ab8d2958f86297a6574a73cc1b9759d59c9b1
1accaf19bc1129c0273ec50dba52318e60bc29103Benjamin Kramer/*
27196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
37196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
47196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
57196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
67196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
77196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *                     Linux for s390 port by D.J. Barrow
87196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *                    <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
97196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * Copyright (c) 2000 PocketPenguins Inc.  Linux for Hitachi SuperH
107196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *                    port by Greg Banks <gbanks@pocketpenguins.com>
117196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
127196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *
137196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * All rights reserved.
147196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *
15684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis * Redistribution and use in source and binary forms, with or without
167196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * modification, are permitted provided that the following conditions
177196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * are met:
187196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * 1. Redistributions of source code must retain the above copyright
197196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *    notice, this list of conditions and the following disclaimer.
207196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * 2. Redistributions in binary form must reproduce the above copyright
217196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *    notice, this list of conditions and the following disclaimer in the
227196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis *    documentation and/or other materials provided with the distribution.
237196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * 3. The name of the author may not be used to endorse or promote products
24684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis *    derived from this software without specific prior written permission.
25684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis *
267196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
277196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
287196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
297196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
307196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
317196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
327196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
335d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
345d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
355d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
365d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis *
375d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis *	$Id$
385d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis */
395d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis
405d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#include "defs.h"
417196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
427196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include <fcntl.h>
437196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include <sys/stat.h>
447196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include <sys/time.h>
45471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#include <sys/wait.h>
462fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include <sys/resource.h>
4718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#include <sys/utsname.h>
482fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include <sys/user.h>
497196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include <sys/syscall.h>
50471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#include <signal.h>
51471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#ifdef SUNOS4
528fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include <machine/reg.h>
537196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif /* SUNOS4 */
547196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
557196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef FREEBSD
567196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include <sys/ptrace.h>
577196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
587196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
597196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef HAVE_SYS_REG_H
607196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# include <sys/reg.h>
617196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifndef PTRACE_PEEKUSR
627196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# define PTRACE_PEEKUSR PTRACE_PEEKUSER
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
6476a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#ifndef PTRACE_POKEUSR
655d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis# define PTRACE_POKEUSR PTRACE_POKEUSER
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
6718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#endif
687196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
695d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef HAVE_LINUX_PTRACE_H
707196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#undef PTRACE_SYSCALL
717196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# ifdef HAVE_STRUCT_IA64_FPREG
727196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#  define ia64_fpreg XXX_ia64_fpreg
7376a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis# endif
7476a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
755d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#  define pt_all_user_regs XXX_pt_all_user_regs
7618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis# endif
7718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#include <linux/ptrace.h>
7818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis# undef ia64_fpreg
7918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis# undef pt_all_user_regs
8024016765c905a02c9df94ef0b8a50c5e74fff5c2Argyrios Kyrtzidis#endif
8124016765c905a02c9df94ef0b8a50c5e74fff5c2Argyrios Kyrtzidis
8224016765c905a02c9df94ef0b8a50c5e74fff5c2Argyrios Kyrtzidis#if defined (LINUX) && defined (SPARC64)
8324016765c905a02c9df94ef0b8a50c5e74fff5c2Argyrios Kyrtzidis# define r_pc r_tpc
8424016765c905a02c9df94ef0b8a50c5e74fff5c2Argyrios Kyrtzidis# undef PTRACE_GETREGS
8524016765c905a02c9df94ef0b8a50c5e74fff5c2Argyrios Kyrtzidis# define PTRACE_GETREGS PTRACE_GETREGS64
8624016765c905a02c9df94ef0b8a50c5e74fff5c2Argyrios Kyrtzidis# undef PTRACE_SETREGS
877196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# define PTRACE_SETREGS PTRACE_SETREGS64
885d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif /* LINUX && SPARC64 */
895d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis
905d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef HAVE_LINUX_FUTEX_H
917196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# include <linux/futex.h>
927196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
937196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef LINUX
947196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# ifndef FUTEX_WAIT
957196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#  define FUTEX_WAIT 0
967196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# endif
975d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis# ifndef FUTEX_WAKE
987196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#  define FUTEX_WAKE 1
997196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# endif
1007196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# ifndef FUTEX_FD
1017196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#  define FUTEX_FD 2
1027196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# endif
1037196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# ifndef FUTEX_REQUEUE
1047196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#  define FUTEX_REQUEUE 3
1057196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# endif
1067196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif /* LINUX */
1077196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1087196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef LINUX
1097196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include <sched.h>
1107196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include <asm/posix_types.h>
1117196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#undef GETGROUPS_T
1125d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#define GETGROUPS_T __kernel_gid_t
1137196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#undef GETGROUPS32_T
1147196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#define GETGROUPS32_T __kernel_gid32_t
1157196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif /* LINUX */
1167196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1177196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#if defined(LINUX) && defined(IA64)
1187196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# include <asm/ptrace_offsets.h>
1197196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# include <asm/rse.h>
1207196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1217196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1227196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef HAVE_PRCTL
1237196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis# include <sys/prctl.h>
1247196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1257196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisstatic const struct xlat prctl_options[] = {
1267196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_MAXPROCS
1277196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_MAXPROCS,		"PR_MAXPROCS"		},
1287196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1297196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_ISBLOCKED
1307196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_ISBLOCKED,		"PR_ISBLOCKED"		},
1317196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1327196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SETSTACKSIZE
1337196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_SETSTACKSIZE,	"PR_SETSTACKSIZE"	},
1347196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1357196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_GETSTACKSIZE
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines	{ PR_GETSTACKSIZE,	"PR_GETSTACKSIZE"	},
1377196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1387196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_MAXPPROCS
1397196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_MAXPPROCS,		"PR_MAXPPROCS"		},
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
1417196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_UNBLKONEXEC
1427196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_UNBLKONEXEC,	"PR_UNBLKONEXEC"	},
1437196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1447196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_ATOMICSIM
1457196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_ATOMICSIM,		"PR_ATOMICSIM"		},
1467196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1477196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SETEXITSIG
1487196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_SETEXITSIG,	"PR_SETEXITSIG"		},
1497196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1507196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_RESIDENT
1517196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_RESIDENT,		"PR_RESIDENT"		},
1522908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#endif
1532908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#ifdef PR_ATTACHADDR
1542908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian	{ PR_ATTACHADDR,	"PR_ATTACHADDR"		},
1552908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#endif
1562908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#ifdef PR_DETACHADDR
1572908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian	{ PR_DETACHADDR,	"PR_DETACHADDR"		},
158181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola#endif
1592908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#ifdef PR_TERMCHILD
1609c7aed308aa701e0ba573c04ebe8d17a4c1486c4Fariborz Jahanian	{ PR_TERMCHILD,		"PR_TERMCHILD"		},
1612908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#endif
1622908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#ifdef PR_GETSHMASK
1632908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian	{ PR_GETSHMASK,		"PR_GETSHMASK"		},
1642908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#endif
1652908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian#ifdef PR_GETNSHARE
1662908ffbc5f54323f150405fa2b06f50788ae55c7Fariborz Jahanian	{ PR_GETNSHARE,		"PR_GETNSHARE"		},
1677196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1687196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_COREPID
1697196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_COREPID,		"PR_COREPID"		},
1707196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1717196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_ATTACHADDRPERM
1727196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_ATTACHADDRPERM,	"PR_ATTACHADDRPERM"	},
1737196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1747196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_PTHREADEXIT
1757196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_PTHREADEXIT,	"PR_PTHREADEXIT"	},
1767196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1777196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SET_PDEATHSIG
17876a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis	{ PR_SET_PDEATHSIG,	"PR_SET_PDEATHSIG"	},
17976a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#endif
18076a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#ifdef PR_GET_PDEATHSIG
18176a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis	{ PR_GET_PDEATHSIG,	"PR_GET_PDEATHSIG"	},
18276a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#endif
18376a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#ifdef PR_GET_DUMPABLE
18476a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis	{ PR_GET_DUMPABLE,	"PR_GET_DUMPABLE"	},
18576a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#endif
18676a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#ifdef PR_SET_DUMPABLE
18776a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis	{ PR_SET_DUMPABLE,	"PR_SET_DUMPABLE"	},
18876a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#endif
18976a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#ifdef PR_GET_UNALIGN
19076a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis	{ PR_GET_UNALIGN,	"PR_GET_UNALIGN"	},
19176a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#endif
19276a5245d7fb558625453ebe2281ee0bc9c93c245Argyrios Kyrtzidis#ifdef PR_SET_UNALIGN
1937196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_SET_UNALIGN,	"PR_SET_UNALIGN"	},
1947196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1957196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_GET_KEEPCAPS
1967196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_GET_KEEPCAPS,	"PR_GET_KEEPCAPS"	},
1977196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
1987196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SET_KEEPCAPS
1997196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_SET_KEEPCAPS,	"PR_SET_KEEPCAPS"	},
20018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#endif
20118fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#ifdef PR_GET_FPEMU
20218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	{ PR_GET_FPEMU,		"PR_GET_FPEMU"		},
20318fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#endif
20418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#ifdef PR_SET_FPEMU
20518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	{ PR_SET_FPEMU,		"PR_SET_FPEMU"		},
2067196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
2077196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_GET_FPEXC
2087196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_GET_FPEXC,		"PR_GET_FPEXC"		},
2097196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
2107196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SET_FPEXC
21118fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	{ PR_SET_FPEXC,		"PR_SET_FPEXC"		},
21218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#endif
2137196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_GET_TIMING
21418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	{ PR_GET_TIMING,	"PR_GET_TIMING"		},
2157196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
2167196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SET_TIMING
2177196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_SET_TIMING,	"PR_SET_TIMING"		},
2187196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
2197196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SET_NAME
2207196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_SET_NAME,		"PR_SET_NAME"		},
2217196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
2227196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_GET_NAME
2237196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_GET_NAME,		"PR_GET_NAME"		},
2247196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
2257196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_GET_ENDIAN
2267196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_GET_ENDIAN,	"PR_GET_ENDIAN"		},
2277196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
2287196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifdef PR_SET_ENDIAN
229684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	{ PR_SET_ENDIAN,	"PR_SET_ENDIAN"		},
230684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
231684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#ifdef PR_GET_SECCOMP
2327196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_GET_SECCOMP,	"PR_GET_SECCOMP"	},
233684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
234684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#ifdef PR_SET_SECCOMP
2357196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	{ PR_SET_SECCOMP,	"PR_SET_SECCOMP"	},
236684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
237684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#ifdef PR_GET_TSC
238684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	{ PR_GET_TSC,		"PR_GET_TSC"		},
239684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
240684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#ifdef PR_SET_TSC
241684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	{ PR_SET_TSC,		"PR_SET_TSC"		},
242684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
243684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#ifdef PR_GET_SECUREBITS
244684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	{ PR_GET_SECUREBITS,	"PR_GET_SECUREBITS"	},
245684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
246684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#ifdef PR_SET_SECUREBITS
247684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	{ PR_SET_SECUREBITS,	"PR_SET_SECUREBITS"	},
248684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
249684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	{ 0,			NULL			},
250d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose};
251d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose
252d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose
253d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rosestatic const char *
254d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Roseunalignctl_string (unsigned int ctl)
255d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose{
256d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose	static char buf[16];
257d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose
258d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose	switch (ctl) {
259d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose#ifdef PR_UNALIGN_NOPRINT
260684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	      case PR_UNALIGN_NOPRINT:
261d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose		return "NOPRINT";
262684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis#endif
263d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose#ifdef PR_UNALIGN_SIGBUS
264684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	      case PR_UNALIGN_SIGBUS:
265684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis		return "SIGBUS";
266d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose#endif
267684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	      default:
268d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose		break;
269d880b3aa6d594d1a7f2d307c29378c6f59b216ffJordan Rose	}
270684190b8dbe5258f4708ffbd816b8c5ee5b3502dArgyrios Kyrtzidis	sprintf(buf, "%x", ctl);
2717196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	return buf;
2727196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis}
2737196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
2747196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
27518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisint
27618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidissys_prctl(tcp)
27718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisstruct tcb *tcp;
27818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis{
27918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	int i;
28018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis
2815d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis	if (entering(tcp)) {
2825d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		printxval(prctl_options, tcp->u_arg[0], "PR_???");
2835d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		switch (tcp->u_arg[0]) {
2845d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GETNSHARE
2855d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GETNSHARE:
286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines			break;
2875d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
2885d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_SET_PDEATHSIG
2895d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_SET_PDEATHSIG:
2905d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			tprintf(", %lu", tcp->u_arg[1]);
2915d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
2925d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
2935d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_PDEATHSIG
2945d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_PDEATHSIG:
2955d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
2965d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
2975d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_SET_DUMPABLE
2985d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_SET_DUMPABLE:
2995d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			tprintf(", %lu", tcp->u_arg[1]);
3005d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3015d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3025d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_DUMPABLE
3035d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_DUMPABLE:
3045d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3055d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3065d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_SET_UNALIGN
3075d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_SET_UNALIGN:
3085d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
3095d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3105d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3115d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_UNALIGN
3125d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_UNALIGN:
3135d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			tprintf(", %#lx", tcp->u_arg[1]);
3145d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3155d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3165d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_SET_KEEPCAPS
3175d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_SET_KEEPCAPS:
3185d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			tprintf(", %lu", tcp->u_arg[1]);
3195d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3205d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3215d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_KEEPCAPS
3225d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_KEEPCAPS:
3235d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3245d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3255d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		default:
3265d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			for (i = 1; i < tcp->u_nargs; i++)
3275d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis				tprintf(", %#lx", tcp->u_arg[i]);
3285d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3295d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		}
3305d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis	} else {
3315d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		switch (tcp->u_arg[0]) {
3325d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_PDEATHSIG
3335d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_PDEATHSIG:
3345d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			if (umove(tcp, tcp->u_arg[1], &i) < 0)
3355d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis				tprintf(", %#lx", tcp->u_arg[1]);
3365d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			else
3377196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis				tprintf(", {%u}", i);
3385d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			break;
3395d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3405d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_DUMPABLE
3415d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_DUMPABLE:
3425d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			return RVAL_UDECIMAL;
3435d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3445d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_UNALIGN
3455d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_UNALIGN:
3465d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
3475d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis				break;
3485d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			tcp->auxstr = unalignctl_string(i);
3495d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis			return RVAL_STR;
3505d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#endif
3515d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis#ifdef PR_GET_KEEPCAPS
3525d2faa41bc63a2a29535ae3dbbc99daabf14ea2fArgyrios Kyrtzidis		case PR_GET_KEEPCAPS:
3537196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis			return RVAL_UDECIMAL;
3547196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
35518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		default:
35618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis			break;
35718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		}
35818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	}
35918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	return 0;
36018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis}
36118fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#endif /* HAVE_PRCTL */
36218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis
36318fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
36418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisint
36518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidissys_gethostid(tcp)
36630c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregorstruct tcb *tcp;
36718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis{
36818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	if (exiting(tcp))
36918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		return RVAL_HEX;
37018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	return 0;
37118fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis}
37218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#endif /* FREEBSD || SUNOS4 || SVR4 */
37318fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis
37418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisint
37518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidissys_sethostname(tcp)
37618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisstruct tcb *tcp;
37718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis{
37818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	if (entering(tcp)) {
37918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
38018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		tprintf(", %lu", tcp->u_arg[1]);
38130c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor	}
38218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	return 0;
38318fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis}
38418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis
38518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
38618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisint
3874b9c2d235fb9449e249d74f48ecfec601650de93John McCallsys_gethostname(tcp)
3884b9c2d235fb9449e249d74f48ecfec601650de93John McCallstruct tcb *tcp;
3894b9c2d235fb9449e249d74f48ecfec601650de93John McCall{
3904b9c2d235fb9449e249d74f48ecfec601650de93John McCall	if (exiting(tcp)) {
3914b9c2d235fb9449e249d74f48ecfec601650de93John McCall		if (syserror(tcp))
3924b9c2d235fb9449e249d74f48ecfec601650de93John McCall			tprintf("%#lx", tcp->u_arg[0]);
3934b9c2d235fb9449e249d74f48ecfec601650de93John McCall		else
3944b9c2d235fb9449e249d74f48ecfec601650de93John McCall			printpath(tcp, tcp->u_arg[0]);
3954b9c2d235fb9449e249d74f48ecfec601650de93John McCall		tprintf(", %lu", tcp->u_arg[1]);
39633e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall	}
39718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	return 0;
39833e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall}
39918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
40018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis
4014532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidisint
4024532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidissys_setdomainname(tcp)
4034532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidisstruct tcb *tcp;
4044532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis{
4054532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	if (entering(tcp)) {
40618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
40718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		tprintf(", %lu", tcp->u_arg[1]);
40818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	}
40918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	return 0;
41018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis}
41118fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis
41218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis#if !defined(LINUX)
41318fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis
41418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisint
41518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidissys_getdomainname(tcp)
41618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidisstruct tcb *tcp;
41718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis{
41818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	if (exiting(tcp)) {
41918fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		if (syserror(tcp))
42018fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis			tprintf("%#lx", tcp->u_arg[0]);
42118fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		else
42218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis			printpath(tcp, tcp->u_arg[0]);
423181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola		tprintf(", %lu", tcp->u_arg[1]);
42418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	}
42518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis	return 0;
42618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis}
4277196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif /* !LINUX */
4287196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
4294532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidisint
4304532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidissys_exit(tcp)
4314532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidisstruct tcb *tcp;
4324532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis{
4334532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	if (exiting(tcp)) {
4344532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis		fprintf(stderr, "_exit returned!\n");
4354532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis		return -1;
4364532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	}
4374532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	/* special case: we stop tracing this process, finish line now */
4384532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	tprintf("%ld) ", tcp->u_arg[0]);
4394532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	tabto(acolumn);
44033ace0669393acb84c24a7ff7a80e8759777b3e8Argyrios Kyrtzidis	tprintf("= ?");
4414532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	printtrailer();
442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines	return 0;
4434532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis}
4444532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis
4454532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidisint
4464532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidisinternal_exit(tcp)
4474532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidisstruct tcb *tcp;
4484532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis{
4494532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis	if (entering(tcp)) {
4504532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis		tcp->flags |= TCB_EXITING;
4514532b5553db699d5bed250454f9a45e0f66f4bf8Argyrios Kyrtzidis#ifdef __NR_exit_group
45218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis# ifdef IA64
4537196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis		if (ia32) {
4547196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis			if (tcp->scno == 252)
45518fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis				tcp->flags |= TCB_GROUP_EXITING;
45618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		} else
45718fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis# endif
45818fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis		if (known_scno(tcp) == __NR_exit_group)
4597196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis			tcp->flags |= TCB_GROUP_EXITING;
4607196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
4617196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	}
4627196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis	return 0;
4637196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis}
4647196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
4657196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/* TCP is creating a child we want to follow.
46618fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis   If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
4677196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis   If not, clear TCB_FOLLOWFORK, print an error, and return 1.  */
4687196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisstatic void
469fork_tcb(struct tcb *tcp)
470{
471	if (nprocs == tcbtabsize)
472		expand_tcbtab();
473
474	tcp->flags |= TCB_FOLLOWFORK;
475}
476
477#ifdef USE_PROCFS
478
479int
480sys_fork(struct tcb *tcp)
481{
482	if (exiting(tcp) && !syserror(tcp)) {
483		if (getrval2(tcp)) {
484			tcp->auxstr = "child process";
485			return RVAL_UDECIMAL | RVAL_STR;
486		}
487	}
488	return 0;
489}
490
491#if UNIXWARE > 2
492
493int
494sys_rfork(tcp)
495struct tcb *tcp;
496{
497	if (entering(tcp)) {
498		tprintf ("%ld", tcp->u_arg[0]);
499	}
500	else if (!syserror(tcp)) {
501		if (getrval2(tcp)) {
502			tcp->auxstr = "child process";
503			return RVAL_UDECIMAL | RVAL_STR;
504		}
505	}
506	return 0;
507}
508
509#endif
510
511int
512internal_fork(tcp)
513struct tcb *tcp;
514{
515	struct tcb *tcpchild;
516
517	if (exiting(tcp)) {
518#ifdef SYS_rfork
519		if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
520			return 0;
521#endif
522		if (getrval2(tcp))
523			return 0;
524		if (!followfork)
525			return 0;
526		fork_tcb(tcp);
527		if (syserror(tcp))
528			return 0;
529		tcpchild = alloctcb(tcp->u_rval);
530		if (proc_open(tcpchild, 2) < 0)
531			droptcb(tcpchild);
532	}
533	return 0;
534}
535
536#else /* !USE_PROCFS */
537
538#ifdef LINUX
539
540/* defines copied from linux/sched.h since we can't include that
541 * ourselves (it conflicts with *lots* of libc includes)
542 */
543#define CSIGNAL         0x000000ff      /* signal mask to be sent at exit */
544#define CLONE_VM        0x00000100      /* set if VM shared between processes */
545#define CLONE_FS        0x00000200      /* set if fs info shared between processes */
546#define CLONE_FILES     0x00000400      /* set if open files shared between processes */
547#define CLONE_SIGHAND   0x00000800      /* set if signal handlers shared */
548#define CLONE_IDLETASK  0x00001000      /* kernel-only flag */
549#define CLONE_PTRACE    0x00002000      /* set if we want to let tracing continue on the child too */
550#define CLONE_VFORK     0x00004000      /* set if the parent wants the child to wake it up on mm_release */
551#define CLONE_PARENT    0x00008000      /* set if we want to have the same parent as the cloner */
552#define CLONE_THREAD	0x00010000	/* Same thread group? */
553#define CLONE_NEWNS	0x00020000	/* New namespace group? */
554#define CLONE_SYSVSEM	0x00040000	/* share system V SEM_UNDO semantics */
555#define CLONE_SETTLS	0x00080000	/* create a new TLS for the child */
556#define CLONE_PARENT_SETTID	0x00100000	/* set the TID in the parent */
557#define CLONE_CHILD_CLEARTID	0x00200000	/* clear the TID in the child */
558#define CLONE_UNTRACED		0x00800000	/* set if the tracing process can't force CLONE_PTRACE on this clone */
559#define CLONE_CHILD_SETTID	0x01000000	/* set the TID in the child */
560
561static const struct xlat clone_flags[] = {
562    { CLONE_VM,		"CLONE_VM"	},
563    { CLONE_FS,		"CLONE_FS"	},
564    { CLONE_FILES,	"CLONE_FILES"	},
565    { CLONE_SIGHAND,	"CLONE_SIGHAND"	},
566    { CLONE_IDLETASK,	"CLONE_IDLETASK"},
567    { CLONE_PTRACE,	"CLONE_PTRACE"	},
568    { CLONE_VFORK,	"CLONE_VFORK"	},
569    { CLONE_PARENT,	"CLONE_PARENT"	},
570    { CLONE_THREAD,	"CLONE_THREAD" },
571    { CLONE_NEWNS,	"CLONE_NEWNS" },
572    { CLONE_SYSVSEM,	"CLONE_SYSVSEM" },
573    { CLONE_SETTLS,	"CLONE_SETTLS" },
574    { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
575    { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
576    { CLONE_UNTRACED,	"CLONE_UNTRACED" },
577    { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
578    { 0,		NULL		},
579};
580
581# ifdef I386
582#  include <asm/ldt.h>
583#   ifdef HAVE_STRUCT_USER_DESC
584#    define modify_ldt_ldt_s user_desc
585#   endif
586extern void print_ldt_entry();
587# endif
588
589# if defined IA64
590#  define ARG_FLAGS	0
591#  define ARG_STACK	1
592#  define ARG_STACKSIZE	(known_scno(tcp) == SYS_clone2 ? 2 : -1)
593#  define ARG_PTID	(known_scno(tcp) == SYS_clone2 ? 3 : 2)
594#  define ARG_CTID	(known_scno(tcp) == SYS_clone2 ? 4 : 3)
595#  define ARG_TLS	(known_scno(tcp) == SYS_clone2 ? 5 : 4)
596# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
597#  define ARG_STACK	0
598#  define ARG_FLAGS	1
599#  define ARG_PTID	2
600#  define ARG_CTID	3
601#  define ARG_TLS	4
602# elif defined X86_64 || defined ALPHA
603#  define ARG_FLAGS	0
604#  define ARG_STACK	1
605#  define ARG_PTID	2
606#  define ARG_CTID	3
607#  define ARG_TLS	4
608# else
609#  define ARG_FLAGS	0
610#  define ARG_STACK	1
611#  define ARG_PTID	2
612#  define ARG_TLS	3
613#  define ARG_CTID	4
614# endif
615
616int
617sys_clone(tcp)
618struct tcb *tcp;
619{
620	if (exiting(tcp)) {
621		const char *sep = "|";
622		unsigned long flags = tcp->u_arg[ARG_FLAGS];
623		tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
624# ifdef ARG_STACKSIZE
625		if (ARG_STACKSIZE != -1)
626			tprintf("stack_size=%#lx, ",
627				tcp->u_arg[ARG_STACKSIZE]);
628# endif
629		tprintf("flags=");
630		if (!printflags(clone_flags, flags &~ CSIGNAL, NULL))
631			sep = "";
632		if ((flags & CSIGNAL) != 0)
633			tprintf("%s%s", sep, signame(flags & CSIGNAL));
634		if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
635			      |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
636			return 0;
637		if (flags & CLONE_PARENT_SETTID)
638			tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
639		if (flags & CLONE_SETTLS) {
640# ifdef I386
641			struct modify_ldt_ldt_s copy;
642			if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
643				tprintf(", {entry_number:%d, ",
644					copy.entry_number);
645				if (!verbose(tcp))
646					tprintf("...}");
647				else
648					print_ldt_entry(&copy);
649			}
650			else
651# endif
652				tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
653		}
654		if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
655			tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
656	}
657	return 0;
658}
659
660int
661sys_unshare(struct tcb *tcp)
662{
663	if (entering(tcp))
664		printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
665	return 0;
666}
667#endif /* LINUX */
668
669int
670sys_fork(tcp)
671struct tcb *tcp;
672{
673	if (exiting(tcp))
674		return RVAL_UDECIMAL;
675	return 0;
676}
677
678int
679change_syscall(struct tcb *tcp, int new)
680{
681#ifdef LINUX
682#if defined(I386)
683	/* Attempt to make vfork into fork, which we can follow. */
684	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
685		return -1;
686	return 0;
687#elif defined(X86_64)
688	/* Attempt to make vfork into fork, which we can follow. */
689	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
690		return -1;
691	return 0;
692#elif defined(POWERPC)
693	if (ptrace(PTRACE_POKEUSER, tcp->pid,
694		   (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
695		return -1;
696	return 0;
697#elif defined(S390) || defined(S390X)
698	/* s390 linux after 2.4.7 has a hook in entry.S to allow this */
699	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
700		return -1;
701	return 0;
702#elif defined(M68K)
703	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
704		return -1;
705	return 0;
706#elif defined(SPARC) || defined(SPARC64)
707	struct pt_regs regs;
708	if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
709		return -1;
710	regs.u_regs[U_REG_G1] = new;
711	if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
712		return -1;
713	return 0;
714#elif defined(MIPS)
715	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
716		return -1;
717	return 0;
718#elif defined(ALPHA)
719	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
720		return -1;
721	return 0;
722#elif defined(AVR32)
723	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
724		return -1;
725	return 0;
726#elif defined(BFIN)
727	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
728		return -1;
729	return 0;
730#elif defined(IA64)
731	if (ia32) {
732		switch (new) {
733		case 2:
734			break;	/* x86 SYS_fork */
735		case SYS_clone:
736			new = 120;
737			break;
738		default:
739			fprintf(stderr, "%s: unexpected syscall %d\n",
740				__FUNCTION__, new);
741			return -1;
742		}
743		if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
744			return -1;
745	} else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
746		return -1;
747	return 0;
748#elif defined(HPPA)
749	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
750		return -1;
751	return 0;
752#elif defined(SH)
753	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
754		return -1;
755	return 0;
756#elif defined(SH64)
757	/* Top half of reg encodes the no. of args n as 0x1n.
758	   Assume 0 args as kernel never actually checks... */
759	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
760				0x100000 | new) < 0)
761		return -1;
762	return 0;
763#elif defined(CRISV10) || defined(CRISV32)
764	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
765		return -1;
766	return 0;
767#elif defined(ARM)
768	/* Some kernels support this, some (pre-2.6.16 or so) don't.  */
769# ifndef PTRACE_SET_SYSCALL
770#  define PTRACE_SET_SYSCALL 23
771# endif
772
773	if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
774		return -1;
775
776	return 0;
777#elif defined(TILE)
778	if (ptrace(PTRACE_POKEUSER, tcp->pid,
779		   (char*)PTREGS_OFFSET_REG(0),
780		   new) != 0)
781		return -1;
782	return 0;
783#elif defined(MICROBLAZE)
784	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new)<0)
785		return -1;
786	return 0;
787#else
788#warning Do not know how to handle change_syscall for this architecture
789#endif /* architecture */
790#endif /* LINUX */
791	return -1;
792}
793
794#ifdef LINUX
795int
796handle_new_child(struct tcb *tcp, int pid, int bpt)
797{
798	struct tcb *tcpchild;
799
800#ifdef CLONE_PTRACE		/* See new setbpt code.  */
801	tcpchild = pid2tcb(pid);
802	if (tcpchild != NULL) {
803		/* The child already reported its startup trap
804		   before the parent reported its syscall return.  */
805		if ((tcpchild->flags
806		     & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
807		    != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
808			fprintf(stderr, "\
809[preattached child %d of %d in weird state!]\n",
810				pid, tcp->pid);
811	}
812	else
813#endif /* CLONE_PTRACE */
814	{
815		fork_tcb(tcp);
816		tcpchild = alloctcb(pid);
817	}
818
819#ifndef CLONE_PTRACE
820	/* Attach to the new child */
821	if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
822		if (bpt)
823			clearbpt(tcp);
824		perror("PTRACE_ATTACH");
825		fprintf(stderr, "Too late?\n");
826		droptcb(tcpchild);
827		return 0;
828	}
829#endif /* !CLONE_PTRACE */
830
831	if (bpt)
832		clearbpt(tcp);
833
834	tcpchild->flags |= TCB_ATTACHED;
835	/* Child has BPT too, must be removed on first occasion.  */
836	if (bpt) {
837		tcpchild->flags |= TCB_BPTSET;
838		tcpchild->baddr = tcp->baddr;
839		memcpy(tcpchild->inst, tcp->inst,
840			sizeof tcpchild->inst);
841	}
842	tcpchild->parent = tcp;
843	tcp->nchildren++;
844	if (tcpchild->flags & TCB_SUSPENDED) {
845		/* The child was born suspended, due to our having
846		   forced CLONE_PTRACE.  */
847		if (bpt)
848			clearbpt(tcpchild);
849
850		tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
851		if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
852			return -1;
853
854		if (!qflag)
855			fprintf(stderr, "\
856Process %u resumed (parent %d ready)\n",
857				pid, tcp->pid);
858	}
859	else {
860		if (!qflag)
861			fprintf(stderr, "Process %d attached\n", pid);
862	}
863
864#ifdef TCB_CLONE_THREAD
865	if (sysent[tcp->scno].sys_func == sys_clone)
866	{
867		/*
868		 * Save the flags used in this call,
869		 * in case we point TCP to our parent below.
870		 */
871		int call_flags = tcp->u_arg[ARG_FLAGS];
872		if ((tcp->flags & TCB_CLONE_THREAD) &&
873		    tcp->parent != NULL) {
874			/* The parent in this clone is itself a
875			   thread belonging to another process.
876			   There is no meaning to the parentage
877			   relationship of the new child with the
878			   thread, only with the process.  We
879			   associate the new thread with our
880			   parent.  Since this is done for every
881			   new thread, there will never be a
882			   TCB_CLONE_THREAD process that has
883			   children.  */
884			--tcp->nchildren;
885			tcp = tcp->parent;
886			tcpchild->parent = tcp;
887			++tcp->nchildren;
888		}
889		if (call_flags & CLONE_THREAD) {
890			tcpchild->flags |= TCB_CLONE_THREAD;
891			++tcp->nclone_threads;
892		}
893		if ((call_flags & CLONE_PARENT) &&
894		    !(call_flags & CLONE_THREAD)) {
895			--tcp->nchildren;
896			tcpchild->parent = NULL;
897			if (tcp->parent != NULL) {
898				tcp = tcp->parent;
899				tcpchild->parent = tcp;
900				++tcp->nchildren;
901			}
902		}
903	}
904#endif /* TCB_CLONE_THREAD */
905	return 0;
906}
907
908int
909internal_fork(struct tcb *tcp)
910{
911	if ((ptrace_setoptions
912	    & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
913	   == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
914		return 0;
915
916	if (entering(tcp)) {
917		tcp->flags &= ~TCB_FOLLOWFORK;
918		if (!followfork)
919			return 0;
920		/*
921		 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
922		 * new child if clone is called with flag CLONE_UNTRACED, so
923		 * we keep the same logic with that option and don't trace it.
924		 */
925		if ((sysent[tcp->scno].sys_func == sys_clone) &&
926		    (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
927			return 0;
928		fork_tcb(tcp);
929		if (setbpt(tcp) < 0)
930			return 0;
931	} else {
932		int pid;
933		int bpt;
934
935		if (!(tcp->flags & TCB_FOLLOWFORK))
936			return 0;
937
938		bpt = tcp->flags & TCB_BPTSET;
939
940		if (syserror(tcp)) {
941			if (bpt)
942				clearbpt(tcp);
943			return 0;
944		}
945
946		pid = tcp->u_rval;
947
948		return handle_new_child(tcp, pid, bpt);
949	}
950	return 0;
951}
952
953#else /* !LINUX */
954
955int
956internal_fork(tcp)
957struct tcb *tcp;
958{
959	struct tcb *tcpchild;
960	int pid;
961	int dont_follow = 0;
962
963#ifdef SYS_vfork
964	if (known_scno(tcp) == SYS_vfork) {
965		/* Attempt to make vfork into fork, which we can follow. */
966		if (change_syscall(tcp, SYS_fork) < 0)
967			dont_follow = 1;
968	}
969#endif
970	if (entering(tcp)) {
971		if (!followfork || dont_follow)
972			return 0;
973		fork_tcb(tcp);
974		if (setbpt(tcp) < 0)
975			return 0;
976	}
977	else {
978		int bpt = tcp->flags & TCB_BPTSET;
979
980		if (!(tcp->flags & TCB_FOLLOWFORK))
981			return 0;
982		if (bpt)
983			clearbpt(tcp);
984
985		if (syserror(tcp))
986			return 0;
987
988		pid = tcp->u_rval;
989		fork_tcb(tcp);
990		tcpchild = alloctcb(pid);
991#ifdef SUNOS4
992#ifdef oldway
993		/* The child must have run before it can be attached. */
994		{
995			struct timeval tv;
996			tv.tv_sec = 0;
997			tv.tv_usec = 10000;
998			select(0, NULL, NULL, NULL, &tv);
999		}
1000		if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1001			perror("PTRACE_ATTACH");
1002			fprintf(stderr, "Too late?\n");
1003			droptcb(tcpchild);
1004			return 0;
1005		}
1006#else /* !oldway */
1007		/* Try to catch the new process as soon as possible. */
1008		{
1009			int i;
1010			for (i = 0; i < 1024; i++)
1011				if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1012					break;
1013			if (i == 1024) {
1014				perror("PTRACE_ATTACH");
1015				fprintf(stderr, "Too late?\n");
1016				droptcb(tcpchild);
1017				return 0;
1018			}
1019		}
1020#endif /* !oldway */
1021#endif /* SUNOS4 */
1022		tcpchild->flags |= TCB_ATTACHED;
1023		/* Child has BPT too, must be removed on first occasion */
1024		if (bpt) {
1025			tcpchild->flags |= TCB_BPTSET;
1026			tcpchild->baddr = tcp->baddr;
1027			memcpy(tcpchild->inst, tcp->inst,
1028				sizeof tcpchild->inst);
1029		}
1030		tcpchild->parent = tcp;
1031		tcp->nchildren++;
1032		if (!qflag)
1033			fprintf(stderr, "Process %d attached\n", pid);
1034	}
1035	return 0;
1036}
1037
1038#endif /* !LINUX */
1039
1040#endif /* !USE_PROCFS */
1041
1042#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
1043
1044int
1045sys_vfork(tcp)
1046struct tcb *tcp;
1047{
1048	if (exiting(tcp))
1049		return RVAL_UDECIMAL;
1050	return 0;
1051}
1052
1053#endif /* SUNOS4 || LINUX || FREEBSD */
1054
1055#ifndef LINUX
1056
1057static char idstr[16];
1058
1059int
1060sys_getpid(tcp)
1061struct tcb *tcp;
1062{
1063	if (exiting(tcp)) {
1064		sprintf(idstr, "ppid %lu", getrval2(tcp));
1065		tcp->auxstr = idstr;
1066		return RVAL_STR;
1067	}
1068	return 0;
1069}
1070
1071int
1072sys_getuid(tcp)
1073struct tcb *tcp;
1074{
1075	if (exiting(tcp)) {
1076		sprintf(idstr, "euid %lu", getrval2(tcp));
1077		tcp->auxstr = idstr;
1078		return RVAL_STR;
1079	}
1080	return 0;
1081}
1082
1083int
1084sys_getgid(tcp)
1085struct tcb *tcp;
1086{
1087	if (exiting(tcp)) {
1088		sprintf(idstr, "egid %lu", getrval2(tcp));
1089		tcp->auxstr = idstr;
1090		return RVAL_STR;
1091	}
1092	return 0;
1093}
1094
1095#endif /* !LINUX */
1096
1097#ifdef LINUX
1098
1099int
1100sys_setuid(tcp)
1101struct tcb *tcp;
1102{
1103	if (entering(tcp)) {
1104		tprintf("%u", (uid_t) tcp->u_arg[0]);
1105	}
1106	return 0;
1107}
1108
1109int
1110sys_setgid(tcp)
1111struct tcb *tcp;
1112{
1113	if (entering(tcp)) {
1114		tprintf("%u", (gid_t) tcp->u_arg[0]);
1115	}
1116	return 0;
1117}
1118
1119int
1120sys_getresuid(struct tcb *tcp)
1121{
1122	if (exiting(tcp)) {
1123		__kernel_uid_t uid;
1124		if (syserror(tcp))
1125			tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1126				tcp->u_arg[1], tcp->u_arg[2]);
1127		else {
1128			if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1129				tprintf("%#lx, ", tcp->u_arg[0]);
1130			else
1131				tprintf("[%lu], ", (unsigned long) uid);
1132			if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1133				tprintf("%#lx, ", tcp->u_arg[1]);
1134			else
1135				tprintf("[%lu], ", (unsigned long) uid);
1136			if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1137				tprintf("%#lx", tcp->u_arg[2]);
1138			else
1139				tprintf("[%lu]", (unsigned long) uid);
1140		}
1141	}
1142	return 0;
1143}
1144
1145int
1146sys_getresgid(tcp)
1147struct tcb *tcp;
1148{
1149	if (exiting(tcp)) {
1150		__kernel_gid_t gid;
1151		if (syserror(tcp))
1152			tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1153				tcp->u_arg[1], tcp->u_arg[2]);
1154		else {
1155			if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1156				tprintf("%#lx, ", tcp->u_arg[0]);
1157			else
1158				tprintf("[%lu], ", (unsigned long) gid);
1159			if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1160				tprintf("%#lx, ", tcp->u_arg[1]);
1161			else
1162				tprintf("[%lu], ", (unsigned long) gid);
1163			if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1164				tprintf("%#lx", tcp->u_arg[2]);
1165			else
1166				tprintf("[%lu]", (unsigned long) gid);
1167		}
1168	}
1169	return 0;
1170}
1171
1172#endif /* LINUX */
1173
1174int
1175sys_setreuid(tcp)
1176struct tcb *tcp;
1177{
1178	if (entering(tcp)) {
1179		printuid("", tcp->u_arg[0]);
1180		printuid(", ", tcp->u_arg[1]);
1181	}
1182	return 0;
1183}
1184
1185int
1186sys_setregid(tcp)
1187struct tcb *tcp;
1188{
1189	if (entering(tcp)) {
1190		printuid("", tcp->u_arg[0]);
1191		printuid(", ", tcp->u_arg[1]);
1192	}
1193	return 0;
1194}
1195
1196#if defined(LINUX) || defined(FREEBSD)
1197int
1198sys_setresuid(tcp)
1199     struct tcb *tcp;
1200{
1201	if (entering(tcp)) {
1202		printuid("", tcp->u_arg[0]);
1203		printuid(", ", tcp->u_arg[1]);
1204		printuid(", ", tcp->u_arg[2]);
1205	}
1206	return 0;
1207}
1208int
1209sys_setresgid(tcp)
1210     struct tcb *tcp;
1211{
1212	if (entering(tcp)) {
1213		printuid("", tcp->u_arg[0]);
1214		printuid(", ", tcp->u_arg[1]);
1215		printuid(", ", tcp->u_arg[2]);
1216	}
1217	return 0;
1218}
1219
1220#endif /* LINUX || FREEBSD */
1221
1222int
1223sys_setgroups(tcp)
1224struct tcb *tcp;
1225{
1226	if (entering(tcp)) {
1227		unsigned long len, size, start, cur, end, abbrev_end;
1228		GETGROUPS_T gid;
1229		int failed = 0;
1230
1231		len = tcp->u_arg[0];
1232		tprintf("%lu, ", len);
1233		if (len == 0) {
1234			tprintf("[]");
1235			return 0;
1236		}
1237		start = tcp->u_arg[1];
1238		if (start == 0) {
1239			tprintf("NULL");
1240			return 0;
1241		}
1242		size = len * sizeof(gid);
1243		end = start + size;
1244		if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1245			tprintf("%#lx", start);
1246			return 0;
1247		}
1248		if (abbrev(tcp)) {
1249			abbrev_end = start + max_strlen * sizeof(gid);
1250			if (abbrev_end < start)
1251				abbrev_end = end;
1252		} else {
1253			abbrev_end = end;
1254		}
1255		tprintf("[");
1256		for (cur = start; cur < end; cur += sizeof(gid)) {
1257			if (cur > start)
1258				tprintf(", ");
1259			if (cur >= abbrev_end) {
1260				tprintf("...");
1261				break;
1262			}
1263			if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1264				tprintf("?");
1265				failed = 1;
1266				break;
1267			}
1268			tprintf("%lu", (unsigned long) gid);
1269		}
1270		tprintf("]");
1271		if (failed)
1272			tprintf(" %#lx", tcp->u_arg[1]);
1273	}
1274	return 0;
1275}
1276
1277int
1278sys_getgroups(tcp)
1279struct tcb *tcp;
1280{
1281	unsigned long len;
1282
1283	if (entering(tcp)) {
1284		len = tcp->u_arg[0];
1285		tprintf("%lu, ", len);
1286	} else {
1287		unsigned long size, start, cur, end, abbrev_end;
1288		GETGROUPS_T gid;
1289		int failed = 0;
1290
1291		len = tcp->u_rval;
1292		if (len == 0) {
1293			tprintf("[]");
1294			return 0;
1295		}
1296		start = tcp->u_arg[1];
1297		if (start == 0) {
1298			tprintf("NULL");
1299			return 0;
1300		}
1301		if (tcp->u_arg[0] == 0) {
1302			tprintf("%#lx", start);
1303			return 0;
1304		}
1305		size = len * sizeof(gid);
1306		end = start + size;
1307		if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1308		    size / sizeof(gid) != len || end < start) {
1309			tprintf("%#lx", start);
1310			return 0;
1311		}
1312		if (abbrev(tcp)) {
1313			abbrev_end = start + max_strlen * sizeof(gid);
1314			if (abbrev_end < start)
1315				abbrev_end = end;
1316		} else {
1317			abbrev_end = end;
1318		}
1319		tprintf("[");
1320		for (cur = start; cur < end; cur += sizeof(gid)) {
1321			if (cur > start)
1322				tprintf(", ");
1323			if (cur >= abbrev_end) {
1324				tprintf("...");
1325				break;
1326			}
1327			if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1328				tprintf("?");
1329				failed = 1;
1330				break;
1331			}
1332			tprintf("%lu", (unsigned long) gid);
1333		}
1334		tprintf("]");
1335		if (failed)
1336			tprintf(" %#lx", tcp->u_arg[1]);
1337	}
1338	return 0;
1339}
1340
1341#ifdef LINUX
1342int
1343sys_setgroups32(tcp)
1344struct tcb *tcp;
1345{
1346	if (entering(tcp)) {
1347		unsigned long len, size, start, cur, end, abbrev_end;
1348		GETGROUPS32_T gid;
1349		int failed = 0;
1350
1351		len = tcp->u_arg[0];
1352		tprintf("%lu, ", len);
1353		if (len == 0) {
1354			tprintf("[]");
1355			return 0;
1356		}
1357		start = tcp->u_arg[1];
1358		if (start == 0) {
1359			tprintf("NULL");
1360			return 0;
1361		}
1362		size = len * sizeof(gid);
1363		end = start + size;
1364		if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1365			tprintf("%#lx", start);
1366			return 0;
1367		}
1368		if (abbrev(tcp)) {
1369			abbrev_end = start + max_strlen * sizeof(gid);
1370			if (abbrev_end < start)
1371				abbrev_end = end;
1372		} else {
1373			abbrev_end = end;
1374		}
1375		tprintf("[");
1376		for (cur = start; cur < end; cur += sizeof(gid)) {
1377			if (cur > start)
1378				tprintf(", ");
1379			if (cur >= abbrev_end) {
1380				tprintf("...");
1381				break;
1382			}
1383			if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1384				tprintf("?");
1385				failed = 1;
1386				break;
1387			}
1388			tprintf("%lu", (unsigned long) gid);
1389		}
1390		tprintf("]");
1391		if (failed)
1392			tprintf(" %#lx", tcp->u_arg[1]);
1393	}
1394	return 0;
1395}
1396
1397int
1398sys_getgroups32(tcp)
1399struct tcb *tcp;
1400{
1401	unsigned long len;
1402
1403	if (entering(tcp)) {
1404		len = tcp->u_arg[0];
1405		tprintf("%lu, ", len);
1406	} else {
1407		unsigned long size, start, cur, end, abbrev_end;
1408		GETGROUPS32_T gid;
1409		int failed = 0;
1410
1411		len = tcp->u_rval;
1412		if (len == 0) {
1413			tprintf("[]");
1414			return 0;
1415		}
1416		start = tcp->u_arg[1];
1417		if (start == 0) {
1418			tprintf("NULL");
1419			return 0;
1420		}
1421		size = len * sizeof(gid);
1422		end = start + size;
1423		if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1424		    size / sizeof(gid) != len || end < start) {
1425			tprintf("%#lx", start);
1426			return 0;
1427		}
1428		if (abbrev(tcp)) {
1429			abbrev_end = start + max_strlen * sizeof(gid);
1430			if (abbrev_end < start)
1431				abbrev_end = end;
1432		} else {
1433			abbrev_end = end;
1434		}
1435		tprintf("[");
1436		for (cur = start; cur < end; cur += sizeof(gid)) {
1437			if (cur > start)
1438				tprintf(", ");
1439			if (cur >= abbrev_end) {
1440				tprintf("...");
1441				break;
1442			}
1443			if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1444				tprintf("?");
1445				failed = 1;
1446				break;
1447			}
1448			tprintf("%lu", (unsigned long) gid);
1449		}
1450		tprintf("]");
1451		if (failed)
1452			tprintf(" %#lx", tcp->u_arg[1]);
1453	}
1454	return 0;
1455}
1456#endif /* LINUX */
1457
1458#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
1459int
1460sys_setpgrp(tcp)
1461struct tcb *tcp;
1462{
1463	if (entering(tcp)) {
1464#ifndef SVR4
1465		tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1466#endif /* !SVR4 */
1467	}
1468	return 0;
1469}
1470#endif /* ALPHA || SUNOS4 || SVR4 */
1471
1472int
1473sys_getpgrp(tcp)
1474struct tcb *tcp;
1475{
1476	if (entering(tcp)) {
1477#ifndef SVR4
1478		tprintf("%lu", tcp->u_arg[0]);
1479#endif /* !SVR4 */
1480	}
1481	return 0;
1482}
1483
1484int
1485sys_getsid(tcp)
1486struct tcb *tcp;
1487{
1488	if (entering(tcp)) {
1489		tprintf("%lu", tcp->u_arg[0]);
1490	}
1491	return 0;
1492}
1493
1494int
1495sys_setsid(tcp)
1496struct tcb *tcp;
1497{
1498	return 0;
1499}
1500
1501int
1502sys_getpgid(tcp)
1503struct tcb *tcp;
1504{
1505	if (entering(tcp)) {
1506		tprintf("%lu", tcp->u_arg[0]);
1507	}
1508	return 0;
1509}
1510
1511int
1512sys_setpgid(tcp)
1513struct tcb *tcp;
1514{
1515	if (entering(tcp)) {
1516		tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1517	}
1518	return 0;
1519}
1520
1521#if UNIXWARE >= 2
1522
1523#include <sys/privilege.h>
1524
1525
1526static const struct xlat procpriv_cmds [] = {
1527	{ SETPRV,	"SETPRV"	},
1528	{ CLRPRV,	"CLRPRV"	},
1529	{ PUTPRV,	"PUTPRV"	},
1530	{ GETPRV,	"GETPRV"	},
1531	{ CNTPRV,	"CNTPRV"	},
1532	{ 0,		NULL		},
1533};
1534
1535
1536static const struct xlat procpriv_priv [] = {
1537	{ P_OWNER,	"P_OWNER"	},
1538	{ P_AUDIT,	"P_AUDIT"	},
1539	{ P_COMPAT,	"P_COMPAT"	},
1540	{ P_DACREAD,	"P_DACREAD"	},
1541	{ P_DACWRITE,	"P_DACWRITE"	},
1542	{ P_DEV,	"P_DEV"		},
1543	{ P_FILESYS,	"P_FILESYS"	},
1544	{ P_MACREAD,	"P_MACREAD"	},
1545	{ P_MACWRITE,	"P_MACWRITE"	},
1546	{ P_MOUNT,	"P_MOUNT"	},
1547	{ P_MULTIDIR,	"P_MULTIDIR"	},
1548	{ P_SETPLEVEL,	"P_SETPLEVEL"	},
1549	{ P_SETSPRIV,	"P_SETSPRIV"	},
1550	{ P_SETUID,	"P_SETUID"	},
1551	{ P_SYSOPS,	"P_SYSOPS"	},
1552	{ P_SETUPRIV,	"P_SETUPRIV"	},
1553	{ P_DRIVER,	"P_DRIVER"	},
1554	{ P_RTIME,	"P_RTIME"	},
1555	{ P_MACUPGRADE,	"P_MACUPGRADE"	},
1556	{ P_FSYSRANGE,	"P_FSYSRANGE"	},
1557	{ P_SETFLEVEL,	"P_SETFLEVEL"	},
1558	{ P_AUDITWR,	"P_AUDITWR"	},
1559	{ P_TSHAR,	"P_TSHAR"	},
1560	{ P_PLOCK,	"P_PLOCK"	},
1561	{ P_CORE,	"P_CORE"	},
1562	{ P_LOADMOD,	"P_LOADMOD"	},
1563	{ P_BIND,	"P_BIND"	},
1564	{ P_ALLPRIVS,	"P_ALLPRIVS"	},
1565	{ 0,		NULL		},
1566};
1567
1568
1569static const struct xlat procpriv_type [] = {
1570	{ PS_FIX,	"PS_FIX"	},
1571	{ PS_INH,	"PS_INH"	},
1572	{ PS_MAX,	"PS_MAX"	},
1573	{ PS_WKG,	"PS_WKG"	},
1574	{ 0,		NULL		},
1575};
1576
1577
1578static void
1579printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
1580{
1581	priv_t buf [128];
1582	int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1583	int dots = len > max;
1584	int i;
1585
1586	if (len > max) len = max;
1587
1588	if (len <= 0 ||
1589	    umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1590	{
1591		tprintf ("%#lx", addr);
1592		return;
1593	}
1594
1595	tprintf ("[");
1596
1597	for (i = 0; i < len; ++i) {
1598		const char *t, *p;
1599
1600		if (i) tprintf (", ");
1601
1602		if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1603		    (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1604		{
1605			tprintf ("%s|%s", t, p);
1606		}
1607		else {
1608			tprintf ("%#lx", buf [i]);
1609		}
1610	}
1611
1612	if (dots) tprintf (" ...");
1613
1614	tprintf ("]");
1615}
1616
1617
1618int
1619sys_procpriv(tcp)
1620struct tcb *tcp;
1621{
1622	if (entering(tcp)) {
1623		printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1624		switch (tcp->u_arg[0]) {
1625		    case CNTPRV:
1626			tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1627			break;
1628
1629		    case GETPRV:
1630			break;
1631
1632		    default:
1633			tprintf (", ");
1634			printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1635			tprintf (", %ld", tcp->u_arg[2]);
1636		}
1637	}
1638	else if (tcp->u_arg[0] == GETPRV) {
1639		if (syserror (tcp)) {
1640			tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1641		}
1642		else {
1643			tprintf (", ");
1644			printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1645			tprintf (", %ld", tcp->u_arg[2]);
1646		}
1647	}
1648
1649	return 0;
1650}
1651
1652#endif /* UNIXWARE */
1653
1654
1655static void
1656printargv(struct tcb *tcp, long addr)
1657{
1658	union {
1659		unsigned int p32;
1660		unsigned long p64;
1661		char data[sizeof(long)];
1662	} cp;
1663	const char *sep;
1664	int n = 0;
1665
1666	cp.p64 = 1;
1667	for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1668		if (umoven(tcp, addr, personality_wordsize[current_personality],
1669			   cp.data) < 0) {
1670			tprintf("%#lx", addr);
1671			return;
1672		}
1673		if (personality_wordsize[current_personality] == 4)
1674			cp.p64 = cp.p32;
1675		if (cp.p64 == 0)
1676			break;
1677		tprintf("%s", sep);
1678		printstr(tcp, cp.p64, -1);
1679		addr += personality_wordsize[current_personality];
1680	}
1681	if (cp.p64)
1682		tprintf("%s...", sep);
1683}
1684
1685static void
1686printargc(const char *fmt, struct tcb *tcp, long addr)
1687{
1688	int count;
1689	char *cp;
1690
1691	for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1692		addr += sizeof(char *);
1693	}
1694	tprintf(fmt, count, count == 1 ? "" : "s");
1695}
1696
1697#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
1698int
1699sys_execv(struct tcb *tcp)
1700{
1701	if (entering(tcp)) {
1702		printpath(tcp, tcp->u_arg[0]);
1703		if (!verbose(tcp))
1704			tprintf(", %#lx", tcp->u_arg[1]);
1705		else {
1706			tprintf(", [");
1707			printargv(tcp, tcp->u_arg[1]);
1708			tprintf("]");
1709		}
1710	}
1711	return 0;
1712}
1713#endif /* SPARC || SPARC64 || SUNOS4 */
1714
1715int
1716sys_execve(struct tcb *tcp)
1717{
1718	if (entering(tcp)) {
1719		printpath(tcp, tcp->u_arg[0]);
1720		if (!verbose(tcp))
1721			tprintf(", %#lx", tcp->u_arg[1]);
1722		else {
1723			tprintf(", [");
1724			printargv(tcp, tcp->u_arg[1]);
1725			tprintf("]");
1726		}
1727		if (!verbose(tcp))
1728			tprintf(", %#lx", tcp->u_arg[2]);
1729		else if (abbrev(tcp))
1730			printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1731		else {
1732			tprintf(", [");
1733			printargv(tcp, tcp->u_arg[2]);
1734			tprintf("]");
1735		}
1736	}
1737	return 0;
1738}
1739
1740#if UNIXWARE > 2
1741
1742int sys_rexecve(tcp)
1743struct tcb *tcp;
1744{
1745	if (entering (tcp)) {
1746		sys_execve (tcp);
1747		tprintf (", %ld", tcp->u_arg[3]);
1748	}
1749	return 0;
1750}
1751
1752#endif
1753
1754int
1755internal_exec(tcp)
1756struct tcb *tcp;
1757{
1758#ifdef SUNOS4
1759	if (exiting(tcp) && !syserror(tcp) && followfork)
1760		fixvfork(tcp);
1761#endif /* SUNOS4 */
1762#if defined LINUX && defined TCB_WAITEXECVE
1763	if (exiting(tcp) && syserror(tcp))
1764		tcp->flags &= ~TCB_WAITEXECVE;
1765	else
1766		tcp->flags |= TCB_WAITEXECVE;
1767#endif /* LINUX && TCB_WAITEXECVE */
1768	return 0;
1769}
1770
1771#ifdef LINUX
1772#ifndef __WNOTHREAD
1773#define __WNOTHREAD	0x20000000
1774#endif
1775#ifndef __WALL
1776#define __WALL		0x40000000
1777#endif
1778#ifndef __WCLONE
1779#define __WCLONE	0x80000000
1780#endif
1781#endif /* LINUX */
1782
1783static const struct xlat wait4_options[] = {
1784	{ WNOHANG,	"WNOHANG"	},
1785#ifndef WSTOPPED
1786	{ WUNTRACED,	"WUNTRACED"	},
1787#endif
1788#ifdef WEXITED
1789	{ WEXITED,	"WEXITED"	},
1790#endif
1791#ifdef WTRAPPED
1792	{ WTRAPPED,	"WTRAPPED"	},
1793#endif
1794#ifdef WSTOPPED
1795	{ WSTOPPED,	"WSTOPPED"	},
1796#endif
1797#ifdef WCONTINUED
1798	{ WCONTINUED,	"WCONTINUED"	},
1799#endif
1800#ifdef WNOWAIT
1801	{ WNOWAIT,	"WNOWAIT"	},
1802#endif
1803#ifdef __WCLONE
1804	{ __WCLONE,	"__WCLONE"	},
1805#endif
1806#ifdef __WALL
1807	{ __WALL,	"__WALL"	},
1808#endif
1809#ifdef __WNOTHREAD
1810	{ __WNOTHREAD,	"__WNOTHREAD"	},
1811#endif
1812	{ 0,		NULL		},
1813};
1814
1815#if !defined WCOREFLAG && defined WCOREFLG
1816# define WCOREFLAG WCOREFLG
1817#endif
1818#ifndef WCOREFLAG
1819# define WCOREFLAG 0x80
1820#endif
1821#ifndef WCOREDUMP
1822# define WCOREDUMP(status) ((status) & 0200)
1823#endif
1824
1825
1826#ifndef W_STOPCODE
1827#define W_STOPCODE(sig)		((sig) << 8 | 0x7f)
1828#endif
1829#ifndef W_EXITCODE
1830#define W_EXITCODE(ret, sig)	((ret) << 8 | (sig))
1831#endif
1832
1833static int
1834printstatus(status)
1835int status;
1836{
1837	int exited = 0;
1838
1839	/*
1840	 * Here is a tricky presentation problem.  This solution
1841	 * is still not entirely satisfactory but since there
1842	 * are no wait status constructors it will have to do.
1843	 */
1844	if (WIFSTOPPED(status)) {
1845		tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
1846			signame(WSTOPSIG(status)));
1847		status &= ~W_STOPCODE(WSTOPSIG(status));
1848	}
1849	else if (WIFSIGNALED(status)) {
1850		tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
1851			signame(WTERMSIG(status)),
1852			WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
1853		status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1854	}
1855	else if (WIFEXITED(status)) {
1856		tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
1857			WEXITSTATUS(status));
1858		exited = 1;
1859		status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
1860	}
1861	else {
1862		tprintf("[%#x]", status);
1863		return 0;
1864	}
1865
1866	if (status == 0)
1867		tprintf("]");
1868	else
1869		tprintf(" | %#x]", status);
1870
1871	return exited;
1872}
1873
1874static int
1875printwaitn(struct tcb *tcp, int n, int bitness)
1876{
1877	int status;
1878	int exited = 0;
1879
1880	if (entering(tcp)) {
1881#ifdef LINUX
1882		/* On Linux, kernel-side pid_t is typedef'ed to int
1883		 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
1884		 * pid argument to int on 64bit arches, producing,
1885		 * for example, wait4(4294967295, ...) instead of -1
1886		 * in strace. We have to use int here, not long.
1887		 */
1888		int pid = tcp->u_arg[0];
1889		tprintf("%d, ", pid);
1890#else
1891		/*
1892		 * Sign-extend a 32-bit value when that's what it is.
1893		 */
1894		long pid = tcp->u_arg[0];
1895		if (personality_wordsize[current_personality] < sizeof pid)
1896			pid = (long) (int) pid;
1897		tprintf("%ld, ", pid);
1898#endif
1899	} else {
1900		/* status */
1901		if (!tcp->u_arg[1])
1902			tprintf("NULL");
1903		else if (syserror(tcp) || tcp->u_rval == 0)
1904			tprintf("%#lx", tcp->u_arg[1]);
1905		else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1906			tprintf("[?]");
1907		else
1908			exited = printstatus(status);
1909		/* options */
1910		tprintf(", ");
1911		printflags(wait4_options, tcp->u_arg[2], "W???");
1912		if (n == 4) {
1913			tprintf(", ");
1914			/* usage */
1915			if (!tcp->u_arg[3])
1916				tprintf("NULL");
1917#ifdef LINUX
1918			else if (tcp->u_rval > 0) {
1919#ifdef ALPHA
1920				if (bitness)
1921					printrusage32(tcp, tcp->u_arg[3]);
1922				else
1923#endif
1924					printrusage(tcp, tcp->u_arg[3]);
1925			}
1926#endif /* LINUX */
1927#ifdef SUNOS4
1928			else if (tcp->u_rval > 0 && exited)
1929				printrusage(tcp, tcp->u_arg[3]);
1930#endif /* SUNOS4 */
1931			else
1932				tprintf("%#lx", tcp->u_arg[3]);
1933		}
1934	}
1935	return 0;
1936}
1937
1938int
1939internal_wait(tcp, flagarg)
1940struct tcb *tcp;
1941int flagarg;
1942{
1943	int got_kids;
1944
1945#ifdef TCB_CLONE_THREAD
1946	if (tcp->flags & TCB_CLONE_THREAD)
1947		/* The children we wait for are our parent's children.  */
1948		got_kids = (tcp->parent->nchildren
1949			    > tcp->parent->nclone_threads);
1950	else
1951		got_kids = (tcp->nchildren > tcp->nclone_threads);
1952#else
1953	got_kids = tcp->nchildren > 0;
1954#endif
1955
1956	if (entering(tcp) && got_kids) {
1957		/* There are children that this parent should block for.
1958		   But ptrace made us the parent of the traced children
1959		   and the real parent will get ECHILD from the wait call.
1960
1961		   XXX If we attached with strace -f -p PID, then there
1962		   may be untraced dead children the parent could be reaping
1963		   now, but we make him block.  */
1964
1965		/* ??? WTA: fix bug with hanging children */
1966
1967		if (!(tcp->u_arg[flagarg] & WNOHANG)) {
1968			/*
1969			 * There are traced children.  We'll make the parent
1970			 * block to avoid a false ECHILD error due to our
1971			 * ptrace having stolen the children.  However,
1972			 * we shouldn't block if there are zombies to reap.
1973			 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1974			 */
1975			struct tcb *child = NULL;
1976			if (tcp->nzombies > 0 &&
1977			    (tcp->u_arg[0] == -1 ||
1978			     (child = pid2tcb(tcp->u_arg[0])) == NULL))
1979				return 0;
1980			if (tcp->u_arg[0] > 0) {
1981				/*
1982				 * If the parent waits for a specified child
1983				 * PID, then it must get ECHILD right away
1984				 * if that PID is not one of its children.
1985				 * Make sure that the requested PID matches
1986				 * one of the parent's children that we are
1987				 * tracing, and don't suspend it otherwise.
1988				 */
1989				if (child == NULL)
1990					child = pid2tcb(tcp->u_arg[0]);
1991				if (child == NULL || child->parent != (
1992#ifdef TCB_CLONE_THREAD
1993					    (tcp->flags & TCB_CLONE_THREAD)
1994					    ? tcp->parent :
1995#endif
1996					    tcp) ||
1997				    (child->flags & TCB_EXITING))
1998					return 0;
1999			}
2000			tcp->flags |= TCB_SUSPENDED;
2001			tcp->waitpid = tcp->u_arg[0];
2002#ifdef TCB_CLONE_THREAD
2003			if (tcp->flags & TCB_CLONE_THREAD)
2004				tcp->parent->nclone_waiting++;
2005#endif
2006		}
2007	}
2008	if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
2009		if (tcp->u_arg[flagarg] & WNOHANG) {
2010			/* We must force a fake result of 0 instead of
2011			   the ECHILD error.  */
2012			return force_result(tcp, 0, 0);
2013		}
2014	}
2015	else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2016		 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2017		/*
2018		 * We just reaped a child we don't know about,
2019		 * presumably a zombie we already droptcb'd.
2020		 */
2021		tcp->nzombies--;
2022	}
2023	return 0;
2024}
2025
2026#ifdef SVR4
2027
2028int
2029sys_wait(tcp)
2030struct tcb *tcp;
2031{
2032	if (exiting(tcp)) {
2033		/* The library wrapper stuffs this into the user variable. */
2034		if (!syserror(tcp))
2035			printstatus(getrval2(tcp));
2036	}
2037	return 0;
2038}
2039
2040#endif /* SVR4 */
2041
2042#ifdef FREEBSD
2043int
2044sys_wait(tcp)
2045struct tcb *tcp;
2046{
2047	int status;
2048
2049	if (exiting(tcp)) {
2050		if (!syserror(tcp)) {
2051			if (umove(tcp, tcp->u_arg[0], &status) < 0)
2052				tprintf("%#lx", tcp->u_arg[0]);
2053			else
2054				printstatus(status);
2055		}
2056	}
2057	return 0;
2058}
2059#endif
2060
2061int
2062sys_waitpid(tcp)
2063struct tcb *tcp;
2064{
2065	return printwaitn(tcp, 3, 0);
2066}
2067
2068int
2069sys_wait4(tcp)
2070struct tcb *tcp;
2071{
2072	return printwaitn(tcp, 4, 0);
2073}
2074
2075#ifdef ALPHA
2076int
2077sys_osf_wait4(tcp)
2078struct tcb *tcp;
2079{
2080	return printwaitn(tcp, 4, 1);
2081}
2082#endif
2083
2084#if defined SVR4 || defined LINUX
2085
2086static const struct xlat waitid_types[] = {
2087	{ P_PID,	"P_PID"		},
2088#ifdef P_PPID
2089	{ P_PPID,	"P_PPID"	},
2090#endif
2091	{ P_PGID,	"P_PGID"	},
2092#ifdef P_SID
2093	{ P_SID,	"P_SID"		},
2094#endif
2095#ifdef P_CID
2096	{ P_CID,	"P_CID"		},
2097#endif
2098#ifdef P_UID
2099	{ P_UID,	"P_UID"		},
2100#endif
2101#ifdef P_GID
2102	{ P_GID,	"P_GID"		},
2103#endif
2104	{ P_ALL,	"P_ALL"		},
2105#ifdef P_LWPID
2106	{ P_LWPID,	"P_LWPID"	},
2107#endif
2108	{ 0,		NULL		},
2109};
2110
2111int
2112sys_waitid(struct tcb *tcp)
2113{
2114	siginfo_t si;
2115
2116	if (entering(tcp)) {
2117		printxval(waitid_types, tcp->u_arg[0], "P_???");
2118		tprintf(", %ld, ", tcp->u_arg[1]);
2119	}
2120	else {
2121		/* siginfo */
2122		if (!tcp->u_arg[2])
2123			tprintf("NULL");
2124		else if (syserror(tcp))
2125			tprintf("%#lx", tcp->u_arg[2]);
2126		else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2127			tprintf("{???}");
2128		else
2129			printsiginfo(&si, verbose(tcp));
2130		/* options */
2131		tprintf(", ");
2132		printflags(wait4_options, tcp->u_arg[3], "W???");
2133		if (tcp->u_nargs > 4) {
2134			/* usage */
2135			tprintf(", ");
2136			if (!tcp->u_arg[4])
2137				tprintf("NULL");
2138			else if (tcp->u_error)
2139				tprintf("%#lx", tcp->u_arg[4]);
2140			else
2141				printrusage(tcp, tcp->u_arg[4]);
2142		}
2143	}
2144	return 0;
2145}
2146
2147#endif /* SVR4 or LINUX */
2148
2149int
2150sys_alarm(tcp)
2151struct tcb *tcp;
2152{
2153	if (entering(tcp))
2154		tprintf("%lu", tcp->u_arg[0]);
2155	return 0;
2156}
2157
2158int
2159sys_uname(tcp)
2160struct tcb *tcp;
2161{
2162	struct utsname uname;
2163
2164	if (exiting(tcp)) {
2165		if (syserror(tcp) || !verbose(tcp))
2166			tprintf("%#lx", tcp->u_arg[0]);
2167		else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2168			tprintf("{...}");
2169		else if (!abbrev(tcp)) {
2170
2171			tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2172				uname.sysname, uname.nodename);
2173			tprintf("release=\"%s\", version=\"%s\", ",
2174				uname.release, uname.version);
2175			tprintf("machine=\"%s\"", uname.machine);
2176#ifdef LINUX
2177#ifndef __GLIBC__
2178			tprintf(", domainname=\"%s\"", uname.domainname);
2179#endif
2180#endif
2181			tprintf("}");
2182		}
2183		else
2184			tprintf("{sys=\"%s\", node=\"%s\", ...}",
2185				uname.sysname, uname.nodename);
2186	}
2187	return 0;
2188}
2189
2190#ifndef SVR4
2191
2192static const struct xlat ptrace_cmds[] = {
2193# ifndef FREEBSD
2194	{ PTRACE_TRACEME,	"PTRACE_TRACEME"	},
2195	{ PTRACE_PEEKTEXT,	"PTRACE_PEEKTEXT",	},
2196	{ PTRACE_PEEKDATA,	"PTRACE_PEEKDATA",	},
2197	{ PTRACE_PEEKUSER,	"PTRACE_PEEKUSER",	},
2198	{ PTRACE_POKETEXT,	"PTRACE_POKETEXT",	},
2199	{ PTRACE_POKEDATA,	"PTRACE_POKEDATA",	},
2200	{ PTRACE_POKEUSER,	"PTRACE_POKEUSER",	},
2201	{ PTRACE_CONT,		"PTRACE_CONT"		},
2202	{ PTRACE_KILL,		"PTRACE_KILL"		},
2203	{ PTRACE_SINGLESTEP,	"PTRACE_SINGLESTEP"	},
2204	{ PTRACE_ATTACH,	"PTRACE_ATTACH"		},
2205	{ PTRACE_DETACH,	"PTRACE_DETACH"		},
2206#  ifdef PTRACE_GETREGS
2207	{ PTRACE_GETREGS,	"PTRACE_GETREGS"	},
2208#  endif
2209#  ifdef PTRACE_SETREGS
2210	{ PTRACE_SETREGS,	"PTRACE_SETREGS"	},
2211#  endif
2212#  ifdef PTRACE_GETFPREGS
2213	{ PTRACE_GETFPREGS,	"PTRACE_GETFPREGS",	},
2214#  endif
2215#  ifdef PTRACE_SETFPREGS
2216	{ PTRACE_SETFPREGS,	"PTRACE_SETFPREGS",	},
2217#  endif
2218#  ifdef PTRACE_GETFPXREGS
2219	{ PTRACE_GETFPXREGS,	"PTRACE_GETFPXREGS",	},
2220#  endif
2221#  ifdef PTRACE_SETFPXREGS
2222	{ PTRACE_SETFPXREGS,	"PTRACE_SETFPXREGS",	},
2223#  endif
2224#  ifdef PTRACE_GETVRREGS
2225	{ PTRACE_GETVRREGS,	"PTRACE_GETVRREGS",	},
2226#  endif
2227#  ifdef PTRACE_SETVRREGS
2228	{ PTRACE_SETVRREGS,	"PTRACE_SETVRREGS",	},
2229#  endif
2230#  ifdef PTRACE_SETOPTIONS
2231	{ PTRACE_SETOPTIONS,	"PTRACE_SETOPTIONS",	},
2232#  endif
2233#  ifdef PTRACE_GETEVENTMSG
2234	{ PTRACE_GETEVENTMSG,	"PTRACE_GETEVENTMSG",	},
2235#  endif
2236#  ifdef PTRACE_GETSIGINFO
2237	{ PTRACE_GETSIGINFO,	"PTRACE_GETSIGINFO",	},
2238#  endif
2239#  ifdef PTRACE_SETSIGINFO
2240	{ PTRACE_SETSIGINFO,	"PTRACE_SETSIGINFO",	},
2241#  endif
2242#  ifdef PTRACE_SET_SYSCALL
2243	{ PTRACE_SET_SYSCALL,	"PTRACE_SET_SYSCALL",	},
2244#  endif
2245#  ifdef SUNOS4
2246	{ PTRACE_READDATA,	"PTRACE_READDATA"	},
2247	{ PTRACE_WRITEDATA,	"PTRACE_WRITEDATA"	},
2248	{ PTRACE_READTEXT,	"PTRACE_READTEXT"	},
2249	{ PTRACE_WRITETEXT,	"PTRACE_WRITETEXT"	},
2250	{ PTRACE_GETFPAREGS,	"PTRACE_GETFPAREGS"	},
2251	{ PTRACE_SETFPAREGS,	"PTRACE_SETFPAREGS"	},
2252#   ifdef SPARC
2253	{ PTRACE_GETWINDOW,	"PTRACE_GETWINDOW"	},
2254	{ PTRACE_SETWINDOW,	"PTRACE_SETWINDOW"	},
2255#   else /* !SPARC */
2256	{ PTRACE_22,		"PTRACE_22"		},
2257	{ PTRACE_23,		"PTRACE_3"		},
2258#   endif /* !SPARC */
2259#  endif /* SUNOS4 */
2260	{ PTRACE_SYSCALL,	"PTRACE_SYSCALL"	},
2261#  ifdef SUNOS4
2262	{ PTRACE_DUMPCORE,	"PTRACE_DUMPCORE"	},
2263#   ifdef I386
2264	{ PTRACE_SETWRBKPT,	"PTRACE_SETWRBKPT"	},
2265	{ PTRACE_SETACBKPT,	"PTRACE_SETACBKPT"	},
2266	{ PTRACE_CLRDR7,	"PTRACE_CLRDR7"		},
2267#   else /* !I386 */
2268	{ PTRACE_26,		"PTRACE_26"		},
2269	{ PTRACE_27,		"PTRACE_27"		},
2270	{ PTRACE_28,		"PTRACE_28"		},
2271#   endif /* !I386 */
2272	{ PTRACE_GETUCODE,	"PTRACE_GETUCODE"	},
2273#  endif /* SUNOS4 */
2274
2275# else /* FREEBSD */
2276
2277	{ PT_TRACE_ME,		"PT_TRACE_ME"		},
2278	{ PT_READ_I,		"PT_READ_I"		},
2279	{ PT_READ_D,		"PT_READ_D"		},
2280	{ PT_WRITE_I,		"PT_WRITE_I"		},
2281	{ PT_WRITE_D,		"PT_WRITE_D"		},
2282#  ifdef PT_READ_U
2283	{ PT_READ_U,		"PT_READ_U"		},
2284#  endif
2285	{ PT_CONTINUE,		"PT_CONTINUE"		},
2286	{ PT_KILL,		"PT_KILL"		},
2287	{ PT_STEP,		"PT_STEP"		},
2288	{ PT_ATTACH,		"PT_ATTACH"		},
2289	{ PT_DETACH,		"PT_DETACH"		},
2290	{ PT_GETREGS,		"PT_GETREGS"		},
2291	{ PT_SETREGS,		"PT_SETREGS"		},
2292	{ PT_GETFPREGS,		"PT_GETFPREGS"		},
2293	{ PT_SETFPREGS,		"PT_SETFPREGS"		},
2294	{ PT_GETDBREGS,		"PT_GETDBREGS"		},
2295	{ PT_SETDBREGS,		"PT_SETDBREGS"		},
2296# endif /* FREEBSD */
2297	{ 0,			NULL			},
2298};
2299
2300# ifndef FREEBSD
2301#  ifdef PTRACE_SETOPTIONS
2302static const struct xlat ptrace_setoptions_flags[] = {
2303#   ifdef PTRACE_O_TRACESYSGOOD
2304	{ PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD"	},
2305#   endif
2306#   ifdef PTRACE_O_TRACEFORK
2307	{ PTRACE_O_TRACEFORK,	"PTRACE_O_TRACEFORK"	},
2308#   endif
2309#   ifdef PTRACE_O_TRACEVFORK
2310	{ PTRACE_O_TRACEVFORK,	"PTRACE_O_TRACEVFORK"	},
2311#   endif
2312#   ifdef PTRACE_O_TRACECLONE
2313	{ PTRACE_O_TRACECLONE,	"PTRACE_O_TRACECLONE"	},
2314#   endif
2315#   ifdef PTRACE_O_TRACEEXEC
2316	{ PTRACE_O_TRACEEXEC,	"PTRACE_O_TRACEEXEC"	},
2317#   endif
2318#   ifdef PTRACE_O_TRACEVFORKDONE
2319	{ PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
2320#   endif
2321#   ifdef PTRACE_O_TRACEEXIT
2322	{ PTRACE_O_TRACEEXIT,	"PTRACE_O_TRACEEXIT"	},
2323#   endif
2324	{ 0,			NULL			},
2325};
2326#  endif /* PTRACE_SETOPTIONS */
2327# endif /* !FREEBSD */
2328
2329# ifndef FREEBSD
2330const struct xlat struct_user_offsets[] = {
2331#  ifdef LINUX
2332#   if defined(S390) || defined(S390X)
2333	{ PT_PSWMASK,		"psw_mask"				},
2334	{ PT_PSWADDR,		"psw_addr"				},
2335	{ PT_GPR0,		"gpr0"					},
2336	{ PT_GPR1,		"gpr1"					},
2337	{ PT_GPR2,		"gpr2"					},
2338	{ PT_GPR3,		"gpr3"					},
2339	{ PT_GPR4,		"gpr4"					},
2340	{ PT_GPR5,		"gpr5"					},
2341	{ PT_GPR6,		"gpr6"					},
2342	{ PT_GPR7,		"gpr7"					},
2343	{ PT_GPR8,		"gpr8"					},
2344	{ PT_GPR9,		"gpr9"					},
2345	{ PT_GPR10,		"gpr10"					},
2346	{ PT_GPR11,		"gpr11"					},
2347	{ PT_GPR12,		"gpr12"					},
2348	{ PT_GPR13,		"gpr13"					},
2349	{ PT_GPR14,		"gpr14"					},
2350	{ PT_GPR15,		"gpr15"					},
2351	{ PT_ACR0,		"acr0"					},
2352	{ PT_ACR1,		"acr1"					},
2353	{ PT_ACR2,		"acr2"					},
2354	{ PT_ACR3,		"acr3"					},
2355	{ PT_ACR4,		"acr4"					},
2356	{ PT_ACR5,		"acr5"					},
2357	{ PT_ACR6,		"acr6"					},
2358	{ PT_ACR7,		"acr7"					},
2359	{ PT_ACR8,		"acr8"					},
2360	{ PT_ACR9,		"acr9"					},
2361	{ PT_ACR10,		"acr10"					},
2362	{ PT_ACR11,		"acr11"					},
2363	{ PT_ACR12,		"acr12"					},
2364	{ PT_ACR13,		"acr13"					},
2365	{ PT_ACR14,		"acr14"					},
2366	{ PT_ACR15,		"acr15"					},
2367	{ PT_ORIGGPR2,		"orig_gpr2"				},
2368	{ PT_FPC,		"fpc"					},
2369#    if defined(S390)
2370	{ PT_FPR0_HI,		"fpr0.hi"				},
2371	{ PT_FPR0_LO,		"fpr0.lo"				},
2372	{ PT_FPR1_HI,		"fpr1.hi"				},
2373	{ PT_FPR1_LO,		"fpr1.lo"				},
2374	{ PT_FPR2_HI,		"fpr2.hi"				},
2375	{ PT_FPR2_LO,		"fpr2.lo"				},
2376	{ PT_FPR3_HI,		"fpr3.hi"				},
2377	{ PT_FPR3_LO,		"fpr3.lo"				},
2378	{ PT_FPR4_HI,		"fpr4.hi"				},
2379	{ PT_FPR4_LO,		"fpr4.lo"				},
2380	{ PT_FPR5_HI,		"fpr5.hi"				},
2381	{ PT_FPR5_LO,		"fpr5.lo"				},
2382	{ PT_FPR6_HI,		"fpr6.hi"				},
2383	{ PT_FPR6_LO,		"fpr6.lo"				},
2384	{ PT_FPR7_HI,		"fpr7.hi"				},
2385	{ PT_FPR7_LO,		"fpr7.lo"				},
2386	{ PT_FPR8_HI,		"fpr8.hi"				},
2387	{ PT_FPR8_LO,		"fpr8.lo"				},
2388	{ PT_FPR9_HI,		"fpr9.hi"				},
2389	{ PT_FPR9_LO,		"fpr9.lo"				},
2390	{ PT_FPR10_HI,		"fpr10.hi"				},
2391	{ PT_FPR10_LO,		"fpr10.lo"				},
2392	{ PT_FPR11_HI,		"fpr11.hi"				},
2393	{ PT_FPR11_LO,		"fpr11.lo"				},
2394	{ PT_FPR12_HI,		"fpr12.hi"				},
2395	{ PT_FPR12_LO,		"fpr12.lo"				},
2396	{ PT_FPR13_HI,		"fpr13.hi"				},
2397	{ PT_FPR13_LO,		"fpr13.lo"				},
2398	{ PT_FPR14_HI,		"fpr14.hi"				},
2399	{ PT_FPR14_LO,		"fpr14.lo"				},
2400	{ PT_FPR15_HI,		"fpr15.hi"				},
2401	{ PT_FPR15_LO,		"fpr15.lo"				},
2402#    endif
2403#    if defined(S390X)
2404	{ PT_FPR0,		"fpr0"					},
2405	{ PT_FPR1,		"fpr1"					},
2406	{ PT_FPR2,		"fpr2"					},
2407	{ PT_FPR3,		"fpr3"					},
2408	{ PT_FPR4,		"fpr4"					},
2409	{ PT_FPR5,		"fpr5"					},
2410	{ PT_FPR6,		"fpr6"					},
2411	{ PT_FPR7,		"fpr7"					},
2412	{ PT_FPR8,		"fpr8"					},
2413	{ PT_FPR9,		"fpr9"					},
2414	{ PT_FPR10,		"fpr10"					},
2415	{ PT_FPR11,		"fpr11"					},
2416	{ PT_FPR12,		"fpr12"					},
2417	{ PT_FPR13,		"fpr13"					},
2418	{ PT_FPR14,		"fpr14"					},
2419	{ PT_FPR15,		"fpr15"					},
2420#    endif
2421	{ PT_CR_9,		"cr9"					},
2422	{ PT_CR_10,		"cr10"					},
2423	{ PT_CR_11,		"cr11"					},
2424	{ PT_IEEE_IP,           "ieee_exception_ip"                     },
2425#   elif defined(SPARC)
2426	/* XXX No support for these offsets yet. */
2427#   elif defined(HPPA)
2428	/* XXX No support for these offsets yet. */
2429#   elif defined(POWERPC)
2430#    ifndef PT_ORIG_R3
2431#     define PT_ORIG_R3 34
2432#    endif
2433#    define REGSIZE (sizeof(unsigned long))
2434	{ REGSIZE*PT_R0,		"r0"				},
2435	{ REGSIZE*PT_R1,		"r1"				},
2436	{ REGSIZE*PT_R2,		"r2"				},
2437	{ REGSIZE*PT_R3,		"r3"				},
2438	{ REGSIZE*PT_R4,		"r4"				},
2439	{ REGSIZE*PT_R5,		"r5"				},
2440	{ REGSIZE*PT_R6,		"r6"				},
2441	{ REGSIZE*PT_R7,		"r7"				},
2442	{ REGSIZE*PT_R8,		"r8"				},
2443	{ REGSIZE*PT_R9,		"r9"				},
2444	{ REGSIZE*PT_R10,		"r10"				},
2445	{ REGSIZE*PT_R11,		"r11"				},
2446	{ REGSIZE*PT_R12,		"r12"				},
2447	{ REGSIZE*PT_R13,		"r13"				},
2448	{ REGSIZE*PT_R14,		"r14"				},
2449	{ REGSIZE*PT_R15,		"r15"				},
2450	{ REGSIZE*PT_R16,		"r16"				},
2451	{ REGSIZE*PT_R17,		"r17"				},
2452	{ REGSIZE*PT_R18,		"r18"				},
2453	{ REGSIZE*PT_R19,		"r19"				},
2454	{ REGSIZE*PT_R20,		"r20"				},
2455	{ REGSIZE*PT_R21,		"r21"				},
2456	{ REGSIZE*PT_R22,		"r22"				},
2457	{ REGSIZE*PT_R23,		"r23"				},
2458	{ REGSIZE*PT_R24,		"r24"				},
2459	{ REGSIZE*PT_R25,		"r25"				},
2460	{ REGSIZE*PT_R26,		"r26"				},
2461	{ REGSIZE*PT_R27,		"r27"				},
2462	{ REGSIZE*PT_R28,		"r28"				},
2463	{ REGSIZE*PT_R29,		"r29"				},
2464	{ REGSIZE*PT_R30,		"r30"				},
2465	{ REGSIZE*PT_R31,		"r31"				},
2466	{ REGSIZE*PT_NIP,		"NIP"				},
2467	{ REGSIZE*PT_MSR,		"MSR"				},
2468	{ REGSIZE*PT_ORIG_R3,		"ORIG_R3"			},
2469	{ REGSIZE*PT_CTR,		"CTR"				},
2470	{ REGSIZE*PT_LNK,		"LNK"				},
2471	{ REGSIZE*PT_XER,		"XER"				},
2472	{ REGSIZE*PT_CCR,		"CCR"				},
2473	{ REGSIZE*PT_FPR0,		"FPR0"				},
2474#    undef REGSIZE
2475#   elif defined(ALPHA)
2476	{ 0,			"r0"					},
2477	{ 1,			"r1"					},
2478	{ 2,			"r2"					},
2479	{ 3,			"r3"					},
2480	{ 4,			"r4"					},
2481	{ 5,			"r5"					},
2482	{ 6,			"r6"					},
2483	{ 7,			"r7"					},
2484	{ 8,			"r8"					},
2485	{ 9,			"r9"					},
2486	{ 10,			"r10"					},
2487	{ 11,			"r11"					},
2488	{ 12,			"r12"					},
2489	{ 13,			"r13"					},
2490	{ 14,			"r14"					},
2491	{ 15,			"r15"					},
2492	{ 16,			"r16"					},
2493	{ 17,			"r17"					},
2494	{ 18,			"r18"					},
2495	{ 19,			"r19"					},
2496	{ 20,			"r20"					},
2497	{ 21,			"r21"					},
2498	{ 22,			"r22"					},
2499	{ 23,			"r23"					},
2500	{ 24,			"r24"					},
2501	{ 25,			"r25"					},
2502	{ 26,			"r26"					},
2503	{ 27,			"r27"					},
2504	{ 28,			"r28"					},
2505	{ 29,			"gp"					},
2506	{ 30,			"fp"					},
2507	{ 31,			"zero"					},
2508	{ 32,			"fp0"					},
2509	{ 33,			"fp"					},
2510	{ 34,			"fp2"					},
2511	{ 35,			"fp3"					},
2512	{ 36,			"fp4"					},
2513	{ 37,			"fp5"					},
2514	{ 38,			"fp6"					},
2515	{ 39,			"fp7"					},
2516	{ 40,			"fp8"					},
2517	{ 41,			"fp9"					},
2518	{ 42,			"fp10"					},
2519	{ 43,			"fp11"					},
2520	{ 44,			"fp12"					},
2521	{ 45,			"fp13"					},
2522	{ 46,			"fp14"					},
2523	{ 47,			"fp15"					},
2524	{ 48,			"fp16"					},
2525	{ 49,			"fp17"					},
2526	{ 50,			"fp18"					},
2527	{ 51,			"fp19"					},
2528	{ 52,			"fp20"					},
2529	{ 53,			"fp21"					},
2530	{ 54,			"fp22"					},
2531	{ 55,			"fp23"					},
2532	{ 56,			"fp24"					},
2533	{ 57,			"fp25"					},
2534	{ 58,			"fp26"					},
2535	{ 59,			"fp27"					},
2536	{ 60,			"fp28"					},
2537	{ 61,			"fp29"					},
2538	{ 62,			"fp30"					},
2539	{ 63,			"fp31"					},
2540	{ 64,			"pc"					},
2541#   elif defined(IA64)
2542	{ PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2543	{ PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2544	{ PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2545	{ PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2546	{ PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2547	{ PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2548	{ PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2549	{ PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2550	{ PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2551	{ PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2552	{ PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2553	{ PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2554	{ PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2555	{ PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2556	{ PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2557	{ PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2558	{ PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2559	{ PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2560	{ PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2561	{ PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2562	{ PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2563	{ PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2564	{ PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2565	{ PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2566	{ PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2567	{ PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2568	{ PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2569	{ PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2570	{ PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2571	{ PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2572	{ PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2573	{ PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2574	/* switch stack: */
2575	{ PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2576	{ PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2577	{ PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2578	{ PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2579	{ PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2580	{ PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2581	{ PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2582	{ PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2583	{ PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2584	{ PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
2585	{ PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2586	{ PT_B4, "b4" }, { PT_B5, "b5" },
2587	{ PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
2588	/* pt_regs */
2589	{ PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2590	{ PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
2591	{ PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2592	{ PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2593	{ PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2594	{ PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2595	{ PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2596	{ PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2597	{ PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2598	{ PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2599	{ PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2600	{ PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2601	{ PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2602	{ PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2603	{ PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2604	{ PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2605	{ PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
2606#    ifdef PT_AR_CSD
2607	{ PT_AR_CSD, "ar.csd" },
2608#    endif
2609#    ifdef PT_AR_SSD
2610	{ PT_AR_SSD, "ar.ssd" },
2611#    endif
2612	{ PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
2613#   elif defined(I386)
2614	{ 4*EBX,		"4*EBX"					},
2615	{ 4*ECX,		"4*ECX"					},
2616	{ 4*EDX,		"4*EDX"					},
2617	{ 4*ESI,		"4*ESI"					},
2618	{ 4*EDI,		"4*EDI"					},
2619	{ 4*EBP,		"4*EBP"					},
2620	{ 4*EAX,		"4*EAX"					},
2621	{ 4*DS,			"4*DS"					},
2622	{ 4*ES,			"4*ES"					},
2623	{ 4*FS,			"4*FS"					},
2624	{ 4*GS,			"4*GS"					},
2625	{ 4*ORIG_EAX,		"4*ORIG_EAX"				},
2626	{ 4*EIP,		"4*EIP"					},
2627	{ 4*CS,			"4*CS"					},
2628	{ 4*EFL,		"4*EFL"					},
2629	{ 4*UESP,		"4*UESP"				},
2630	{ 4*SS,			"4*SS"					},
2631#   elif defined(X86_64)
2632	{ 8*R15, 		"8*R15"					},
2633	{ 8*R14, 		"8*R14"					},
2634	{ 8*R13, 		"8*R13"					},
2635	{ 8*R12, 		"8*R12"					},
2636	{ 8*RBP,		"8*RBP"					},
2637	{ 8*RBX,		"8*RBX"					},
2638	{ 8*R11,		"8*R11"					},
2639	{ 8*R10,		"8*R10"					},
2640	{ 8*R9,			"8*R9"					},
2641	{ 8*R8,			"8*R8"					},
2642	{ 8*RAX,		"8*RAX"					},
2643	{ 8*RCX,		"8*RCX"					},
2644	{ 8*RDX,		"8*RDX"					},
2645	{ 8*RSI,		"8*RSI"					},
2646	{ 8*RDI,		"8*RDI"					},
2647	{ 8*ORIG_RAX,		"8*ORIG_RAX"				},
2648	{ 8*RIP,		"8*RIP"					},
2649	{ 8*CS,			"8*CS"					},
2650	{ 8*EFLAGS,		"8*EFL"					},
2651	{ 8*RSP,		"8*RSP"					},
2652	{ 8*SS,			"8*SS"					},
2653#   elif defined(M68K)
2654	{ 4*PT_D1,		"4*PT_D1"				},
2655	{ 4*PT_D2,		"4*PT_D2"				},
2656	{ 4*PT_D3,		"4*PT_D3"				},
2657	{ 4*PT_D4,		"4*PT_D4"				},
2658	{ 4*PT_D5,		"4*PT_D5"				},
2659	{ 4*PT_D6,		"4*PT_D6"				},
2660	{ 4*PT_D7,		"4*PT_D7"				},
2661	{ 4*PT_A0,		"4*PT_A0"				},
2662	{ 4*PT_A1,		"4*PT_A1"				},
2663	{ 4*PT_A2,		"4*PT_A2"				},
2664	{ 4*PT_A3,		"4*PT_A3"				},
2665	{ 4*PT_A4,		"4*PT_A4"				},
2666	{ 4*PT_A5,		"4*PT_A5"				},
2667	{ 4*PT_A6,		"4*PT_A6"				},
2668	{ 4*PT_D0,		"4*PT_D0"				},
2669	{ 4*PT_USP,		"4*PT_USP"				},
2670	{ 4*PT_ORIG_D0,		"4*PT_ORIG_D0"				},
2671	{ 4*PT_SR,		"4*PT_SR"				},
2672	{ 4*PT_PC,		"4*PT_PC"				},
2673#   elif defined(SH)
2674	{ 4*REG_REG0,           "4*REG_REG0"                            },
2675	{ 4*(REG_REG0+1),       "4*REG_REG1"                            },
2676	{ 4*(REG_REG0+2),       "4*REG_REG2"                            },
2677	{ 4*(REG_REG0+3),       "4*REG_REG3"                            },
2678	{ 4*(REG_REG0+4),       "4*REG_REG4"                            },
2679	{ 4*(REG_REG0+5),       "4*REG_REG5"                            },
2680	{ 4*(REG_REG0+6),       "4*REG_REG6"                            },
2681	{ 4*(REG_REG0+7),       "4*REG_REG7"                            },
2682	{ 4*(REG_REG0+8),       "4*REG_REG8"                            },
2683	{ 4*(REG_REG0+9),       "4*REG_REG9"                            },
2684	{ 4*(REG_REG0+10),      "4*REG_REG10"                           },
2685	{ 4*(REG_REG0+11),      "4*REG_REG11"                           },
2686	{ 4*(REG_REG0+12),      "4*REG_REG12"                           },
2687	{ 4*(REG_REG0+13),      "4*REG_REG13"                           },
2688	{ 4*(REG_REG0+14),      "4*REG_REG14"                           },
2689	{ 4*REG_REG15,          "4*REG_REG15"                           },
2690	{ 4*REG_PC,             "4*REG_PC"                              },
2691	{ 4*REG_PR,             "4*REG_PR"                              },
2692	{ 4*REG_SR,             "4*REG_SR"                              },
2693	{ 4*REG_GBR,            "4*REG_GBR"                             },
2694	{ 4*REG_MACH,           "4*REG_MACH"                            },
2695	{ 4*REG_MACL,           "4*REG_MACL"                            },
2696	{ 4*REG_SYSCALL,        "4*REG_SYSCALL"                         },
2697	{ 4*REG_FPUL,           "4*REG_FPUL"                            },
2698	{ 4*REG_FPREG0,         "4*REG_FPREG0"                          },
2699	{ 4*(REG_FPREG0+1),     "4*REG_FPREG1"                          },
2700	{ 4*(REG_FPREG0+2),     "4*REG_FPREG2"                          },
2701	{ 4*(REG_FPREG0+3),     "4*REG_FPREG3"                          },
2702	{ 4*(REG_FPREG0+4),     "4*REG_FPREG4"                          },
2703	{ 4*(REG_FPREG0+5),     "4*REG_FPREG5"                          },
2704	{ 4*(REG_FPREG0+6),     "4*REG_FPREG6"                          },
2705	{ 4*(REG_FPREG0+7),     "4*REG_FPREG7"                          },
2706	{ 4*(REG_FPREG0+8),     "4*REG_FPREG8"                          },
2707	{ 4*(REG_FPREG0+9),     "4*REG_FPREG9"                          },
2708	{ 4*(REG_FPREG0+10),    "4*REG_FPREG10"                         },
2709	{ 4*(REG_FPREG0+11),    "4*REG_FPREG11"                         },
2710	{ 4*(REG_FPREG0+12),    "4*REG_FPREG12"                         },
2711	{ 4*(REG_FPREG0+13),    "4*REG_FPREG13"                         },
2712	{ 4*(REG_FPREG0+14),    "4*REG_FPREG14"                         },
2713	{ 4*REG_FPREG15,        "4*REG_FPREG15"                         },
2714#    ifdef REG_XDREG0
2715	{ 4*REG_XDREG0,         "4*REG_XDREG0"                          },
2716	{ 4*(REG_XDREG0+2),     "4*REG_XDREG2"                          },
2717	{ 4*(REG_XDREG0+4),     "4*REG_XDREG4"                          },
2718	{ 4*(REG_XDREG0+6),     "4*REG_XDREG6"                          },
2719	{ 4*(REG_XDREG0+8),     "4*REG_XDREG8"                          },
2720	{ 4*(REG_XDREG0+10),    "4*REG_XDREG10"                         },
2721	{ 4*(REG_XDREG0+12),    "4*REG_XDREG12"                         },
2722	{ 4*REG_XDREG14,        "4*REG_XDREG14"                         },
2723#    endif
2724	{ 4*REG_FPSCR,          "4*REG_FPSCR"                           },
2725#   elif defined(SH64)
2726	{ 0,		        "PC(L)"				        },
2727	{ 4,	                "PC(U)"				        },
2728	{ 8, 	                "SR(L)"	  	         		},
2729	{ 12,               	"SR(U)"     				},
2730	{ 16,            	"syscall no.(L)" 			},
2731	{ 20,            	"syscall_no.(U)"			},
2732	{ 24,            	"R0(L)"     				},
2733	{ 28,            	"R0(U)"     				},
2734	{ 32,            	"R1(L)"     				},
2735	{ 36,            	"R1(U)"     				},
2736	{ 40,            	"R2(L)"     				},
2737	{ 44,            	"R2(U)"     				},
2738	{ 48,            	"R3(L)"     				},
2739	{ 52,            	"R3(U)"     				},
2740	{ 56,            	"R4(L)"     				},
2741	{ 60,            	"R4(U)"     				},
2742	{ 64,            	"R5(L)"     				},
2743	{ 68,            	"R5(U)"     				},
2744	{ 72,            	"R6(L)"     				},
2745	{ 76,            	"R6(U)"     				},
2746	{ 80,            	"R7(L)"     				},
2747	{ 84,            	"R7(U)"     				},
2748	{ 88,            	"R8(L)"     				},
2749	{ 92,            	"R8(U)"     				},
2750	{ 96,            	"R9(L)"     				},
2751	{ 100,           	"R9(U)"     				},
2752	{ 104,           	"R10(L)"     				},
2753	{ 108,           	"R10(U)"     				},
2754	{ 112,           	"R11(L)"     				},
2755	{ 116,           	"R11(U)"     				},
2756	{ 120,           	"R12(L)"     				},
2757	{ 124,           	"R12(U)"     				},
2758	{ 128,           	"R13(L)"     				},
2759	{ 132,           	"R13(U)"     				},
2760	{ 136,           	"R14(L)"     				},
2761	{ 140,           	"R14(U)"     				},
2762	{ 144,           	"R15(L)"     				},
2763	{ 148,           	"R15(U)"     				},
2764	{ 152,           	"R16(L)"     				},
2765	{ 156,           	"R16(U)"     				},
2766	{ 160,           	"R17(L)"     				},
2767	{ 164,           	"R17(U)"     				},
2768	{ 168,           	"R18(L)"     				},
2769	{ 172,           	"R18(U)"     				},
2770	{ 176,           	"R19(L)"     				},
2771	{ 180,           	"R19(U)"     				},
2772	{ 184,           	"R20(L)"     				},
2773	{ 188,           	"R20(U)"     				},
2774	{ 192,           	"R21(L)"     				},
2775	{ 196,           	"R21(U)"     				},
2776	{ 200,           	"R22(L)"     				},
2777	{ 204,           	"R22(U)"     				},
2778	{ 208,           	"R23(L)"     				},
2779	{ 212,           	"R23(U)"     				},
2780	{ 216,           	"R24(L)"     				},
2781	{ 220,           	"R24(U)"     				},
2782	{ 224,           	"R25(L)"     				},
2783	{ 228,           	"R25(U)"     				},
2784	{ 232,           	"R26(L)"     				},
2785	{ 236,           	"R26(U)"     				},
2786	{ 240,           	"R27(L)"     				},
2787	{ 244,           	"R27(U)"     				},
2788	{ 248,           	"R28(L)"     				},
2789	{ 252,           	"R28(U)"     				},
2790	{ 256,           	"R29(L)"     				},
2791	{ 260,           	"R29(U)"     				},
2792	{ 264,           	"R30(L)"     				},
2793	{ 268,           	"R30(U)"     				},
2794	{ 272,           	"R31(L)"     				},
2795	{ 276,           	"R31(U)"     				},
2796	{ 280,           	"R32(L)"     				},
2797	{ 284,           	"R32(U)"     				},
2798	{ 288,           	"R33(L)"     				},
2799	{ 292,           	"R33(U)"     				},
2800	{ 296,           	"R34(L)"     				},
2801	{ 300,           	"R34(U)"     				},
2802	{ 304,           	"R35(L)"     				},
2803	{ 308,           	"R35(U)"     				},
2804	{ 312,           	"R36(L)"     				},
2805	{ 316,           	"R36(U)"     				},
2806	{ 320,           	"R37(L)"     				},
2807	{ 324,           	"R37(U)"     				},
2808	{ 328,           	"R38(L)"     				},
2809	{ 332,           	"R38(U)"     				},
2810	{ 336,           	"R39(L)"     				},
2811	{ 340,           	"R39(U)"     				},
2812	{ 344,           	"R40(L)"     				},
2813	{ 348,           	"R40(U)"     				},
2814	{ 352,           	"R41(L)"     				},
2815	{ 356,           	"R41(U)"     				},
2816	{ 360,           	"R42(L)"     				},
2817	{ 364,           	"R42(U)"     				},
2818	{ 368,           	"R43(L)"     				},
2819	{ 372,           	"R43(U)"     				},
2820	{ 376,           	"R44(L)"     				},
2821	{ 380,           	"R44(U)"     				},
2822	{ 384,           	"R45(L)"     				},
2823	{ 388,           	"R45(U)"     				},
2824	{ 392,           	"R46(L)"     				},
2825	{ 396,           	"R46(U)"     				},
2826	{ 400,           	"R47(L)"     				},
2827	{ 404,           	"R47(U)"     				},
2828	{ 408,           	"R48(L)"     				},
2829	{ 412,           	"R48(U)"     				},
2830	{ 416,           	"R49(L)"     				},
2831	{ 420,           	"R49(U)"     				},
2832	{ 424,           	"R50(L)"     				},
2833	{ 428,           	"R50(U)"     				},
2834	{ 432,           	"R51(L)"     				},
2835	{ 436,           	"R51(U)"     				},
2836	{ 440,           	"R52(L)"     				},
2837	{ 444,           	"R52(U)"     				},
2838	{ 448,           	"R53(L)"     				},
2839	{ 452,           	"R53(U)"     				},
2840	{ 456,           	"R54(L)"     				},
2841	{ 460,           	"R54(U)"     				},
2842	{ 464,           	"R55(L)"     				},
2843	{ 468,           	"R55(U)"     				},
2844	{ 472,           	"R56(L)"     				},
2845	{ 476,           	"R56(U)"     				},
2846	{ 480,           	"R57(L)"     				},
2847	{ 484,           	"R57(U)"     				},
2848	{ 488,           	"R58(L)"     				},
2849	{ 492,           	"R58(U)"     				},
2850	{ 496,           	"R59(L)"     				},
2851	{ 500,           	"R59(U)"     				},
2852	{ 504,           	"R60(L)"     				},
2853	{ 508,           	"R60(U)"     				},
2854	{ 512,           	"R61(L)"     				},
2855	{ 516,           	"R61(U)"     				},
2856	{ 520,           	"R62(L)"     				},
2857	{ 524,           	"R62(U)"     				},
2858	{ 528,                  "TR0(L)"                                },
2859	{ 532,                  "TR0(U)"                                },
2860	{ 536,                  "TR1(L)"                                },
2861	{ 540,                  "TR1(U)"                                },
2862	{ 544,                  "TR2(L)"                                },
2863	{ 548,                  "TR2(U)"                                },
2864	{ 552,                  "TR3(L)"                                },
2865	{ 556,                  "TR3(U)"                                },
2866	{ 560,                  "TR4(L)"                                },
2867	{ 564,                  "TR4(U)"                                },
2868	{ 568,                  "TR5(L)"                                },
2869	{ 572,                  "TR5(U)"                                },
2870	{ 576,                  "TR6(L)"                                },
2871	{ 580,                  "TR6(U)"                                },
2872	{ 584,                  "TR7(L)"                                },
2873	{ 588,                  "TR7(U)"                                },
2874	/* This entry is in case pt_regs contains dregs (depends on
2875	   the kernel build options). */
2876	{ uoff(regs),	        "offsetof(struct user, regs)"	        },
2877	{ uoff(fpu),	        "offsetof(struct user, fpu)"	        },
2878#   elif defined(ARM)
2879	{ uoff(regs.ARM_r0),	"r0"					},
2880	{ uoff(regs.ARM_r1),	"r1"					},
2881	{ uoff(regs.ARM_r2),	"r2"					},
2882	{ uoff(regs.ARM_r3),	"r3"					},
2883	{ uoff(regs.ARM_r4),	"r4"					},
2884	{ uoff(regs.ARM_r5),	"r5"					},
2885	{ uoff(regs.ARM_r6),	"r6"					},
2886	{ uoff(regs.ARM_r7),	"r7"					},
2887	{ uoff(regs.ARM_r8),	"r8"					},
2888	{ uoff(regs.ARM_r9),	"r9"					},
2889	{ uoff(regs.ARM_r10),	"r10"					},
2890	{ uoff(regs.ARM_fp),	"fp"					},
2891	{ uoff(regs.ARM_ip),	"ip"					},
2892	{ uoff(regs.ARM_sp),	"sp"					},
2893	{ uoff(regs.ARM_lr),	"lr"					},
2894	{ uoff(regs.ARM_pc),	"pc"					},
2895	{ uoff(regs.ARM_cpsr),	"cpsr"					},
2896#   elif defined(AVR32)
2897	{ uoff(regs.sr),	"sr"					},
2898	{ uoff(regs.pc),	"pc"					},
2899	{ uoff(regs.lr),	"lr"					},
2900	{ uoff(regs.sp),	"sp"					},
2901	{ uoff(regs.r12),	"r12"					},
2902	{ uoff(regs.r11),	"r11"					},
2903	{ uoff(regs.r10),	"r10"					},
2904	{ uoff(regs.r9),	"r9"					},
2905	{ uoff(regs.r8),	"r8"					},
2906	{ uoff(regs.r7),	"r7"					},
2907	{ uoff(regs.r6),	"r6"					},
2908	{ uoff(regs.r5),	"r5"					},
2909	{ uoff(regs.r4),	"r4"					},
2910	{ uoff(regs.r3),	"r3"					},
2911	{ uoff(regs.r2),	"r2"					},
2912	{ uoff(regs.r1),	"r1"					},
2913	{ uoff(regs.r0),	"r0"					},
2914	{ uoff(regs.r12_orig),	"orig_r12"				},
2915#   elif defined(MIPS)
2916	{ 0,			"r0"					},
2917	{ 1,			"r1"					},
2918	{ 2,			"r2"					},
2919	{ 3,			"r3"					},
2920	{ 4,			"r4"					},
2921	{ 5,			"r5"					},
2922	{ 6,			"r6"					},
2923	{ 7,			"r7"					},
2924	{ 8,			"r8"					},
2925	{ 9,			"r9"					},
2926	{ 10,			"r10"					},
2927	{ 11,			"r11"					},
2928	{ 12,			"r12"					},
2929	{ 13,			"r13"					},
2930	{ 14,			"r14"					},
2931	{ 15,			"r15"					},
2932	{ 16,			"r16"					},
2933	{ 17,			"r17"					},
2934	{ 18,			"r18"					},
2935	{ 19,			"r19"					},
2936	{ 20,			"r20"					},
2937	{ 21,			"r21"					},
2938	{ 22,			"r22"					},
2939	{ 23,			"r23"					},
2940	{ 24,			"r24"					},
2941	{ 25,			"r25"					},
2942	{ 26,			"r26"					},
2943	{ 27,			"r27"					},
2944	{ 28,			"r28"					},
2945	{ 29,			"r29"					},
2946	{ 30,			"r30"					},
2947	{ 31,			"r31"					},
2948	{ 32,			"f0"					},
2949	{ 33,			"f1"					},
2950	{ 34,			"f2"					},
2951	{ 35,			"f3"					},
2952	{ 36,			"f4"					},
2953	{ 37,			"f5"					},
2954	{ 38,			"f6"					},
2955	{ 39,			"f7"					},
2956	{ 40,			"f8"					},
2957	{ 41,			"f9"					},
2958	{ 42,			"f10"					},
2959	{ 43,			"f11"					},
2960	{ 44,			"f12"					},
2961	{ 45,			"f13"					},
2962	{ 46,			"f14"					},
2963	{ 47,			"f15"					},
2964	{ 48,			"f16"					},
2965	{ 49,			"f17"					},
2966	{ 50,			"f18"					},
2967	{ 51,			"f19"					},
2968	{ 52,			"f20"					},
2969	{ 53,			"f21"					},
2970	{ 54,			"f22"					},
2971	{ 55,			"f23"					},
2972	{ 56,			"f24"					},
2973	{ 57,			"f25"					},
2974	{ 58,			"f26"					},
2975	{ 59,			"f27"					},
2976	{ 60,			"f28"					},
2977	{ 61,			"f29"					},
2978	{ 62,			"f30"					},
2979	{ 63,			"f31"					},
2980	{ 64,			"pc"					},
2981	{ 65,			"cause"					},
2982	{ 66,			"badvaddr"				},
2983	{ 67,			"mmhi"					},
2984	{ 68,			"mmlo"					},
2985	{ 69,			"fpcsr"					},
2986	{ 70,			"fpeir"					},
2987#   elif defined(TILE)
2988	{ PTREGS_OFFSET_REG(0),  "r0"  },
2989	{ PTREGS_OFFSET_REG(1),  "r1"  },
2990	{ PTREGS_OFFSET_REG(2),  "r2"  },
2991	{ PTREGS_OFFSET_REG(3),  "r3"  },
2992	{ PTREGS_OFFSET_REG(4),  "r4"  },
2993	{ PTREGS_OFFSET_REG(5),  "r5"  },
2994	{ PTREGS_OFFSET_REG(6),  "r6"  },
2995	{ PTREGS_OFFSET_REG(7),  "r7"  },
2996	{ PTREGS_OFFSET_REG(8),  "r8"  },
2997	{ PTREGS_OFFSET_REG(9),  "r9"  },
2998	{ PTREGS_OFFSET_REG(10), "r10" },
2999	{ PTREGS_OFFSET_REG(11), "r11" },
3000	{ PTREGS_OFFSET_REG(12), "r12" },
3001	{ PTREGS_OFFSET_REG(13), "r13" },
3002	{ PTREGS_OFFSET_REG(14), "r14" },
3003	{ PTREGS_OFFSET_REG(15), "r15" },
3004	{ PTREGS_OFFSET_REG(16), "r16" },
3005	{ PTREGS_OFFSET_REG(17), "r17" },
3006	{ PTREGS_OFFSET_REG(18), "r18" },
3007	{ PTREGS_OFFSET_REG(19), "r19" },
3008	{ PTREGS_OFFSET_REG(20), "r20" },
3009	{ PTREGS_OFFSET_REG(21), "r21" },
3010	{ PTREGS_OFFSET_REG(22), "r22" },
3011	{ PTREGS_OFFSET_REG(23), "r23" },
3012	{ PTREGS_OFFSET_REG(24), "r24" },
3013	{ PTREGS_OFFSET_REG(25), "r25" },
3014	{ PTREGS_OFFSET_REG(26), "r26" },
3015	{ PTREGS_OFFSET_REG(27), "r27" },
3016	{ PTREGS_OFFSET_REG(28), "r28" },
3017	{ PTREGS_OFFSET_REG(29), "r29" },
3018	{ PTREGS_OFFSET_REG(30), "r30" },
3019	{ PTREGS_OFFSET_REG(31), "r31" },
3020	{ PTREGS_OFFSET_REG(32), "r32" },
3021	{ PTREGS_OFFSET_REG(33), "r33" },
3022	{ PTREGS_OFFSET_REG(34), "r34" },
3023	{ PTREGS_OFFSET_REG(35), "r35" },
3024	{ PTREGS_OFFSET_REG(36), "r36" },
3025	{ PTREGS_OFFSET_REG(37), "r37" },
3026	{ PTREGS_OFFSET_REG(38), "r38" },
3027	{ PTREGS_OFFSET_REG(39), "r39" },
3028	{ PTREGS_OFFSET_REG(40), "r40" },
3029	{ PTREGS_OFFSET_REG(41), "r41" },
3030	{ PTREGS_OFFSET_REG(42), "r42" },
3031	{ PTREGS_OFFSET_REG(43), "r43" },
3032	{ PTREGS_OFFSET_REG(44), "r44" },
3033	{ PTREGS_OFFSET_REG(45), "r45" },
3034	{ PTREGS_OFFSET_REG(46), "r46" },
3035	{ PTREGS_OFFSET_REG(47), "r47" },
3036	{ PTREGS_OFFSET_REG(48), "r48" },
3037	{ PTREGS_OFFSET_REG(49), "r49" },
3038	{ PTREGS_OFFSET_REG(50), "r50" },
3039	{ PTREGS_OFFSET_REG(51), "r51" },
3040	{ PTREGS_OFFSET_REG(52), "r52" },
3041	{ PTREGS_OFFSET_TP, "tp" },
3042	{ PTREGS_OFFSET_SP, "sp" },
3043	{ PTREGS_OFFSET_LR, "lr" },
3044	{ PTREGS_OFFSET_PC, "pc" },
3045	{ PTREGS_OFFSET_EX1, "ex1" },
3046	{ PTREGS_OFFSET_FAULTNUM, "faultnum" },
3047	{ PTREGS_OFFSET_ORIG_R0, "orig_r0" },
3048	{ PTREGS_OFFSET_FLAGS, "flags" },
3049#   endif
3050#   ifdef CRISV10
3051	{ 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3052	{ 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3053	{ 4*PT_R13, "4*PT_R13" },
3054	{ 4*PT_R12, "4*PT_R12" },
3055	{ 4*PT_R11, "4*PT_R11" },
3056	{ 4*PT_R10, "4*PT_R10" },
3057	{ 4*PT_R9, "4*PT_R9" },
3058	{ 4*PT_R8, "4*PT_R8" },
3059	{ 4*PT_R7, "4*PT_R7" },
3060	{ 4*PT_R6, "4*PT_R6" },
3061	{ 4*PT_R5, "4*PT_R5" },
3062	{ 4*PT_R4, "4*PT_R4" },
3063	{ 4*PT_R3, "4*PT_R3" },
3064	{ 4*PT_R2, "4*PT_R2" },
3065	{ 4*PT_R1, "4*PT_R1" },
3066	{ 4*PT_R0, "4*PT_R0" },
3067	{ 4*PT_MOF, "4*PT_MOF" },
3068	{ 4*PT_DCCR, "4*PT_DCCR" },
3069	{ 4*PT_SRP, "4*PT_SRP" },
3070	{ 4*PT_IRP, "4*PT_IRP" },
3071	{ 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3072	{ 4*PT_CSRADDR, "4*PT_CSRADDR" },
3073	{ 4*PT_CSRDATA, "4*PT_CSRDATA" },
3074	{ 4*PT_USP, "4*PT_USP" },
3075#   endif
3076#   ifdef CRISV32
3077	{ 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3078	{ 4*PT_R0, "4*PT_R0" },
3079	{ 4*PT_R1, "4*PT_R1" },
3080	{ 4*PT_R2, "4*PT_R2" },
3081	{ 4*PT_R3, "4*PT_R3" },
3082	{ 4*PT_R4, "4*PT_R4" },
3083	{ 4*PT_R5, "4*PT_R5" },
3084	{ 4*PT_R6, "4*PT_R6" },
3085	{ 4*PT_R7, "4*PT_R7" },
3086	{ 4*PT_R8, "4*PT_R8" },
3087	{ 4*PT_R9, "4*PT_R9" },
3088	{ 4*PT_R10, "4*PT_R10" },
3089	{ 4*PT_R11, "4*PT_R11" },
3090	{ 4*PT_R12, "4*PT_R12" },
3091	{ 4*PT_R13, "4*PT_R13" },
3092	{ 4*PT_ACR, "4*PT_ACR" },
3093	{ 4*PT_SRS, "4*PT_SRS" },
3094	{ 4*PT_MOF, "4*PT_MOF" },
3095	{ 4*PT_SPC, "4*PT_SPC" },
3096	{ 4*PT_CCS, "4*PT_CCS" },
3097	{ 4*PT_SRP, "4*PT_SRP" },
3098	{ 4*PT_ERP, "4*PT_ERP" },
3099	{ 4*PT_EXS, "4*PT_EXS" },
3100	{ 4*PT_EDA, "4*PT_EDA" },
3101	{ 4*PT_USP, "4*PT_USP" },
3102	{ 4*PT_PPC, "4*PT_PPC" },
3103	{ 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3104	{ 4*PT_BP+4, "4*PT_BP+4" },
3105	{ 4*PT_BP+8, "4*PT_BP+8" },
3106	{ 4*PT_BP+12, "4*PT_BP+12" },
3107	{ 4*PT_BP+16, "4*PT_BP+16" },
3108	{ 4*PT_BP+20, "4*PT_BP+20" },
3109	{ 4*PT_BP+24, "4*PT_BP+24" },
3110	{ 4*PT_BP+28, "4*PT_BP+28" },
3111	{ 4*PT_BP+32, "4*PT_BP+32" },
3112	{ 4*PT_BP+36, "4*PT_BP+36" },
3113	{ 4*PT_BP+40, "4*PT_BP+40" },
3114	{ 4*PT_BP+44, "4*PT_BP+44" },
3115	{ 4*PT_BP+48, "4*PT_BP+48" },
3116	{ 4*PT_BP+52, "4*PT_BP+52" },
3117	{ 4*PT_BP+56, "4*PT_BP+56" },
3118#   endif
3119#   ifdef MICROBLAZE
3120	{ PT_GPR(0),		"r0"					},
3121	{ PT_GPR(1),		"r1"					},
3122	{ PT_GPR(2),		"r2"					},
3123	{ PT_GPR(3),		"r3"					},
3124	{ PT_GPR(4),		"r4"					},
3125	{ PT_GPR(5),		"r5"					},
3126	{ PT_GPR(6),		"r6"					},
3127	{ PT_GPR(7),		"r7"					},
3128	{ PT_GPR(8),		"r8"					},
3129	{ PT_GPR(9),		"r9"					},
3130	{ PT_GPR(10),		"r10"					},
3131	{ PT_GPR(11),		"r11"					},
3132	{ PT_GPR(12),		"r12"					},
3133	{ PT_GPR(13),		"r13"					},
3134	{ PT_GPR(14),		"r14"					},
3135	{ PT_GPR(15),		"r15"					},
3136	{ PT_GPR(16),		"r16"					},
3137	{ PT_GPR(17),		"r17"					},
3138	{ PT_GPR(18),		"r18"					},
3139	{ PT_GPR(19),		"r19"					},
3140	{ PT_GPR(20),		"r20"					},
3141	{ PT_GPR(21),		"r21"					},
3142	{ PT_GPR(22),		"r22"					},
3143	{ PT_GPR(23),		"r23"					},
3144	{ PT_GPR(24),		"r24"					},
3145	{ PT_GPR(25),		"r25"					},
3146	{ PT_GPR(26),		"r26"					},
3147	{ PT_GPR(27),		"r27"					},
3148	{ PT_GPR(28),		"r28"					},
3149	{ PT_GPR(29),		"r29"					},
3150	{ PT_GPR(30),		"r30"					},
3151	{ PT_GPR(31),		"r31"					},
3152	{ PT_PC, 		"rpc",					},
3153	{ PT_MSR, 		"rmsr",					},
3154	{ PT_EAR,		"rear",					},
3155	{ PT_ESR,		"resr",					},
3156	{ PT_FSR,		"rfsr",					},
3157	{ PT_KERNEL_MODE, 	"kernel_mode",				},
3158#   endif
3159
3160#   if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3161		&& !defined(ALPHA) && !defined(IA64) \
3162		&& !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
3163#    if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
3164	{ uoff(u_fpvalid),	"offsetof(struct user, u_fpvalid)"	},
3165#    endif
3166#    if defined(I386) || defined(X86_64)
3167	{ uoff(i387),		"offsetof(struct user, i387)"		},
3168#    endif
3169#    if defined(M68K)
3170	{ uoff(m68kfp),		"offsetof(struct user, m68kfp)"		},
3171#    endif
3172	{ uoff(u_tsize),	"offsetof(struct user, u_tsize)"	},
3173	{ uoff(u_dsize),	"offsetof(struct user, u_dsize)"	},
3174	{ uoff(u_ssize),	"offsetof(struct user, u_ssize)"	},
3175#    if !defined(SPARC64)
3176	{ uoff(start_code),	"offsetof(struct user, start_code)"	},
3177#    endif
3178#    if defined(AVR32) || defined(SH64)
3179	{ uoff(start_data),	"offsetof(struct user, start_data)"	},
3180#    endif
3181#    if !defined(SPARC64)
3182	{ uoff(start_stack),	"offsetof(struct user, start_stack)"	},
3183#    endif
3184	{ uoff(signal),		"offsetof(struct user, signal)"		},
3185#    if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
3186	{ uoff(reserved),	"offsetof(struct user, reserved)"	},
3187#    endif
3188#    if !defined(SPARC64)
3189	{ uoff(u_ar0),		"offsetof(struct user, u_ar0)"		},
3190#    endif
3191#    if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
3192	{ uoff(u_fpstate),	"offsetof(struct user, u_fpstate)"	},
3193#    endif
3194	{ uoff(magic),		"offsetof(struct user, magic)"		},
3195	{ uoff(u_comm),		"offsetof(struct user, u_comm)"		},
3196#    if defined(I386) || defined(X86_64)
3197	{ uoff(u_debugreg),	"offsetof(struct user, u_debugreg)"	},
3198#    endif
3199#   endif /* !defined(many arches) */
3200
3201#  endif /* LINUX */
3202
3203#  ifdef SUNOS4
3204	{ uoff(u_pcb),		"offsetof(struct user, u_pcb)"		},
3205	{ uoff(u_procp),	"offsetof(struct user, u_procp)"	},
3206	{ uoff(u_ar0),		"offsetof(struct user, u_ar0)"		},
3207	{ uoff(u_comm[0]),	"offsetof(struct user, u_comm[0])"	},
3208	{ uoff(u_arg[0]),	"offsetof(struct user, u_arg[0])"	},
3209	{ uoff(u_ap),		"offsetof(struct user, u_ap)"		},
3210	{ uoff(u_qsave),	"offsetof(struct user, u_qsave)"	},
3211	{ uoff(u_rval1),	"offsetof(struct user, u_rval1)"	},
3212	{ uoff(u_rval2),	"offsetof(struct user, u_rval2)"	},
3213	{ uoff(u_error),	"offsetof(struct user, u_error)"	},
3214	{ uoff(u_eosys),	"offsetof(struct user, u_eosys)"	},
3215	{ uoff(u_ssave),	"offsetof(struct user, u_ssave)"	},
3216	{ uoff(u_signal[0]),	"offsetof(struct user, u_signal)"	},
3217	{ uoff(u_sigmask[0]),	"offsetof(struct user, u_sigmask)"	},
3218	{ uoff(u_sigonstack),	"offsetof(struct user, u_sigonstack)"	},
3219	{ uoff(u_sigintr),	"offsetof(struct user, u_sigintr)"	},
3220	{ uoff(u_sigreset),	"offsetof(struct user, u_sigreset)"	},
3221	{ uoff(u_oldmask),	"offsetof(struct user, u_oldmask)"	},
3222	{ uoff(u_code),		"offsetof(struct user, u_code)"		},
3223	{ uoff(u_addr),		"offsetof(struct user, u_addr)"		},
3224	{ uoff(u_sigstack),	"offsetof(struct user, u_sigstack)"	},
3225	{ uoff(u_ofile),	"offsetof(struct user, u_ofile)"	},
3226	{ uoff(u_pofile),	"offsetof(struct user, u_pofile)"	},
3227	{ uoff(u_ofile_arr[0]),	"offsetof(struct user, u_ofile_arr[0])"	},
3228	{ uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3229	{ uoff(u_lastfile),	"offsetof(struct user, u_lastfile)"	},
3230	{ uoff(u_cwd),		"offsetof(struct user, u_cwd)"		},
3231	{ uoff(u_cdir),		"offsetof(struct user, u_cdir)"		},
3232	{ uoff(u_rdir),		"offsetof(struct user, u_rdir)"		},
3233	{ uoff(u_cmask),	"offsetof(struct user, u_cmask)"	},
3234	{ uoff(u_ru),		"offsetof(struct user, u_ru)"		},
3235	{ uoff(u_cru),		"offsetof(struct user, u_cru)"		},
3236	{ uoff(u_timer[0]),	"offsetof(struct user, u_timer[0])"	},
3237	{ uoff(u_XXX[0]),	"offsetof(struct user, u_XXX[0])"	},
3238	{ uoff(u_ioch),		"offsetof(struct user, u_ioch)"		},
3239	{ uoff(u_start),	"offsetof(struct user, u_start)"	},
3240	{ uoff(u_acflag),	"offsetof(struct user, u_acflag)"	},
3241	{ uoff(u_prof.pr_base),	"offsetof(struct user, u_prof.pr_base)"	},
3242	{ uoff(u_prof.pr_size),	"offsetof(struct user, u_prof.pr_size)"	},
3243	{ uoff(u_prof.pr_off),	"offsetof(struct user, u_prof.pr_off)"	},
3244	{ uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3245	{ uoff(u_rlimit[0]),	"offsetof(struct user, u_rlimit)"	},
3246	{ uoff(u_exdata.Ux_A),	"offsetof(struct user, u_exdata.Ux_A)"	},
3247	{ uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3248	{ uoff(u_lofault),	"offsetof(struct user, u_lofault)"	},
3249#  endif /* SUNOS4 */
3250#  ifndef HPPA
3251	{ sizeof(struct user),	"sizeof(struct user)"			},
3252#  endif
3253	{ 0,			NULL					},
3254};
3255# endif /* !FREEBSD */
3256
3257int
3258sys_ptrace(struct tcb *tcp)
3259{
3260	const struct xlat *x;
3261	long addr;
3262
3263	if (entering(tcp)) {
3264		printxval(ptrace_cmds, tcp->u_arg[0],
3265# ifndef FREEBSD
3266			  "PTRACE_???"
3267# else
3268			  "PT_???"
3269# endif
3270			);
3271		tprintf(", %lu, ", tcp->u_arg[1]);
3272		addr = tcp->u_arg[2];
3273# ifndef FREEBSD
3274		if (tcp->u_arg[0] == PTRACE_PEEKUSER
3275			|| tcp->u_arg[0] == PTRACE_POKEUSER) {
3276			for (x = struct_user_offsets; x->str; x++) {
3277				if (x->val >= addr)
3278					break;
3279			}
3280			if (!x->str)
3281				tprintf("%#lx, ", addr);
3282			else if (x->val > addr && x != struct_user_offsets) {
3283				x--;
3284				tprintf("%s + %ld, ", x->str, addr - x->val);
3285			}
3286			else
3287				tprintf("%s, ", x->str);
3288		}
3289		else
3290# endif
3291			tprintf("%#lx, ", tcp->u_arg[2]);
3292# ifdef LINUX
3293		switch (tcp->u_arg[0]) {
3294#  ifndef IA64
3295		case PTRACE_PEEKDATA:
3296		case PTRACE_PEEKTEXT:
3297		case PTRACE_PEEKUSER:
3298			break;
3299#  endif
3300		case PTRACE_CONT:
3301		case PTRACE_SINGLESTEP:
3302		case PTRACE_SYSCALL:
3303		case PTRACE_DETACH:
3304			printsignal(tcp->u_arg[3]);
3305			break;
3306#  ifdef PTRACE_SETOPTIONS
3307		case PTRACE_SETOPTIONS:
3308			printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3309			break;
3310#  endif
3311#  ifdef PTRACE_SETSIGINFO
3312		case PTRACE_SETSIGINFO: {
3313			siginfo_t si;
3314			if (!tcp->u_arg[3])
3315				tprintf("NULL");
3316			else if (syserror(tcp))
3317				tprintf("%#lx", tcp->u_arg[3]);
3318			else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3319				tprintf("{???}");
3320			else
3321				printsiginfo(&si, verbose(tcp));
3322			break;
3323		}
3324#  endif
3325#  ifdef PTRACE_GETSIGINFO
3326		case PTRACE_GETSIGINFO:
3327			/* Don't print anything, do it at syscall return. */
3328			break;
3329#  endif
3330		default:
3331			tprintf("%#lx", tcp->u_arg[3]);
3332			break;
3333		}
3334	} else {
3335		switch (tcp->u_arg[0]) {
3336		case PTRACE_PEEKDATA:
3337		case PTRACE_PEEKTEXT:
3338		case PTRACE_PEEKUSER:
3339#  ifdef IA64
3340			return RVAL_HEX;
3341#  else
3342			printnum(tcp, tcp->u_arg[3], "%#lx");
3343			break;
3344#  endif
3345#  ifdef PTRACE_GETSIGINFO
3346		case PTRACE_GETSIGINFO: {
3347			siginfo_t si;
3348			if (!tcp->u_arg[3])
3349				tprintf("NULL");
3350			else if (syserror(tcp))
3351				tprintf("%#lx", tcp->u_arg[3]);
3352			else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3353				tprintf("{???}");
3354			else
3355				printsiginfo(&si, verbose(tcp));
3356			break;
3357		}
3358#  endif
3359		}
3360	}
3361# endif /* LINUX */
3362# ifdef SUNOS4
3363		if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3364			tcp->u_arg[0] == PTRACE_WRITETEXT) {
3365			tprintf("%lu, ", tcp->u_arg[3]);
3366			printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3367		} else if (tcp->u_arg[0] != PTRACE_READDATA &&
3368				tcp->u_arg[0] != PTRACE_READTEXT) {
3369			tprintf("%#lx", tcp->u_arg[3]);
3370		}
3371	} else {
3372		if (tcp->u_arg[0] == PTRACE_READDATA ||
3373			tcp->u_arg[0] == PTRACE_READTEXT) {
3374			tprintf("%lu, ", tcp->u_arg[3]);
3375			printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3376		}
3377	}
3378# endif /* SUNOS4 */
3379# ifdef FREEBSD
3380		tprintf("%lu", tcp->u_arg[3]);
3381	}
3382# endif /* FREEBSD */
3383	return 0;
3384}
3385
3386#endif /* !SVR4 */
3387
3388#ifdef LINUX
3389# ifndef FUTEX_CMP_REQUEUE
3390#  define FUTEX_CMP_REQUEUE 4
3391# endif
3392# ifndef FUTEX_WAKE_OP
3393#  define FUTEX_WAKE_OP 5
3394# endif
3395# ifndef FUTEX_LOCK_PI
3396#  define FUTEX_LOCK_PI 6
3397#  define FUTEX_UNLOCK_PI 7
3398#  define FUTEX_TRYLOCK_PI 8
3399# endif
3400# ifndef FUTEX_WAIT_BITSET
3401#  define FUTEX_WAIT_BITSET 9
3402# endif
3403# ifndef FUTEX_WAKE_BITSET
3404#  define FUTEX_WAKE_BITSET 10
3405# endif
3406# ifndef FUTEX_WAIT_REQUEUE_PI
3407#  define FUTEX_WAIT_REQUEUE_PI 11
3408# endif
3409# ifndef FUTEX_CMP_REQUEUE_PI
3410#  define FUTEX_CMP_REQUEUE_PI 12
3411# endif
3412# ifndef FUTEX_PRIVATE_FLAG
3413#  define FUTEX_PRIVATE_FLAG 128
3414# endif
3415# ifndef FUTEX_CLOCK_REALTIME
3416#  define FUTEX_CLOCK_REALTIME 256
3417# endif
3418static const struct xlat futexops[] = {
3419	{ FUTEX_WAIT,					"FUTEX_WAIT" },
3420	{ FUTEX_WAKE,					"FUTEX_WAKE" },
3421	{ FUTEX_FD,					"FUTEX_FD" },
3422	{ FUTEX_REQUEUE,				"FUTEX_REQUEUE" },
3423	{ FUTEX_CMP_REQUEUE,				"FUTEX_CMP_REQUEUE" },
3424	{ FUTEX_WAKE_OP,				"FUTEX_WAKE_OP" },
3425	{ FUTEX_LOCK_PI,				"FUTEX_LOCK_PI" },
3426	{ FUTEX_UNLOCK_PI,				"FUTEX_UNLOCK_PI" },
3427	{ FUTEX_TRYLOCK_PI,				"FUTEX_TRYLOCK_PI" },
3428	{ FUTEX_WAIT_BITSET,				"FUTEX_WAIT_BITSET" },
3429	{ FUTEX_WAKE_BITSET,				"FUTEX_WAKE_BITSET" },
3430	{ FUTEX_WAIT_REQUEUE_PI,			"FUTEX_WAIT_REQUEUE_PI" },
3431	{ FUTEX_CMP_REQUEUE_PI,				"FUTEX_CMP_REQUEUE_PI" },
3432	{ FUTEX_WAIT|FUTEX_PRIVATE_FLAG,		"FUTEX_WAIT_PRIVATE" },
3433	{ FUTEX_WAKE|FUTEX_PRIVATE_FLAG,		"FUTEX_WAKE_PRIVATE" },
3434	{ FUTEX_FD|FUTEX_PRIVATE_FLAG,			"FUTEX_FD_PRIVATE" },
3435	{ FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG,		"FUTEX_REQUEUE_PRIVATE" },
3436	{ FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG,		"FUTEX_CMP_REQUEUE_PRIVATE" },
3437	{ FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG,		"FUTEX_WAKE_OP_PRIVATE" },
3438	{ FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG,		"FUTEX_LOCK_PI_PRIVATE" },
3439	{ FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG,		"FUTEX_UNLOCK_PI_PRIVATE" },
3440	{ FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG,		"FUTEX_TRYLOCK_PI_PRIVATE" },
3441	{ FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG,		"FUTEX_WAIT_BITSET_PRIVATE" },
3442	{ FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG,		"FUTEX_WAKE_BITSET_PRIVATE" },
3443	{ FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG,	"FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3444	{ FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG,	"FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3445	{ FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME,	"FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3446	{ FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME,	"FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3447	{ FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME,	"FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3448	{ FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME,	"FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME" },
3449	{ 0,						NULL }
3450};
3451# ifndef FUTEX_OP_SET
3452#  define FUTEX_OP_SET		0
3453#  define FUTEX_OP_ADD		1
3454#  define FUTEX_OP_OR		2
3455#  define FUTEX_OP_ANDN		3
3456#  define FUTEX_OP_XOR		4
3457#  define FUTEX_OP_CMP_EQ	0
3458#  define FUTEX_OP_CMP_NE	1
3459#  define FUTEX_OP_CMP_LT	2
3460#  define FUTEX_OP_CMP_LE	3
3461#  define FUTEX_OP_CMP_GT	4
3462#  define FUTEX_OP_CMP_GE	5
3463# endif
3464static const struct xlat futexwakeops[] = {
3465	{ FUTEX_OP_SET,		"FUTEX_OP_SET" },
3466	{ FUTEX_OP_ADD,		"FUTEX_OP_ADD" },
3467	{ FUTEX_OP_OR,		"FUTEX_OP_OR" },
3468	{ FUTEX_OP_ANDN,	"FUTEX_OP_ANDN" },
3469	{ FUTEX_OP_XOR,		"FUTEX_OP_XOR" },
3470	{ 0,			NULL }
3471};
3472static const struct xlat futexwakecmps[] = {
3473	{ FUTEX_OP_CMP_EQ,	"FUTEX_OP_CMP_EQ" },
3474	{ FUTEX_OP_CMP_NE,	"FUTEX_OP_CMP_NE" },
3475	{ FUTEX_OP_CMP_LT,	"FUTEX_OP_CMP_LT" },
3476	{ FUTEX_OP_CMP_LE,	"FUTEX_OP_CMP_LE" },
3477	{ FUTEX_OP_CMP_GT,	"FUTEX_OP_CMP_GT" },
3478	{ FUTEX_OP_CMP_GE,	"FUTEX_OP_CMP_GE" },
3479	{ 0,			NULL }
3480};
3481
3482int
3483sys_futex(struct tcb *tcp)
3484{
3485	if (entering(tcp)) {
3486		long int cmd = tcp->u_arg[1] & 127;
3487		tprintf("%p, ", (void *) tcp->u_arg[0]);
3488		printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3489		tprintf(", %ld", tcp->u_arg[2]);
3490		if (cmd == FUTEX_WAKE_BITSET)
3491			tprintf(", %lx", tcp->u_arg[5]);
3492		else if (cmd == FUTEX_WAIT) {
3493			tprintf(", ");
3494			printtv(tcp, tcp->u_arg[3]);
3495		} else if (cmd == FUTEX_WAIT_BITSET) {
3496			tprintf(", ");
3497			printtv(tcp, tcp->u_arg[3]);
3498			tprintf(", %lx", tcp->u_arg[5]);
3499		} else if (cmd == FUTEX_REQUEUE)
3500			tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3501		else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
3502			tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3503		else if (cmd == FUTEX_WAKE_OP) {
3504			tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3505			if ((tcp->u_arg[5] >> 28) & 8)
3506				tprintf("FUTEX_OP_OPARG_SHIFT|");
3507			printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3508			tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3509			if ((tcp->u_arg[5] >> 24) & 8)
3510				tprintf("FUTEX_OP_OPARG_SHIFT|");
3511			printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3512			tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
3513		} else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3514			tprintf(", ");
3515			printtv(tcp, tcp->u_arg[3]);
3516			tprintf(", %p", (void *) tcp->u_arg[4]);
3517		}
3518	}
3519	return 0;
3520}
3521
3522static void
3523print_affinitylist(struct tcb *tcp, long list, unsigned int len)
3524{
3525	int first = 1;
3526	unsigned long w, min_len;
3527
3528	if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3529		min_len = len - max_strlen * sizeof(w);
3530	else
3531		min_len = 0;
3532	for (; len >= sizeof(w) && len > min_len;
3533	     len -= sizeof(w), list += sizeof(w)) {
3534		if (umove(tcp, list, &w) < 0)
3535			break;
3536		if (first)
3537			tprintf("{");
3538		else
3539			tprintf(", ");
3540		first = 0;
3541		tprintf("%lx", w);
3542	}
3543	if (len) {
3544		if (first)
3545			tprintf("%#lx", list);
3546		else
3547			tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3548				"???" : "..."));
3549	} else {
3550		tprintf(first ? "{}" : "}");
3551	}
3552}
3553
3554int
3555sys_sched_setaffinity(struct tcb *tcp)
3556{
3557	if (entering(tcp)) {
3558		tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3559		print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3560	}
3561	return 0;
3562}
3563
3564int
3565sys_sched_getaffinity(struct tcb *tcp)
3566{
3567	if (entering(tcp)) {
3568		tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3569	} else {
3570		if (tcp->u_rval == -1)
3571			tprintf("%#lx", tcp->u_arg[2]);
3572		else
3573			print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3574	}
3575	return 0;
3576}
3577
3578static const struct xlat schedulers[] = {
3579	{ SCHED_OTHER,	"SCHED_OTHER" },
3580	{ SCHED_RR,	"SCHED_RR" },
3581	{ SCHED_FIFO,	"SCHED_FIFO" },
3582	{ 0,		NULL }
3583};
3584
3585int
3586sys_sched_getscheduler(struct tcb *tcp)
3587{
3588	if (entering(tcp)) {
3589		tprintf("%d", (int) tcp->u_arg[0]);
3590	} else if (! syserror(tcp)) {
3591		tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3592		if (tcp->auxstr != NULL)
3593			return RVAL_STR;
3594	}
3595	return 0;
3596}
3597
3598int
3599sys_sched_setscheduler(struct tcb *tcp)
3600{
3601	if (entering(tcp)) {
3602		struct sched_param p;
3603		tprintf("%d, ", (int) tcp->u_arg[0]);
3604		printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3605		if (umove(tcp, tcp->u_arg[2], &p) < 0)
3606			tprintf(", %#lx", tcp->u_arg[2]);
3607		else
3608			tprintf(", { %d }", p.__sched_priority);
3609	}
3610	return 0;
3611}
3612
3613int
3614sys_sched_getparam(struct tcb *tcp)
3615{
3616	if (entering(tcp)) {
3617		tprintf("%d, ", (int) tcp->u_arg[0]);
3618	} else {
3619		struct sched_param p;
3620		if (umove(tcp, tcp->u_arg[1], &p) < 0)
3621			tprintf("%#lx", tcp->u_arg[1]);
3622		else
3623			tprintf("{ %d }", p.__sched_priority);
3624	}
3625	return 0;
3626}
3627
3628int
3629sys_sched_setparam(struct tcb *tcp)
3630{
3631	if (entering(tcp)) {
3632		struct sched_param p;
3633		if (umove(tcp, tcp->u_arg[1], &p) < 0)
3634			tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3635		else
3636			tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3637	}
3638	return 0;
3639}
3640
3641int
3642sys_sched_get_priority_min(struct tcb *tcp)
3643{
3644	if (entering(tcp)) {
3645		printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3646	}
3647	return 0;
3648}
3649
3650# ifdef X86_64
3651# include <asm/prctl.h>
3652
3653static const struct xlat archvals[] = {
3654	{ ARCH_SET_GS,		"ARCH_SET_GS"		},
3655	{ ARCH_SET_FS,		"ARCH_SET_FS"		},
3656	{ ARCH_GET_FS,		"ARCH_GET_FS"		},
3657	{ ARCH_GET_GS,		"ARCH_GET_GS"		},
3658	{ 0,			NULL			},
3659};
3660
3661int
3662sys_arch_prctl(struct tcb *tcp)
3663{
3664	if (entering(tcp)) {
3665		printxval(archvals, tcp->u_arg[0], "ARCH_???");
3666		if (tcp->u_arg[0] == ARCH_SET_GS
3667		 || tcp->u_arg[0] == ARCH_SET_FS
3668		) {
3669			tprintf(", %#lx", tcp->u_arg[1]);
3670		}
3671	} else {
3672		if (tcp->u_arg[0] == ARCH_GET_GS
3673		 || tcp->u_arg[0] == ARCH_GET_FS
3674		) {
3675			long int v;
3676			if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3677				tprintf(", [%#lx]", v);
3678			else
3679				tprintf(", %#lx", tcp->u_arg[1]);
3680		}
3681	}
3682	return 0;
3683}
3684# endif /* X86_64 */
3685
3686
3687int
3688sys_getcpu(struct tcb *tcp)
3689{
3690	if (exiting(tcp)) {
3691		unsigned u;
3692		if (tcp->u_arg[0] == 0)
3693			tprintf("NULL, ");
3694		else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3695			tprintf("%#lx, ", tcp->u_arg[0]);
3696		else
3697			tprintf("[%u], ", u);
3698		if (tcp->u_arg[1] == 0)
3699			tprintf("NULL, ");
3700		else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3701			tprintf("%#lx, ", tcp->u_arg[1]);
3702		else
3703			tprintf("[%u], ", u);
3704		tprintf("%#lx", tcp->u_arg[2]);
3705	}
3706	return 0;
3707}
3708
3709#endif /* LINUX */
3710