blob: 276ce20b85be1f12cd3f40123b283ca6e18c414d [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)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200483 tprintf("%ld", tcp->u_arg[0]);
John Hughes4e36a812001-04-18 15:11:51 +0000484 }
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 */
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200695 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)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200699 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;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200704 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0) < 0)
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000705 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400706 regs.u_regs[U_REG_G1] = new;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200707 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)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200711 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)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200715 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)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200723 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new) < 0)
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000724 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 }
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200739 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0)
Roland McGrath08267b82004-02-20 22:56:43 +0000740 return -1;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200741 } 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)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200745 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 Vlasenkob63256e2011-06-07 12:13:24 +0200749 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000750 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
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200769 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)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200780 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0)
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200781 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;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800839 if (tcpchild->flags & TCB_SUSPENDED) {
840 /* The child was born suspended, due to our having
841 forced CLONE_PTRACE. */
842 if (bpt)
843 clearbpt(tcpchild);
844
845 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
846 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
847 return -1;
848
849 if (!qflag)
850 fprintf(stderr, "\
851Process %u resumed (parent %d ready)\n",
852 pid, tcp->pid);
853 }
854 else {
855 if (!qflag)
856 fprintf(stderr, "Process %d attached\n", pid);
857 }
858
859#ifdef TCB_CLONE_THREAD
860 if (sysent[tcp->scno].sys_func == sys_clone)
861 {
862 /*
863 * Save the flags used in this call,
864 * in case we point TCP to our parent below.
865 */
866 int call_flags = tcp->u_arg[ARG_FLAGS];
867 if ((tcp->flags & TCB_CLONE_THREAD) &&
868 tcp->parent != NULL) {
869 /* The parent in this clone is itself a
870 thread belonging to another process.
871 There is no meaning to the parentage
872 relationship of the new child with the
873 thread, only with the process. We
874 associate the new thread with our
875 parent. Since this is done for every
876 new thread, there will never be a
877 TCB_CLONE_THREAD process that has
878 children. */
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800879 tcp = tcp->parent;
880 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800881 }
882 if (call_flags & CLONE_THREAD) {
883 tcpchild->flags |= TCB_CLONE_THREAD;
884 ++tcp->nclone_threads;
885 }
886 if ((call_flags & CLONE_PARENT) &&
887 !(call_flags & CLONE_THREAD)) {
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800888 tcpchild->parent = NULL;
889 if (tcp->parent != NULL) {
890 tcp = tcp->parent;
891 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800892 }
893 }
894 }
895#endif /* TCB_CLONE_THREAD */
896 return 0;
897}
898
899int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000900internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000901{
Denys Vlasenkof44cce42011-06-21 14:34:10 +0200902 if ((ptrace_setoptions
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800903 & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
904 == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
905 return 0;
906
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000907 if (entering(tcp)) {
Wang Chaoe636c852010-09-16 11:20:56 +0800908 tcp->flags &= ~TCB_FOLLOWFORK;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700909 if (!followfork)
910 return 0;
Wang Chaoe636c852010-09-16 11:20:56 +0800911 /*
912 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
913 * new child if clone is called with flag CLONE_UNTRACED, so
914 * we keep the same logic with that option and don't trace it.
915 */
916 if ((sysent[tcp->scno].sys_func == sys_clone) &&
917 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
918 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700919 fork_tcb(tcp);
Denys Vlasenkoe7c90242011-06-22 00:09:25 +0200920 setbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000921 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000922 int pid;
923 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700924
925 if (!(tcp->flags & TCB_FOLLOWFORK))
926 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000927
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000928 bpt = tcp->flags & TCB_BPTSET;
929
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000930 if (syserror(tcp)) {
931 if (bpt)
932 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000933 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000934 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000935
936 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000937
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800938 return handle_new_child(tcp, pid, bpt);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000939 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000940 return 0;
941}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000942
943#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000944
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000945int
Denys Vlasenko12014262011-05-30 14:00:14 +0200946internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000947{
948 struct tcb *tcpchild;
949 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700950 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000951
952#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000953 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000954 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000955 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700956 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000957 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000958#endif
959 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700960 if (!followfork || dont_follow)
961 return 0;
962 fork_tcb(tcp);
Denys Vlasenkoe7c90242011-06-22 00:09:25 +0200963 setbpt(tcp);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000964 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000965 else {
966 int bpt = tcp->flags & TCB_BPTSET;
967
Roland McGratheb9e2e82009-06-02 16:49:22 -0700968 if (!(tcp->flags & TCB_FOLLOWFORK))
969 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000970 if (bpt)
971 clearbpt(tcp);
972
973 if (syserror(tcp))
974 return 0;
975
976 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700977 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000978 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000979#ifdef SUNOS4
980#ifdef oldway
981 /* The child must have run before it can be attached. */
982 {
983 struct timeval tv;
984 tv.tv_sec = 0;
985 tv.tv_usec = 10000;
986 select(0, NULL, NULL, NULL, &tv);
987 }
988 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
989 perror("PTRACE_ATTACH");
990 fprintf(stderr, "Too late?\n");
991 droptcb(tcpchild);
992 return 0;
993 }
994#else /* !oldway */
995 /* Try to catch the new process as soon as possible. */
996 {
997 int i;
998 for (i = 0; i < 1024; i++)
999 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1000 break;
1001 if (i == 1024) {
1002 perror("PTRACE_ATTACH");
1003 fprintf(stderr, "Too late?\n");
1004 droptcb(tcpchild);
1005 return 0;
1006 }
1007 }
1008#endif /* !oldway */
1009#endif /* SUNOS4 */
1010 tcpchild->flags |= TCB_ATTACHED;
1011 /* Child has BPT too, must be removed on first occasion */
1012 if (bpt) {
1013 tcpchild->flags |= TCB_BPTSET;
1014 tcpchild->baddr = tcp->baddr;
1015 memcpy(tcpchild->inst, tcp->inst,
1016 sizeof tcpchild->inst);
1017 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001018 tcpchild->parent = tcp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001019 if (!qflag)
1020 fprintf(stderr, "Process %d attached\n", pid);
1021 }
1022 return 0;
1023}
1024
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001025#endif /* !LINUX */
1026
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001027#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001028
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001029#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001030
1031int
Denys Vlasenko12014262011-05-30 14:00:14 +02001032sys_vfork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001033{
1034 if (exiting(tcp))
1035 return RVAL_UDECIMAL;
1036 return 0;
1037}
1038
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001039#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001040
1041#ifndef LINUX
1042
1043static char idstr[16];
1044
1045int
Denys Vlasenko12014262011-05-30 14:00:14 +02001046sys_getpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001047{
1048 if (exiting(tcp)) {
1049 sprintf(idstr, "ppid %lu", getrval2(tcp));
1050 tcp->auxstr = idstr;
1051 return RVAL_STR;
1052 }
1053 return 0;
1054}
1055
1056int
Denys Vlasenko12014262011-05-30 14:00:14 +02001057sys_getuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001058{
1059 if (exiting(tcp)) {
1060 sprintf(idstr, "euid %lu", getrval2(tcp));
1061 tcp->auxstr = idstr;
1062 return RVAL_STR;
1063 }
1064 return 0;
1065}
1066
1067int
Denys Vlasenko12014262011-05-30 14:00:14 +02001068sys_getgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001069{
1070 if (exiting(tcp)) {
1071 sprintf(idstr, "egid %lu", getrval2(tcp));
1072 tcp->auxstr = idstr;
1073 return RVAL_STR;
1074 }
1075 return 0;
1076}
1077
1078#endif /* !LINUX */
1079
1080#ifdef LINUX
1081
Dmitry V. Levin50a218d2011-01-18 17:36:20 +00001082int sys_getuid(struct tcb *tcp)
1083{
1084 if (exiting(tcp))
1085 tcp->u_rval = (uid_t) tcp->u_rval;
1086 return RVAL_UDECIMAL;
1087}
1088
1089int sys_setfsuid(struct tcb *tcp)
1090{
1091 if (entering(tcp))
1092 tprintf("%u", (uid_t) tcp->u_arg[0]);
1093 else
1094 tcp->u_rval = (uid_t) tcp->u_rval;
1095 return RVAL_UDECIMAL;
1096}
1097
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001098int
Denys Vlasenko12014262011-05-30 14:00:14 +02001099sys_setuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001100{
1101 if (entering(tcp)) {
1102 tprintf("%u", (uid_t) tcp->u_arg[0]);
1103 }
1104 return 0;
1105}
1106
1107int
Denys Vlasenko12014262011-05-30 14:00:14 +02001108sys_setgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001109{
1110 if (entering(tcp)) {
1111 tprintf("%u", (gid_t) tcp->u_arg[0]);
1112 }
1113 return 0;
1114}
1115
1116int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001117sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001118{
1119 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001120 __kernel_uid_t uid;
1121 if (syserror(tcp))
1122 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1123 tcp->u_arg[1], tcp->u_arg[2]);
1124 else {
1125 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1126 tprintf("%#lx, ", tcp->u_arg[0]);
1127 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001128 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001129 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1130 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001131 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001132 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001133 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1134 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001135 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001136 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001137 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001138 }
1139 return 0;
1140}
1141
1142int
Denys Vlasenko12014262011-05-30 14:00:14 +02001143sys_getresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001144{
1145 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001146 __kernel_gid_t gid;
1147 if (syserror(tcp))
1148 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1149 tcp->u_arg[1], tcp->u_arg[2]);
1150 else {
1151 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1152 tprintf("%#lx, ", tcp->u_arg[0]);
1153 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001154 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001155 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1156 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001157 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001158 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001159 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1160 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001161 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001162 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001163 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001164 }
1165 return 0;
1166}
1167
1168#endif /* LINUX */
1169
1170int
Denys Vlasenko12014262011-05-30 14:00:14 +02001171sys_setreuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001172{
1173 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001174 printuid("", tcp->u_arg[0]);
1175 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001176 }
1177 return 0;
1178}
1179
1180int
Denys Vlasenko12014262011-05-30 14:00:14 +02001181sys_setregid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001182{
1183 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001184 printuid("", tcp->u_arg[0]);
1185 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001186 }
1187 return 0;
1188}
1189
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001190#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001191int
Denys Vlasenko12014262011-05-30 14:00:14 +02001192sys_setresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001193{
1194 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001195 printuid("", tcp->u_arg[0]);
1196 printuid(", ", tcp->u_arg[1]);
1197 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001198 }
1199 return 0;
1200}
1201int
Denys Vlasenko12014262011-05-30 14:00:14 +02001202sys_setresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001203{
1204 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001205 printuid("", tcp->u_arg[0]);
1206 printuid(", ", tcp->u_arg[1]);
1207 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001208 }
1209 return 0;
1210}
1211
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001212#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001213
1214int
Denys Vlasenko12014262011-05-30 14:00:14 +02001215sys_setgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001216{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001217 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001218 unsigned long len, size, start, cur, end, abbrev_end;
1219 GETGROUPS_T gid;
1220 int failed = 0;
1221
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001222 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001223 tprintf("%lu, ", len);
1224 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001225 tprintf("[]");
1226 return 0;
1227 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001228 start = tcp->u_arg[1];
1229 if (start == 0) {
1230 tprintf("NULL");
1231 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001232 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001233 size = len * sizeof(gid);
1234 end = start + size;
1235 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1236 tprintf("%#lx", start);
1237 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001238 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001239 if (abbrev(tcp)) {
1240 abbrev_end = start + max_strlen * sizeof(gid);
1241 if (abbrev_end < start)
1242 abbrev_end = end;
1243 } else {
1244 abbrev_end = end;
1245 }
1246 tprintf("[");
1247 for (cur = start; cur < end; cur += sizeof(gid)) {
1248 if (cur > start)
1249 tprintf(", ");
1250 if (cur >= abbrev_end) {
1251 tprintf("...");
1252 break;
1253 }
1254 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1255 tprintf("?");
1256 failed = 1;
1257 break;
1258 }
1259 tprintf("%lu", (unsigned long) gid);
1260 }
1261 tprintf("]");
1262 if (failed)
1263 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001264 }
1265 return 0;
1266}
1267
1268int
Denys Vlasenko12014262011-05-30 14:00:14 +02001269sys_getgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001270{
Roland McGrathaa524c82005-06-01 19:22:06 +00001271 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001272
1273 if (entering(tcp)) {
1274 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001275 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001276 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001277 unsigned long size, start, cur, end, abbrev_end;
1278 GETGROUPS_T gid;
1279 int failed = 0;
1280
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001281 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001282 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001283 tprintf("[]");
1284 return 0;
1285 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001286 start = tcp->u_arg[1];
1287 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001288 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001289 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001290 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001291 if (tcp->u_arg[0] == 0) {
1292 tprintf("%#lx", start);
1293 return 0;
1294 }
1295 size = len * sizeof(gid);
1296 end = start + size;
1297 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1298 size / sizeof(gid) != len || end < start) {
1299 tprintf("%#lx", start);
1300 return 0;
1301 }
1302 if (abbrev(tcp)) {
1303 abbrev_end = start + max_strlen * sizeof(gid);
1304 if (abbrev_end < start)
1305 abbrev_end = end;
1306 } else {
1307 abbrev_end = end;
1308 }
1309 tprintf("[");
1310 for (cur = start; cur < end; cur += sizeof(gid)) {
1311 if (cur > start)
1312 tprintf(", ");
1313 if (cur >= abbrev_end) {
1314 tprintf("...");
1315 break;
1316 }
1317 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1318 tprintf("?");
1319 failed = 1;
1320 break;
1321 }
1322 tprintf("%lu", (unsigned long) gid);
1323 }
1324 tprintf("]");
1325 if (failed)
1326 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001327 }
1328 return 0;
1329}
1330
Roland McGrath83bd47a2003-11-13 22:32:26 +00001331#ifdef LINUX
1332int
Denys Vlasenko12014262011-05-30 14:00:14 +02001333sys_setgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001334{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001335 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001336 unsigned long len, size, start, cur, end, abbrev_end;
1337 GETGROUPS32_T gid;
1338 int failed = 0;
1339
Roland McGrath83bd47a2003-11-13 22:32:26 +00001340 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001341 tprintf("%lu, ", len);
1342 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001343 tprintf("[]");
1344 return 0;
1345 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001346 start = tcp->u_arg[1];
1347 if (start == 0) {
1348 tprintf("NULL");
1349 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001350 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001351 size = len * sizeof(gid);
1352 end = start + size;
1353 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1354 tprintf("%#lx", start);
1355 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001356 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001357 if (abbrev(tcp)) {
1358 abbrev_end = start + max_strlen * sizeof(gid);
1359 if (abbrev_end < start)
1360 abbrev_end = end;
1361 } else {
1362 abbrev_end = end;
1363 }
1364 tprintf("[");
1365 for (cur = start; cur < end; cur += sizeof(gid)) {
1366 if (cur > start)
1367 tprintf(", ");
1368 if (cur >= abbrev_end) {
1369 tprintf("...");
1370 break;
1371 }
1372 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1373 tprintf("?");
1374 failed = 1;
1375 break;
1376 }
1377 tprintf("%lu", (unsigned long) gid);
1378 }
1379 tprintf("]");
1380 if (failed)
1381 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001382 }
1383 return 0;
1384}
1385
1386int
Denys Vlasenko12014262011-05-30 14:00:14 +02001387sys_getgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001388{
Roland McGrathaa524c82005-06-01 19:22:06 +00001389 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001390
1391 if (entering(tcp)) {
1392 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001393 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001394 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001395 unsigned long size, start, cur, end, abbrev_end;
1396 GETGROUPS32_T gid;
1397 int failed = 0;
1398
Roland McGrath83bd47a2003-11-13 22:32:26 +00001399 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001400 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001401 tprintf("[]");
1402 return 0;
1403 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001404 start = tcp->u_arg[1];
1405 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001406 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001407 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001408 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001409 size = len * sizeof(gid);
1410 end = start + size;
1411 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1412 size / sizeof(gid) != len || end < start) {
1413 tprintf("%#lx", start);
1414 return 0;
1415 }
1416 if (abbrev(tcp)) {
1417 abbrev_end = start + max_strlen * sizeof(gid);
1418 if (abbrev_end < start)
1419 abbrev_end = end;
1420 } else {
1421 abbrev_end = end;
1422 }
1423 tprintf("[");
1424 for (cur = start; cur < end; cur += sizeof(gid)) {
1425 if (cur > start)
1426 tprintf(", ");
1427 if (cur >= abbrev_end) {
1428 tprintf("...");
1429 break;
1430 }
1431 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1432 tprintf("?");
1433 failed = 1;
1434 break;
1435 }
1436 tprintf("%lu", (unsigned long) gid);
1437 }
1438 tprintf("]");
1439 if (failed)
1440 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001441 }
1442 return 0;
1443}
1444#endif /* LINUX */
1445
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001446#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001447int
Denys Vlasenko12014262011-05-30 14:00:14 +02001448sys_setpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001449{
1450 if (entering(tcp)) {
1451#ifndef SVR4
1452 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1453#endif /* !SVR4 */
1454 }
1455 return 0;
1456}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001457#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001458
1459int
Denys Vlasenko12014262011-05-30 14:00:14 +02001460sys_getpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001461{
1462 if (entering(tcp)) {
1463#ifndef SVR4
1464 tprintf("%lu", tcp->u_arg[0]);
1465#endif /* !SVR4 */
1466 }
1467 return 0;
1468}
1469
1470int
Denys Vlasenko12014262011-05-30 14:00:14 +02001471sys_getsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001472{
1473 if (entering(tcp)) {
1474 tprintf("%lu", tcp->u_arg[0]);
1475 }
1476 return 0;
1477}
1478
1479int
Denys Vlasenko12014262011-05-30 14:00:14 +02001480sys_setsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001481{
1482 return 0;
1483}
1484
1485int
Denys Vlasenko12014262011-05-30 14:00:14 +02001486sys_getpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001487{
1488 if (entering(tcp)) {
1489 tprintf("%lu", tcp->u_arg[0]);
1490 }
1491 return 0;
1492}
1493
1494int
Denys Vlasenko12014262011-05-30 14:00:14 +02001495sys_setpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001496{
1497 if (entering(tcp)) {
1498 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1499 }
1500 return 0;
1501}
1502
John Hughesc61eb3d2002-05-17 11:37:50 +00001503#if UNIXWARE >= 2
1504
1505#include <sys/privilege.h>
1506
1507
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001508static const struct xlat procpriv_cmds[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001509 { SETPRV, "SETPRV" },
1510 { CLRPRV, "CLRPRV" },
1511 { PUTPRV, "PUTPRV" },
1512 { GETPRV, "GETPRV" },
1513 { CNTPRV, "CNTPRV" },
1514 { 0, NULL },
1515};
1516
1517
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001518static const struct xlat procpriv_priv[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001519 { P_OWNER, "P_OWNER" },
1520 { P_AUDIT, "P_AUDIT" },
1521 { P_COMPAT, "P_COMPAT" },
1522 { P_DACREAD, "P_DACREAD" },
1523 { P_DACWRITE, "P_DACWRITE" },
1524 { P_DEV, "P_DEV" },
1525 { P_FILESYS, "P_FILESYS" },
1526 { P_MACREAD, "P_MACREAD" },
1527 { P_MACWRITE, "P_MACWRITE" },
1528 { P_MOUNT, "P_MOUNT" },
1529 { P_MULTIDIR, "P_MULTIDIR" },
1530 { P_SETPLEVEL, "P_SETPLEVEL" },
1531 { P_SETSPRIV, "P_SETSPRIV" },
1532 { P_SETUID, "P_SETUID" },
1533 { P_SYSOPS, "P_SYSOPS" },
1534 { P_SETUPRIV, "P_SETUPRIV" },
1535 { P_DRIVER, "P_DRIVER" },
1536 { P_RTIME, "P_RTIME" },
1537 { P_MACUPGRADE, "P_MACUPGRADE" },
1538 { P_FSYSRANGE, "P_FSYSRANGE" },
1539 { P_SETFLEVEL, "P_SETFLEVEL" },
1540 { P_AUDITWR, "P_AUDITWR" },
1541 { P_TSHAR, "P_TSHAR" },
1542 { P_PLOCK, "P_PLOCK" },
1543 { P_CORE, "P_CORE" },
1544 { P_LOADMOD, "P_LOADMOD" },
1545 { P_BIND, "P_BIND" },
1546 { P_ALLPRIVS, "P_ALLPRIVS" },
1547 { 0, NULL },
1548};
1549
1550
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001551static const struct xlat procpriv_type[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001552 { PS_FIX, "PS_FIX" },
1553 { PS_INH, "PS_INH" },
1554 { PS_MAX, "PS_MAX" },
1555 { PS_WKG, "PS_WKG" },
1556 { 0, NULL },
1557};
1558
1559
1560static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001561printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001562{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001563 priv_t buf[128];
Dmitry V. Levinfcda7a52011-06-13 21:58:43 +00001564 int max = verbose(tcp) ? ARRAY_SIZE(buf) : 10;
John Hughesc61eb3d2002-05-17 11:37:50 +00001565 int dots = len > max;
1566 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001567
John Hughesc61eb3d2002-05-17 11:37:50 +00001568 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001569
John Hughesc61eb3d2002-05-17 11:37:50 +00001570 if (len <= 0 ||
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001571 umoven(tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
John Hughesc61eb3d2002-05-17 11:37:50 +00001572 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001573 tprintf("%#lx", addr);
John Hughesc61eb3d2002-05-17 11:37:50 +00001574 return;
1575 }
1576
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001577 tprintf("[");
John Hughesc61eb3d2002-05-17 11:37:50 +00001578
1579 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001580 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001581
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001582 if (i) tprintf(", ");
John Hughesc61eb3d2002-05-17 11:37:50 +00001583
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001584 if ((t = xlookup(procpriv_type, buf[i] & PS_TYPE)) &&
1585 (p = xlookup(procpriv_priv, buf[i] & ~PS_TYPE)))
John Hughesc61eb3d2002-05-17 11:37:50 +00001586 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001587 tprintf("%s|%s", t, p);
John Hughesc61eb3d2002-05-17 11:37:50 +00001588 }
1589 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001590 tprintf("%#lx", buf[i]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001591 }
1592 }
1593
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001594 if (dots) tprintf(" ...");
John Hughesc61eb3d2002-05-17 11:37:50 +00001595
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001596 tprintf("]");
John Hughesc61eb3d2002-05-17 11:37:50 +00001597}
1598
1599
1600int
Denys Vlasenko12014262011-05-30 14:00:14 +02001601sys_procpriv(struct tcb *tcp)
John Hughesc61eb3d2002-05-17 11:37:50 +00001602{
1603 if (entering(tcp)) {
1604 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1605 switch (tcp->u_arg[0]) {
1606 case CNTPRV:
1607 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1608 break;
1609
1610 case GETPRV:
1611 break;
1612
1613 default:
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001614 tprintf(", ");
1615 printpriv(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1616 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001617 }
1618 }
1619 else if (tcp->u_arg[0] == GETPRV) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001620 if (syserror(tcp)) {
John Hughesc61eb3d2002-05-17 11:37:50 +00001621 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1622 }
1623 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001624 tprintf(", ");
1625 printpriv(tcp, tcp->u_arg[1], tcp->u_rval);
1626 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001627 }
1628 }
Roland McGrath5a223472002-12-15 23:58:26 +00001629
John Hughesc61eb3d2002-05-17 11:37:50 +00001630 return 0;
1631}
1632
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001633#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001634
1635
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001636static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001637printargv(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001638{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001639 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001640 unsigned int p32;
1641 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001642 char data[sizeof(long)];
1643 } cp;
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001644 const char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001645 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001646
Roland McGrath85a3bc42007-08-02 02:13:05 +00001647 cp.p64 = 1;
1648 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1649 if (umoven(tcp, addr, personality_wordsize[current_personality],
1650 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001651 tprintf("%#lx", addr);
1652 return;
1653 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001654 if (personality_wordsize[current_personality] == 4)
1655 cp.p64 = cp.p32;
1656 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001657 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001658 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001659 printstr(tcp, cp.p64, -1);
1660 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001661 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001662 if (cp.p64)
1663 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001664}
1665
1666static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001667printargc(const char *fmt, struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001668{
1669 int count;
1670 char *cp;
1671
1672 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1673 addr += sizeof(char *);
1674 }
1675 tprintf(fmt, count, count == 1 ? "" : "s");
1676}
1677
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001678#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001679int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001680sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001681{
1682 if (entering(tcp)) {
1683 printpath(tcp, tcp->u_arg[0]);
1684 if (!verbose(tcp))
1685 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001686 else {
1687 tprintf(", [");
1688 printargv(tcp, tcp->u_arg[1]);
1689 tprintf("]");
1690 }
1691 }
1692 return 0;
1693}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001694#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001695
1696int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001697sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001698{
1699 if (entering(tcp)) {
1700 printpath(tcp, tcp->u_arg[0]);
1701 if (!verbose(tcp))
1702 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001703 else {
1704 tprintf(", [");
1705 printargv(tcp, tcp->u_arg[1]);
1706 tprintf("]");
1707 }
1708 if (!verbose(tcp))
1709 tprintf(", %#lx", tcp->u_arg[2]);
1710 else if (abbrev(tcp))
1711 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1712 else {
1713 tprintf(", [");
1714 printargv(tcp, tcp->u_arg[2]);
1715 tprintf("]");
1716 }
1717 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001718 return 0;
1719}
1720
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001721#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001722
Denys Vlasenko12014262011-05-30 14:00:14 +02001723int sys_rexecve(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +00001724{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001725 if (entering(tcp)) {
1726 sys_execve(tcp);
1727 tprintf(", %ld", tcp->u_arg[3]);
John Hughes4e36a812001-04-18 15:11:51 +00001728 }
1729 return 0;
1730}
1731
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001732#endif
John Hughes4e36a812001-04-18 15:11:51 +00001733
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001734int
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001735internal_exec(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001736{
1737#ifdef SUNOS4
1738 if (exiting(tcp) && !syserror(tcp) && followfork)
1739 fixvfork(tcp);
1740#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001741#if defined LINUX && defined TCB_WAITEXECVE
1742 if (exiting(tcp) && syserror(tcp))
1743 tcp->flags &= ~TCB_WAITEXECVE;
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001744 else {
1745 /* Maybe we have post-execve SIGTRAP suppressed? */
Denys Vlasenkof44cce42011-06-21 14:34:10 +02001746 if (!(ptrace_setoptions & PTRACE_O_TRACEEXEC))
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001747 tcp->flags |= TCB_WAITEXECVE; /* no */
1748 }
Roland McGrathfdb097f2004-07-12 07:38:55 +00001749#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001750 return 0;
1751}
1752
1753#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001754#ifndef __WNOTHREAD
1755#define __WNOTHREAD 0x20000000
1756#endif
1757#ifndef __WALL
1758#define __WALL 0x40000000
1759#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001760#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001761#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001762#endif
1763#endif /* LINUX */
1764
Roland McGrathd9f816f2004-09-04 03:39:20 +00001765static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001766 { WNOHANG, "WNOHANG" },
1767#ifndef WSTOPPED
1768 { WUNTRACED, "WUNTRACED" },
1769#endif
1770#ifdef WEXITED
1771 { WEXITED, "WEXITED" },
1772#endif
1773#ifdef WTRAPPED
1774 { WTRAPPED, "WTRAPPED" },
1775#endif
1776#ifdef WSTOPPED
1777 { WSTOPPED, "WSTOPPED" },
1778#endif
1779#ifdef WCONTINUED
1780 { WCONTINUED, "WCONTINUED" },
1781#endif
1782#ifdef WNOWAIT
1783 { WNOWAIT, "WNOWAIT" },
1784#endif
1785#ifdef __WCLONE
1786 { __WCLONE, "__WCLONE" },
1787#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001788#ifdef __WALL
1789 { __WALL, "__WALL" },
1790#endif
1791#ifdef __WNOTHREAD
1792 { __WNOTHREAD, "__WNOTHREAD" },
1793#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001794 { 0, NULL },
1795};
1796
Roland McGrath5e02a572004-10-19 23:33:47 +00001797#if !defined WCOREFLAG && defined WCOREFLG
1798# define WCOREFLAG WCOREFLG
1799#endif
1800#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001801# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001802#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001803#ifndef WCOREDUMP
1804# define WCOREDUMP(status) ((status) & 0200)
1805#endif
1806
Roland McGrath5e02a572004-10-19 23:33:47 +00001807
1808#ifndef W_STOPCODE
1809#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1810#endif
1811#ifndef W_EXITCODE
1812#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1813#endif
1814
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001815static int
Denys Vlasenko12014262011-05-30 14:00:14 +02001816printstatus(int status)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001817{
1818 int exited = 0;
1819
1820 /*
1821 * Here is a tricky presentation problem. This solution
1822 * is still not entirely satisfactory but since there
1823 * are no wait status constructors it will have to do.
1824 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001825 if (WIFSTOPPED(status)) {
1826 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001827 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001828 status &= ~W_STOPCODE(WSTOPSIG(status));
1829 }
1830 else if (WIFSIGNALED(status)) {
1831 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001832 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001833 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001834 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1835 }
1836 else if (WIFEXITED(status)) {
1837 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001838 WEXITSTATUS(status));
1839 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001840 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001841 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001842 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001843 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001844 return 0;
1845 }
1846
1847 if (status == 0)
1848 tprintf("]");
1849 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001850 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001851
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001852 return exited;
1853}
1854
1855static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001856printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001857{
1858 int status;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001859#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001860 int exited = 0;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001861#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001862
1863 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001864#ifdef LINUX
1865 /* On Linux, kernel-side pid_t is typedef'ed to int
1866 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001867 * pid argument to int on 64bit arches, producing,
1868 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001869 * in strace. We have to use int here, not long.
1870 */
1871 int pid = tcp->u_arg[0];
1872 tprintf("%d, ", pid);
1873#else
1874 /*
1875 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001876 */
1877 long pid = tcp->u_arg[0];
1878 if (personality_wordsize[current_personality] < sizeof pid)
1879 pid = (long) (int) pid;
1880 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001881#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001882 } else {
1883 /* status */
1884 if (!tcp->u_arg[1])
1885 tprintf("NULL");
1886 else if (syserror(tcp) || tcp->u_rval == 0)
1887 tprintf("%#lx", tcp->u_arg[1]);
1888 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1889 tprintf("[?]");
1890 else
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001891#ifdef SUNOS4
1892 exited =
1893#endif
1894 printstatus(status);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001895 /* options */
1896 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001897 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001898 if (n == 4) {
1899 tprintf(", ");
1900 /* usage */
1901 if (!tcp->u_arg[3])
1902 tprintf("NULL");
1903#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001904 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001905#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001906 if (bitness)
1907 printrusage32(tcp, tcp->u_arg[3]);
1908 else
1909#endif
1910 printrusage(tcp, tcp->u_arg[3]);
1911 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001912#endif /* LINUX */
1913#ifdef SUNOS4
1914 else if (tcp->u_rval > 0 && exited)
1915 printrusage(tcp, tcp->u_arg[3]);
1916#endif /* SUNOS4 */
1917 else
1918 tprintf("%#lx", tcp->u_arg[3]);
1919 }
1920 }
1921 return 0;
1922}
1923
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001924#ifdef SVR4
1925
1926int
Denys Vlasenko12014262011-05-30 14:00:14 +02001927sys_wait(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001928{
1929 if (exiting(tcp)) {
1930 /* The library wrapper stuffs this into the user variable. */
1931 if (!syserror(tcp))
1932 printstatus(getrval2(tcp));
1933 }
1934 return 0;
1935}
1936
1937#endif /* SVR4 */
1938
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001939#ifdef FREEBSD
1940int
Denys Vlasenko12014262011-05-30 14:00:14 +02001941sys_wait(struct tcb *tcp)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001942{
1943 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00001944
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001945 if (exiting(tcp)) {
1946 if (!syserror(tcp)) {
1947 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1948 tprintf("%#lx", tcp->u_arg[0]);
1949 else
1950 printstatus(status);
1951 }
1952 }
1953 return 0;
1954}
1955#endif
1956
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001957int
Denys Vlasenko12014262011-05-30 14:00:14 +02001958sys_waitpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001959{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001960 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001961}
1962
1963int
Denys Vlasenko12014262011-05-30 14:00:14 +02001964sys_wait4(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001965{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001966 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001967}
1968
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001969#ifdef ALPHA
1970int
Denys Vlasenko12014262011-05-30 14:00:14 +02001971sys_osf_wait4(struct tcb *tcp)
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001972{
1973 return printwaitn(tcp, 4, 1);
1974}
1975#endif
1976
Roland McGrathc74c0b72004-09-01 19:39:46 +00001977#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001978
Roland McGrathd9f816f2004-09-04 03:39:20 +00001979static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001980 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001981#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001982 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001983#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001984 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001985#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001986 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001987#endif
1988#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001989 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001990#endif
1991#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001992 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001993#endif
1994#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001995 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001996#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001997 { P_ALL, "P_ALL" },
1998#ifdef P_LWPID
1999 { P_LWPID, "P_LWPID" },
2000#endif
2001 { 0, NULL },
2002};
2003
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002004int
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00002005sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002006{
2007 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002008
2009 if (entering(tcp)) {
2010 printxval(waitid_types, tcp->u_arg[0], "P_???");
2011 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002012 }
2013 else {
2014 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002015 if (!tcp->u_arg[2])
2016 tprintf("NULL");
2017 else if (syserror(tcp))
2018 tprintf("%#lx", tcp->u_arg[2]);
2019 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2020 tprintf("{???}");
2021 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002022 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002023 /* options */
2024 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002025 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002026 if (tcp->u_nargs > 4) {
2027 /* usage */
2028 tprintf(", ");
2029 if (!tcp->u_arg[4])
2030 tprintf("NULL");
2031 else if (tcp->u_error)
2032 tprintf("%#lx", tcp->u_arg[4]);
2033 else
2034 printrusage(tcp, tcp->u_arg[4]);
2035 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002036 }
2037 return 0;
2038}
2039
Roland McGrathc74c0b72004-09-01 19:39:46 +00002040#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002041
2042int
Denys Vlasenko12014262011-05-30 14:00:14 +02002043sys_alarm(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002044{
2045 if (entering(tcp))
2046 tprintf("%lu", tcp->u_arg[0]);
2047 return 0;
2048}
2049
2050int
Denys Vlasenko12014262011-05-30 14:00:14 +02002051sys_uname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002052{
2053 struct utsname uname;
2054
2055 if (exiting(tcp)) {
2056 if (syserror(tcp) || !verbose(tcp))
2057 tprintf("%#lx", tcp->u_arg[0]);
2058 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2059 tprintf("{...}");
2060 else if (!abbrev(tcp)) {
2061
2062 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2063 uname.sysname, uname.nodename);
2064 tprintf("release=\"%s\", version=\"%s\", ",
2065 uname.release, uname.version);
2066 tprintf("machine=\"%s\"", uname.machine);
2067#ifdef LINUX
2068#ifndef __GLIBC__
2069 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002070#endif
2071#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002072 tprintf("}");
2073 }
2074 else
2075 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2076 uname.sysname, uname.nodename);
2077 }
2078 return 0;
2079}
2080
2081#ifndef SVR4
2082
Roland McGratheb9e2e82009-06-02 16:49:22 -07002083static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002084# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002085 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2086 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2087 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2088 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2089 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2090 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2091 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2092 { PTRACE_CONT, "PTRACE_CONT" },
2093 { PTRACE_KILL, "PTRACE_KILL" },
2094 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2095 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2096 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002097# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002098 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002099# endif
2100# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002101 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002102# endif
2103# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002104 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002105# endif
2106# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002107 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002108# endif
2109# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002110 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002111# endif
2112# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002113 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002114# endif
2115# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002116 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002117# endif
2118# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002119 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002120# endif
2121# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002122 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002123# endif
2124# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002125 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002126# endif
2127# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002128 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002129# endif
2130# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002131 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002132# endif
Dmitry V. Levinbb668a52011-03-14 21:58:59 +00002133# ifdef PTRACE_GETREGSET
2134 { PTRACE_GETREGSET, "PTRACE_GETREGSET", },
2135# endif
2136# ifdef PTRACE_SETREGSET
2137 { PTRACE_SETREGSET, "PTRACE_SETREGSET", },
2138# endif
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002139# ifdef PTRACE_SET_SYSCALL
2140 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2141# endif
2142# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002143 { PTRACE_READDATA, "PTRACE_READDATA" },
2144 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2145 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2146 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2147 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2148 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002149# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002150 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2151 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002152# else /* !SPARC */
2153 { PTRACE_22, "PTRACE_22" },
2154 { PTRACE_23, "PTRACE_3" },
2155# endif /* !SPARC */
2156# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002157 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002158# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002159 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002160# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002161 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2162 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2163 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002164# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002165 { PTRACE_26, "PTRACE_26" },
2166 { PTRACE_27, "PTRACE_27" },
2167 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002168# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002169 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002170# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002171
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002172# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002173
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002174 { PT_TRACE_ME, "PT_TRACE_ME" },
2175 { PT_READ_I, "PT_READ_I" },
2176 { PT_READ_D, "PT_READ_D" },
2177 { PT_WRITE_I, "PT_WRITE_I" },
2178 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002179# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002180 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002181# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002182 { PT_CONTINUE, "PT_CONTINUE" },
2183 { PT_KILL, "PT_KILL" },
2184 { PT_STEP, "PT_STEP" },
2185 { PT_ATTACH, "PT_ATTACH" },
2186 { PT_DETACH, "PT_DETACH" },
2187 { PT_GETREGS, "PT_GETREGS" },
2188 { PT_SETREGS, "PT_SETREGS" },
2189 { PT_GETFPREGS, "PT_GETFPREGS" },
2190 { PT_SETFPREGS, "PT_SETFPREGS" },
2191 { PT_GETDBREGS, "PT_GETDBREGS" },
2192 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002193# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002194 { 0, NULL },
2195};
2196
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002197# ifndef FREEBSD
2198# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002199static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002200# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002201 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002202# endif
2203# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002204 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002205# endif
2206# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002207 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002208# endif
2209# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002210 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002211# endif
2212# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002213 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002214# endif
2215# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002216 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002217# endif
2218# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002219 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002220# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002221 { 0, NULL },
2222};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002223# endif /* PTRACE_SETOPTIONS */
2224# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002225
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002226# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002227const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002228# ifdef LINUX
2229# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002230 { PT_PSWMASK, "psw_mask" },
2231 { PT_PSWADDR, "psw_addr" },
2232 { PT_GPR0, "gpr0" },
2233 { PT_GPR1, "gpr1" },
2234 { PT_GPR2, "gpr2" },
2235 { PT_GPR3, "gpr3" },
2236 { PT_GPR4, "gpr4" },
2237 { PT_GPR5, "gpr5" },
2238 { PT_GPR6, "gpr6" },
2239 { PT_GPR7, "gpr7" },
2240 { PT_GPR8, "gpr8" },
2241 { PT_GPR9, "gpr9" },
2242 { PT_GPR10, "gpr10" },
2243 { PT_GPR11, "gpr11" },
2244 { PT_GPR12, "gpr12" },
2245 { PT_GPR13, "gpr13" },
2246 { PT_GPR14, "gpr14" },
2247 { PT_GPR15, "gpr15" },
2248 { PT_ACR0, "acr0" },
2249 { PT_ACR1, "acr1" },
2250 { PT_ACR2, "acr2" },
2251 { PT_ACR3, "acr3" },
2252 { PT_ACR4, "acr4" },
2253 { PT_ACR5, "acr5" },
2254 { PT_ACR6, "acr6" },
2255 { PT_ACR7, "acr7" },
2256 { PT_ACR8, "acr8" },
2257 { PT_ACR9, "acr9" },
2258 { PT_ACR10, "acr10" },
2259 { PT_ACR11, "acr11" },
2260 { PT_ACR12, "acr12" },
2261 { PT_ACR13, "acr13" },
2262 { PT_ACR14, "acr14" },
2263 { PT_ACR15, "acr15" },
2264 { PT_ORIGGPR2, "orig_gpr2" },
2265 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002266# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002267 { PT_FPR0_HI, "fpr0.hi" },
2268 { PT_FPR0_LO, "fpr0.lo" },
2269 { PT_FPR1_HI, "fpr1.hi" },
2270 { PT_FPR1_LO, "fpr1.lo" },
2271 { PT_FPR2_HI, "fpr2.hi" },
2272 { PT_FPR2_LO, "fpr2.lo" },
2273 { PT_FPR3_HI, "fpr3.hi" },
2274 { PT_FPR3_LO, "fpr3.lo" },
2275 { PT_FPR4_HI, "fpr4.hi" },
2276 { PT_FPR4_LO, "fpr4.lo" },
2277 { PT_FPR5_HI, "fpr5.hi" },
2278 { PT_FPR5_LO, "fpr5.lo" },
2279 { PT_FPR6_HI, "fpr6.hi" },
2280 { PT_FPR6_LO, "fpr6.lo" },
2281 { PT_FPR7_HI, "fpr7.hi" },
2282 { PT_FPR7_LO, "fpr7.lo" },
2283 { PT_FPR8_HI, "fpr8.hi" },
2284 { PT_FPR8_LO, "fpr8.lo" },
2285 { PT_FPR9_HI, "fpr9.hi" },
2286 { PT_FPR9_LO, "fpr9.lo" },
2287 { PT_FPR10_HI, "fpr10.hi" },
2288 { PT_FPR10_LO, "fpr10.lo" },
2289 { PT_FPR11_HI, "fpr11.hi" },
2290 { PT_FPR11_LO, "fpr11.lo" },
2291 { PT_FPR12_HI, "fpr12.hi" },
2292 { PT_FPR12_LO, "fpr12.lo" },
2293 { PT_FPR13_HI, "fpr13.hi" },
2294 { PT_FPR13_LO, "fpr13.lo" },
2295 { PT_FPR14_HI, "fpr14.hi" },
2296 { PT_FPR14_LO, "fpr14.lo" },
2297 { PT_FPR15_HI, "fpr15.hi" },
2298 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002299# endif
2300# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002301 { PT_FPR0, "fpr0" },
2302 { PT_FPR1, "fpr1" },
2303 { PT_FPR2, "fpr2" },
2304 { PT_FPR3, "fpr3" },
2305 { PT_FPR4, "fpr4" },
2306 { PT_FPR5, "fpr5" },
2307 { PT_FPR6, "fpr6" },
2308 { PT_FPR7, "fpr7" },
2309 { PT_FPR8, "fpr8" },
2310 { PT_FPR9, "fpr9" },
2311 { PT_FPR10, "fpr10" },
2312 { PT_FPR11, "fpr11" },
2313 { PT_FPR12, "fpr12" },
2314 { PT_FPR13, "fpr13" },
2315 { PT_FPR14, "fpr14" },
2316 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002317# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002318 { PT_CR_9, "cr9" },
2319 { PT_CR_10, "cr10" },
2320 { PT_CR_11, "cr11" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002321 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002322# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002323 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002324# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002325 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002326# elif defined(POWERPC)
2327# ifndef PT_ORIG_R3
2328# define PT_ORIG_R3 34
2329# endif
2330# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002331 { REGSIZE*PT_R0, "r0" },
2332 { REGSIZE*PT_R1, "r1" },
2333 { REGSIZE*PT_R2, "r2" },
2334 { REGSIZE*PT_R3, "r3" },
2335 { REGSIZE*PT_R4, "r4" },
2336 { REGSIZE*PT_R5, "r5" },
2337 { REGSIZE*PT_R6, "r6" },
2338 { REGSIZE*PT_R7, "r7" },
2339 { REGSIZE*PT_R8, "r8" },
2340 { REGSIZE*PT_R9, "r9" },
2341 { REGSIZE*PT_R10, "r10" },
2342 { REGSIZE*PT_R11, "r11" },
2343 { REGSIZE*PT_R12, "r12" },
2344 { REGSIZE*PT_R13, "r13" },
2345 { REGSIZE*PT_R14, "r14" },
2346 { REGSIZE*PT_R15, "r15" },
2347 { REGSIZE*PT_R16, "r16" },
2348 { REGSIZE*PT_R17, "r17" },
2349 { REGSIZE*PT_R18, "r18" },
2350 { REGSIZE*PT_R19, "r19" },
2351 { REGSIZE*PT_R20, "r20" },
2352 { REGSIZE*PT_R21, "r21" },
2353 { REGSIZE*PT_R22, "r22" },
2354 { REGSIZE*PT_R23, "r23" },
2355 { REGSIZE*PT_R24, "r24" },
2356 { REGSIZE*PT_R25, "r25" },
2357 { REGSIZE*PT_R26, "r26" },
2358 { REGSIZE*PT_R27, "r27" },
2359 { REGSIZE*PT_R28, "r28" },
2360 { REGSIZE*PT_R29, "r29" },
2361 { REGSIZE*PT_R30, "r30" },
2362 { REGSIZE*PT_R31, "r31" },
2363 { REGSIZE*PT_NIP, "NIP" },
2364 { REGSIZE*PT_MSR, "MSR" },
2365 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2366 { REGSIZE*PT_CTR, "CTR" },
2367 { REGSIZE*PT_LNK, "LNK" },
2368 { REGSIZE*PT_XER, "XER" },
2369 { REGSIZE*PT_CCR, "CCR" },
2370 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002371# undef REGSIZE
2372# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002373 { 0, "r0" },
2374 { 1, "r1" },
2375 { 2, "r2" },
2376 { 3, "r3" },
2377 { 4, "r4" },
2378 { 5, "r5" },
2379 { 6, "r6" },
2380 { 7, "r7" },
2381 { 8, "r8" },
2382 { 9, "r9" },
2383 { 10, "r10" },
2384 { 11, "r11" },
2385 { 12, "r12" },
2386 { 13, "r13" },
2387 { 14, "r14" },
2388 { 15, "r15" },
2389 { 16, "r16" },
2390 { 17, "r17" },
2391 { 18, "r18" },
2392 { 19, "r19" },
2393 { 20, "r20" },
2394 { 21, "r21" },
2395 { 22, "r22" },
2396 { 23, "r23" },
2397 { 24, "r24" },
2398 { 25, "r25" },
2399 { 26, "r26" },
2400 { 27, "r27" },
2401 { 28, "r28" },
2402 { 29, "gp" },
2403 { 30, "fp" },
2404 { 31, "zero" },
2405 { 32, "fp0" },
2406 { 33, "fp" },
2407 { 34, "fp2" },
2408 { 35, "fp3" },
2409 { 36, "fp4" },
2410 { 37, "fp5" },
2411 { 38, "fp6" },
2412 { 39, "fp7" },
2413 { 40, "fp8" },
2414 { 41, "fp9" },
2415 { 42, "fp10" },
2416 { 43, "fp11" },
2417 { 44, "fp12" },
2418 { 45, "fp13" },
2419 { 46, "fp14" },
2420 { 47, "fp15" },
2421 { 48, "fp16" },
2422 { 49, "fp17" },
2423 { 50, "fp18" },
2424 { 51, "fp19" },
2425 { 52, "fp20" },
2426 { 53, "fp21" },
2427 { 54, "fp22" },
2428 { 55, "fp23" },
2429 { 56, "fp24" },
2430 { 57, "fp25" },
2431 { 58, "fp26" },
2432 { 59, "fp27" },
2433 { 60, "fp28" },
2434 { 61, "fp29" },
2435 { 62, "fp30" },
2436 { 63, "fp31" },
2437 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002438# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002439 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2440 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2441 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2442 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2443 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2444 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2445 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2446 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2447 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2448 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2449 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2450 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2451 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2452 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2453 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2454 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2455 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2456 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2457 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2458 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2459 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2460 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2461 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2462 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2463 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2464 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2465 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2466 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2467 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2468 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2469 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2470 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2471 /* switch stack: */
2472 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2473 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2474 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2475 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2476 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2477 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2478 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2479 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2480 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2481 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002482 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2483 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002484 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002485 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002486 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2487 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002488 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2489 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2490 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2491 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2492 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2493 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2494 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2495 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2496 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2497 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2498 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2499 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2500 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2501 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2502 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002503# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002504 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002505# endif
2506# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002507 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002508# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002509 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002510# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002511 { 4*EBX, "4*EBX" },
2512 { 4*ECX, "4*ECX" },
2513 { 4*EDX, "4*EDX" },
2514 { 4*ESI, "4*ESI" },
2515 { 4*EDI, "4*EDI" },
2516 { 4*EBP, "4*EBP" },
2517 { 4*EAX, "4*EAX" },
2518 { 4*DS, "4*DS" },
2519 { 4*ES, "4*ES" },
2520 { 4*FS, "4*FS" },
2521 { 4*GS, "4*GS" },
2522 { 4*ORIG_EAX, "4*ORIG_EAX" },
2523 { 4*EIP, "4*EIP" },
2524 { 4*CS, "4*CS" },
2525 { 4*EFL, "4*EFL" },
2526 { 4*UESP, "4*UESP" },
2527 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002528# elif defined(X86_64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002529 { 8*R15, "8*R15" },
2530 { 8*R14, "8*R14" },
2531 { 8*R13, "8*R13" },
2532 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002533 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002534 { 8*RBX, "8*RBX" },
2535 { 8*R11, "8*R11" },
2536 { 8*R10, "8*R10" },
2537 { 8*R9, "8*R9" },
2538 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002539 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002540 { 8*RCX, "8*RCX" },
2541 { 8*RDX, "8*RDX" },
2542 { 8*RSI, "8*RSI" },
2543 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002544 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002545 { 8*RIP, "8*RIP" },
2546 { 8*CS, "8*CS" },
2547 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002548 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002549 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002550# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002551 { 4*PT_D1, "4*PT_D1" },
2552 { 4*PT_D2, "4*PT_D2" },
2553 { 4*PT_D3, "4*PT_D3" },
2554 { 4*PT_D4, "4*PT_D4" },
2555 { 4*PT_D5, "4*PT_D5" },
2556 { 4*PT_D6, "4*PT_D6" },
2557 { 4*PT_D7, "4*PT_D7" },
2558 { 4*PT_A0, "4*PT_A0" },
2559 { 4*PT_A1, "4*PT_A1" },
2560 { 4*PT_A2, "4*PT_A2" },
2561 { 4*PT_A3, "4*PT_A3" },
2562 { 4*PT_A4, "4*PT_A4" },
2563 { 4*PT_A5, "4*PT_A5" },
2564 { 4*PT_A6, "4*PT_A6" },
2565 { 4*PT_D0, "4*PT_D0" },
2566 { 4*PT_USP, "4*PT_USP" },
2567 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2568 { 4*PT_SR, "4*PT_SR" },
2569 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002570# elif defined(SH)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002571 { 4*REG_REG0, "4*REG_REG0" },
2572 { 4*(REG_REG0+1), "4*REG_REG1" },
2573 { 4*(REG_REG0+2), "4*REG_REG2" },
2574 { 4*(REG_REG0+3), "4*REG_REG3" },
2575 { 4*(REG_REG0+4), "4*REG_REG4" },
2576 { 4*(REG_REG0+5), "4*REG_REG5" },
2577 { 4*(REG_REG0+6), "4*REG_REG6" },
2578 { 4*(REG_REG0+7), "4*REG_REG7" },
2579 { 4*(REG_REG0+8), "4*REG_REG8" },
2580 { 4*(REG_REG0+9), "4*REG_REG9" },
2581 { 4*(REG_REG0+10), "4*REG_REG10" },
2582 { 4*(REG_REG0+11), "4*REG_REG11" },
2583 { 4*(REG_REG0+12), "4*REG_REG12" },
2584 { 4*(REG_REG0+13), "4*REG_REG13" },
2585 { 4*(REG_REG0+14), "4*REG_REG14" },
2586 { 4*REG_REG15, "4*REG_REG15" },
2587 { 4*REG_PC, "4*REG_PC" },
2588 { 4*REG_PR, "4*REG_PR" },
2589 { 4*REG_SR, "4*REG_SR" },
2590 { 4*REG_GBR, "4*REG_GBR" },
2591 { 4*REG_MACH, "4*REG_MACH" },
2592 { 4*REG_MACL, "4*REG_MACL" },
2593 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2594 { 4*REG_FPUL, "4*REG_FPUL" },
2595 { 4*REG_FPREG0, "4*REG_FPREG0" },
2596 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2597 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2598 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2599 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2600 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2601 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2602 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2603 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2604 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2605 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2606 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2607 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2608 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2609 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2610 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002611# ifdef REG_XDREG0
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002612 { 4*REG_XDREG0, "4*REG_XDREG0" },
2613 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2614 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2615 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2616 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2617 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2618 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2619 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002620# endif
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002621 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002622# elif defined(SH64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002623 { 0, "PC(L)" },
2624 { 4, "PC(U)" },
2625 { 8, "SR(L)" },
2626 { 12, "SR(U)" },
2627 { 16, "syscall no.(L)" },
2628 { 20, "syscall_no.(U)" },
2629 { 24, "R0(L)" },
2630 { 28, "R0(U)" },
2631 { 32, "R1(L)" },
2632 { 36, "R1(U)" },
2633 { 40, "R2(L)" },
2634 { 44, "R2(U)" },
2635 { 48, "R3(L)" },
2636 { 52, "R3(U)" },
2637 { 56, "R4(L)" },
2638 { 60, "R4(U)" },
2639 { 64, "R5(L)" },
2640 { 68, "R5(U)" },
2641 { 72, "R6(L)" },
2642 { 76, "R6(U)" },
2643 { 80, "R7(L)" },
2644 { 84, "R7(U)" },
2645 { 88, "R8(L)" },
2646 { 92, "R8(U)" },
2647 { 96, "R9(L)" },
2648 { 100, "R9(U)" },
2649 { 104, "R10(L)" },
2650 { 108, "R10(U)" },
2651 { 112, "R11(L)" },
2652 { 116, "R11(U)" },
2653 { 120, "R12(L)" },
2654 { 124, "R12(U)" },
2655 { 128, "R13(L)" },
2656 { 132, "R13(U)" },
2657 { 136, "R14(L)" },
2658 { 140, "R14(U)" },
2659 { 144, "R15(L)" },
2660 { 148, "R15(U)" },
2661 { 152, "R16(L)" },
2662 { 156, "R16(U)" },
2663 { 160, "R17(L)" },
2664 { 164, "R17(U)" },
2665 { 168, "R18(L)" },
2666 { 172, "R18(U)" },
2667 { 176, "R19(L)" },
2668 { 180, "R19(U)" },
2669 { 184, "R20(L)" },
2670 { 188, "R20(U)" },
2671 { 192, "R21(L)" },
2672 { 196, "R21(U)" },
2673 { 200, "R22(L)" },
2674 { 204, "R22(U)" },
2675 { 208, "R23(L)" },
2676 { 212, "R23(U)" },
2677 { 216, "R24(L)" },
2678 { 220, "R24(U)" },
2679 { 224, "R25(L)" },
2680 { 228, "R25(U)" },
2681 { 232, "R26(L)" },
2682 { 236, "R26(U)" },
2683 { 240, "R27(L)" },
2684 { 244, "R27(U)" },
2685 { 248, "R28(L)" },
2686 { 252, "R28(U)" },
2687 { 256, "R29(L)" },
2688 { 260, "R29(U)" },
2689 { 264, "R30(L)" },
2690 { 268, "R30(U)" },
2691 { 272, "R31(L)" },
2692 { 276, "R31(U)" },
2693 { 280, "R32(L)" },
2694 { 284, "R32(U)" },
2695 { 288, "R33(L)" },
2696 { 292, "R33(U)" },
2697 { 296, "R34(L)" },
2698 { 300, "R34(U)" },
2699 { 304, "R35(L)" },
2700 { 308, "R35(U)" },
2701 { 312, "R36(L)" },
2702 { 316, "R36(U)" },
2703 { 320, "R37(L)" },
2704 { 324, "R37(U)" },
2705 { 328, "R38(L)" },
2706 { 332, "R38(U)" },
2707 { 336, "R39(L)" },
2708 { 340, "R39(U)" },
2709 { 344, "R40(L)" },
2710 { 348, "R40(U)" },
2711 { 352, "R41(L)" },
2712 { 356, "R41(U)" },
2713 { 360, "R42(L)" },
2714 { 364, "R42(U)" },
2715 { 368, "R43(L)" },
2716 { 372, "R43(U)" },
2717 { 376, "R44(L)" },
2718 { 380, "R44(U)" },
2719 { 384, "R45(L)" },
2720 { 388, "R45(U)" },
2721 { 392, "R46(L)" },
2722 { 396, "R46(U)" },
2723 { 400, "R47(L)" },
2724 { 404, "R47(U)" },
2725 { 408, "R48(L)" },
2726 { 412, "R48(U)" },
2727 { 416, "R49(L)" },
2728 { 420, "R49(U)" },
2729 { 424, "R50(L)" },
2730 { 428, "R50(U)" },
2731 { 432, "R51(L)" },
2732 { 436, "R51(U)" },
2733 { 440, "R52(L)" },
2734 { 444, "R52(U)" },
2735 { 448, "R53(L)" },
2736 { 452, "R53(U)" },
2737 { 456, "R54(L)" },
2738 { 460, "R54(U)" },
2739 { 464, "R55(L)" },
2740 { 468, "R55(U)" },
2741 { 472, "R56(L)" },
2742 { 476, "R56(U)" },
2743 { 480, "R57(L)" },
2744 { 484, "R57(U)" },
2745 { 488, "R58(L)" },
2746 { 492, "R58(U)" },
2747 { 496, "R59(L)" },
2748 { 500, "R59(U)" },
2749 { 504, "R60(L)" },
2750 { 508, "R60(U)" },
2751 { 512, "R61(L)" },
2752 { 516, "R61(U)" },
2753 { 520, "R62(L)" },
2754 { 524, "R62(U)" },
2755 { 528, "TR0(L)" },
2756 { 532, "TR0(U)" },
2757 { 536, "TR1(L)" },
2758 { 540, "TR1(U)" },
2759 { 544, "TR2(L)" },
2760 { 548, "TR2(U)" },
2761 { 552, "TR3(L)" },
2762 { 556, "TR3(U)" },
2763 { 560, "TR4(L)" },
2764 { 564, "TR4(U)" },
2765 { 568, "TR5(L)" },
2766 { 572, "TR5(U)" },
2767 { 576, "TR6(L)" },
2768 { 580, "TR6(U)" },
2769 { 584, "TR7(L)" },
2770 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002771 /* This entry is in case pt_regs contains dregs (depends on
2772 the kernel build options). */
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002773 { uoff(regs), "offsetof(struct user, regs)" },
2774 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002775# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002776 { uoff(regs.ARM_r0), "r0" },
2777 { uoff(regs.ARM_r1), "r1" },
2778 { uoff(regs.ARM_r2), "r2" },
2779 { uoff(regs.ARM_r3), "r3" },
2780 { uoff(regs.ARM_r4), "r4" },
2781 { uoff(regs.ARM_r5), "r5" },
2782 { uoff(regs.ARM_r6), "r6" },
2783 { uoff(regs.ARM_r7), "r7" },
2784 { uoff(regs.ARM_r8), "r8" },
2785 { uoff(regs.ARM_r9), "r9" },
2786 { uoff(regs.ARM_r10), "r10" },
2787 { uoff(regs.ARM_fp), "fp" },
2788 { uoff(regs.ARM_ip), "ip" },
2789 { uoff(regs.ARM_sp), "sp" },
2790 { uoff(regs.ARM_lr), "lr" },
2791 { uoff(regs.ARM_pc), "pc" },
2792 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002793# elif defined(AVR32)
2794 { uoff(regs.sr), "sr" },
2795 { uoff(regs.pc), "pc" },
2796 { uoff(regs.lr), "lr" },
2797 { uoff(regs.sp), "sp" },
2798 { uoff(regs.r12), "r12" },
2799 { uoff(regs.r11), "r11" },
2800 { uoff(regs.r10), "r10" },
2801 { uoff(regs.r9), "r9" },
2802 { uoff(regs.r8), "r8" },
2803 { uoff(regs.r7), "r7" },
2804 { uoff(regs.r6), "r6" },
2805 { uoff(regs.r5), "r5" },
2806 { uoff(regs.r4), "r4" },
2807 { uoff(regs.r3), "r3" },
2808 { uoff(regs.r2), "r2" },
2809 { uoff(regs.r1), "r1" },
2810 { uoff(regs.r0), "r0" },
2811 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002812# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002813 { 0, "r0" },
2814 { 1, "r1" },
2815 { 2, "r2" },
2816 { 3, "r3" },
2817 { 4, "r4" },
2818 { 5, "r5" },
2819 { 6, "r6" },
2820 { 7, "r7" },
2821 { 8, "r8" },
2822 { 9, "r9" },
2823 { 10, "r10" },
2824 { 11, "r11" },
2825 { 12, "r12" },
2826 { 13, "r13" },
2827 { 14, "r14" },
2828 { 15, "r15" },
2829 { 16, "r16" },
2830 { 17, "r17" },
2831 { 18, "r18" },
2832 { 19, "r19" },
2833 { 20, "r20" },
2834 { 21, "r21" },
2835 { 22, "r22" },
2836 { 23, "r23" },
2837 { 24, "r24" },
2838 { 25, "r25" },
2839 { 26, "r26" },
2840 { 27, "r27" },
2841 { 28, "r28" },
2842 { 29, "r29" },
2843 { 30, "r30" },
2844 { 31, "r31" },
2845 { 32, "f0" },
2846 { 33, "f1" },
2847 { 34, "f2" },
2848 { 35, "f3" },
2849 { 36, "f4" },
2850 { 37, "f5" },
2851 { 38, "f6" },
2852 { 39, "f7" },
2853 { 40, "f8" },
2854 { 41, "f9" },
2855 { 42, "f10" },
2856 { 43, "f11" },
2857 { 44, "f12" },
2858 { 45, "f13" },
2859 { 46, "f14" },
2860 { 47, "f15" },
2861 { 48, "f16" },
2862 { 49, "f17" },
2863 { 50, "f18" },
2864 { 51, "f19" },
2865 { 52, "f20" },
2866 { 53, "f21" },
2867 { 54, "f22" },
2868 { 55, "f23" },
2869 { 56, "f24" },
2870 { 57, "f25" },
2871 { 58, "f26" },
2872 { 59, "f27" },
2873 { 60, "f28" },
2874 { 61, "f29" },
2875 { 62, "f30" },
2876 { 63, "f31" },
2877 { 64, "pc" },
2878 { 65, "cause" },
2879 { 66, "badvaddr" },
2880 { 67, "mmhi" },
2881 { 68, "mmlo" },
2882 { 69, "fpcsr" },
2883 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002884# elif defined(TILE)
2885 { PTREGS_OFFSET_REG(0), "r0" },
2886 { PTREGS_OFFSET_REG(1), "r1" },
2887 { PTREGS_OFFSET_REG(2), "r2" },
2888 { PTREGS_OFFSET_REG(3), "r3" },
2889 { PTREGS_OFFSET_REG(4), "r4" },
2890 { PTREGS_OFFSET_REG(5), "r5" },
2891 { PTREGS_OFFSET_REG(6), "r6" },
2892 { PTREGS_OFFSET_REG(7), "r7" },
2893 { PTREGS_OFFSET_REG(8), "r8" },
2894 { PTREGS_OFFSET_REG(9), "r9" },
2895 { PTREGS_OFFSET_REG(10), "r10" },
2896 { PTREGS_OFFSET_REG(11), "r11" },
2897 { PTREGS_OFFSET_REG(12), "r12" },
2898 { PTREGS_OFFSET_REG(13), "r13" },
2899 { PTREGS_OFFSET_REG(14), "r14" },
2900 { PTREGS_OFFSET_REG(15), "r15" },
2901 { PTREGS_OFFSET_REG(16), "r16" },
2902 { PTREGS_OFFSET_REG(17), "r17" },
2903 { PTREGS_OFFSET_REG(18), "r18" },
2904 { PTREGS_OFFSET_REG(19), "r19" },
2905 { PTREGS_OFFSET_REG(20), "r20" },
2906 { PTREGS_OFFSET_REG(21), "r21" },
2907 { PTREGS_OFFSET_REG(22), "r22" },
2908 { PTREGS_OFFSET_REG(23), "r23" },
2909 { PTREGS_OFFSET_REG(24), "r24" },
2910 { PTREGS_OFFSET_REG(25), "r25" },
2911 { PTREGS_OFFSET_REG(26), "r26" },
2912 { PTREGS_OFFSET_REG(27), "r27" },
2913 { PTREGS_OFFSET_REG(28), "r28" },
2914 { PTREGS_OFFSET_REG(29), "r29" },
2915 { PTREGS_OFFSET_REG(30), "r30" },
2916 { PTREGS_OFFSET_REG(31), "r31" },
2917 { PTREGS_OFFSET_REG(32), "r32" },
2918 { PTREGS_OFFSET_REG(33), "r33" },
2919 { PTREGS_OFFSET_REG(34), "r34" },
2920 { PTREGS_OFFSET_REG(35), "r35" },
2921 { PTREGS_OFFSET_REG(36), "r36" },
2922 { PTREGS_OFFSET_REG(37), "r37" },
2923 { PTREGS_OFFSET_REG(38), "r38" },
2924 { PTREGS_OFFSET_REG(39), "r39" },
2925 { PTREGS_OFFSET_REG(40), "r40" },
2926 { PTREGS_OFFSET_REG(41), "r41" },
2927 { PTREGS_OFFSET_REG(42), "r42" },
2928 { PTREGS_OFFSET_REG(43), "r43" },
2929 { PTREGS_OFFSET_REG(44), "r44" },
2930 { PTREGS_OFFSET_REG(45), "r45" },
2931 { PTREGS_OFFSET_REG(46), "r46" },
2932 { PTREGS_OFFSET_REG(47), "r47" },
2933 { PTREGS_OFFSET_REG(48), "r48" },
2934 { PTREGS_OFFSET_REG(49), "r49" },
2935 { PTREGS_OFFSET_REG(50), "r50" },
2936 { PTREGS_OFFSET_REG(51), "r51" },
2937 { PTREGS_OFFSET_REG(52), "r52" },
2938 { PTREGS_OFFSET_TP, "tp" },
2939 { PTREGS_OFFSET_SP, "sp" },
2940 { PTREGS_OFFSET_LR, "lr" },
2941 { PTREGS_OFFSET_PC, "pc" },
2942 { PTREGS_OFFSET_EX1, "ex1" },
2943 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
2944 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
2945 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002946# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00002947# ifdef CRISV10
2948 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
2949 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2950 { 4*PT_R13, "4*PT_R13" },
2951 { 4*PT_R12, "4*PT_R12" },
2952 { 4*PT_R11, "4*PT_R11" },
2953 { 4*PT_R10, "4*PT_R10" },
2954 { 4*PT_R9, "4*PT_R9" },
2955 { 4*PT_R8, "4*PT_R8" },
2956 { 4*PT_R7, "4*PT_R7" },
2957 { 4*PT_R6, "4*PT_R6" },
2958 { 4*PT_R5, "4*PT_R5" },
2959 { 4*PT_R4, "4*PT_R4" },
2960 { 4*PT_R3, "4*PT_R3" },
2961 { 4*PT_R2, "4*PT_R2" },
2962 { 4*PT_R1, "4*PT_R1" },
2963 { 4*PT_R0, "4*PT_R0" },
2964 { 4*PT_MOF, "4*PT_MOF" },
2965 { 4*PT_DCCR, "4*PT_DCCR" },
2966 { 4*PT_SRP, "4*PT_SRP" },
2967 { 4*PT_IRP, "4*PT_IRP" },
2968 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
2969 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
2970 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
2971 { 4*PT_USP, "4*PT_USP" },
2972# endif
2973# ifdef CRISV32
2974 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2975 { 4*PT_R0, "4*PT_R0" },
2976 { 4*PT_R1, "4*PT_R1" },
2977 { 4*PT_R2, "4*PT_R2" },
2978 { 4*PT_R3, "4*PT_R3" },
2979 { 4*PT_R4, "4*PT_R4" },
2980 { 4*PT_R5, "4*PT_R5" },
2981 { 4*PT_R6, "4*PT_R6" },
2982 { 4*PT_R7, "4*PT_R7" },
2983 { 4*PT_R8, "4*PT_R8" },
2984 { 4*PT_R9, "4*PT_R9" },
2985 { 4*PT_R10, "4*PT_R10" },
2986 { 4*PT_R11, "4*PT_R11" },
2987 { 4*PT_R12, "4*PT_R12" },
2988 { 4*PT_R13, "4*PT_R13" },
2989 { 4*PT_ACR, "4*PT_ACR" },
2990 { 4*PT_SRS, "4*PT_SRS" },
2991 { 4*PT_MOF, "4*PT_MOF" },
2992 { 4*PT_SPC, "4*PT_SPC" },
2993 { 4*PT_CCS, "4*PT_CCS" },
2994 { 4*PT_SRP, "4*PT_SRP" },
2995 { 4*PT_ERP, "4*PT_ERP" },
2996 { 4*PT_EXS, "4*PT_EXS" },
2997 { 4*PT_EDA, "4*PT_EDA" },
2998 { 4*PT_USP, "4*PT_USP" },
2999 { 4*PT_PPC, "4*PT_PPC" },
3000 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3001 { 4*PT_BP+4, "4*PT_BP+4" },
3002 { 4*PT_BP+8, "4*PT_BP+8" },
3003 { 4*PT_BP+12, "4*PT_BP+12" },
3004 { 4*PT_BP+16, "4*PT_BP+16" },
3005 { 4*PT_BP+20, "4*PT_BP+20" },
3006 { 4*PT_BP+24, "4*PT_BP+24" },
3007 { 4*PT_BP+28, "4*PT_BP+28" },
3008 { 4*PT_BP+32, "4*PT_BP+32" },
3009 { 4*PT_BP+36, "4*PT_BP+36" },
3010 { 4*PT_BP+40, "4*PT_BP+40" },
3011 { 4*PT_BP+44, "4*PT_BP+44" },
3012 { 4*PT_BP+48, "4*PT_BP+48" },
3013 { 4*PT_BP+52, "4*PT_BP+52" },
3014 { 4*PT_BP+56, "4*PT_BP+56" },
3015# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003016# ifdef MICROBLAZE
3017 { PT_GPR(0), "r0" },
3018 { PT_GPR(1), "r1" },
3019 { PT_GPR(2), "r2" },
3020 { PT_GPR(3), "r3" },
3021 { PT_GPR(4), "r4" },
3022 { PT_GPR(5), "r5" },
3023 { PT_GPR(6), "r6" },
3024 { PT_GPR(7), "r7" },
3025 { PT_GPR(8), "r8" },
3026 { PT_GPR(9), "r9" },
3027 { PT_GPR(10), "r10" },
3028 { PT_GPR(11), "r11" },
3029 { PT_GPR(12), "r12" },
3030 { PT_GPR(13), "r13" },
3031 { PT_GPR(14), "r14" },
3032 { PT_GPR(15), "r15" },
3033 { PT_GPR(16), "r16" },
3034 { PT_GPR(17), "r17" },
3035 { PT_GPR(18), "r18" },
3036 { PT_GPR(19), "r19" },
3037 { PT_GPR(20), "r20" },
3038 { PT_GPR(21), "r21" },
3039 { PT_GPR(22), "r22" },
3040 { PT_GPR(23), "r23" },
3041 { PT_GPR(24), "r24" },
3042 { PT_GPR(25), "r25" },
3043 { PT_GPR(26), "r26" },
3044 { PT_GPR(27), "r27" },
3045 { PT_GPR(28), "r28" },
3046 { PT_GPR(29), "r29" },
3047 { PT_GPR(30), "r30" },
3048 { PT_GPR(31), "r31" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003049 { PT_PC, "rpc", },
3050 { PT_MSR, "rmsr", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003051 { PT_EAR, "rear", },
3052 { PT_ESR, "resr", },
3053 { PT_FSR, "rfsr", },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003054 { PT_KERNEL_MODE, "kernel_mode", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003055# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003056
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003057# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3058 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003059 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003060# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003061 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003062# endif
3063# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003064 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003065# endif
3066# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003067 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003068# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003069 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3070 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3071 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003072# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003073 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003074# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003075# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003076 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003077# endif
3078# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003079 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003080# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003081 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003082# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003083 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003084# endif
3085# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003086 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003087# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003088# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003089 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003090# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003091 { uoff(magic), "offsetof(struct user, magic)" },
3092 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003093# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003094 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003095# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003096# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003097
3098# endif /* LINUX */
3099
3100# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003101 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3102 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3103 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3104 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3105 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3106 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3107 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3108 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3109 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3110 { uoff(u_error), "offsetof(struct user, u_error)" },
3111 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3112 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3113 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3114 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3115 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3116 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3117 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3118 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3119 { uoff(u_code), "offsetof(struct user, u_code)" },
3120 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3121 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3122 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3123 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3124 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3125 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3126 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3127 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3128 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3129 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3130 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3131 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3132 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3133 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3134 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3135 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3136 { uoff(u_start), "offsetof(struct user, u_start)" },
3137 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3138 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3139 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3140 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3141 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3142 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3143 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3144 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3145 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003146# endif /* SUNOS4 */
3147# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003148 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003149# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003150 { 0, NULL },
3151};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003152# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003153
3154int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003155sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003156{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003157 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003158 long addr;
3159
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003160 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003161 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003162# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003163 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003164# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003165 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003166# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003167 );
3168 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003169 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003170# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003171 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3172 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3173 for (x = struct_user_offsets; x->str; x++) {
3174 if (x->val >= addr)
3175 break;
3176 }
3177 if (!x->str)
3178 tprintf("%#lx, ", addr);
3179 else if (x->val > addr && x != struct_user_offsets) {
3180 x--;
3181 tprintf("%s + %ld, ", x->str, addr - x->val);
3182 }
3183 else
3184 tprintf("%s, ", x->str);
3185 }
3186 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003187# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003188 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003189# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003190 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003191# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003192 case PTRACE_PEEKDATA:
3193 case PTRACE_PEEKTEXT:
3194 case PTRACE_PEEKUSER:
3195 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003196# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003197 case PTRACE_CONT:
3198 case PTRACE_SINGLESTEP:
3199 case PTRACE_SYSCALL:
3200 case PTRACE_DETACH:
3201 printsignal(tcp->u_arg[3]);
3202 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003203# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003204 case PTRACE_SETOPTIONS:
3205 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3206 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003207# endif
3208# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003209 case PTRACE_SETSIGINFO: {
3210 siginfo_t si;
3211 if (!tcp->u_arg[3])
3212 tprintf("NULL");
3213 else if (syserror(tcp))
3214 tprintf("%#lx", tcp->u_arg[3]);
3215 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3216 tprintf("{???}");
3217 else
3218 printsiginfo(&si, verbose(tcp));
3219 break;
3220 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003221# endif
3222# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003223 case PTRACE_GETSIGINFO:
3224 /* Don't print anything, do it at syscall return. */
3225 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003226# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003227 default:
3228 tprintf("%#lx", tcp->u_arg[3]);
3229 break;
3230 }
3231 } else {
3232 switch (tcp->u_arg[0]) {
3233 case PTRACE_PEEKDATA:
3234 case PTRACE_PEEKTEXT:
3235 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003236# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003237 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003238# else
Roland McGratheb285352003-01-14 09:59:00 +00003239 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003240 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003241# endif
3242# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003243 case PTRACE_GETSIGINFO: {
3244 siginfo_t si;
3245 if (!tcp->u_arg[3])
3246 tprintf("NULL");
3247 else if (syserror(tcp))
3248 tprintf("%#lx", tcp->u_arg[3]);
3249 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3250 tprintf("{???}");
3251 else
3252 printsiginfo(&si, verbose(tcp));
3253 break;
3254 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003255# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003256 }
3257 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003258# endif /* LINUX */
3259# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003260 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3261 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3262 tprintf("%lu, ", tcp->u_arg[3]);
3263 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3264 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3265 tcp->u_arg[0] != PTRACE_READTEXT) {
3266 tprintf("%#lx", tcp->u_arg[3]);
3267 }
3268 } else {
3269 if (tcp->u_arg[0] == PTRACE_READDATA ||
3270 tcp->u_arg[0] == PTRACE_READTEXT) {
3271 tprintf("%lu, ", tcp->u_arg[3]);
3272 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3273 }
3274 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003275# endif /* SUNOS4 */
3276# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003277 tprintf("%lu", tcp->u_arg[3]);
3278 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003279# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003280 return 0;
3281}
3282
3283#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003284
3285#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003286# ifndef FUTEX_CMP_REQUEUE
3287# define FUTEX_CMP_REQUEUE 4
3288# endif
3289# ifndef FUTEX_WAKE_OP
3290# define FUTEX_WAKE_OP 5
3291# endif
3292# ifndef FUTEX_LOCK_PI
3293# define FUTEX_LOCK_PI 6
3294# define FUTEX_UNLOCK_PI 7
3295# define FUTEX_TRYLOCK_PI 8
3296# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003297# ifndef FUTEX_WAIT_BITSET
3298# define FUTEX_WAIT_BITSET 9
3299# endif
3300# ifndef FUTEX_WAKE_BITSET
3301# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003302# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003303# ifndef FUTEX_WAIT_REQUEUE_PI
3304# define FUTEX_WAIT_REQUEUE_PI 11
3305# endif
3306# ifndef FUTEX_CMP_REQUEUE_PI
3307# define FUTEX_CMP_REQUEUE_PI 12
3308# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003309# ifndef FUTEX_PRIVATE_FLAG
3310# define FUTEX_PRIVATE_FLAG 128
3311# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003312# ifndef FUTEX_CLOCK_REALTIME
3313# define FUTEX_CLOCK_REALTIME 256
3314# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003315static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003316 { FUTEX_WAIT, "FUTEX_WAIT" },
3317 { FUTEX_WAKE, "FUTEX_WAKE" },
3318 { FUTEX_FD, "FUTEX_FD" },
3319 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3320 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3321 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3322 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3323 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3324 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003325 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3326 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003327 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3328 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003329 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3330 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3331 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3332 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3333 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3334 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3335 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3336 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3337 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003338 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3339 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003340 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3341 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3342 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3343 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3344 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3345 { 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 +00003346 { 0, NULL }
3347};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003348# ifndef FUTEX_OP_SET
3349# define FUTEX_OP_SET 0
3350# define FUTEX_OP_ADD 1
3351# define FUTEX_OP_OR 2
3352# define FUTEX_OP_ANDN 3
3353# define FUTEX_OP_XOR 4
3354# define FUTEX_OP_CMP_EQ 0
3355# define FUTEX_OP_CMP_NE 1
3356# define FUTEX_OP_CMP_LT 2
3357# define FUTEX_OP_CMP_LE 3
3358# define FUTEX_OP_CMP_GT 4
3359# define FUTEX_OP_CMP_GE 5
3360# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003361static const struct xlat futexwakeops[] = {
3362 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3363 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3364 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3365 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3366 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3367 { 0, NULL }
3368};
3369static const struct xlat futexwakecmps[] = {
3370 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3371 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3372 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3373 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3374 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3375 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3376 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003377};
3378
3379int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003380sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003381{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003382 if (entering(tcp)) {
3383 long int cmd = tcp->u_arg[1] & 127;
3384 tprintf("%p, ", (void *) tcp->u_arg[0]);
3385 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3386 tprintf(", %ld", tcp->u_arg[2]);
3387 if (cmd == FUTEX_WAKE_BITSET)
3388 tprintf(", %lx", tcp->u_arg[5]);
3389 else if (cmd == FUTEX_WAIT) {
3390 tprintf(", ");
3391 printtv(tcp, tcp->u_arg[3]);
3392 } else if (cmd == FUTEX_WAIT_BITSET) {
3393 tprintf(", ");
3394 printtv(tcp, tcp->u_arg[3]);
3395 tprintf(", %lx", tcp->u_arg[5]);
3396 } else if (cmd == FUTEX_REQUEUE)
3397 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003398 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003399 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3400 else if (cmd == FUTEX_WAKE_OP) {
3401 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3402 if ((tcp->u_arg[5] >> 28) & 8)
3403 tprintf("FUTEX_OP_OPARG_SHIFT|");
3404 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3405 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3406 if ((tcp->u_arg[5] >> 24) & 8)
3407 tprintf("FUTEX_OP_OPARG_SHIFT|");
3408 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3409 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003410 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3411 tprintf(", ");
3412 printtv(tcp, tcp->u_arg[3]);
3413 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003414 }
Roland McGrath51942a92007-07-05 18:59:11 +00003415 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003416 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003417}
3418
3419static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003420print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003421{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003422 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003423 unsigned long w, min_len;
3424
3425 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3426 min_len = len - max_strlen * sizeof(w);
3427 else
3428 min_len = 0;
3429 for (; len >= sizeof(w) && len > min_len;
3430 len -= sizeof(w), list += sizeof(w)) {
3431 if (umove(tcp, list, &w) < 0)
3432 break;
3433 if (first)
3434 tprintf("{");
3435 else
3436 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003437 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003438 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003439 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003440 if (len) {
3441 if (first)
3442 tprintf("%#lx", list);
3443 else
3444 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3445 "???" : "..."));
3446 } else {
3447 tprintf(first ? "{}" : "}");
3448 }
Roland McGrath5a223472002-12-15 23:58:26 +00003449}
3450
3451int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003452sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003453{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003454 if (entering(tcp)) {
3455 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3456 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3457 }
3458 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003459}
3460
3461int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003462sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003463{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003464 if (entering(tcp)) {
3465 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3466 } else {
3467 if (tcp->u_rval == -1)
3468 tprintf("%#lx", tcp->u_arg[2]);
3469 else
3470 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3471 }
3472 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003473}
Roland McGrath279d3782004-03-01 20:27:37 +00003474
Roland McGrathd9f816f2004-09-04 03:39:20 +00003475static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003476 { SCHED_OTHER, "SCHED_OTHER" },
3477 { SCHED_RR, "SCHED_RR" },
3478 { SCHED_FIFO, "SCHED_FIFO" },
3479 { 0, NULL }
3480};
3481
3482int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003483sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003484{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003485 if (entering(tcp)) {
3486 tprintf("%d", (int) tcp->u_arg[0]);
3487 } else if (! syserror(tcp)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003488 tcp->auxstr = xlookup(schedulers, tcp->u_rval);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003489 if (tcp->auxstr != NULL)
3490 return RVAL_STR;
3491 }
3492 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003493}
3494
3495int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003496sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003497{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003498 if (entering(tcp)) {
3499 struct sched_param p;
3500 tprintf("%d, ", (int) tcp->u_arg[0]);
3501 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3502 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3503 tprintf(", %#lx", tcp->u_arg[2]);
3504 else
3505 tprintf(", { %d }", p.__sched_priority);
3506 }
3507 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003508}
3509
3510int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003511sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003512{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003513 if (entering(tcp)) {
3514 tprintf("%d, ", (int) tcp->u_arg[0]);
3515 } else {
3516 struct sched_param p;
3517 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3518 tprintf("%#lx", tcp->u_arg[1]);
3519 else
3520 tprintf("{ %d }", p.__sched_priority);
3521 }
3522 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003523}
3524
3525int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003526sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003527{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003528 if (entering(tcp)) {
3529 struct sched_param p;
3530 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3531 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3532 else
3533 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3534 }
3535 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003536}
3537
3538int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003539sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003540{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003541 if (entering(tcp)) {
3542 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3543 }
3544 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003545}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003546
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003547# ifdef X86_64
3548# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003549
3550static const struct xlat archvals[] = {
3551 { ARCH_SET_GS, "ARCH_SET_GS" },
3552 { ARCH_SET_FS, "ARCH_SET_FS" },
3553 { ARCH_GET_FS, "ARCH_GET_FS" },
3554 { ARCH_GET_GS, "ARCH_GET_GS" },
3555 { 0, NULL },
3556};
3557
3558int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003559sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003560{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003561 if (entering(tcp)) {
3562 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3563 if (tcp->u_arg[0] == ARCH_SET_GS
3564 || tcp->u_arg[0] == ARCH_SET_FS
3565 ) {
3566 tprintf(", %#lx", tcp->u_arg[1]);
3567 }
3568 } else {
3569 if (tcp->u_arg[0] == ARCH_GET_GS
3570 || tcp->u_arg[0] == ARCH_GET_FS
3571 ) {
3572 long int v;
3573 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3574 tprintf(", [%#lx]", v);
3575 else
3576 tprintf(", %#lx", tcp->u_arg[1]);
3577 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003578 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003579 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003580}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003581# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003582
Roland McGrathdb8319f2007-08-02 01:37:55 +00003583
3584int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003585sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003586{
3587 if (exiting(tcp)) {
3588 unsigned u;
3589 if (tcp->u_arg[0] == 0)
3590 tprintf("NULL, ");
3591 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3592 tprintf("%#lx, ", tcp->u_arg[0]);
3593 else
3594 tprintf("[%u], ", u);
3595 if (tcp->u_arg[1] == 0)
3596 tprintf("NULL, ");
3597 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3598 tprintf("%#lx, ", tcp->u_arg[1]);
3599 else
3600 tprintf("[%u], ", u);
3601 tprintf("%#lx", tcp->u_arg[2]);
3602 }
3603 return 0;
3604}
3605
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003606#endif /* LINUX */