blob: 5ac6f589589d5e90e9c129ac83d18c278519e475 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Linux for s390 port by D.J. Barrow
8 * <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
Wichert Akkermanccef6372002-05-01 16:39:22 +00009 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
11
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000012 *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000013 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 */
39
40#include "defs.h"
41
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <sys/time.h>
45#include <sys/wait.h>
46#include <sys/resource.h>
47#include <sys/utsname.h>
48#include <sys/user.h>
49#include <sys/syscall.h>
50#include <signal.h>
51#ifdef SUNOS4
52#include <machine/reg.h>
53#endif /* SUNOS4 */
54
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000055#ifdef FREEBSD
56#include <sys/ptrace.h>
57#endif
58
Wichert Akkerman36915a11999-07-13 15:45:02 +000059#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000060# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000061#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000062# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000063#endif
64#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000065# define PTRACE_POKEUSR PTRACE_POKEUSER
66#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000067#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000068
Roland McGrath5bd7cf82003-01-24 04:31:18 +000069#ifdef HAVE_LINUX_PTRACE_H
70#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000071# ifdef HAVE_STRUCT_IA64_FPREG
72# define ia64_fpreg XXX_ia64_fpreg
73# endif
74# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
75# define pt_all_user_regs XXX_pt_all_user_regs
76# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000077#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000078# undef ia64_fpreg
79# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000080#endif
81
Roland McGrath6d1a65c2004-07-12 07:44:08 +000082#if defined (LINUX) && defined (SPARC64)
83# define r_pc r_tpc
84# undef PTRACE_GETREGS
85# define PTRACE_GETREGS PTRACE_GETREGS64
86# undef PTRACE_SETREGS
87# define PTRACE_SETREGS PTRACE_SETREGS64
88#endif /* LINUX && SPARC64 */
89
Roland McGrath5a223472002-12-15 23:58:26 +000090#ifdef HAVE_LINUX_FUTEX_H
Dmitry V. Levine5e60852009-12-31 22:50:49 +000091# include <linux/futex.h>
Roland McGrath5a223472002-12-15 23:58:26 +000092#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +000093#ifdef LINUX
Roland McGrath5a223472002-12-15 23:58:26 +000094# ifndef FUTEX_WAIT
95# define FUTEX_WAIT 0
96# endif
97# ifndef FUTEX_WAKE
98# define FUTEX_WAKE 1
99# endif
100# ifndef FUTEX_FD
101# define FUTEX_FD 2
102# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000103# ifndef FUTEX_REQUEUE
104# define FUTEX_REQUEUE 3
105# endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000106#endif /* LINUX */
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000107
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000108#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000109#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000110#include <asm/posix_types.h>
111#undef GETGROUPS_T
112#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000113#undef GETGROUPS32_T
114#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000115#endif /* LINUX */
116
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000117#if defined(LINUX) && defined(IA64)
118# include <asm/ptrace_offsets.h>
119# include <asm/rse.h>
120#endif
121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef HAVE_PRCTL
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000123# include <sys/prctl.h>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000124
Roland McGrathd9f816f2004-09-04 03:39:20 +0000125static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000126#ifdef PR_MAXPROCS
127 { PR_MAXPROCS, "PR_MAXPROCS" },
128#endif
129#ifdef PR_ISBLOCKED
130 { PR_ISBLOCKED, "PR_ISBLOCKED" },
131#endif
132#ifdef PR_SETSTACKSIZE
133 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
134#endif
135#ifdef PR_GETSTACKSIZE
136 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
137#endif
138#ifdef PR_MAXPPROCS
139 { PR_MAXPPROCS, "PR_MAXPPROCS" },
140#endif
141#ifdef PR_UNBLKONEXEC
142 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
143#endif
144#ifdef PR_ATOMICSIM
145 { PR_ATOMICSIM, "PR_ATOMICSIM" },
146#endif
147#ifdef PR_SETEXITSIG
148 { PR_SETEXITSIG, "PR_SETEXITSIG" },
149#endif
150#ifdef PR_RESIDENT
151 { PR_RESIDENT, "PR_RESIDENT" },
152#endif
153#ifdef PR_ATTACHADDR
154 { PR_ATTACHADDR, "PR_ATTACHADDR" },
155#endif
156#ifdef PR_DETACHADDR
157 { PR_DETACHADDR, "PR_DETACHADDR" },
158#endif
159#ifdef PR_TERMCHILD
160 { PR_TERMCHILD, "PR_TERMCHILD" },
161#endif
162#ifdef PR_GETSHMASK
163 { PR_GETSHMASK, "PR_GETSHMASK" },
164#endif
165#ifdef PR_GETNSHARE
166 { PR_GETNSHARE, "PR_GETNSHARE" },
167#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000168#ifdef PR_COREPID
169 { PR_COREPID, "PR_COREPID" },
170#endif
171#ifdef PR_ATTACHADDRPERM
172 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
173#endif
174#ifdef PR_PTHREADEXIT
175 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
176#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000177#ifdef PR_SET_PDEATHSIG
178 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
179#endif
180#ifdef PR_GET_PDEATHSIG
181 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
182#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000183#ifdef PR_GET_DUMPABLE
184 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
185#endif
186#ifdef PR_SET_DUMPABLE
187 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
188#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000189#ifdef PR_GET_UNALIGN
190 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
191#endif
192#ifdef PR_SET_UNALIGN
193 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
194#endif
195#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000196 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000197#endif
198#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000199 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000200#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000201#ifdef PR_GET_FPEMU
202 { PR_GET_FPEMU, "PR_GET_FPEMU" },
203#endif
204#ifdef PR_SET_FPEMU
205 { PR_SET_FPEMU, "PR_SET_FPEMU" },
206#endif
207#ifdef PR_GET_FPEXC
208 { PR_GET_FPEXC, "PR_GET_FPEXC" },
209#endif
210#ifdef PR_SET_FPEXC
211 { PR_SET_FPEXC, "PR_SET_FPEXC" },
212#endif
213#ifdef PR_GET_TIMING
214 { PR_GET_TIMING, "PR_GET_TIMING" },
215#endif
216#ifdef PR_SET_TIMING
217 { PR_SET_TIMING, "PR_SET_TIMING" },
218#endif
219#ifdef PR_SET_NAME
220 { PR_SET_NAME, "PR_SET_NAME" },
221#endif
222#ifdef PR_GET_NAME
223 { PR_GET_NAME, "PR_GET_NAME" },
224#endif
225#ifdef PR_GET_ENDIAN
226 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
227#endif
228#ifdef PR_SET_ENDIAN
229 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
230#endif
231#ifdef PR_GET_SECCOMP
232 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
233#endif
234#ifdef PR_SET_SECCOMP
235 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
236#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000237#ifdef PR_GET_TSC
238 { PR_GET_TSC, "PR_GET_TSC" },
239#endif
240#ifdef PR_SET_TSC
241 { PR_SET_TSC, "PR_SET_TSC" },
242#endif
243#ifdef PR_GET_SECUREBITS
244 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
245#endif
246#ifdef PR_SET_SECUREBITS
247 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
248#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000249 { 0, NULL },
250};
251
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000252
Roland McGratha4d48532005-06-08 20:45:28 +0000253static const char *
Denys Vlasenko12014262011-05-30 14:00:14 +0200254unalignctl_string(unsigned int ctl)
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000255{
256 static char buf[16];
257
258 switch (ctl) {
259#ifdef PR_UNALIGN_NOPRINT
260 case PR_UNALIGN_NOPRINT:
261 return "NOPRINT";
262#endif
263#ifdef PR_UNALIGN_SIGBUS
264 case PR_UNALIGN_SIGBUS:
265 return "SIGBUS";
266#endif
267 default:
268 break;
269 }
270 sprintf(buf, "%x", ctl);
271 return buf;
272}
273
274
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000275int
Denys Vlasenko12014262011-05-30 14:00:14 +0200276sys_prctl(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000277{
278 int i;
279
280 if (entering(tcp)) {
281 printxval(prctl_options, tcp->u_arg[0], "PR_???");
282 switch (tcp->u_arg[0]) {
283#ifdef PR_GETNSHARE
284 case PR_GETNSHARE:
285 break;
286#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000287#ifdef PR_SET_PDEATHSIG
288 case PR_SET_PDEATHSIG:
289 tprintf(", %lu", tcp->u_arg[1]);
290 break;
291#endif
292#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000293 case PR_GET_PDEATHSIG:
294 break;
295#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000296#ifdef PR_SET_DUMPABLE
297 case PR_SET_DUMPABLE:
298 tprintf(", %lu", tcp->u_arg[1]);
299 break;
300#endif
301#ifdef PR_GET_DUMPABLE
302 case PR_GET_DUMPABLE:
303 break;
304#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000305#ifdef PR_SET_UNALIGN
306 case PR_SET_UNALIGN:
307 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
308 break;
309#endif
310#ifdef PR_GET_UNALIGN
311 case PR_GET_UNALIGN:
312 tprintf(", %#lx", tcp->u_arg[1]);
313 break;
314#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000315#ifdef PR_SET_KEEPCAPS
316 case PR_SET_KEEPCAPS:
317 tprintf(", %lu", tcp->u_arg[1]);
318 break;
319#endif
320#ifdef PR_GET_KEEPCAPS
321 case PR_GET_KEEPCAPS:
322 break;
323#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000324 default:
325 for (i = 1; i < tcp->u_nargs; i++)
326 tprintf(", %#lx", tcp->u_arg[i]);
327 break;
328 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000329 } else {
330 switch (tcp->u_arg[0]) {
331#ifdef PR_GET_PDEATHSIG
332 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000333 if (umove(tcp, tcp->u_arg[1], &i) < 0)
334 tprintf(", %#lx", tcp->u_arg[1]);
335 else
336 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000337 break;
338#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000339#ifdef PR_GET_DUMPABLE
340 case PR_GET_DUMPABLE:
341 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000342#endif
343#ifdef PR_GET_UNALIGN
344 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000345 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
346 break;
347 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000348 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000349#endif
350#ifdef PR_GET_KEEPCAPS
351 case PR_GET_KEEPCAPS:
352 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000353#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000354 default:
355 break;
356 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000357 }
358 return 0;
359}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000360#endif /* HAVE_PRCTL */
361
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000362#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000363int
Denys Vlasenko12014262011-05-30 14:00:14 +0200364sys_gethostid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000365{
366 if (exiting(tcp))
367 return RVAL_HEX;
368 return 0;
369}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000370#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000371
372int
Denys Vlasenko12014262011-05-30 14:00:14 +0200373sys_sethostname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000374{
375 if (entering(tcp)) {
376 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
377 tprintf(", %lu", tcp->u_arg[1]);
378 }
379 return 0;
380}
381
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000382#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000383int
Denys Vlasenko12014262011-05-30 14:00:14 +0200384sys_gethostname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000385{
386 if (exiting(tcp)) {
387 if (syserror(tcp))
388 tprintf("%#lx", tcp->u_arg[0]);
389 else
390 printpath(tcp, tcp->u_arg[0]);
391 tprintf(", %lu", tcp->u_arg[1]);
392 }
393 return 0;
394}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000395#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000396
397int
Denys Vlasenko12014262011-05-30 14:00:14 +0200398sys_setdomainname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000399{
400 if (entering(tcp)) {
401 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
402 tprintf(", %lu", tcp->u_arg[1]);
403 }
404 return 0;
405}
406
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000407#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000408
409int
Denys Vlasenko12014262011-05-30 14:00:14 +0200410sys_getdomainname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000411{
412 if (exiting(tcp)) {
413 if (syserror(tcp))
414 tprintf("%#lx", tcp->u_arg[0]);
415 else
416 printpath(tcp, tcp->u_arg[0]);
417 tprintf(", %lu", tcp->u_arg[1]);
418 }
419 return 0;
420}
421#endif /* !LINUX */
422
423int
Denys Vlasenko12014262011-05-30 14:00:14 +0200424sys_exit(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000425{
426 if (exiting(tcp)) {
427 fprintf(stderr, "_exit returned!\n");
428 return -1;
429 }
430 /* special case: we stop tracing this process, finish line now */
431 tprintf("%ld) ", tcp->u_arg[0]);
432 tabto(acolumn);
433 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000434 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000435 return 0;
436}
437
438int
Dmitry V. Levinfde119c2011-02-18 23:16:20 +0000439internal_exit(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000440{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000441 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000442 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000443#ifdef __NR_exit_group
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000444 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000445 tcp->flags |= TCB_GROUP_EXITING;
446#endif
447 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000448 return 0;
449}
450
Roland McGratheb9e2e82009-06-02 16:49:22 -0700451/* TCP is creating a child we want to follow.
452 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
453 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
454static void
455fork_tcb(struct tcb *tcp)
456{
457 if (nprocs == tcbtabsize)
458 expand_tcbtab();
459
460 tcp->flags |= TCB_FOLLOWFORK;
461}
462
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000463#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000464
465int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000466sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000467{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000468 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000469 if (getrval2(tcp)) {
470 tcp->auxstr = "child process";
471 return RVAL_UDECIMAL | RVAL_STR;
472 }
473 }
474 return 0;
475}
476
John Hughes4e36a812001-04-18 15:11:51 +0000477#if UNIXWARE > 2
478
479int
Denys Vlasenko12014262011-05-30 14:00:14 +0200480sys_rfork(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +0000481{
482 if (entering(tcp)) {
483 tprintf ("%ld", tcp->u_arg[0]);
484 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000485 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000486 if (getrval2(tcp)) {
487 tcp->auxstr = "child process";
488 return RVAL_UDECIMAL | RVAL_STR;
489 }
490 }
491 return 0;
492}
493
494#endif
495
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000496int
Denys Vlasenko12014262011-05-30 14:00:14 +0200497internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000498{
499 struct tcb *tcpchild;
500
501 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000502#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000503 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000504 return 0;
505#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000506 if (getrval2(tcp))
507 return 0;
508 if (!followfork)
509 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700510 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000511 if (syserror(tcp))
512 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000513 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000514 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000515 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000516 }
517 return 0;
518}
519
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000520#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000521
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000522#ifdef LINUX
523
524/* defines copied from linux/sched.h since we can't include that
525 * ourselves (it conflicts with *lots* of libc includes)
526 */
527#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
528#define CLONE_VM 0x00000100 /* set if VM shared between processes */
529#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
530#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
531#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000532#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000533#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
534#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
535#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000536#define CLONE_THREAD 0x00010000 /* Same thread group? */
537#define CLONE_NEWNS 0x00020000 /* New namespace group? */
538#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
539#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
540#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
541#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
Roland McGrath909875b2002-12-22 03:34:36 +0000542#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
543#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000544#define CLONE_STOPPED 0x02000000 /* Start in stopped state */
545#define CLONE_NEWUTS 0x04000000 /* New utsname group? */
546#define CLONE_NEWIPC 0x08000000 /* New ipcs */
547#define CLONE_NEWUSER 0x10000000 /* New user namespace */
548#define CLONE_NEWPID 0x20000000 /* New pid namespace */
549#define CLONE_NEWNET 0x40000000 /* New network namespace */
550#define CLONE_IO 0x80000000 /* Clone io context */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000551
Roland McGrathd9f816f2004-09-04 03:39:20 +0000552static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000553 { CLONE_VM, "CLONE_VM" },
554 { CLONE_FS, "CLONE_FS" },
555 { CLONE_FILES, "CLONE_FILES" },
556 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000557 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000558 { CLONE_PTRACE, "CLONE_PTRACE" },
559 { CLONE_VFORK, "CLONE_VFORK" },
560 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000561 { CLONE_THREAD, "CLONE_THREAD" },
562 { CLONE_NEWNS, "CLONE_NEWNS" },
563 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
564 { CLONE_SETTLS, "CLONE_SETTLS" },
565 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
566 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
Roland McGrath909875b2002-12-22 03:34:36 +0000567 { CLONE_UNTRACED, "CLONE_UNTRACED" },
568 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000569 { CLONE_STOPPED, "CLONE_STOPPED" },
570 { CLONE_NEWUTS, "CLONE_NEWUTS" },
571 { CLONE_NEWIPC, "CLONE_NEWIPC" },
572 { CLONE_NEWUSER, "CLONE_NEWUSER" },
573 { CLONE_NEWPID, "CLONE_NEWPID" },
574 { CLONE_NEWNET, "CLONE_NEWNET" },
575 { CLONE_IO, "CLONE_IO" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000576 { 0, NULL },
577};
578
Roland McGrath909875b2002-12-22 03:34:36 +0000579# ifdef I386
580# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000581# ifdef HAVE_STRUCT_USER_DESC
582# define modify_ldt_ldt_s user_desc
583# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000584extern void print_ldt_entry();
585# endif
586
Roland McGrath9677b3a2003-03-12 09:54:36 +0000587# if defined IA64
588# define ARG_FLAGS 0
589# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000590# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
591# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
592# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
593# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000594# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000595# define ARG_STACK 0
596# define ARG_FLAGS 1
597# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000598# define ARG_CTID 3
599# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000600# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000601# define ARG_FLAGS 0
602# define ARG_STACK 1
603# define ARG_PTID 2
604# define ARG_CTID 3
605# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000606# else
607# define ARG_FLAGS 0
608# define ARG_STACK 1
609# define ARG_PTID 2
610# define ARG_TLS 3
611# define ARG_CTID 4
612# endif
613
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000614int
Denys Vlasenko12014262011-05-30 14:00:14 +0200615sys_clone(struct tcb *tcp)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000616{
617 if (exiting(tcp)) {
Wang Chaocbdd1902010-09-02 15:08:59 +0800618 const char *sep = "|";
Roland McGrath9677b3a2003-03-12 09:54:36 +0000619 unsigned long flags = tcp->u_arg[ARG_FLAGS];
620 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
621# ifdef ARG_STACKSIZE
622 if (ARG_STACKSIZE != -1)
623 tprintf("stack_size=%#lx, ",
624 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000625# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000626 tprintf("flags=");
Wang Chaocbdd1902010-09-02 15:08:59 +0800627 if (!printflags(clone_flags, flags &~ CSIGNAL, NULL))
628 sep = "";
Roland McGrath984154d2003-05-23 01:08:42 +0000629 if ((flags & CSIGNAL) != 0)
Wang Chaocbdd1902010-09-02 15:08:59 +0800630 tprintf("%s%s", sep, signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000631 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000632 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000633 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000634 if (flags & CLONE_PARENT_SETTID)
635 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000636 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000637# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000638 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000639 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000640 tprintf(", {entry_number:%d, ",
641 copy.entry_number);
642 if (!verbose(tcp))
643 tprintf("...}");
644 else
645 print_ldt_entry(&copy);
646 }
647 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000648# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000649 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000650 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000651 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
652 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000653 }
654 return 0;
655}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000656
657int
658sys_unshare(struct tcb *tcp)
659{
660 if (entering(tcp))
661 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
662 return 0;
663}
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000664#endif /* LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000665
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000666int
Denys Vlasenko12014262011-05-30 14:00:14 +0200667sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000668{
669 if (exiting(tcp))
670 return RVAL_UDECIMAL;
671 return 0;
672}
673
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000674int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000675change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000676{
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000677#ifdef LINUX
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000678#if defined(I386)
679 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000680 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000681 return -1;
682 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000683#elif defined(X86_64)
684 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000685 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000686 return -1;
687 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000688#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000689 if (ptrace(PTRACE_POKEUSER, tcp->pid,
690 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000691 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000692 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000693#elif defined(S390) || defined(S390X)
694 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
695 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000696 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000697 return 0;
698#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000699 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000700 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000702#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400703 struct pt_regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000704 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
705 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400706 regs.u_regs[U_REG_G1] = new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000707 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000708 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000709 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000710#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000711 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000712 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000713 return 0;
714#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000715 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000716 return -1;
717 return 0;
718#elif defined(AVR32)
719 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
720 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000721 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000722#elif defined(BFIN)
723 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
724 return -1;
725 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000726#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000727 if (ia32) {
728 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000729 case 2:
730 break; /* x86 SYS_fork */
731 case SYS_clone:
732 new = 120;
733 break;
734 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000735 fprintf(stderr, "%s: unexpected syscall %d\n",
736 __FUNCTION__, new);
737 return -1;
738 }
739 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
740 return -1;
741 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000742 return -1;
743 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000744#elif defined(HPPA)
745 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000746 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000747 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000748#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000749 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
750 return -1;
751 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000752#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000753 /* Top half of reg encodes the no. of args n as 0x1n.
754 Assume 0 args as kernel never actually checks... */
755 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
756 0x100000 | new) < 0)
757 return -1;
758 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000759#elif defined(CRISV10) || defined(CRISV32)
760 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
761 return -1;
762 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000763#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000764 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000765# ifndef PTRACE_SET_SYSCALL
766# define PTRACE_SET_SYSCALL 23
767# endif
768
Dmitry V. Levin76740062009-09-18 11:30:14 +0000769 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000770 return -1;
771
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000772 return 0;
Chris Metcalfc8c66982009-12-28 10:00:15 -0500773#elif defined(TILE)
774 if (ptrace(PTRACE_POKEUSER, tcp->pid,
775 (char*)PTREGS_OFFSET_REG(0),
776 new) != 0)
777 return -1;
778 return 0;
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200779#elif defined(MICROBLAZE)
780 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new)<0)
781 return -1;
782 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000783#else
784#warning Do not know how to handle change_syscall for this architecture
785#endif /* architecture */
786#endif /* LINUX */
787 return -1;
788}
789
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000790#ifdef LINUX
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000791int
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800792handle_new_child(struct tcb *tcp, int pid, int bpt)
793{
794 struct tcb *tcpchild;
795
796#ifdef CLONE_PTRACE /* See new setbpt code. */
797 tcpchild = pid2tcb(pid);
798 if (tcpchild != NULL) {
799 /* The child already reported its startup trap
800 before the parent reported its syscall return. */
801 if ((tcpchild->flags
802 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
803 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
804 fprintf(stderr, "\
805[preattached child %d of %d in weird state!]\n",
806 pid, tcp->pid);
807 }
808 else
809#endif /* CLONE_PTRACE */
810 {
811 fork_tcb(tcp);
812 tcpchild = alloctcb(pid);
813 }
814
815#ifndef CLONE_PTRACE
816 /* Attach to the new child */
817 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
818 if (bpt)
819 clearbpt(tcp);
820 perror("PTRACE_ATTACH");
821 fprintf(stderr, "Too late?\n");
822 droptcb(tcpchild);
823 return 0;
824 }
825#endif /* !CLONE_PTRACE */
826
827 if (bpt)
828 clearbpt(tcp);
829
830 tcpchild->flags |= TCB_ATTACHED;
831 /* Child has BPT too, must be removed on first occasion. */
832 if (bpt) {
833 tcpchild->flags |= TCB_BPTSET;
834 tcpchild->baddr = tcp->baddr;
835 memcpy(tcpchild->inst, tcp->inst,
836 sizeof tcpchild->inst);
837 }
838 tcpchild->parent = tcp;
839 tcp->nchildren++;
840 if (tcpchild->flags & TCB_SUSPENDED) {
841 /* The child was born suspended, due to our having
842 forced CLONE_PTRACE. */
843 if (bpt)
844 clearbpt(tcpchild);
845
846 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
847 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
848 return -1;
849
850 if (!qflag)
851 fprintf(stderr, "\
852Process %u resumed (parent %d ready)\n",
853 pid, tcp->pid);
854 }
855 else {
856 if (!qflag)
857 fprintf(stderr, "Process %d attached\n", pid);
858 }
859
860#ifdef TCB_CLONE_THREAD
861 if (sysent[tcp->scno].sys_func == sys_clone)
862 {
863 /*
864 * Save the flags used in this call,
865 * in case we point TCP to our parent below.
866 */
867 int call_flags = tcp->u_arg[ARG_FLAGS];
868 if ((tcp->flags & TCB_CLONE_THREAD) &&
869 tcp->parent != NULL) {
870 /* The parent in this clone is itself a
871 thread belonging to another process.
872 There is no meaning to the parentage
873 relationship of the new child with the
874 thread, only with the process. We
875 associate the new thread with our
876 parent. Since this is done for every
877 new thread, there will never be a
878 TCB_CLONE_THREAD process that has
879 children. */
880 --tcp->nchildren;
881 tcp = tcp->parent;
882 tcpchild->parent = tcp;
883 ++tcp->nchildren;
884 }
885 if (call_flags & CLONE_THREAD) {
886 tcpchild->flags |= TCB_CLONE_THREAD;
887 ++tcp->nclone_threads;
888 }
889 if ((call_flags & CLONE_PARENT) &&
890 !(call_flags & CLONE_THREAD)) {
891 --tcp->nchildren;
892 tcpchild->parent = NULL;
893 if (tcp->parent != NULL) {
894 tcp = tcp->parent;
895 tcpchild->parent = tcp;
896 ++tcp->nchildren;
897 }
898 }
899 }
900#endif /* TCB_CLONE_THREAD */
901 return 0;
902}
903
904int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000905internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000906{
Denys Vlasenko3454e4b2011-05-23 21:29:03 +0200907 if ((ptrace_setoptions_followfork
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800908 & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
909 == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
910 return 0;
911
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000912 if (entering(tcp)) {
Wang Chaoe636c852010-09-16 11:20:56 +0800913 tcp->flags &= ~TCB_FOLLOWFORK;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700914 if (!followfork)
915 return 0;
Wang Chaoe636c852010-09-16 11:20:56 +0800916 /*
917 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
918 * new child if clone is called with flag CLONE_UNTRACED, so
919 * we keep the same logic with that option and don't trace it.
920 */
921 if ((sysent[tcp->scno].sys_func == sys_clone) &&
922 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
923 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700924 fork_tcb(tcp);
925 if (setbpt(tcp) < 0)
926 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000927 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000928 int pid;
929 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700930
931 if (!(tcp->flags & TCB_FOLLOWFORK))
932 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000933
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000934 bpt = tcp->flags & TCB_BPTSET;
935
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000936 if (syserror(tcp)) {
937 if (bpt)
938 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000939 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000940 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000941
942 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000943
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800944 return handle_new_child(tcp, pid, bpt);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000945 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000946 return 0;
947}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000948
949#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000950
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000951int
Denys Vlasenko12014262011-05-30 14:00:14 +0200952internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000953{
954 struct tcb *tcpchild;
955 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700956 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000957
958#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000959 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000960 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000961 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700962 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000963 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000964#endif
965 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700966 if (!followfork || dont_follow)
967 return 0;
968 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000969 if (setbpt(tcp) < 0)
970 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000971 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000972 else {
973 int bpt = tcp->flags & TCB_BPTSET;
974
Roland McGratheb9e2e82009-06-02 16:49:22 -0700975 if (!(tcp->flags & TCB_FOLLOWFORK))
976 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000977 if (bpt)
978 clearbpt(tcp);
979
980 if (syserror(tcp))
981 return 0;
982
983 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700984 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000985 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000986#ifdef SUNOS4
987#ifdef oldway
988 /* The child must have run before it can be attached. */
989 {
990 struct timeval tv;
991 tv.tv_sec = 0;
992 tv.tv_usec = 10000;
993 select(0, NULL, NULL, NULL, &tv);
994 }
995 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
996 perror("PTRACE_ATTACH");
997 fprintf(stderr, "Too late?\n");
998 droptcb(tcpchild);
999 return 0;
1000 }
1001#else /* !oldway */
1002 /* Try to catch the new process as soon as possible. */
1003 {
1004 int i;
1005 for (i = 0; i < 1024; i++)
1006 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1007 break;
1008 if (i == 1024) {
1009 perror("PTRACE_ATTACH");
1010 fprintf(stderr, "Too late?\n");
1011 droptcb(tcpchild);
1012 return 0;
1013 }
1014 }
1015#endif /* !oldway */
1016#endif /* SUNOS4 */
1017 tcpchild->flags |= TCB_ATTACHED;
1018 /* Child has BPT too, must be removed on first occasion */
1019 if (bpt) {
1020 tcpchild->flags |= TCB_BPTSET;
1021 tcpchild->baddr = tcp->baddr;
1022 memcpy(tcpchild->inst, tcp->inst,
1023 sizeof tcpchild->inst);
1024 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001025 tcpchild->parent = tcp;
1026 tcp->nchildren++;
1027 if (!qflag)
1028 fprintf(stderr, "Process %d attached\n", pid);
1029 }
1030 return 0;
1031}
1032
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001033#endif /* !LINUX */
1034
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001035#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001036
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001037#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001038
1039int
Denys Vlasenko12014262011-05-30 14:00:14 +02001040sys_vfork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001041{
1042 if (exiting(tcp))
1043 return RVAL_UDECIMAL;
1044 return 0;
1045}
1046
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001047#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001048
1049#ifndef LINUX
1050
1051static char idstr[16];
1052
1053int
Denys Vlasenko12014262011-05-30 14:00:14 +02001054sys_getpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001055{
1056 if (exiting(tcp)) {
1057 sprintf(idstr, "ppid %lu", getrval2(tcp));
1058 tcp->auxstr = idstr;
1059 return RVAL_STR;
1060 }
1061 return 0;
1062}
1063
1064int
Denys Vlasenko12014262011-05-30 14:00:14 +02001065sys_getuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001066{
1067 if (exiting(tcp)) {
1068 sprintf(idstr, "euid %lu", getrval2(tcp));
1069 tcp->auxstr = idstr;
1070 return RVAL_STR;
1071 }
1072 return 0;
1073}
1074
1075int
Denys Vlasenko12014262011-05-30 14:00:14 +02001076sys_getgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001077{
1078 if (exiting(tcp)) {
1079 sprintf(idstr, "egid %lu", getrval2(tcp));
1080 tcp->auxstr = idstr;
1081 return RVAL_STR;
1082 }
1083 return 0;
1084}
1085
1086#endif /* !LINUX */
1087
1088#ifdef LINUX
1089
Dmitry V. Levin50a218d2011-01-18 17:36:20 +00001090int sys_getuid(struct tcb *tcp)
1091{
1092 if (exiting(tcp))
1093 tcp->u_rval = (uid_t) tcp->u_rval;
1094 return RVAL_UDECIMAL;
1095}
1096
1097int sys_setfsuid(struct tcb *tcp)
1098{
1099 if (entering(tcp))
1100 tprintf("%u", (uid_t) tcp->u_arg[0]);
1101 else
1102 tcp->u_rval = (uid_t) tcp->u_rval;
1103 return RVAL_UDECIMAL;
1104}
1105
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001106int
Denys Vlasenko12014262011-05-30 14:00:14 +02001107sys_setuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001108{
1109 if (entering(tcp)) {
1110 tprintf("%u", (uid_t) tcp->u_arg[0]);
1111 }
1112 return 0;
1113}
1114
1115int
Denys Vlasenko12014262011-05-30 14:00:14 +02001116sys_setgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001117{
1118 if (entering(tcp)) {
1119 tprintf("%u", (gid_t) tcp->u_arg[0]);
1120 }
1121 return 0;
1122}
1123
1124int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001125sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001126{
1127 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001128 __kernel_uid_t uid;
1129 if (syserror(tcp))
1130 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1131 tcp->u_arg[1], tcp->u_arg[2]);
1132 else {
1133 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1134 tprintf("%#lx, ", tcp->u_arg[0]);
1135 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001136 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001137 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1138 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001139 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001140 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001141 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1142 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001143 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001144 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001145 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001146 }
1147 return 0;
1148}
1149
1150int
Denys Vlasenko12014262011-05-30 14:00:14 +02001151sys_getresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001152{
1153 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001154 __kernel_gid_t gid;
1155 if (syserror(tcp))
1156 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1157 tcp->u_arg[1], tcp->u_arg[2]);
1158 else {
1159 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1160 tprintf("%#lx, ", tcp->u_arg[0]);
1161 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001162 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001163 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1164 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001165 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001166 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001167 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1168 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001169 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001170 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001171 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001172 }
1173 return 0;
1174}
1175
1176#endif /* LINUX */
1177
1178int
Denys Vlasenko12014262011-05-30 14:00:14 +02001179sys_setreuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001180{
1181 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001182 printuid("", tcp->u_arg[0]);
1183 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001184 }
1185 return 0;
1186}
1187
1188int
Denys Vlasenko12014262011-05-30 14:00:14 +02001189sys_setregid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001190{
1191 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001192 printuid("", tcp->u_arg[0]);
1193 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001194 }
1195 return 0;
1196}
1197
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001198#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001199int
Denys Vlasenko12014262011-05-30 14:00:14 +02001200sys_setresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001201{
1202 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001203 printuid("", tcp->u_arg[0]);
1204 printuid(", ", tcp->u_arg[1]);
1205 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001206 }
1207 return 0;
1208}
1209int
Denys Vlasenko12014262011-05-30 14:00:14 +02001210sys_setresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001211{
1212 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001213 printuid("", tcp->u_arg[0]);
1214 printuid(", ", tcp->u_arg[1]);
1215 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001216 }
1217 return 0;
1218}
1219
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001220#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001221
1222int
Denys Vlasenko12014262011-05-30 14:00:14 +02001223sys_setgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001224{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001225 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001226 unsigned long len, size, start, cur, end, abbrev_end;
1227 GETGROUPS_T gid;
1228 int failed = 0;
1229
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001230 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001231 tprintf("%lu, ", len);
1232 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001233 tprintf("[]");
1234 return 0;
1235 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001236 start = tcp->u_arg[1];
1237 if (start == 0) {
1238 tprintf("NULL");
1239 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001240 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001241 size = len * sizeof(gid);
1242 end = start + size;
1243 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1244 tprintf("%#lx", start);
1245 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001246 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001247 if (abbrev(tcp)) {
1248 abbrev_end = start + max_strlen * sizeof(gid);
1249 if (abbrev_end < start)
1250 abbrev_end = end;
1251 } else {
1252 abbrev_end = end;
1253 }
1254 tprintf("[");
1255 for (cur = start; cur < end; cur += sizeof(gid)) {
1256 if (cur > start)
1257 tprintf(", ");
1258 if (cur >= abbrev_end) {
1259 tprintf("...");
1260 break;
1261 }
1262 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1263 tprintf("?");
1264 failed = 1;
1265 break;
1266 }
1267 tprintf("%lu", (unsigned long) gid);
1268 }
1269 tprintf("]");
1270 if (failed)
1271 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001272 }
1273 return 0;
1274}
1275
1276int
Denys Vlasenko12014262011-05-30 14:00:14 +02001277sys_getgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001278{
Roland McGrathaa524c82005-06-01 19:22:06 +00001279 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001280
1281 if (entering(tcp)) {
1282 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001283 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001284 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001285 unsigned long size, start, cur, end, abbrev_end;
1286 GETGROUPS_T gid;
1287 int failed = 0;
1288
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001289 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001290 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001291 tprintf("[]");
1292 return 0;
1293 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001294 start = tcp->u_arg[1];
1295 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001296 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001297 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001298 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001299 if (tcp->u_arg[0] == 0) {
1300 tprintf("%#lx", start);
1301 return 0;
1302 }
1303 size = len * sizeof(gid);
1304 end = start + size;
1305 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1306 size / sizeof(gid) != len || end < start) {
1307 tprintf("%#lx", start);
1308 return 0;
1309 }
1310 if (abbrev(tcp)) {
1311 abbrev_end = start + max_strlen * sizeof(gid);
1312 if (abbrev_end < start)
1313 abbrev_end = end;
1314 } else {
1315 abbrev_end = end;
1316 }
1317 tprintf("[");
1318 for (cur = start; cur < end; cur += sizeof(gid)) {
1319 if (cur > start)
1320 tprintf(", ");
1321 if (cur >= abbrev_end) {
1322 tprintf("...");
1323 break;
1324 }
1325 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1326 tprintf("?");
1327 failed = 1;
1328 break;
1329 }
1330 tprintf("%lu", (unsigned long) gid);
1331 }
1332 tprintf("]");
1333 if (failed)
1334 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001335 }
1336 return 0;
1337}
1338
Roland McGrath83bd47a2003-11-13 22:32:26 +00001339#ifdef LINUX
1340int
Denys Vlasenko12014262011-05-30 14:00:14 +02001341sys_setgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001342{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001343 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001344 unsigned long len, size, start, cur, end, abbrev_end;
1345 GETGROUPS32_T gid;
1346 int failed = 0;
1347
Roland McGrath83bd47a2003-11-13 22:32:26 +00001348 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001349 tprintf("%lu, ", len);
1350 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001351 tprintf("[]");
1352 return 0;
1353 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001354 start = tcp->u_arg[1];
1355 if (start == 0) {
1356 tprintf("NULL");
1357 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001358 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001359 size = len * sizeof(gid);
1360 end = start + size;
1361 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1362 tprintf("%#lx", start);
1363 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001364 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001365 if (abbrev(tcp)) {
1366 abbrev_end = start + max_strlen * sizeof(gid);
1367 if (abbrev_end < start)
1368 abbrev_end = end;
1369 } else {
1370 abbrev_end = end;
1371 }
1372 tprintf("[");
1373 for (cur = start; cur < end; cur += sizeof(gid)) {
1374 if (cur > start)
1375 tprintf(", ");
1376 if (cur >= abbrev_end) {
1377 tprintf("...");
1378 break;
1379 }
1380 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1381 tprintf("?");
1382 failed = 1;
1383 break;
1384 }
1385 tprintf("%lu", (unsigned long) gid);
1386 }
1387 tprintf("]");
1388 if (failed)
1389 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001390 }
1391 return 0;
1392}
1393
1394int
Denys Vlasenko12014262011-05-30 14:00:14 +02001395sys_getgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001396{
Roland McGrathaa524c82005-06-01 19:22:06 +00001397 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001398
1399 if (entering(tcp)) {
1400 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001401 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001402 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001403 unsigned long size, start, cur, end, abbrev_end;
1404 GETGROUPS32_T gid;
1405 int failed = 0;
1406
Roland McGrath83bd47a2003-11-13 22:32:26 +00001407 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001408 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001409 tprintf("[]");
1410 return 0;
1411 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001412 start = tcp->u_arg[1];
1413 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001414 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001415 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001416 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001417 size = len * sizeof(gid);
1418 end = start + size;
1419 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1420 size / sizeof(gid) != len || end < start) {
1421 tprintf("%#lx", start);
1422 return 0;
1423 }
1424 if (abbrev(tcp)) {
1425 abbrev_end = start + max_strlen * sizeof(gid);
1426 if (abbrev_end < start)
1427 abbrev_end = end;
1428 } else {
1429 abbrev_end = end;
1430 }
1431 tprintf("[");
1432 for (cur = start; cur < end; cur += sizeof(gid)) {
1433 if (cur > start)
1434 tprintf(", ");
1435 if (cur >= abbrev_end) {
1436 tprintf("...");
1437 break;
1438 }
1439 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1440 tprintf("?");
1441 failed = 1;
1442 break;
1443 }
1444 tprintf("%lu", (unsigned long) gid);
1445 }
1446 tprintf("]");
1447 if (failed)
1448 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001449 }
1450 return 0;
1451}
1452#endif /* LINUX */
1453
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001454#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001455int
Denys Vlasenko12014262011-05-30 14:00:14 +02001456sys_setpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001457{
1458 if (entering(tcp)) {
1459#ifndef SVR4
1460 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1461#endif /* !SVR4 */
1462 }
1463 return 0;
1464}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001465#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001466
1467int
Denys Vlasenko12014262011-05-30 14:00:14 +02001468sys_getpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001469{
1470 if (entering(tcp)) {
1471#ifndef SVR4
1472 tprintf("%lu", tcp->u_arg[0]);
1473#endif /* !SVR4 */
1474 }
1475 return 0;
1476}
1477
1478int
Denys Vlasenko12014262011-05-30 14:00:14 +02001479sys_getsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001480{
1481 if (entering(tcp)) {
1482 tprintf("%lu", tcp->u_arg[0]);
1483 }
1484 return 0;
1485}
1486
1487int
Denys Vlasenko12014262011-05-30 14:00:14 +02001488sys_setsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001489{
1490 return 0;
1491}
1492
1493int
Denys Vlasenko12014262011-05-30 14:00:14 +02001494sys_getpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001495{
1496 if (entering(tcp)) {
1497 tprintf("%lu", tcp->u_arg[0]);
1498 }
1499 return 0;
1500}
1501
1502int
Denys Vlasenko12014262011-05-30 14:00:14 +02001503sys_setpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001504{
1505 if (entering(tcp)) {
1506 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1507 }
1508 return 0;
1509}
1510
John Hughesc61eb3d2002-05-17 11:37:50 +00001511#if UNIXWARE >= 2
1512
1513#include <sys/privilege.h>
1514
1515
Roland McGrathd9f816f2004-09-04 03:39:20 +00001516static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001517 { SETPRV, "SETPRV" },
1518 { CLRPRV, "CLRPRV" },
1519 { PUTPRV, "PUTPRV" },
1520 { GETPRV, "GETPRV" },
1521 { CNTPRV, "CNTPRV" },
1522 { 0, NULL },
1523};
1524
1525
Roland McGrathd9f816f2004-09-04 03:39:20 +00001526static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001527 { P_OWNER, "P_OWNER" },
1528 { P_AUDIT, "P_AUDIT" },
1529 { P_COMPAT, "P_COMPAT" },
1530 { P_DACREAD, "P_DACREAD" },
1531 { P_DACWRITE, "P_DACWRITE" },
1532 { P_DEV, "P_DEV" },
1533 { P_FILESYS, "P_FILESYS" },
1534 { P_MACREAD, "P_MACREAD" },
1535 { P_MACWRITE, "P_MACWRITE" },
1536 { P_MOUNT, "P_MOUNT" },
1537 { P_MULTIDIR, "P_MULTIDIR" },
1538 { P_SETPLEVEL, "P_SETPLEVEL" },
1539 { P_SETSPRIV, "P_SETSPRIV" },
1540 { P_SETUID, "P_SETUID" },
1541 { P_SYSOPS, "P_SYSOPS" },
1542 { P_SETUPRIV, "P_SETUPRIV" },
1543 { P_DRIVER, "P_DRIVER" },
1544 { P_RTIME, "P_RTIME" },
1545 { P_MACUPGRADE, "P_MACUPGRADE" },
1546 { P_FSYSRANGE, "P_FSYSRANGE" },
1547 { P_SETFLEVEL, "P_SETFLEVEL" },
1548 { P_AUDITWR, "P_AUDITWR" },
1549 { P_TSHAR, "P_TSHAR" },
1550 { P_PLOCK, "P_PLOCK" },
1551 { P_CORE, "P_CORE" },
1552 { P_LOADMOD, "P_LOADMOD" },
1553 { P_BIND, "P_BIND" },
1554 { P_ALLPRIVS, "P_ALLPRIVS" },
1555 { 0, NULL },
1556};
1557
1558
Roland McGrathd9f816f2004-09-04 03:39:20 +00001559static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001560 { PS_FIX, "PS_FIX" },
1561 { PS_INH, "PS_INH" },
1562 { PS_MAX, "PS_MAX" },
1563 { PS_WKG, "PS_WKG" },
1564 { 0, NULL },
1565};
1566
1567
1568static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001569printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001570{
1571 priv_t buf [128];
1572 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1573 int dots = len > max;
1574 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001575
John Hughesc61eb3d2002-05-17 11:37:50 +00001576 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001577
John Hughesc61eb3d2002-05-17 11:37:50 +00001578 if (len <= 0 ||
1579 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1580 {
1581 tprintf ("%#lx", addr);
1582 return;
1583 }
1584
1585 tprintf ("[");
1586
1587 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001588 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001589
1590 if (i) tprintf (", ");
1591
1592 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1593 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1594 {
1595 tprintf ("%s|%s", t, p);
1596 }
1597 else {
1598 tprintf ("%#lx", buf [i]);
1599 }
1600 }
1601
1602 if (dots) tprintf (" ...");
1603
1604 tprintf ("]");
1605}
1606
1607
1608int
Denys Vlasenko12014262011-05-30 14:00:14 +02001609sys_procpriv(struct tcb *tcp)
John Hughesc61eb3d2002-05-17 11:37:50 +00001610{
1611 if (entering(tcp)) {
1612 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1613 switch (tcp->u_arg[0]) {
1614 case CNTPRV:
1615 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1616 break;
1617
1618 case GETPRV:
1619 break;
1620
1621 default:
1622 tprintf (", ");
1623 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1624 tprintf (", %ld", tcp->u_arg[2]);
1625 }
1626 }
1627 else if (tcp->u_arg[0] == GETPRV) {
1628 if (syserror (tcp)) {
1629 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1630 }
1631 else {
1632 tprintf (", ");
1633 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1634 tprintf (", %ld", tcp->u_arg[2]);
1635 }
1636 }
Roland McGrath5a223472002-12-15 23:58:26 +00001637
John Hughesc61eb3d2002-05-17 11:37:50 +00001638 return 0;
1639}
1640
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001641#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001642
1643
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001644static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001645printargv(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001646{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001647 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001648 unsigned int p32;
1649 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001650 char data[sizeof(long)];
1651 } cp;
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001652 const char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001653 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001654
Roland McGrath85a3bc42007-08-02 02:13:05 +00001655 cp.p64 = 1;
1656 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1657 if (umoven(tcp, addr, personality_wordsize[current_personality],
1658 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001659 tprintf("%#lx", addr);
1660 return;
1661 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001662 if (personality_wordsize[current_personality] == 4)
1663 cp.p64 = cp.p32;
1664 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001665 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001666 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001667 printstr(tcp, cp.p64, -1);
1668 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001669 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001670 if (cp.p64)
1671 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001672}
1673
1674static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001675printargc(const char *fmt, struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001676{
1677 int count;
1678 char *cp;
1679
1680 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1681 addr += sizeof(char *);
1682 }
1683 tprintf(fmt, count, count == 1 ? "" : "s");
1684}
1685
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001686#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001687int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001688sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001689{
1690 if (entering(tcp)) {
1691 printpath(tcp, tcp->u_arg[0]);
1692 if (!verbose(tcp))
1693 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001694 else {
1695 tprintf(", [");
1696 printargv(tcp, tcp->u_arg[1]);
1697 tprintf("]");
1698 }
1699 }
1700 return 0;
1701}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001702#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001703
1704int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001705sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001706{
1707 if (entering(tcp)) {
1708 printpath(tcp, tcp->u_arg[0]);
1709 if (!verbose(tcp))
1710 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001711 else {
1712 tprintf(", [");
1713 printargv(tcp, tcp->u_arg[1]);
1714 tprintf("]");
1715 }
1716 if (!verbose(tcp))
1717 tprintf(", %#lx", tcp->u_arg[2]);
1718 else if (abbrev(tcp))
1719 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1720 else {
1721 tprintf(", [");
1722 printargv(tcp, tcp->u_arg[2]);
1723 tprintf("]");
1724 }
1725 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001726 return 0;
1727}
1728
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001729#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001730
Denys Vlasenko12014262011-05-30 14:00:14 +02001731int sys_rexecve(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +00001732{
1733 if (entering (tcp)) {
1734 sys_execve (tcp);
1735 tprintf (", %ld", tcp->u_arg[3]);
1736 }
1737 return 0;
1738}
1739
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001740#endif
John Hughes4e36a812001-04-18 15:11:51 +00001741
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001742int
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001743internal_exec(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001744{
1745#ifdef SUNOS4
1746 if (exiting(tcp) && !syserror(tcp) && followfork)
1747 fixvfork(tcp);
1748#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001749#if defined LINUX && defined TCB_WAITEXECVE
1750 if (exiting(tcp) && syserror(tcp))
1751 tcp->flags &= ~TCB_WAITEXECVE;
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001752 else {
1753 /* Maybe we have post-execve SIGTRAP suppressed? */
1754 if (!(ptrace_setoptions_for_all & PTRACE_O_TRACEEXEC))
1755 tcp->flags |= TCB_WAITEXECVE; /* no */
1756 }
Roland McGrathfdb097f2004-07-12 07:38:55 +00001757#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001758 return 0;
1759}
1760
1761#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001762#ifndef __WNOTHREAD
1763#define __WNOTHREAD 0x20000000
1764#endif
1765#ifndef __WALL
1766#define __WALL 0x40000000
1767#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001768#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001769#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001770#endif
1771#endif /* LINUX */
1772
Roland McGrathd9f816f2004-09-04 03:39:20 +00001773static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001774 { WNOHANG, "WNOHANG" },
1775#ifndef WSTOPPED
1776 { WUNTRACED, "WUNTRACED" },
1777#endif
1778#ifdef WEXITED
1779 { WEXITED, "WEXITED" },
1780#endif
1781#ifdef WTRAPPED
1782 { WTRAPPED, "WTRAPPED" },
1783#endif
1784#ifdef WSTOPPED
1785 { WSTOPPED, "WSTOPPED" },
1786#endif
1787#ifdef WCONTINUED
1788 { WCONTINUED, "WCONTINUED" },
1789#endif
1790#ifdef WNOWAIT
1791 { WNOWAIT, "WNOWAIT" },
1792#endif
1793#ifdef __WCLONE
1794 { __WCLONE, "__WCLONE" },
1795#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001796#ifdef __WALL
1797 { __WALL, "__WALL" },
1798#endif
1799#ifdef __WNOTHREAD
1800 { __WNOTHREAD, "__WNOTHREAD" },
1801#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001802 { 0, NULL },
1803};
1804
Roland McGrath5e02a572004-10-19 23:33:47 +00001805#if !defined WCOREFLAG && defined WCOREFLG
1806# define WCOREFLAG WCOREFLG
1807#endif
1808#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001809# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001810#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001811#ifndef WCOREDUMP
1812# define WCOREDUMP(status) ((status) & 0200)
1813#endif
1814
Roland McGrath5e02a572004-10-19 23:33:47 +00001815
1816#ifndef W_STOPCODE
1817#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1818#endif
1819#ifndef W_EXITCODE
1820#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1821#endif
1822
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001823static int
Denys Vlasenko12014262011-05-30 14:00:14 +02001824printstatus(int status)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001825{
1826 int exited = 0;
1827
1828 /*
1829 * Here is a tricky presentation problem. This solution
1830 * is still not entirely satisfactory but since there
1831 * are no wait status constructors it will have to do.
1832 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001833 if (WIFSTOPPED(status)) {
1834 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001835 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001836 status &= ~W_STOPCODE(WSTOPSIG(status));
1837 }
1838 else if (WIFSIGNALED(status)) {
1839 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001840 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001841 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001842 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1843 }
1844 else if (WIFEXITED(status)) {
1845 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001846 WEXITSTATUS(status));
1847 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001848 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001849 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001850 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001851 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001852 return 0;
1853 }
1854
1855 if (status == 0)
1856 tprintf("]");
1857 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001858 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001859
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001860 return exited;
1861}
1862
1863static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001864printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001865{
1866 int status;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001867#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001868 int exited = 0;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001869#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001870
1871 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001872#ifdef LINUX
1873 /* On Linux, kernel-side pid_t is typedef'ed to int
1874 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001875 * pid argument to int on 64bit arches, producing,
1876 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001877 * in strace. We have to use int here, not long.
1878 */
1879 int pid = tcp->u_arg[0];
1880 tprintf("%d, ", pid);
1881#else
1882 /*
1883 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001884 */
1885 long pid = tcp->u_arg[0];
1886 if (personality_wordsize[current_personality] < sizeof pid)
1887 pid = (long) (int) pid;
1888 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001889#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001890 } else {
1891 /* status */
1892 if (!tcp->u_arg[1])
1893 tprintf("NULL");
1894 else if (syserror(tcp) || tcp->u_rval == 0)
1895 tprintf("%#lx", tcp->u_arg[1]);
1896 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1897 tprintf("[?]");
1898 else
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001899#ifdef SUNOS4
1900 exited =
1901#endif
1902 printstatus(status);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001903 /* options */
1904 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001905 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001906 if (n == 4) {
1907 tprintf(", ");
1908 /* usage */
1909 if (!tcp->u_arg[3])
1910 tprintf("NULL");
1911#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001912 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001913#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001914 if (bitness)
1915 printrusage32(tcp, tcp->u_arg[3]);
1916 else
1917#endif
1918 printrusage(tcp, tcp->u_arg[3]);
1919 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001920#endif /* LINUX */
1921#ifdef SUNOS4
1922 else if (tcp->u_rval > 0 && exited)
1923 printrusage(tcp, tcp->u_arg[3]);
1924#endif /* SUNOS4 */
1925 else
1926 tprintf("%#lx", tcp->u_arg[3]);
1927 }
1928 }
1929 return 0;
1930}
1931
1932int
Denys Vlasenko12014262011-05-30 14:00:14 +02001933internal_wait(struct tcb *tcp, int flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001934{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001935 int got_kids;
1936
1937#ifdef TCB_CLONE_THREAD
1938 if (tcp->flags & TCB_CLONE_THREAD)
1939 /* The children we wait for are our parent's children. */
1940 got_kids = (tcp->parent->nchildren
Wang Chao21b8db42010-08-27 17:43:16 +08001941 > tcp->parent->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001942 else
Wang Chao21b8db42010-08-27 17:43:16 +08001943 got_kids = (tcp->nchildren > tcp->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001944#else
1945 got_kids = tcp->nchildren > 0;
1946#endif
1947
1948 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001949 /* There are children that this parent should block for.
1950 But ptrace made us the parent of the traced children
1951 and the real parent will get ECHILD from the wait call.
1952
1953 XXX If we attached with strace -f -p PID, then there
1954 may be untraced dead children the parent could be reaping
1955 now, but we make him block. */
1956
1957 /* ??? WTA: fix bug with hanging children */
1958
Roland McGrathc74c0b72004-09-01 19:39:46 +00001959 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001960 /*
1961 * There are traced children. We'll make the parent
1962 * block to avoid a false ECHILD error due to our
1963 * ptrace having stolen the children. However,
1964 * we shouldn't block if there are zombies to reap.
1965 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1966 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001967 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001968 if (tcp->nzombies > 0 &&
1969 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001970 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001971 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001972 if (tcp->u_arg[0] > 0) {
1973 /*
1974 * If the parent waits for a specified child
1975 * PID, then it must get ECHILD right away
1976 * if that PID is not one of its children.
1977 * Make sure that the requested PID matches
1978 * one of the parent's children that we are
1979 * tracing, and don't suspend it otherwise.
1980 */
1981 if (child == NULL)
1982 child = pid2tcb(tcp->u_arg[0]);
1983 if (child == NULL || child->parent != (
1984#ifdef TCB_CLONE_THREAD
1985 (tcp->flags & TCB_CLONE_THREAD)
1986 ? tcp->parent :
1987#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00001988 tcp) ||
1989 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00001990 return 0;
1991 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001992 tcp->flags |= TCB_SUSPENDED;
1993 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001994#ifdef TCB_CLONE_THREAD
1995 if (tcp->flags & TCB_CLONE_THREAD)
1996 tcp->parent->nclone_waiting++;
1997#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001998 }
1999 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002000 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002001 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002002 /* We must force a fake result of 0 instead of
2003 the ECHILD error. */
Roland McGrathb69f81b2002-12-21 23:25:18 +00002004 return force_result(tcp, 0, 0);
2005 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002006 }
Roland McGrath09623452003-05-23 02:27:13 +00002007 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2008 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2009 /*
2010 * We just reaped a child we don't know about,
2011 * presumably a zombie we already droptcb'd.
2012 */
2013 tcp->nzombies--;
2014 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002015 return 0;
2016}
2017
2018#ifdef SVR4
2019
2020int
Denys Vlasenko12014262011-05-30 14:00:14 +02002021sys_wait(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002022{
2023 if (exiting(tcp)) {
2024 /* The library wrapper stuffs this into the user variable. */
2025 if (!syserror(tcp))
2026 printstatus(getrval2(tcp));
2027 }
2028 return 0;
2029}
2030
2031#endif /* SVR4 */
2032
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002033#ifdef FREEBSD
2034int
Denys Vlasenko12014262011-05-30 14:00:14 +02002035sys_wait(struct tcb *tcp)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002036{
2037 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002038
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002039 if (exiting(tcp)) {
2040 if (!syserror(tcp)) {
2041 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2042 tprintf("%#lx", tcp->u_arg[0]);
2043 else
2044 printstatus(status);
2045 }
2046 }
2047 return 0;
2048}
2049#endif
2050
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002051int
Denys Vlasenko12014262011-05-30 14:00:14 +02002052sys_waitpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002053{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002054 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002055}
2056
2057int
Denys Vlasenko12014262011-05-30 14:00:14 +02002058sys_wait4(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002059{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002060 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002061}
2062
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002063#ifdef ALPHA
2064int
Denys Vlasenko12014262011-05-30 14:00:14 +02002065sys_osf_wait4(struct tcb *tcp)
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002066{
2067 return printwaitn(tcp, 4, 1);
2068}
2069#endif
2070
Roland McGrathc74c0b72004-09-01 19:39:46 +00002071#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002072
Roland McGrathd9f816f2004-09-04 03:39:20 +00002073static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002074 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002075#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002076 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002077#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002078 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002079#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002080 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002081#endif
2082#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002083 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002084#endif
2085#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002086 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002087#endif
2088#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002089 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002090#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002091 { P_ALL, "P_ALL" },
2092#ifdef P_LWPID
2093 { P_LWPID, "P_LWPID" },
2094#endif
2095 { 0, NULL },
2096};
2097
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002098int
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00002099sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002100{
2101 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002102
2103 if (entering(tcp)) {
2104 printxval(waitid_types, tcp->u_arg[0], "P_???");
2105 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002106 }
2107 else {
2108 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002109 if (!tcp->u_arg[2])
2110 tprintf("NULL");
2111 else if (syserror(tcp))
2112 tprintf("%#lx", tcp->u_arg[2]);
2113 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2114 tprintf("{???}");
2115 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002116 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002117 /* options */
2118 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002119 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002120 if (tcp->u_nargs > 4) {
2121 /* usage */
2122 tprintf(", ");
2123 if (!tcp->u_arg[4])
2124 tprintf("NULL");
2125 else if (tcp->u_error)
2126 tprintf("%#lx", tcp->u_arg[4]);
2127 else
2128 printrusage(tcp, tcp->u_arg[4]);
2129 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002130 }
2131 return 0;
2132}
2133
Roland McGrathc74c0b72004-09-01 19:39:46 +00002134#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002135
2136int
Denys Vlasenko12014262011-05-30 14:00:14 +02002137sys_alarm(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002138{
2139 if (entering(tcp))
2140 tprintf("%lu", tcp->u_arg[0]);
2141 return 0;
2142}
2143
2144int
Denys Vlasenko12014262011-05-30 14:00:14 +02002145sys_uname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002146{
2147 struct utsname uname;
2148
2149 if (exiting(tcp)) {
2150 if (syserror(tcp) || !verbose(tcp))
2151 tprintf("%#lx", tcp->u_arg[0]);
2152 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2153 tprintf("{...}");
2154 else if (!abbrev(tcp)) {
2155
2156 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2157 uname.sysname, uname.nodename);
2158 tprintf("release=\"%s\", version=\"%s\", ",
2159 uname.release, uname.version);
2160 tprintf("machine=\"%s\"", uname.machine);
2161#ifdef LINUX
2162#ifndef __GLIBC__
2163 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002164#endif
2165#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002166 tprintf("}");
2167 }
2168 else
2169 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2170 uname.sysname, uname.nodename);
2171 }
2172 return 0;
2173}
2174
2175#ifndef SVR4
2176
Roland McGratheb9e2e82009-06-02 16:49:22 -07002177static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002178# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002179 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2180 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2181 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2182 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2183 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2184 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2185 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2186 { PTRACE_CONT, "PTRACE_CONT" },
2187 { PTRACE_KILL, "PTRACE_KILL" },
2188 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2189 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2190 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002191# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002192 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002193# endif
2194# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002195 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002196# endif
2197# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002198 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002199# endif
2200# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002201 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002202# endif
2203# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002204 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002205# endif
2206# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002207 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002208# endif
2209# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002210 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002211# endif
2212# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002213 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002214# endif
2215# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002216 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002217# endif
2218# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002219 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002220# endif
2221# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002222 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002223# endif
2224# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002225 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002226# endif
Dmitry V. Levinbb668a52011-03-14 21:58:59 +00002227# ifdef PTRACE_GETREGSET
2228 { PTRACE_GETREGSET, "PTRACE_GETREGSET", },
2229# endif
2230# ifdef PTRACE_SETREGSET
2231 { PTRACE_SETREGSET, "PTRACE_SETREGSET", },
2232# endif
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002233# ifdef PTRACE_SET_SYSCALL
2234 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2235# endif
2236# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002237 { PTRACE_READDATA, "PTRACE_READDATA" },
2238 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2239 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2240 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2241 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2242 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002243# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002244 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2245 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002246# else /* !SPARC */
2247 { PTRACE_22, "PTRACE_22" },
2248 { PTRACE_23, "PTRACE_3" },
2249# endif /* !SPARC */
2250# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002251 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002252# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002253 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002254# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002255 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2256 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2257 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002258# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002259 { PTRACE_26, "PTRACE_26" },
2260 { PTRACE_27, "PTRACE_27" },
2261 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002262# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002263 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002264# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002265
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002266# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002267
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002268 { PT_TRACE_ME, "PT_TRACE_ME" },
2269 { PT_READ_I, "PT_READ_I" },
2270 { PT_READ_D, "PT_READ_D" },
2271 { PT_WRITE_I, "PT_WRITE_I" },
2272 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002273# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002274 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002275# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002276 { PT_CONTINUE, "PT_CONTINUE" },
2277 { PT_KILL, "PT_KILL" },
2278 { PT_STEP, "PT_STEP" },
2279 { PT_ATTACH, "PT_ATTACH" },
2280 { PT_DETACH, "PT_DETACH" },
2281 { PT_GETREGS, "PT_GETREGS" },
2282 { PT_SETREGS, "PT_SETREGS" },
2283 { PT_GETFPREGS, "PT_GETFPREGS" },
2284 { PT_SETFPREGS, "PT_SETFPREGS" },
2285 { PT_GETDBREGS, "PT_GETDBREGS" },
2286 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002287# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002288 { 0, NULL },
2289};
2290
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002291# ifndef FREEBSD
2292# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002293static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002294# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002295 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002296# endif
2297# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002298 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002299# endif
2300# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002301 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002302# endif
2303# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002304 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002305# endif
2306# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002307 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002308# endif
2309# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002310 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002311# endif
2312# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002313 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002314# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002315 { 0, NULL },
2316};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002317# endif /* PTRACE_SETOPTIONS */
2318# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002319
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002320# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002321const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002322# ifdef LINUX
2323# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002324 { PT_PSWMASK, "psw_mask" },
2325 { PT_PSWADDR, "psw_addr" },
2326 { PT_GPR0, "gpr0" },
2327 { PT_GPR1, "gpr1" },
2328 { PT_GPR2, "gpr2" },
2329 { PT_GPR3, "gpr3" },
2330 { PT_GPR4, "gpr4" },
2331 { PT_GPR5, "gpr5" },
2332 { PT_GPR6, "gpr6" },
2333 { PT_GPR7, "gpr7" },
2334 { PT_GPR8, "gpr8" },
2335 { PT_GPR9, "gpr9" },
2336 { PT_GPR10, "gpr10" },
2337 { PT_GPR11, "gpr11" },
2338 { PT_GPR12, "gpr12" },
2339 { PT_GPR13, "gpr13" },
2340 { PT_GPR14, "gpr14" },
2341 { PT_GPR15, "gpr15" },
2342 { PT_ACR0, "acr0" },
2343 { PT_ACR1, "acr1" },
2344 { PT_ACR2, "acr2" },
2345 { PT_ACR3, "acr3" },
2346 { PT_ACR4, "acr4" },
2347 { PT_ACR5, "acr5" },
2348 { PT_ACR6, "acr6" },
2349 { PT_ACR7, "acr7" },
2350 { PT_ACR8, "acr8" },
2351 { PT_ACR9, "acr9" },
2352 { PT_ACR10, "acr10" },
2353 { PT_ACR11, "acr11" },
2354 { PT_ACR12, "acr12" },
2355 { PT_ACR13, "acr13" },
2356 { PT_ACR14, "acr14" },
2357 { PT_ACR15, "acr15" },
2358 { PT_ORIGGPR2, "orig_gpr2" },
2359 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002360# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002361 { PT_FPR0_HI, "fpr0.hi" },
2362 { PT_FPR0_LO, "fpr0.lo" },
2363 { PT_FPR1_HI, "fpr1.hi" },
2364 { PT_FPR1_LO, "fpr1.lo" },
2365 { PT_FPR2_HI, "fpr2.hi" },
2366 { PT_FPR2_LO, "fpr2.lo" },
2367 { PT_FPR3_HI, "fpr3.hi" },
2368 { PT_FPR3_LO, "fpr3.lo" },
2369 { PT_FPR4_HI, "fpr4.hi" },
2370 { PT_FPR4_LO, "fpr4.lo" },
2371 { PT_FPR5_HI, "fpr5.hi" },
2372 { PT_FPR5_LO, "fpr5.lo" },
2373 { PT_FPR6_HI, "fpr6.hi" },
2374 { PT_FPR6_LO, "fpr6.lo" },
2375 { PT_FPR7_HI, "fpr7.hi" },
2376 { PT_FPR7_LO, "fpr7.lo" },
2377 { PT_FPR8_HI, "fpr8.hi" },
2378 { PT_FPR8_LO, "fpr8.lo" },
2379 { PT_FPR9_HI, "fpr9.hi" },
2380 { PT_FPR9_LO, "fpr9.lo" },
2381 { PT_FPR10_HI, "fpr10.hi" },
2382 { PT_FPR10_LO, "fpr10.lo" },
2383 { PT_FPR11_HI, "fpr11.hi" },
2384 { PT_FPR11_LO, "fpr11.lo" },
2385 { PT_FPR12_HI, "fpr12.hi" },
2386 { PT_FPR12_LO, "fpr12.lo" },
2387 { PT_FPR13_HI, "fpr13.hi" },
2388 { PT_FPR13_LO, "fpr13.lo" },
2389 { PT_FPR14_HI, "fpr14.hi" },
2390 { PT_FPR14_LO, "fpr14.lo" },
2391 { PT_FPR15_HI, "fpr15.hi" },
2392 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002393# endif
2394# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002395 { PT_FPR0, "fpr0" },
2396 { PT_FPR1, "fpr1" },
2397 { PT_FPR2, "fpr2" },
2398 { PT_FPR3, "fpr3" },
2399 { PT_FPR4, "fpr4" },
2400 { PT_FPR5, "fpr5" },
2401 { PT_FPR6, "fpr6" },
2402 { PT_FPR7, "fpr7" },
2403 { PT_FPR8, "fpr8" },
2404 { PT_FPR9, "fpr9" },
2405 { PT_FPR10, "fpr10" },
2406 { PT_FPR11, "fpr11" },
2407 { PT_FPR12, "fpr12" },
2408 { PT_FPR13, "fpr13" },
2409 { PT_FPR14, "fpr14" },
2410 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002411# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002412 { PT_CR_9, "cr9" },
2413 { PT_CR_10, "cr10" },
2414 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002415 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002416# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002417 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002418# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002419 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002420# elif defined(POWERPC)
2421# ifndef PT_ORIG_R3
2422# define PT_ORIG_R3 34
2423# endif
2424# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002425 { REGSIZE*PT_R0, "r0" },
2426 { REGSIZE*PT_R1, "r1" },
2427 { REGSIZE*PT_R2, "r2" },
2428 { REGSIZE*PT_R3, "r3" },
2429 { REGSIZE*PT_R4, "r4" },
2430 { REGSIZE*PT_R5, "r5" },
2431 { REGSIZE*PT_R6, "r6" },
2432 { REGSIZE*PT_R7, "r7" },
2433 { REGSIZE*PT_R8, "r8" },
2434 { REGSIZE*PT_R9, "r9" },
2435 { REGSIZE*PT_R10, "r10" },
2436 { REGSIZE*PT_R11, "r11" },
2437 { REGSIZE*PT_R12, "r12" },
2438 { REGSIZE*PT_R13, "r13" },
2439 { REGSIZE*PT_R14, "r14" },
2440 { REGSIZE*PT_R15, "r15" },
2441 { REGSIZE*PT_R16, "r16" },
2442 { REGSIZE*PT_R17, "r17" },
2443 { REGSIZE*PT_R18, "r18" },
2444 { REGSIZE*PT_R19, "r19" },
2445 { REGSIZE*PT_R20, "r20" },
2446 { REGSIZE*PT_R21, "r21" },
2447 { REGSIZE*PT_R22, "r22" },
2448 { REGSIZE*PT_R23, "r23" },
2449 { REGSIZE*PT_R24, "r24" },
2450 { REGSIZE*PT_R25, "r25" },
2451 { REGSIZE*PT_R26, "r26" },
2452 { REGSIZE*PT_R27, "r27" },
2453 { REGSIZE*PT_R28, "r28" },
2454 { REGSIZE*PT_R29, "r29" },
2455 { REGSIZE*PT_R30, "r30" },
2456 { REGSIZE*PT_R31, "r31" },
2457 { REGSIZE*PT_NIP, "NIP" },
2458 { REGSIZE*PT_MSR, "MSR" },
2459 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2460 { REGSIZE*PT_CTR, "CTR" },
2461 { REGSIZE*PT_LNK, "LNK" },
2462 { REGSIZE*PT_XER, "XER" },
2463 { REGSIZE*PT_CCR, "CCR" },
2464 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002465# undef REGSIZE
2466# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002467 { 0, "r0" },
2468 { 1, "r1" },
2469 { 2, "r2" },
2470 { 3, "r3" },
2471 { 4, "r4" },
2472 { 5, "r5" },
2473 { 6, "r6" },
2474 { 7, "r7" },
2475 { 8, "r8" },
2476 { 9, "r9" },
2477 { 10, "r10" },
2478 { 11, "r11" },
2479 { 12, "r12" },
2480 { 13, "r13" },
2481 { 14, "r14" },
2482 { 15, "r15" },
2483 { 16, "r16" },
2484 { 17, "r17" },
2485 { 18, "r18" },
2486 { 19, "r19" },
2487 { 20, "r20" },
2488 { 21, "r21" },
2489 { 22, "r22" },
2490 { 23, "r23" },
2491 { 24, "r24" },
2492 { 25, "r25" },
2493 { 26, "r26" },
2494 { 27, "r27" },
2495 { 28, "r28" },
2496 { 29, "gp" },
2497 { 30, "fp" },
2498 { 31, "zero" },
2499 { 32, "fp0" },
2500 { 33, "fp" },
2501 { 34, "fp2" },
2502 { 35, "fp3" },
2503 { 36, "fp4" },
2504 { 37, "fp5" },
2505 { 38, "fp6" },
2506 { 39, "fp7" },
2507 { 40, "fp8" },
2508 { 41, "fp9" },
2509 { 42, "fp10" },
2510 { 43, "fp11" },
2511 { 44, "fp12" },
2512 { 45, "fp13" },
2513 { 46, "fp14" },
2514 { 47, "fp15" },
2515 { 48, "fp16" },
2516 { 49, "fp17" },
2517 { 50, "fp18" },
2518 { 51, "fp19" },
2519 { 52, "fp20" },
2520 { 53, "fp21" },
2521 { 54, "fp22" },
2522 { 55, "fp23" },
2523 { 56, "fp24" },
2524 { 57, "fp25" },
2525 { 58, "fp26" },
2526 { 59, "fp27" },
2527 { 60, "fp28" },
2528 { 61, "fp29" },
2529 { 62, "fp30" },
2530 { 63, "fp31" },
2531 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002532# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002533 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2534 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2535 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2536 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2537 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2538 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2539 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2540 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2541 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2542 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2543 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2544 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2545 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2546 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2547 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2548 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2549 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2550 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2551 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2552 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2553 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2554 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2555 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2556 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2557 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2558 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2559 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2560 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2561 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2562 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2563 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2564 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2565 /* switch stack: */
2566 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2567 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2568 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2569 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2570 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2571 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2572 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2573 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2574 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2575 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002576 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2577 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002578 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002579 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002580 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2581 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002582 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2583 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2584 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2585 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2586 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2587 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2588 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2589 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2590 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2591 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2592 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2593 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2594 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2595 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2596 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002597# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002598 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002599# endif
2600# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002601 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002602# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002603 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002604# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002605 { 4*EBX, "4*EBX" },
2606 { 4*ECX, "4*ECX" },
2607 { 4*EDX, "4*EDX" },
2608 { 4*ESI, "4*ESI" },
2609 { 4*EDI, "4*EDI" },
2610 { 4*EBP, "4*EBP" },
2611 { 4*EAX, "4*EAX" },
2612 { 4*DS, "4*DS" },
2613 { 4*ES, "4*ES" },
2614 { 4*FS, "4*FS" },
2615 { 4*GS, "4*GS" },
2616 { 4*ORIG_EAX, "4*ORIG_EAX" },
2617 { 4*EIP, "4*EIP" },
2618 { 4*CS, "4*CS" },
2619 { 4*EFL, "4*EFL" },
2620 { 4*UESP, "4*UESP" },
2621 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002622# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002623 { 8*R15, "8*R15" },
2624 { 8*R14, "8*R14" },
2625 { 8*R13, "8*R13" },
2626 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002627 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002628 { 8*RBX, "8*RBX" },
2629 { 8*R11, "8*R11" },
2630 { 8*R10, "8*R10" },
2631 { 8*R9, "8*R9" },
2632 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002633 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002634 { 8*RCX, "8*RCX" },
2635 { 8*RDX, "8*RDX" },
2636 { 8*RSI, "8*RSI" },
2637 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002638 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002639 { 8*RIP, "8*RIP" },
2640 { 8*CS, "8*CS" },
2641 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002642 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002643 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002644# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002645 { 4*PT_D1, "4*PT_D1" },
2646 { 4*PT_D2, "4*PT_D2" },
2647 { 4*PT_D3, "4*PT_D3" },
2648 { 4*PT_D4, "4*PT_D4" },
2649 { 4*PT_D5, "4*PT_D5" },
2650 { 4*PT_D6, "4*PT_D6" },
2651 { 4*PT_D7, "4*PT_D7" },
2652 { 4*PT_A0, "4*PT_A0" },
2653 { 4*PT_A1, "4*PT_A1" },
2654 { 4*PT_A2, "4*PT_A2" },
2655 { 4*PT_A3, "4*PT_A3" },
2656 { 4*PT_A4, "4*PT_A4" },
2657 { 4*PT_A5, "4*PT_A5" },
2658 { 4*PT_A6, "4*PT_A6" },
2659 { 4*PT_D0, "4*PT_D0" },
2660 { 4*PT_USP, "4*PT_USP" },
2661 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2662 { 4*PT_SR, "4*PT_SR" },
2663 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002664# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002665 { 4*REG_REG0, "4*REG_REG0" },
2666 { 4*(REG_REG0+1), "4*REG_REG1" },
2667 { 4*(REG_REG0+2), "4*REG_REG2" },
2668 { 4*(REG_REG0+3), "4*REG_REG3" },
2669 { 4*(REG_REG0+4), "4*REG_REG4" },
2670 { 4*(REG_REG0+5), "4*REG_REG5" },
2671 { 4*(REG_REG0+6), "4*REG_REG6" },
2672 { 4*(REG_REG0+7), "4*REG_REG7" },
2673 { 4*(REG_REG0+8), "4*REG_REG8" },
2674 { 4*(REG_REG0+9), "4*REG_REG9" },
2675 { 4*(REG_REG0+10), "4*REG_REG10" },
2676 { 4*(REG_REG0+11), "4*REG_REG11" },
2677 { 4*(REG_REG0+12), "4*REG_REG12" },
2678 { 4*(REG_REG0+13), "4*REG_REG13" },
2679 { 4*(REG_REG0+14), "4*REG_REG14" },
2680 { 4*REG_REG15, "4*REG_REG15" },
2681 { 4*REG_PC, "4*REG_PC" },
2682 { 4*REG_PR, "4*REG_PR" },
2683 { 4*REG_SR, "4*REG_SR" },
2684 { 4*REG_GBR, "4*REG_GBR" },
2685 { 4*REG_MACH, "4*REG_MACH" },
2686 { 4*REG_MACL, "4*REG_MACL" },
2687 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2688 { 4*REG_FPUL, "4*REG_FPUL" },
2689 { 4*REG_FPREG0, "4*REG_FPREG0" },
2690 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2691 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2692 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2693 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2694 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2695 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2696 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2697 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2698 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2699 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2700 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2701 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2702 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2703 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2704 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002705# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002706 { 4*REG_XDREG0, "4*REG_XDREG0" },
2707 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2708 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2709 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2710 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2711 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2712 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2713 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002714# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002715 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002716# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002717 { 0, "PC(L)" },
2718 { 4, "PC(U)" },
2719 { 8, "SR(L)" },
2720 { 12, "SR(U)" },
2721 { 16, "syscall no.(L)" },
2722 { 20, "syscall_no.(U)" },
2723 { 24, "R0(L)" },
2724 { 28, "R0(U)" },
2725 { 32, "R1(L)" },
2726 { 36, "R1(U)" },
2727 { 40, "R2(L)" },
2728 { 44, "R2(U)" },
2729 { 48, "R3(L)" },
2730 { 52, "R3(U)" },
2731 { 56, "R4(L)" },
2732 { 60, "R4(U)" },
2733 { 64, "R5(L)" },
2734 { 68, "R5(U)" },
2735 { 72, "R6(L)" },
2736 { 76, "R6(U)" },
2737 { 80, "R7(L)" },
2738 { 84, "R7(U)" },
2739 { 88, "R8(L)" },
2740 { 92, "R8(U)" },
2741 { 96, "R9(L)" },
2742 { 100, "R9(U)" },
2743 { 104, "R10(L)" },
2744 { 108, "R10(U)" },
2745 { 112, "R11(L)" },
2746 { 116, "R11(U)" },
2747 { 120, "R12(L)" },
2748 { 124, "R12(U)" },
2749 { 128, "R13(L)" },
2750 { 132, "R13(U)" },
2751 { 136, "R14(L)" },
2752 { 140, "R14(U)" },
2753 { 144, "R15(L)" },
2754 { 148, "R15(U)" },
2755 { 152, "R16(L)" },
2756 { 156, "R16(U)" },
2757 { 160, "R17(L)" },
2758 { 164, "R17(U)" },
2759 { 168, "R18(L)" },
2760 { 172, "R18(U)" },
2761 { 176, "R19(L)" },
2762 { 180, "R19(U)" },
2763 { 184, "R20(L)" },
2764 { 188, "R20(U)" },
2765 { 192, "R21(L)" },
2766 { 196, "R21(U)" },
2767 { 200, "R22(L)" },
2768 { 204, "R22(U)" },
2769 { 208, "R23(L)" },
2770 { 212, "R23(U)" },
2771 { 216, "R24(L)" },
2772 { 220, "R24(U)" },
2773 { 224, "R25(L)" },
2774 { 228, "R25(U)" },
2775 { 232, "R26(L)" },
2776 { 236, "R26(U)" },
2777 { 240, "R27(L)" },
2778 { 244, "R27(U)" },
2779 { 248, "R28(L)" },
2780 { 252, "R28(U)" },
2781 { 256, "R29(L)" },
2782 { 260, "R29(U)" },
2783 { 264, "R30(L)" },
2784 { 268, "R30(U)" },
2785 { 272, "R31(L)" },
2786 { 276, "R31(U)" },
2787 { 280, "R32(L)" },
2788 { 284, "R32(U)" },
2789 { 288, "R33(L)" },
2790 { 292, "R33(U)" },
2791 { 296, "R34(L)" },
2792 { 300, "R34(U)" },
2793 { 304, "R35(L)" },
2794 { 308, "R35(U)" },
2795 { 312, "R36(L)" },
2796 { 316, "R36(U)" },
2797 { 320, "R37(L)" },
2798 { 324, "R37(U)" },
2799 { 328, "R38(L)" },
2800 { 332, "R38(U)" },
2801 { 336, "R39(L)" },
2802 { 340, "R39(U)" },
2803 { 344, "R40(L)" },
2804 { 348, "R40(U)" },
2805 { 352, "R41(L)" },
2806 { 356, "R41(U)" },
2807 { 360, "R42(L)" },
2808 { 364, "R42(U)" },
2809 { 368, "R43(L)" },
2810 { 372, "R43(U)" },
2811 { 376, "R44(L)" },
2812 { 380, "R44(U)" },
2813 { 384, "R45(L)" },
2814 { 388, "R45(U)" },
2815 { 392, "R46(L)" },
2816 { 396, "R46(U)" },
2817 { 400, "R47(L)" },
2818 { 404, "R47(U)" },
2819 { 408, "R48(L)" },
2820 { 412, "R48(U)" },
2821 { 416, "R49(L)" },
2822 { 420, "R49(U)" },
2823 { 424, "R50(L)" },
2824 { 428, "R50(U)" },
2825 { 432, "R51(L)" },
2826 { 436, "R51(U)" },
2827 { 440, "R52(L)" },
2828 { 444, "R52(U)" },
2829 { 448, "R53(L)" },
2830 { 452, "R53(U)" },
2831 { 456, "R54(L)" },
2832 { 460, "R54(U)" },
2833 { 464, "R55(L)" },
2834 { 468, "R55(U)" },
2835 { 472, "R56(L)" },
2836 { 476, "R56(U)" },
2837 { 480, "R57(L)" },
2838 { 484, "R57(U)" },
2839 { 488, "R58(L)" },
2840 { 492, "R58(U)" },
2841 { 496, "R59(L)" },
2842 { 500, "R59(U)" },
2843 { 504, "R60(L)" },
2844 { 508, "R60(U)" },
2845 { 512, "R61(L)" },
2846 { 516, "R61(U)" },
2847 { 520, "R62(L)" },
2848 { 524, "R62(U)" },
2849 { 528, "TR0(L)" },
2850 { 532, "TR0(U)" },
2851 { 536, "TR1(L)" },
2852 { 540, "TR1(U)" },
2853 { 544, "TR2(L)" },
2854 { 548, "TR2(U)" },
2855 { 552, "TR3(L)" },
2856 { 556, "TR3(U)" },
2857 { 560, "TR4(L)" },
2858 { 564, "TR4(U)" },
2859 { 568, "TR5(L)" },
2860 { 572, "TR5(U)" },
2861 { 576, "TR6(L)" },
2862 { 580, "TR6(U)" },
2863 { 584, "TR7(L)" },
2864 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002865 /* This entry is in case pt_regs contains dregs (depends on
2866 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002867 { uoff(regs), "offsetof(struct user, regs)" },
2868 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002869# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002870 { uoff(regs.ARM_r0), "r0" },
2871 { uoff(regs.ARM_r1), "r1" },
2872 { uoff(regs.ARM_r2), "r2" },
2873 { uoff(regs.ARM_r3), "r3" },
2874 { uoff(regs.ARM_r4), "r4" },
2875 { uoff(regs.ARM_r5), "r5" },
2876 { uoff(regs.ARM_r6), "r6" },
2877 { uoff(regs.ARM_r7), "r7" },
2878 { uoff(regs.ARM_r8), "r8" },
2879 { uoff(regs.ARM_r9), "r9" },
2880 { uoff(regs.ARM_r10), "r10" },
2881 { uoff(regs.ARM_fp), "fp" },
2882 { uoff(regs.ARM_ip), "ip" },
2883 { uoff(regs.ARM_sp), "sp" },
2884 { uoff(regs.ARM_lr), "lr" },
2885 { uoff(regs.ARM_pc), "pc" },
2886 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002887# elif defined(AVR32)
2888 { uoff(regs.sr), "sr" },
2889 { uoff(regs.pc), "pc" },
2890 { uoff(regs.lr), "lr" },
2891 { uoff(regs.sp), "sp" },
2892 { uoff(regs.r12), "r12" },
2893 { uoff(regs.r11), "r11" },
2894 { uoff(regs.r10), "r10" },
2895 { uoff(regs.r9), "r9" },
2896 { uoff(regs.r8), "r8" },
2897 { uoff(regs.r7), "r7" },
2898 { uoff(regs.r6), "r6" },
2899 { uoff(regs.r5), "r5" },
2900 { uoff(regs.r4), "r4" },
2901 { uoff(regs.r3), "r3" },
2902 { uoff(regs.r2), "r2" },
2903 { uoff(regs.r1), "r1" },
2904 { uoff(regs.r0), "r0" },
2905 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002906# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002907 { 0, "r0" },
2908 { 1, "r1" },
2909 { 2, "r2" },
2910 { 3, "r3" },
2911 { 4, "r4" },
2912 { 5, "r5" },
2913 { 6, "r6" },
2914 { 7, "r7" },
2915 { 8, "r8" },
2916 { 9, "r9" },
2917 { 10, "r10" },
2918 { 11, "r11" },
2919 { 12, "r12" },
2920 { 13, "r13" },
2921 { 14, "r14" },
2922 { 15, "r15" },
2923 { 16, "r16" },
2924 { 17, "r17" },
2925 { 18, "r18" },
2926 { 19, "r19" },
2927 { 20, "r20" },
2928 { 21, "r21" },
2929 { 22, "r22" },
2930 { 23, "r23" },
2931 { 24, "r24" },
2932 { 25, "r25" },
2933 { 26, "r26" },
2934 { 27, "r27" },
2935 { 28, "r28" },
2936 { 29, "r29" },
2937 { 30, "r30" },
2938 { 31, "r31" },
2939 { 32, "f0" },
2940 { 33, "f1" },
2941 { 34, "f2" },
2942 { 35, "f3" },
2943 { 36, "f4" },
2944 { 37, "f5" },
2945 { 38, "f6" },
2946 { 39, "f7" },
2947 { 40, "f8" },
2948 { 41, "f9" },
2949 { 42, "f10" },
2950 { 43, "f11" },
2951 { 44, "f12" },
2952 { 45, "f13" },
2953 { 46, "f14" },
2954 { 47, "f15" },
2955 { 48, "f16" },
2956 { 49, "f17" },
2957 { 50, "f18" },
2958 { 51, "f19" },
2959 { 52, "f20" },
2960 { 53, "f21" },
2961 { 54, "f22" },
2962 { 55, "f23" },
2963 { 56, "f24" },
2964 { 57, "f25" },
2965 { 58, "f26" },
2966 { 59, "f27" },
2967 { 60, "f28" },
2968 { 61, "f29" },
2969 { 62, "f30" },
2970 { 63, "f31" },
2971 { 64, "pc" },
2972 { 65, "cause" },
2973 { 66, "badvaddr" },
2974 { 67, "mmhi" },
2975 { 68, "mmlo" },
2976 { 69, "fpcsr" },
2977 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002978# elif defined(TILE)
2979 { PTREGS_OFFSET_REG(0), "r0" },
2980 { PTREGS_OFFSET_REG(1), "r1" },
2981 { PTREGS_OFFSET_REG(2), "r2" },
2982 { PTREGS_OFFSET_REG(3), "r3" },
2983 { PTREGS_OFFSET_REG(4), "r4" },
2984 { PTREGS_OFFSET_REG(5), "r5" },
2985 { PTREGS_OFFSET_REG(6), "r6" },
2986 { PTREGS_OFFSET_REG(7), "r7" },
2987 { PTREGS_OFFSET_REG(8), "r8" },
2988 { PTREGS_OFFSET_REG(9), "r9" },
2989 { PTREGS_OFFSET_REG(10), "r10" },
2990 { PTREGS_OFFSET_REG(11), "r11" },
2991 { PTREGS_OFFSET_REG(12), "r12" },
2992 { PTREGS_OFFSET_REG(13), "r13" },
2993 { PTREGS_OFFSET_REG(14), "r14" },
2994 { PTREGS_OFFSET_REG(15), "r15" },
2995 { PTREGS_OFFSET_REG(16), "r16" },
2996 { PTREGS_OFFSET_REG(17), "r17" },
2997 { PTREGS_OFFSET_REG(18), "r18" },
2998 { PTREGS_OFFSET_REG(19), "r19" },
2999 { PTREGS_OFFSET_REG(20), "r20" },
3000 { PTREGS_OFFSET_REG(21), "r21" },
3001 { PTREGS_OFFSET_REG(22), "r22" },
3002 { PTREGS_OFFSET_REG(23), "r23" },
3003 { PTREGS_OFFSET_REG(24), "r24" },
3004 { PTREGS_OFFSET_REG(25), "r25" },
3005 { PTREGS_OFFSET_REG(26), "r26" },
3006 { PTREGS_OFFSET_REG(27), "r27" },
3007 { PTREGS_OFFSET_REG(28), "r28" },
3008 { PTREGS_OFFSET_REG(29), "r29" },
3009 { PTREGS_OFFSET_REG(30), "r30" },
3010 { PTREGS_OFFSET_REG(31), "r31" },
3011 { PTREGS_OFFSET_REG(32), "r32" },
3012 { PTREGS_OFFSET_REG(33), "r33" },
3013 { PTREGS_OFFSET_REG(34), "r34" },
3014 { PTREGS_OFFSET_REG(35), "r35" },
3015 { PTREGS_OFFSET_REG(36), "r36" },
3016 { PTREGS_OFFSET_REG(37), "r37" },
3017 { PTREGS_OFFSET_REG(38), "r38" },
3018 { PTREGS_OFFSET_REG(39), "r39" },
3019 { PTREGS_OFFSET_REG(40), "r40" },
3020 { PTREGS_OFFSET_REG(41), "r41" },
3021 { PTREGS_OFFSET_REG(42), "r42" },
3022 { PTREGS_OFFSET_REG(43), "r43" },
3023 { PTREGS_OFFSET_REG(44), "r44" },
3024 { PTREGS_OFFSET_REG(45), "r45" },
3025 { PTREGS_OFFSET_REG(46), "r46" },
3026 { PTREGS_OFFSET_REG(47), "r47" },
3027 { PTREGS_OFFSET_REG(48), "r48" },
3028 { PTREGS_OFFSET_REG(49), "r49" },
3029 { PTREGS_OFFSET_REG(50), "r50" },
3030 { PTREGS_OFFSET_REG(51), "r51" },
3031 { PTREGS_OFFSET_REG(52), "r52" },
3032 { PTREGS_OFFSET_TP, "tp" },
3033 { PTREGS_OFFSET_SP, "sp" },
3034 { PTREGS_OFFSET_LR, "lr" },
3035 { PTREGS_OFFSET_PC, "pc" },
3036 { PTREGS_OFFSET_EX1, "ex1" },
3037 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
3038 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
3039 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003040# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003041# ifdef CRISV10
3042 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3043 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3044 { 4*PT_R13, "4*PT_R13" },
3045 { 4*PT_R12, "4*PT_R12" },
3046 { 4*PT_R11, "4*PT_R11" },
3047 { 4*PT_R10, "4*PT_R10" },
3048 { 4*PT_R9, "4*PT_R9" },
3049 { 4*PT_R8, "4*PT_R8" },
3050 { 4*PT_R7, "4*PT_R7" },
3051 { 4*PT_R6, "4*PT_R6" },
3052 { 4*PT_R5, "4*PT_R5" },
3053 { 4*PT_R4, "4*PT_R4" },
3054 { 4*PT_R3, "4*PT_R3" },
3055 { 4*PT_R2, "4*PT_R2" },
3056 { 4*PT_R1, "4*PT_R1" },
3057 { 4*PT_R0, "4*PT_R0" },
3058 { 4*PT_MOF, "4*PT_MOF" },
3059 { 4*PT_DCCR, "4*PT_DCCR" },
3060 { 4*PT_SRP, "4*PT_SRP" },
3061 { 4*PT_IRP, "4*PT_IRP" },
3062 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3063 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3064 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3065 { 4*PT_USP, "4*PT_USP" },
3066# endif
3067# ifdef CRISV32
3068 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3069 { 4*PT_R0, "4*PT_R0" },
3070 { 4*PT_R1, "4*PT_R1" },
3071 { 4*PT_R2, "4*PT_R2" },
3072 { 4*PT_R3, "4*PT_R3" },
3073 { 4*PT_R4, "4*PT_R4" },
3074 { 4*PT_R5, "4*PT_R5" },
3075 { 4*PT_R6, "4*PT_R6" },
3076 { 4*PT_R7, "4*PT_R7" },
3077 { 4*PT_R8, "4*PT_R8" },
3078 { 4*PT_R9, "4*PT_R9" },
3079 { 4*PT_R10, "4*PT_R10" },
3080 { 4*PT_R11, "4*PT_R11" },
3081 { 4*PT_R12, "4*PT_R12" },
3082 { 4*PT_R13, "4*PT_R13" },
3083 { 4*PT_ACR, "4*PT_ACR" },
3084 { 4*PT_SRS, "4*PT_SRS" },
3085 { 4*PT_MOF, "4*PT_MOF" },
3086 { 4*PT_SPC, "4*PT_SPC" },
3087 { 4*PT_CCS, "4*PT_CCS" },
3088 { 4*PT_SRP, "4*PT_SRP" },
3089 { 4*PT_ERP, "4*PT_ERP" },
3090 { 4*PT_EXS, "4*PT_EXS" },
3091 { 4*PT_EDA, "4*PT_EDA" },
3092 { 4*PT_USP, "4*PT_USP" },
3093 { 4*PT_PPC, "4*PT_PPC" },
3094 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3095 { 4*PT_BP+4, "4*PT_BP+4" },
3096 { 4*PT_BP+8, "4*PT_BP+8" },
3097 { 4*PT_BP+12, "4*PT_BP+12" },
3098 { 4*PT_BP+16, "4*PT_BP+16" },
3099 { 4*PT_BP+20, "4*PT_BP+20" },
3100 { 4*PT_BP+24, "4*PT_BP+24" },
3101 { 4*PT_BP+28, "4*PT_BP+28" },
3102 { 4*PT_BP+32, "4*PT_BP+32" },
3103 { 4*PT_BP+36, "4*PT_BP+36" },
3104 { 4*PT_BP+40, "4*PT_BP+40" },
3105 { 4*PT_BP+44, "4*PT_BP+44" },
3106 { 4*PT_BP+48, "4*PT_BP+48" },
3107 { 4*PT_BP+52, "4*PT_BP+52" },
3108 { 4*PT_BP+56, "4*PT_BP+56" },
3109# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003110# ifdef MICROBLAZE
3111 { PT_GPR(0), "r0" },
3112 { PT_GPR(1), "r1" },
3113 { PT_GPR(2), "r2" },
3114 { PT_GPR(3), "r3" },
3115 { PT_GPR(4), "r4" },
3116 { PT_GPR(5), "r5" },
3117 { PT_GPR(6), "r6" },
3118 { PT_GPR(7), "r7" },
3119 { PT_GPR(8), "r8" },
3120 { PT_GPR(9), "r9" },
3121 { PT_GPR(10), "r10" },
3122 { PT_GPR(11), "r11" },
3123 { PT_GPR(12), "r12" },
3124 { PT_GPR(13), "r13" },
3125 { PT_GPR(14), "r14" },
3126 { PT_GPR(15), "r15" },
3127 { PT_GPR(16), "r16" },
3128 { PT_GPR(17), "r17" },
3129 { PT_GPR(18), "r18" },
3130 { PT_GPR(19), "r19" },
3131 { PT_GPR(20), "r20" },
3132 { PT_GPR(21), "r21" },
3133 { PT_GPR(22), "r22" },
3134 { PT_GPR(23), "r23" },
3135 { PT_GPR(24), "r24" },
3136 { PT_GPR(25), "r25" },
3137 { PT_GPR(26), "r26" },
3138 { PT_GPR(27), "r27" },
3139 { PT_GPR(28), "r28" },
3140 { PT_GPR(29), "r29" },
3141 { PT_GPR(30), "r30" },
3142 { PT_GPR(31), "r31" },
3143 { PT_PC, "rpc", },
3144 { PT_MSR, "rmsr", },
3145 { PT_EAR, "rear", },
3146 { PT_ESR, "resr", },
3147 { PT_FSR, "rfsr", },
3148 { PT_KERNEL_MODE, "kernel_mode", },
3149# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003150
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003151# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3152 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003153 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003154# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003155 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003156# endif
3157# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003158 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003159# endif
3160# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003161 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003162# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003163 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3164 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3165 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003166# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003167 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003168# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003169# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003170 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003171# endif
3172# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003173 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003174# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003175 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003176# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003177 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003178# endif
3179# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003180 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003181# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003182# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003183 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003184# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003185 { uoff(magic), "offsetof(struct user, magic)" },
3186 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003187# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003188 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003189# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003190# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003191
3192# endif /* LINUX */
3193
3194# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003195 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3196 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3197 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3198 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3199 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3200 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3201 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3202 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3203 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3204 { uoff(u_error), "offsetof(struct user, u_error)" },
3205 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3206 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3207 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3208 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3209 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3210 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3211 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3212 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3213 { uoff(u_code), "offsetof(struct user, u_code)" },
3214 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3215 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3216 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3217 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3218 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3219 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3220 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3221 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3222 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3223 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3224 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3225 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3226 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3227 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3228 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3229 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3230 { uoff(u_start), "offsetof(struct user, u_start)" },
3231 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3232 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3233 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3234 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3235 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3236 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3237 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3238 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3239 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003240# endif /* SUNOS4 */
3241# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003242 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003243# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003244 { 0, NULL },
3245};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003246# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003247
3248int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003249sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003250{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003251 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003252 long addr;
3253
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003254 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003255 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003256# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003257 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003258# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003259 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003260# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003261 );
3262 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003263 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003264# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003265 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3266 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3267 for (x = struct_user_offsets; x->str; x++) {
3268 if (x->val >= addr)
3269 break;
3270 }
3271 if (!x->str)
3272 tprintf("%#lx, ", addr);
3273 else if (x->val > addr && x != struct_user_offsets) {
3274 x--;
3275 tprintf("%s + %ld, ", x->str, addr - x->val);
3276 }
3277 else
3278 tprintf("%s, ", x->str);
3279 }
3280 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003281# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003282 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003283# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003284 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003285# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003286 case PTRACE_PEEKDATA:
3287 case PTRACE_PEEKTEXT:
3288 case PTRACE_PEEKUSER:
3289 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003290# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003291 case PTRACE_CONT:
3292 case PTRACE_SINGLESTEP:
3293 case PTRACE_SYSCALL:
3294 case PTRACE_DETACH:
3295 printsignal(tcp->u_arg[3]);
3296 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003297# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003298 case PTRACE_SETOPTIONS:
3299 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3300 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003301# endif
3302# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003303 case PTRACE_SETSIGINFO: {
3304 siginfo_t si;
3305 if (!tcp->u_arg[3])
3306 tprintf("NULL");
3307 else if (syserror(tcp))
3308 tprintf("%#lx", tcp->u_arg[3]);
3309 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3310 tprintf("{???}");
3311 else
3312 printsiginfo(&si, verbose(tcp));
3313 break;
3314 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003315# endif
3316# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003317 case PTRACE_GETSIGINFO:
3318 /* Don't print anything, do it at syscall return. */
3319 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003320# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003321 default:
3322 tprintf("%#lx", tcp->u_arg[3]);
3323 break;
3324 }
3325 } else {
3326 switch (tcp->u_arg[0]) {
3327 case PTRACE_PEEKDATA:
3328 case PTRACE_PEEKTEXT:
3329 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003330# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003331 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003332# else
Roland McGratheb285352003-01-14 09:59:00 +00003333 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003334 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003335# endif
3336# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003337 case PTRACE_GETSIGINFO: {
3338 siginfo_t si;
3339 if (!tcp->u_arg[3])
3340 tprintf("NULL");
3341 else if (syserror(tcp))
3342 tprintf("%#lx", tcp->u_arg[3]);
3343 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3344 tprintf("{???}");
3345 else
3346 printsiginfo(&si, verbose(tcp));
3347 break;
3348 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003349# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003350 }
3351 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003352# endif /* LINUX */
3353# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003354 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3355 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3356 tprintf("%lu, ", tcp->u_arg[3]);
3357 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3358 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3359 tcp->u_arg[0] != PTRACE_READTEXT) {
3360 tprintf("%#lx", tcp->u_arg[3]);
3361 }
3362 } else {
3363 if (tcp->u_arg[0] == PTRACE_READDATA ||
3364 tcp->u_arg[0] == PTRACE_READTEXT) {
3365 tprintf("%lu, ", tcp->u_arg[3]);
3366 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3367 }
3368 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003369# endif /* SUNOS4 */
3370# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003371 tprintf("%lu", tcp->u_arg[3]);
3372 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003373# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003374 return 0;
3375}
3376
3377#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003378
3379#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003380# ifndef FUTEX_CMP_REQUEUE
3381# define FUTEX_CMP_REQUEUE 4
3382# endif
3383# ifndef FUTEX_WAKE_OP
3384# define FUTEX_WAKE_OP 5
3385# endif
3386# ifndef FUTEX_LOCK_PI
3387# define FUTEX_LOCK_PI 6
3388# define FUTEX_UNLOCK_PI 7
3389# define FUTEX_TRYLOCK_PI 8
3390# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003391# ifndef FUTEX_WAIT_BITSET
3392# define FUTEX_WAIT_BITSET 9
3393# endif
3394# ifndef FUTEX_WAKE_BITSET
3395# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003396# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003397# ifndef FUTEX_WAIT_REQUEUE_PI
3398# define FUTEX_WAIT_REQUEUE_PI 11
3399# endif
3400# ifndef FUTEX_CMP_REQUEUE_PI
3401# define FUTEX_CMP_REQUEUE_PI 12
3402# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003403# ifndef FUTEX_PRIVATE_FLAG
3404# define FUTEX_PRIVATE_FLAG 128
3405# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003406# ifndef FUTEX_CLOCK_REALTIME
3407# define FUTEX_CLOCK_REALTIME 256
3408# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003409static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003410 { FUTEX_WAIT, "FUTEX_WAIT" },
3411 { FUTEX_WAKE, "FUTEX_WAKE" },
3412 { FUTEX_FD, "FUTEX_FD" },
3413 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3414 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3415 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3416 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3417 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3418 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003419 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3420 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003421 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3422 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003423 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3424 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3425 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3426 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3427 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3428 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3429 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3430 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3431 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003432 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3433 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003434 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3435 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3436 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3437 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3438 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3439 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME" },
Roland McGrath51942a92007-07-05 18:59:11 +00003440 { 0, NULL }
3441};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003442# ifndef FUTEX_OP_SET
3443# define FUTEX_OP_SET 0
3444# define FUTEX_OP_ADD 1
3445# define FUTEX_OP_OR 2
3446# define FUTEX_OP_ANDN 3
3447# define FUTEX_OP_XOR 4
3448# define FUTEX_OP_CMP_EQ 0
3449# define FUTEX_OP_CMP_NE 1
3450# define FUTEX_OP_CMP_LT 2
3451# define FUTEX_OP_CMP_LE 3
3452# define FUTEX_OP_CMP_GT 4
3453# define FUTEX_OP_CMP_GE 5
3454# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003455static const struct xlat futexwakeops[] = {
3456 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3457 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3458 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3459 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3460 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3461 { 0, NULL }
3462};
3463static const struct xlat futexwakecmps[] = {
3464 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3465 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3466 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3467 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3468 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3469 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3470 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003471};
3472
3473int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003474sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003475{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003476 if (entering(tcp)) {
3477 long int cmd = tcp->u_arg[1] & 127;
3478 tprintf("%p, ", (void *) tcp->u_arg[0]);
3479 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3480 tprintf(", %ld", tcp->u_arg[2]);
3481 if (cmd == FUTEX_WAKE_BITSET)
3482 tprintf(", %lx", tcp->u_arg[5]);
3483 else if (cmd == FUTEX_WAIT) {
3484 tprintf(", ");
3485 printtv(tcp, tcp->u_arg[3]);
3486 } else if (cmd == FUTEX_WAIT_BITSET) {
3487 tprintf(", ");
3488 printtv(tcp, tcp->u_arg[3]);
3489 tprintf(", %lx", tcp->u_arg[5]);
3490 } else if (cmd == FUTEX_REQUEUE)
3491 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003492 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003493 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3494 else if (cmd == FUTEX_WAKE_OP) {
3495 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3496 if ((tcp->u_arg[5] >> 28) & 8)
3497 tprintf("FUTEX_OP_OPARG_SHIFT|");
3498 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3499 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3500 if ((tcp->u_arg[5] >> 24) & 8)
3501 tprintf("FUTEX_OP_OPARG_SHIFT|");
3502 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3503 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003504 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3505 tprintf(", ");
3506 printtv(tcp, tcp->u_arg[3]);
3507 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003508 }
Roland McGrath51942a92007-07-05 18:59:11 +00003509 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003510 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003511}
3512
3513static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003514print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003515{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003516 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003517 unsigned long w, min_len;
3518
3519 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3520 min_len = len - max_strlen * sizeof(w);
3521 else
3522 min_len = 0;
3523 for (; len >= sizeof(w) && len > min_len;
3524 len -= sizeof(w), list += sizeof(w)) {
3525 if (umove(tcp, list, &w) < 0)
3526 break;
3527 if (first)
3528 tprintf("{");
3529 else
3530 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003531 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003532 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003533 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003534 if (len) {
3535 if (first)
3536 tprintf("%#lx", list);
3537 else
3538 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3539 "???" : "..."));
3540 } else {
3541 tprintf(first ? "{}" : "}");
3542 }
Roland McGrath5a223472002-12-15 23:58:26 +00003543}
3544
3545int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003546sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003547{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003548 if (entering(tcp)) {
3549 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3550 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3551 }
3552 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003553}
3554
3555int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003556sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003557{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003558 if (entering(tcp)) {
3559 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3560 } else {
3561 if (tcp->u_rval == -1)
3562 tprintf("%#lx", tcp->u_arg[2]);
3563 else
3564 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3565 }
3566 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003567}
Roland McGrath279d3782004-03-01 20:27:37 +00003568
Roland McGrathd9f816f2004-09-04 03:39:20 +00003569static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003570 { SCHED_OTHER, "SCHED_OTHER" },
3571 { SCHED_RR, "SCHED_RR" },
3572 { SCHED_FIFO, "SCHED_FIFO" },
3573 { 0, NULL }
3574};
3575
3576int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003577sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003578{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003579 if (entering(tcp)) {
3580 tprintf("%d", (int) tcp->u_arg[0]);
3581 } else if (! syserror(tcp)) {
3582 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3583 if (tcp->auxstr != NULL)
3584 return RVAL_STR;
3585 }
3586 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003587}
3588
3589int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003590sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003591{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003592 if (entering(tcp)) {
3593 struct sched_param p;
3594 tprintf("%d, ", (int) tcp->u_arg[0]);
3595 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3596 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3597 tprintf(", %#lx", tcp->u_arg[2]);
3598 else
3599 tprintf(", { %d }", p.__sched_priority);
3600 }
3601 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003602}
3603
3604int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003605sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003606{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003607 if (entering(tcp)) {
3608 tprintf("%d, ", (int) tcp->u_arg[0]);
3609 } else {
3610 struct sched_param p;
3611 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3612 tprintf("%#lx", tcp->u_arg[1]);
3613 else
3614 tprintf("{ %d }", p.__sched_priority);
3615 }
3616 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003617}
3618
3619int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003620sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003621{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003622 if (entering(tcp)) {
3623 struct sched_param p;
3624 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3625 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3626 else
3627 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3628 }
3629 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003630}
3631
3632int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003633sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003634{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003635 if (entering(tcp)) {
3636 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3637 }
3638 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003639}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003640
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003641# ifdef X86_64
3642# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003643
3644static const struct xlat archvals[] = {
3645 { ARCH_SET_GS, "ARCH_SET_GS" },
3646 { ARCH_SET_FS, "ARCH_SET_FS" },
3647 { ARCH_GET_FS, "ARCH_GET_FS" },
3648 { ARCH_GET_GS, "ARCH_GET_GS" },
3649 { 0, NULL },
3650};
3651
3652int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003653sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003654{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003655 if (entering(tcp)) {
3656 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3657 if (tcp->u_arg[0] == ARCH_SET_GS
3658 || tcp->u_arg[0] == ARCH_SET_FS
3659 ) {
3660 tprintf(", %#lx", tcp->u_arg[1]);
3661 }
3662 } else {
3663 if (tcp->u_arg[0] == ARCH_GET_GS
3664 || tcp->u_arg[0] == ARCH_GET_FS
3665 ) {
3666 long int v;
3667 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3668 tprintf(", [%#lx]", v);
3669 else
3670 tprintf(", %#lx", tcp->u_arg[1]);
3671 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003672 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003673 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003674}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003675# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003676
Roland McGrathdb8319f2007-08-02 01:37:55 +00003677
3678int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003679sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003680{
3681 if (exiting(tcp)) {
3682 unsigned u;
3683 if (tcp->u_arg[0] == 0)
3684 tprintf("NULL, ");
3685 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3686 tprintf("%#lx, ", tcp->u_arg[0]);
3687 else
3688 tprintf("[%u], ", u);
3689 if (tcp->u_arg[1] == 0)
3690 tprintf("NULL, ");
3691 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3692 tprintf("%#lx, ", tcp->u_arg[1]);
3693 else
3694 tprintf("[%u], ", u);
3695 tprintf("%#lx", tcp->u_arg[2]);
3696 }
3697 return 0;
3698}
3699
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003700#endif /* LINUX */