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], ©) != -1) { 643 tprintf(", {entry_number:%d, ", 644 copy.entry_number); 645 if (!verbose(tcp)) 646 tprintf("...}"); 647 else 648 print_ldt_entry(©); 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*)®s, 0)<0) 709 return -1; 710 regs.u_regs[U_REG_G1] = new; 711 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)®s, 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