blob: 7aa5aa43831d70bf87e4a25fd27bb42a8b31853b [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
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000451#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000452
453int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000454sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000455{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000456 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000457 if (getrval2(tcp)) {
458 tcp->auxstr = "child process";
459 return RVAL_UDECIMAL | RVAL_STR;
460 }
461 }
462 return 0;
463}
464
John Hughes4e36a812001-04-18 15:11:51 +0000465#if UNIXWARE > 2
466
467int
Denys Vlasenko12014262011-05-30 14:00:14 +0200468sys_rfork(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +0000469{
470 if (entering(tcp)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200471 tprintf("%ld", tcp->u_arg[0]);
John Hughes4e36a812001-04-18 15:11:51 +0000472 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000473 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000474 if (getrval2(tcp)) {
475 tcp->auxstr = "child process";
476 return RVAL_UDECIMAL | RVAL_STR;
477 }
478 }
479 return 0;
480}
481
482#endif
483
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000484int
Denys Vlasenko12014262011-05-30 14:00:14 +0200485internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000486{
487 struct tcb *tcpchild;
488
489 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000490#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000491 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000492 return 0;
493#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000494 if (getrval2(tcp))
495 return 0;
496 if (!followfork)
497 return 0;
Denys Vlasenko2b60c352011-06-22 12:45:25 +0200498 tcp->flags |= TCB_FOLLOWFORK;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000499 if (syserror(tcp))
500 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000501 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000502 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000503 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000504 }
505 return 0;
506}
507
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000508#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000509
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000510#ifdef LINUX
511
512/* defines copied from linux/sched.h since we can't include that
513 * ourselves (it conflicts with *lots* of libc includes)
514 */
515#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
516#define CLONE_VM 0x00000100 /* set if VM shared between processes */
517#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
518#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
519#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000520#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000521#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
522#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
523#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000524#define CLONE_THREAD 0x00010000 /* Same thread group? */
525#define CLONE_NEWNS 0x00020000 /* New namespace group? */
526#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
527#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
528#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
529#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
Roland McGrath909875b2002-12-22 03:34:36 +0000530#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
531#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000532#define CLONE_STOPPED 0x02000000 /* Start in stopped state */
533#define CLONE_NEWUTS 0x04000000 /* New utsname group? */
534#define CLONE_NEWIPC 0x08000000 /* New ipcs */
535#define CLONE_NEWUSER 0x10000000 /* New user namespace */
536#define CLONE_NEWPID 0x20000000 /* New pid namespace */
537#define CLONE_NEWNET 0x40000000 /* New network namespace */
538#define CLONE_IO 0x80000000 /* Clone io context */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000539
Roland McGrathd9f816f2004-09-04 03:39:20 +0000540static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000541 { CLONE_VM, "CLONE_VM" },
542 { CLONE_FS, "CLONE_FS" },
543 { CLONE_FILES, "CLONE_FILES" },
544 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000545 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000546 { CLONE_PTRACE, "CLONE_PTRACE" },
547 { CLONE_VFORK, "CLONE_VFORK" },
548 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000549 { CLONE_THREAD, "CLONE_THREAD" },
550 { CLONE_NEWNS, "CLONE_NEWNS" },
551 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
552 { CLONE_SETTLS, "CLONE_SETTLS" },
553 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
554 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
Roland McGrath909875b2002-12-22 03:34:36 +0000555 { CLONE_UNTRACED, "CLONE_UNTRACED" },
556 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000557 { CLONE_STOPPED, "CLONE_STOPPED" },
558 { CLONE_NEWUTS, "CLONE_NEWUTS" },
559 { CLONE_NEWIPC, "CLONE_NEWIPC" },
560 { CLONE_NEWUSER, "CLONE_NEWUSER" },
561 { CLONE_NEWPID, "CLONE_NEWPID" },
562 { CLONE_NEWNET, "CLONE_NEWNET" },
563 { CLONE_IO, "CLONE_IO" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000564 { 0, NULL },
565};
566
Roland McGrath909875b2002-12-22 03:34:36 +0000567# ifdef I386
568# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000569# ifdef HAVE_STRUCT_USER_DESC
570# define modify_ldt_ldt_s user_desc
571# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000572extern void print_ldt_entry();
573# endif
574
Roland McGrath9677b3a2003-03-12 09:54:36 +0000575# if defined IA64
576# define ARG_FLAGS 0
577# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000578# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
579# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
580# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
581# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000582# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000583# define ARG_STACK 0
584# define ARG_FLAGS 1
585# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000586# define ARG_CTID 3
587# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000588# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000589# define ARG_FLAGS 0
590# define ARG_STACK 1
591# define ARG_PTID 2
592# define ARG_CTID 3
593# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000594# else
595# define ARG_FLAGS 0
596# define ARG_STACK 1
597# define ARG_PTID 2
598# define ARG_TLS 3
599# define ARG_CTID 4
600# endif
601
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000602int
Denys Vlasenko12014262011-05-30 14:00:14 +0200603sys_clone(struct tcb *tcp)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000604{
605 if (exiting(tcp)) {
Wang Chaocbdd1902010-09-02 15:08:59 +0800606 const char *sep = "|";
Roland McGrath9677b3a2003-03-12 09:54:36 +0000607 unsigned long flags = tcp->u_arg[ARG_FLAGS];
608 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
609# ifdef ARG_STACKSIZE
610 if (ARG_STACKSIZE != -1)
611 tprintf("stack_size=%#lx, ",
612 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000613# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000614 tprintf("flags=");
Wang Chaocbdd1902010-09-02 15:08:59 +0800615 if (!printflags(clone_flags, flags &~ CSIGNAL, NULL))
616 sep = "";
Roland McGrath984154d2003-05-23 01:08:42 +0000617 if ((flags & CSIGNAL) != 0)
Wang Chaocbdd1902010-09-02 15:08:59 +0800618 tprintf("%s%s", sep, signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000619 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000620 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000621 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000622 if (flags & CLONE_PARENT_SETTID)
623 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000624 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000625# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000626 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000627 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000628 tprintf(", {entry_number:%d, ",
629 copy.entry_number);
630 if (!verbose(tcp))
631 tprintf("...}");
632 else
633 print_ldt_entry(&copy);
634 }
635 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000636# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000637 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000638 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000639 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
640 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000641 }
642 return 0;
643}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000644
645int
646sys_unshare(struct tcb *tcp)
647{
648 if (entering(tcp))
649 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
650 return 0;
651}
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000652#endif /* LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000653
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000654int
Denys Vlasenko12014262011-05-30 14:00:14 +0200655sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000656{
657 if (exiting(tcp))
658 return RVAL_UDECIMAL;
659 return 0;
660}
661
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000662int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000663change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000664{
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000665#ifdef LINUX
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000666#if defined(I386)
667 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000668 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000669 return -1;
670 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000671#elif defined(X86_64)
672 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000673 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000674 return -1;
675 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000676#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000677 if (ptrace(PTRACE_POKEUSER, tcp->pid,
678 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000679 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000680 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000681#elif defined(S390) || defined(S390X)
682 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200683 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000684 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000685 return 0;
686#elif defined(M68K)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200687 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000688 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000689 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000690#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400691 struct pt_regs regs;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200692 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0) < 0)
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000693 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400694 regs.u_regs[U_REG_G1] = new;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200695 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000696 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000697 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000698#elif defined(MIPS)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200699 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000700 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701 return 0;
702#elif defined(ALPHA)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200703 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000704 return -1;
705 return 0;
706#elif defined(AVR32)
707 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
708 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000709 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000710#elif defined(BFIN)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200711 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new) < 0)
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000712 return -1;
713 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000714#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000715 if (ia32) {
716 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000717 case 2:
718 break; /* x86 SYS_fork */
719 case SYS_clone:
720 new = 120;
721 break;
722 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000723 fprintf(stderr, "%s: unexpected syscall %d\n",
724 __FUNCTION__, new);
725 return -1;
726 }
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200727 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0)
Roland McGrath08267b82004-02-20 22:56:43 +0000728 return -1;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200729 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new) < 0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000730 return -1;
731 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000732#elif defined(HPPA)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200733 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000734 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000735 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000736#elif defined(SH)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200737 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000738 return -1;
739 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000740#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000741 /* Top half of reg encodes the no. of args n as 0x1n.
742 Assume 0 args as kernel never actually checks... */
743 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
744 0x100000 | new) < 0)
745 return -1;
746 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000747#elif defined(CRISV10) || defined(CRISV32)
748 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
749 return -1;
750 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000751#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000752 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000753# ifndef PTRACE_SET_SYSCALL
754# define PTRACE_SET_SYSCALL 23
755# endif
756
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200757 if (ptrace(PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000758 return -1;
759
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000760 return 0;
Chris Metcalfc8c66982009-12-28 10:00:15 -0500761#elif defined(TILE)
762 if (ptrace(PTRACE_POKEUSER, tcp->pid,
763 (char*)PTREGS_OFFSET_REG(0),
764 new) != 0)
765 return -1;
766 return 0;
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200767#elif defined(MICROBLAZE)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200768 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0)
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200769 return -1;
770 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000771#else
772#warning Do not know how to handle change_syscall for this architecture
773#endif /* architecture */
774#endif /* LINUX */
775 return -1;
776}
777
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000778#ifdef LINUX
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000779int
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800780handle_new_child(struct tcb *tcp, int pid, int bpt)
781{
782 struct tcb *tcpchild;
783
784#ifdef CLONE_PTRACE /* See new setbpt code. */
785 tcpchild = pid2tcb(pid);
786 if (tcpchild != NULL) {
787 /* The child already reported its startup trap
788 before the parent reported its syscall return. */
789 if ((tcpchild->flags
790 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
791 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
792 fprintf(stderr, "\
793[preattached child %d of %d in weird state!]\n",
794 pid, tcp->pid);
795 }
796 else
797#endif /* CLONE_PTRACE */
798 {
Denys Vlasenko2b60c352011-06-22 12:45:25 +0200799 tcp->flags |= TCB_FOLLOWFORK;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800800 tcpchild = alloctcb(pid);
801 }
802
803#ifndef CLONE_PTRACE
804 /* Attach to the new child */
805 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
806 if (bpt)
807 clearbpt(tcp);
808 perror("PTRACE_ATTACH");
809 fprintf(stderr, "Too late?\n");
810 droptcb(tcpchild);
811 return 0;
812 }
813#endif /* !CLONE_PTRACE */
814
815 if (bpt)
816 clearbpt(tcp);
817
818 tcpchild->flags |= TCB_ATTACHED;
819 /* Child has BPT too, must be removed on first occasion. */
820 if (bpt) {
821 tcpchild->flags |= TCB_BPTSET;
822 tcpchild->baddr = tcp->baddr;
823 memcpy(tcpchild->inst, tcp->inst,
824 sizeof tcpchild->inst);
825 }
826 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800827 if (tcpchild->flags & TCB_SUSPENDED) {
828 /* The child was born suspended, due to our having
829 forced CLONE_PTRACE. */
830 if (bpt)
831 clearbpt(tcpchild);
832
833 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
834 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
835 return -1;
836
837 if (!qflag)
838 fprintf(stderr, "\
839Process %u resumed (parent %d ready)\n",
840 pid, tcp->pid);
841 }
842 else {
843 if (!qflag)
844 fprintf(stderr, "Process %d attached\n", pid);
845 }
846
847#ifdef TCB_CLONE_THREAD
848 if (sysent[tcp->scno].sys_func == sys_clone)
849 {
850 /*
851 * Save the flags used in this call,
852 * in case we point TCP to our parent below.
853 */
854 int call_flags = tcp->u_arg[ARG_FLAGS];
855 if ((tcp->flags & TCB_CLONE_THREAD) &&
856 tcp->parent != NULL) {
857 /* The parent in this clone is itself a
858 thread belonging to another process.
859 There is no meaning to the parentage
860 relationship of the new child with the
861 thread, only with the process. We
862 associate the new thread with our
863 parent. Since this is done for every
864 new thread, there will never be a
865 TCB_CLONE_THREAD process that has
866 children. */
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800867 tcp = tcp->parent;
868 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800869 }
870 if (call_flags & CLONE_THREAD) {
871 tcpchild->flags |= TCB_CLONE_THREAD;
872 ++tcp->nclone_threads;
873 }
874 if ((call_flags & CLONE_PARENT) &&
875 !(call_flags & CLONE_THREAD)) {
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800876 tcpchild->parent = NULL;
877 if (tcp->parent != NULL) {
878 tcp = tcp->parent;
879 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800880 }
881 }
882 }
883#endif /* TCB_CLONE_THREAD */
884 return 0;
885}
886
887int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000888internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000889{
Denys Vlasenkof44cce42011-06-21 14:34:10 +0200890 if ((ptrace_setoptions
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800891 & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
892 == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
893 return 0;
894
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000895 if (entering(tcp)) {
Wang Chaoe636c852010-09-16 11:20:56 +0800896 tcp->flags &= ~TCB_FOLLOWFORK;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700897 if (!followfork)
898 return 0;
Wang Chaoe636c852010-09-16 11:20:56 +0800899 /*
900 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
901 * new child if clone is called with flag CLONE_UNTRACED, so
902 * we keep the same logic with that option and don't trace it.
903 */
904 if ((sysent[tcp->scno].sys_func == sys_clone) &&
905 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
906 return 0;
Denys Vlasenko2b60c352011-06-22 12:45:25 +0200907 tcp->flags |= TCB_FOLLOWFORK;
Denys Vlasenkoe7c90242011-06-22 00:09:25 +0200908 setbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000909 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000910 int pid;
911 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700912
913 if (!(tcp->flags & TCB_FOLLOWFORK))
914 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000915
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000916 bpt = tcp->flags & TCB_BPTSET;
917
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000918 if (syserror(tcp)) {
919 if (bpt)
920 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000921 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000922 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000923
924 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000925
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800926 return handle_new_child(tcp, pid, bpt);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000927 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000928 return 0;
929}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000930
931#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000932
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000933int
Denys Vlasenko12014262011-05-30 14:00:14 +0200934internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000935{
936 struct tcb *tcpchild;
937 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700938 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000939
940#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000941 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000942 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000943 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700944 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000945 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000946#endif
947 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700948 if (!followfork || dont_follow)
949 return 0;
Denys Vlasenko2b60c352011-06-22 12:45:25 +0200950 tcp->flags |= TCB_FOLLOWFORK;
Denys Vlasenkoe7c90242011-06-22 00:09:25 +0200951 setbpt(tcp);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000952 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000953 else {
954 int bpt = tcp->flags & TCB_BPTSET;
955
Roland McGratheb9e2e82009-06-02 16:49:22 -0700956 if (!(tcp->flags & TCB_FOLLOWFORK))
957 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000958 if (bpt)
959 clearbpt(tcp);
960
961 if (syserror(tcp))
962 return 0;
963
964 pid = tcp->u_rval;
Denys Vlasenko2b60c352011-06-22 12:45:25 +0200965 tcp->flags |= TCB_FOLLOWFORK;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000966 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000967#ifdef SUNOS4
968#ifdef oldway
969 /* The child must have run before it can be attached. */
970 {
971 struct timeval tv;
972 tv.tv_sec = 0;
973 tv.tv_usec = 10000;
974 select(0, NULL, NULL, NULL, &tv);
975 }
976 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
977 perror("PTRACE_ATTACH");
978 fprintf(stderr, "Too late?\n");
979 droptcb(tcpchild);
980 return 0;
981 }
982#else /* !oldway */
983 /* Try to catch the new process as soon as possible. */
984 {
985 int i;
986 for (i = 0; i < 1024; i++)
987 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
988 break;
989 if (i == 1024) {
990 perror("PTRACE_ATTACH");
991 fprintf(stderr, "Too late?\n");
992 droptcb(tcpchild);
993 return 0;
994 }
995 }
996#endif /* !oldway */
997#endif /* SUNOS4 */
998 tcpchild->flags |= TCB_ATTACHED;
999 /* Child has BPT too, must be removed on first occasion */
1000 if (bpt) {
1001 tcpchild->flags |= TCB_BPTSET;
1002 tcpchild->baddr = tcp->baddr;
1003 memcpy(tcpchild->inst, tcp->inst,
1004 sizeof tcpchild->inst);
1005 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001006 tcpchild->parent = tcp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001007 if (!qflag)
1008 fprintf(stderr, "Process %d attached\n", pid);
1009 }
1010 return 0;
1011}
1012
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001013#endif /* !LINUX */
1014
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001015#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001016
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001017#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001018
1019int
Denys Vlasenko12014262011-05-30 14:00:14 +02001020sys_vfork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001021{
1022 if (exiting(tcp))
1023 return RVAL_UDECIMAL;
1024 return 0;
1025}
1026
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001027#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001028
1029#ifndef LINUX
1030
1031static char idstr[16];
1032
1033int
Denys Vlasenko12014262011-05-30 14:00:14 +02001034sys_getpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001035{
1036 if (exiting(tcp)) {
1037 sprintf(idstr, "ppid %lu", getrval2(tcp));
1038 tcp->auxstr = idstr;
1039 return RVAL_STR;
1040 }
1041 return 0;
1042}
1043
1044int
Denys Vlasenko12014262011-05-30 14:00:14 +02001045sys_getuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001046{
1047 if (exiting(tcp)) {
1048 sprintf(idstr, "euid %lu", getrval2(tcp));
1049 tcp->auxstr = idstr;
1050 return RVAL_STR;
1051 }
1052 return 0;
1053}
1054
1055int
Denys Vlasenko12014262011-05-30 14:00:14 +02001056sys_getgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001057{
1058 if (exiting(tcp)) {
1059 sprintf(idstr, "egid %lu", getrval2(tcp));
1060 tcp->auxstr = idstr;
1061 return RVAL_STR;
1062 }
1063 return 0;
1064}
1065
1066#endif /* !LINUX */
1067
1068#ifdef LINUX
1069
Dmitry V. Levin50a218d2011-01-18 17:36:20 +00001070int sys_getuid(struct tcb *tcp)
1071{
1072 if (exiting(tcp))
1073 tcp->u_rval = (uid_t) tcp->u_rval;
1074 return RVAL_UDECIMAL;
1075}
1076
1077int sys_setfsuid(struct tcb *tcp)
1078{
1079 if (entering(tcp))
1080 tprintf("%u", (uid_t) tcp->u_arg[0]);
1081 else
1082 tcp->u_rval = (uid_t) tcp->u_rval;
1083 return RVAL_UDECIMAL;
1084}
1085
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001086int
Denys Vlasenko12014262011-05-30 14:00:14 +02001087sys_setuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001088{
1089 if (entering(tcp)) {
1090 tprintf("%u", (uid_t) tcp->u_arg[0]);
1091 }
1092 return 0;
1093}
1094
1095int
Denys Vlasenko12014262011-05-30 14:00:14 +02001096sys_setgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001097{
1098 if (entering(tcp)) {
1099 tprintf("%u", (gid_t) tcp->u_arg[0]);
1100 }
1101 return 0;
1102}
1103
1104int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001105sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001106{
1107 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001108 __kernel_uid_t uid;
1109 if (syserror(tcp))
1110 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1111 tcp->u_arg[1], tcp->u_arg[2]);
1112 else {
1113 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1114 tprintf("%#lx, ", tcp->u_arg[0]);
1115 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001116 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001117 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1118 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001119 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001120 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001121 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1122 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001123 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001124 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001125 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001126 }
1127 return 0;
1128}
1129
1130int
Denys Vlasenko12014262011-05-30 14:00:14 +02001131sys_getresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001132{
1133 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001134 __kernel_gid_t gid;
1135 if (syserror(tcp))
1136 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1137 tcp->u_arg[1], tcp->u_arg[2]);
1138 else {
1139 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1140 tprintf("%#lx, ", tcp->u_arg[0]);
1141 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001142 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001143 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1144 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001145 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001146 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001147 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1148 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001149 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001150 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001151 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001152 }
1153 return 0;
1154}
1155
1156#endif /* LINUX */
1157
1158int
Denys Vlasenko12014262011-05-30 14:00:14 +02001159sys_setreuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001160{
1161 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001162 printuid("", tcp->u_arg[0]);
1163 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001164 }
1165 return 0;
1166}
1167
1168int
Denys Vlasenko12014262011-05-30 14:00:14 +02001169sys_setregid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001170{
1171 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001172 printuid("", tcp->u_arg[0]);
1173 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001174 }
1175 return 0;
1176}
1177
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001178#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001179int
Denys Vlasenko12014262011-05-30 14:00:14 +02001180sys_setresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001181{
1182 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001183 printuid("", tcp->u_arg[0]);
1184 printuid(", ", tcp->u_arg[1]);
1185 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001186 }
1187 return 0;
1188}
1189int
Denys Vlasenko12014262011-05-30 14:00:14 +02001190sys_setresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001191{
1192 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001193 printuid("", tcp->u_arg[0]);
1194 printuid(", ", tcp->u_arg[1]);
1195 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001196 }
1197 return 0;
1198}
1199
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001200#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001201
1202int
Denys Vlasenko12014262011-05-30 14:00:14 +02001203sys_setgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001204{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001205 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001206 unsigned long len, size, start, cur, end, abbrev_end;
1207 GETGROUPS_T gid;
1208 int failed = 0;
1209
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001210 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001211 tprintf("%lu, ", len);
1212 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001213 tprintf("[]");
1214 return 0;
1215 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001216 start = tcp->u_arg[1];
1217 if (start == 0) {
1218 tprintf("NULL");
1219 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001220 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001221 size = len * sizeof(gid);
1222 end = start + size;
1223 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1224 tprintf("%#lx", start);
1225 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001226 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001227 if (abbrev(tcp)) {
1228 abbrev_end = start + max_strlen * sizeof(gid);
1229 if (abbrev_end < start)
1230 abbrev_end = end;
1231 } else {
1232 abbrev_end = end;
1233 }
1234 tprintf("[");
1235 for (cur = start; cur < end; cur += sizeof(gid)) {
1236 if (cur > start)
1237 tprintf(", ");
1238 if (cur >= abbrev_end) {
1239 tprintf("...");
1240 break;
1241 }
1242 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1243 tprintf("?");
1244 failed = 1;
1245 break;
1246 }
1247 tprintf("%lu", (unsigned long) gid);
1248 }
1249 tprintf("]");
1250 if (failed)
1251 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001252 }
1253 return 0;
1254}
1255
1256int
Denys Vlasenko12014262011-05-30 14:00:14 +02001257sys_getgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001258{
Roland McGrathaa524c82005-06-01 19:22:06 +00001259 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001260
1261 if (entering(tcp)) {
1262 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001263 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001264 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001265 unsigned long size, start, cur, end, abbrev_end;
1266 GETGROUPS_T gid;
1267 int failed = 0;
1268
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001269 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001270 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001271 tprintf("[]");
1272 return 0;
1273 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001274 start = tcp->u_arg[1];
1275 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001276 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001277 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001278 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001279 if (tcp->u_arg[0] == 0) {
1280 tprintf("%#lx", start);
1281 return 0;
1282 }
1283 size = len * sizeof(gid);
1284 end = start + size;
1285 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1286 size / sizeof(gid) != len || end < start) {
1287 tprintf("%#lx", start);
1288 return 0;
1289 }
1290 if (abbrev(tcp)) {
1291 abbrev_end = start + max_strlen * sizeof(gid);
1292 if (abbrev_end < start)
1293 abbrev_end = end;
1294 } else {
1295 abbrev_end = end;
1296 }
1297 tprintf("[");
1298 for (cur = start; cur < end; cur += sizeof(gid)) {
1299 if (cur > start)
1300 tprintf(", ");
1301 if (cur >= abbrev_end) {
1302 tprintf("...");
1303 break;
1304 }
1305 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1306 tprintf("?");
1307 failed = 1;
1308 break;
1309 }
1310 tprintf("%lu", (unsigned long) gid);
1311 }
1312 tprintf("]");
1313 if (failed)
1314 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001315 }
1316 return 0;
1317}
1318
Roland McGrath83bd47a2003-11-13 22:32:26 +00001319#ifdef LINUX
1320int
Denys Vlasenko12014262011-05-30 14:00:14 +02001321sys_setgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001322{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001323 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001324 unsigned long len, size, start, cur, end, abbrev_end;
1325 GETGROUPS32_T gid;
1326 int failed = 0;
1327
Roland McGrath83bd47a2003-11-13 22:32:26 +00001328 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001329 tprintf("%lu, ", len);
1330 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001331 tprintf("[]");
1332 return 0;
1333 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001334 start = tcp->u_arg[1];
1335 if (start == 0) {
1336 tprintf("NULL");
1337 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001338 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001339 size = len * sizeof(gid);
1340 end = start + size;
1341 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1342 tprintf("%#lx", start);
1343 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001344 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001345 if (abbrev(tcp)) {
1346 abbrev_end = start + max_strlen * sizeof(gid);
1347 if (abbrev_end < start)
1348 abbrev_end = end;
1349 } else {
1350 abbrev_end = end;
1351 }
1352 tprintf("[");
1353 for (cur = start; cur < end; cur += sizeof(gid)) {
1354 if (cur > start)
1355 tprintf(", ");
1356 if (cur >= abbrev_end) {
1357 tprintf("...");
1358 break;
1359 }
1360 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1361 tprintf("?");
1362 failed = 1;
1363 break;
1364 }
1365 tprintf("%lu", (unsigned long) gid);
1366 }
1367 tprintf("]");
1368 if (failed)
1369 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001370 }
1371 return 0;
1372}
1373
1374int
Denys Vlasenko12014262011-05-30 14:00:14 +02001375sys_getgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001376{
Roland McGrathaa524c82005-06-01 19:22:06 +00001377 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001378
1379 if (entering(tcp)) {
1380 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001381 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001382 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001383 unsigned long size, start, cur, end, abbrev_end;
1384 GETGROUPS32_T gid;
1385 int failed = 0;
1386
Roland McGrath83bd47a2003-11-13 22:32:26 +00001387 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001388 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001389 tprintf("[]");
1390 return 0;
1391 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001392 start = tcp->u_arg[1];
1393 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001394 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001395 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001396 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001397 size = len * sizeof(gid);
1398 end = start + size;
1399 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1400 size / sizeof(gid) != len || end < start) {
1401 tprintf("%#lx", start);
1402 return 0;
1403 }
1404 if (abbrev(tcp)) {
1405 abbrev_end = start + max_strlen * sizeof(gid);
1406 if (abbrev_end < start)
1407 abbrev_end = end;
1408 } else {
1409 abbrev_end = end;
1410 }
1411 tprintf("[");
1412 for (cur = start; cur < end; cur += sizeof(gid)) {
1413 if (cur > start)
1414 tprintf(", ");
1415 if (cur >= abbrev_end) {
1416 tprintf("...");
1417 break;
1418 }
1419 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1420 tprintf("?");
1421 failed = 1;
1422 break;
1423 }
1424 tprintf("%lu", (unsigned long) gid);
1425 }
1426 tprintf("]");
1427 if (failed)
1428 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001429 }
1430 return 0;
1431}
1432#endif /* LINUX */
1433
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001434#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001435int
Denys Vlasenko12014262011-05-30 14:00:14 +02001436sys_setpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001437{
1438 if (entering(tcp)) {
1439#ifndef SVR4
1440 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1441#endif /* !SVR4 */
1442 }
1443 return 0;
1444}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001445#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001446
1447int
Denys Vlasenko12014262011-05-30 14:00:14 +02001448sys_getpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001449{
1450 if (entering(tcp)) {
1451#ifndef SVR4
1452 tprintf("%lu", tcp->u_arg[0]);
1453#endif /* !SVR4 */
1454 }
1455 return 0;
1456}
1457
1458int
Denys Vlasenko12014262011-05-30 14:00:14 +02001459sys_getsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001460{
1461 if (entering(tcp)) {
1462 tprintf("%lu", tcp->u_arg[0]);
1463 }
1464 return 0;
1465}
1466
1467int
Denys Vlasenko12014262011-05-30 14:00:14 +02001468sys_setsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001469{
1470 return 0;
1471}
1472
1473int
Denys Vlasenko12014262011-05-30 14:00:14 +02001474sys_getpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001475{
1476 if (entering(tcp)) {
1477 tprintf("%lu", tcp->u_arg[0]);
1478 }
1479 return 0;
1480}
1481
1482int
Denys Vlasenko12014262011-05-30 14:00:14 +02001483sys_setpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001484{
1485 if (entering(tcp)) {
1486 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1487 }
1488 return 0;
1489}
1490
John Hughesc61eb3d2002-05-17 11:37:50 +00001491#if UNIXWARE >= 2
1492
1493#include <sys/privilege.h>
1494
1495
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001496static const struct xlat procpriv_cmds[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001497 { SETPRV, "SETPRV" },
1498 { CLRPRV, "CLRPRV" },
1499 { PUTPRV, "PUTPRV" },
1500 { GETPRV, "GETPRV" },
1501 { CNTPRV, "CNTPRV" },
1502 { 0, NULL },
1503};
1504
1505
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001506static const struct xlat procpriv_priv[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001507 { P_OWNER, "P_OWNER" },
1508 { P_AUDIT, "P_AUDIT" },
1509 { P_COMPAT, "P_COMPAT" },
1510 { P_DACREAD, "P_DACREAD" },
1511 { P_DACWRITE, "P_DACWRITE" },
1512 { P_DEV, "P_DEV" },
1513 { P_FILESYS, "P_FILESYS" },
1514 { P_MACREAD, "P_MACREAD" },
1515 { P_MACWRITE, "P_MACWRITE" },
1516 { P_MOUNT, "P_MOUNT" },
1517 { P_MULTIDIR, "P_MULTIDIR" },
1518 { P_SETPLEVEL, "P_SETPLEVEL" },
1519 { P_SETSPRIV, "P_SETSPRIV" },
1520 { P_SETUID, "P_SETUID" },
1521 { P_SYSOPS, "P_SYSOPS" },
1522 { P_SETUPRIV, "P_SETUPRIV" },
1523 { P_DRIVER, "P_DRIVER" },
1524 { P_RTIME, "P_RTIME" },
1525 { P_MACUPGRADE, "P_MACUPGRADE" },
1526 { P_FSYSRANGE, "P_FSYSRANGE" },
1527 { P_SETFLEVEL, "P_SETFLEVEL" },
1528 { P_AUDITWR, "P_AUDITWR" },
1529 { P_TSHAR, "P_TSHAR" },
1530 { P_PLOCK, "P_PLOCK" },
1531 { P_CORE, "P_CORE" },
1532 { P_LOADMOD, "P_LOADMOD" },
1533 { P_BIND, "P_BIND" },
1534 { P_ALLPRIVS, "P_ALLPRIVS" },
1535 { 0, NULL },
1536};
1537
1538
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001539static const struct xlat procpriv_type[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001540 { PS_FIX, "PS_FIX" },
1541 { PS_INH, "PS_INH" },
1542 { PS_MAX, "PS_MAX" },
1543 { PS_WKG, "PS_WKG" },
1544 { 0, NULL },
1545};
1546
1547
1548static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001549printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001550{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001551 priv_t buf[128];
Dmitry V. Levinfcda7a52011-06-13 21:58:43 +00001552 int max = verbose(tcp) ? ARRAY_SIZE(buf) : 10;
John Hughesc61eb3d2002-05-17 11:37:50 +00001553 int dots = len > max;
1554 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001555
John Hughesc61eb3d2002-05-17 11:37:50 +00001556 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001557
John Hughesc61eb3d2002-05-17 11:37:50 +00001558 if (len <= 0 ||
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001559 umoven(tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
John Hughesc61eb3d2002-05-17 11:37:50 +00001560 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001561 tprintf("%#lx", addr);
John Hughesc61eb3d2002-05-17 11:37:50 +00001562 return;
1563 }
1564
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001565 tprintf("[");
John Hughesc61eb3d2002-05-17 11:37:50 +00001566
1567 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001568 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001569
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001570 if (i) tprintf(", ");
John Hughesc61eb3d2002-05-17 11:37:50 +00001571
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001572 if ((t = xlookup(procpriv_type, buf[i] & PS_TYPE)) &&
1573 (p = xlookup(procpriv_priv, buf[i] & ~PS_TYPE)))
John Hughesc61eb3d2002-05-17 11:37:50 +00001574 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001575 tprintf("%s|%s", t, p);
John Hughesc61eb3d2002-05-17 11:37:50 +00001576 }
1577 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001578 tprintf("%#lx", buf[i]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001579 }
1580 }
1581
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001582 if (dots) tprintf(" ...");
John Hughesc61eb3d2002-05-17 11:37:50 +00001583
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001584 tprintf("]");
John Hughesc61eb3d2002-05-17 11:37:50 +00001585}
1586
1587
1588int
Denys Vlasenko12014262011-05-30 14:00:14 +02001589sys_procpriv(struct tcb *tcp)
John Hughesc61eb3d2002-05-17 11:37:50 +00001590{
1591 if (entering(tcp)) {
1592 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1593 switch (tcp->u_arg[0]) {
1594 case CNTPRV:
1595 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1596 break;
1597
1598 case GETPRV:
1599 break;
1600
1601 default:
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001602 tprintf(", ");
1603 printpriv(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1604 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001605 }
1606 }
1607 else if (tcp->u_arg[0] == GETPRV) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001608 if (syserror(tcp)) {
John Hughesc61eb3d2002-05-17 11:37:50 +00001609 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1610 }
1611 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001612 tprintf(", ");
1613 printpriv(tcp, tcp->u_arg[1], tcp->u_rval);
1614 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001615 }
1616 }
Roland McGrath5a223472002-12-15 23:58:26 +00001617
John Hughesc61eb3d2002-05-17 11:37:50 +00001618 return 0;
1619}
1620
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001621#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001622
1623
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001624static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001625printargv(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001626{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001627 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001628 unsigned int p32;
1629 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001630 char data[sizeof(long)];
1631 } cp;
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001632 const char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001633 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001634
Roland McGrath85a3bc42007-08-02 02:13:05 +00001635 cp.p64 = 1;
1636 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1637 if (umoven(tcp, addr, personality_wordsize[current_personality],
1638 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001639 tprintf("%#lx", addr);
1640 return;
1641 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001642 if (personality_wordsize[current_personality] == 4)
1643 cp.p64 = cp.p32;
1644 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001645 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001646 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001647 printstr(tcp, cp.p64, -1);
1648 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001649 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001650 if (cp.p64)
1651 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001652}
1653
1654static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001655printargc(const char *fmt, struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001656{
1657 int count;
1658 char *cp;
1659
1660 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1661 addr += sizeof(char *);
1662 }
1663 tprintf(fmt, count, count == 1 ? "" : "s");
1664}
1665
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001666#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001667int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001668sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001669{
1670 if (entering(tcp)) {
1671 printpath(tcp, tcp->u_arg[0]);
1672 if (!verbose(tcp))
1673 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001674 else {
1675 tprintf(", [");
1676 printargv(tcp, tcp->u_arg[1]);
1677 tprintf("]");
1678 }
1679 }
1680 return 0;
1681}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001682#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001683
1684int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001685sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001686{
1687 if (entering(tcp)) {
1688 printpath(tcp, tcp->u_arg[0]);
1689 if (!verbose(tcp))
1690 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001691 else {
1692 tprintf(", [");
1693 printargv(tcp, tcp->u_arg[1]);
1694 tprintf("]");
1695 }
1696 if (!verbose(tcp))
1697 tprintf(", %#lx", tcp->u_arg[2]);
1698 else if (abbrev(tcp))
1699 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1700 else {
1701 tprintf(", [");
1702 printargv(tcp, tcp->u_arg[2]);
1703 tprintf("]");
1704 }
1705 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001706 return 0;
1707}
1708
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001709#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001710
Denys Vlasenko12014262011-05-30 14:00:14 +02001711int sys_rexecve(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +00001712{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001713 if (entering(tcp)) {
1714 sys_execve(tcp);
1715 tprintf(", %ld", tcp->u_arg[3]);
John Hughes4e36a812001-04-18 15:11:51 +00001716 }
1717 return 0;
1718}
1719
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001720#endif
John Hughes4e36a812001-04-18 15:11:51 +00001721
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001722int
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001723internal_exec(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001724{
1725#ifdef SUNOS4
1726 if (exiting(tcp) && !syserror(tcp) && followfork)
1727 fixvfork(tcp);
1728#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001729#if defined LINUX && defined TCB_WAITEXECVE
1730 if (exiting(tcp) && syserror(tcp))
1731 tcp->flags &= ~TCB_WAITEXECVE;
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001732 else {
1733 /* Maybe we have post-execve SIGTRAP suppressed? */
Denys Vlasenkof44cce42011-06-21 14:34:10 +02001734 if (!(ptrace_setoptions & PTRACE_O_TRACEEXEC))
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001735 tcp->flags |= TCB_WAITEXECVE; /* no */
1736 }
Roland McGrathfdb097f2004-07-12 07:38:55 +00001737#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001738 return 0;
1739}
1740
1741#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001742#ifndef __WNOTHREAD
1743#define __WNOTHREAD 0x20000000
1744#endif
1745#ifndef __WALL
1746#define __WALL 0x40000000
1747#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001748#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001749#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001750#endif
1751#endif /* LINUX */
1752
Roland McGrathd9f816f2004-09-04 03:39:20 +00001753static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001754 { WNOHANG, "WNOHANG" },
1755#ifndef WSTOPPED
1756 { WUNTRACED, "WUNTRACED" },
1757#endif
1758#ifdef WEXITED
1759 { WEXITED, "WEXITED" },
1760#endif
1761#ifdef WTRAPPED
1762 { WTRAPPED, "WTRAPPED" },
1763#endif
1764#ifdef WSTOPPED
1765 { WSTOPPED, "WSTOPPED" },
1766#endif
1767#ifdef WCONTINUED
1768 { WCONTINUED, "WCONTINUED" },
1769#endif
1770#ifdef WNOWAIT
1771 { WNOWAIT, "WNOWAIT" },
1772#endif
1773#ifdef __WCLONE
1774 { __WCLONE, "__WCLONE" },
1775#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001776#ifdef __WALL
1777 { __WALL, "__WALL" },
1778#endif
1779#ifdef __WNOTHREAD
1780 { __WNOTHREAD, "__WNOTHREAD" },
1781#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001782 { 0, NULL },
1783};
1784
Roland McGrath5e02a572004-10-19 23:33:47 +00001785#if !defined WCOREFLAG && defined WCOREFLG
1786# define WCOREFLAG WCOREFLG
1787#endif
1788#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001789# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001790#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001791#ifndef WCOREDUMP
1792# define WCOREDUMP(status) ((status) & 0200)
1793#endif
1794
Roland McGrath5e02a572004-10-19 23:33:47 +00001795
1796#ifndef W_STOPCODE
1797#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1798#endif
1799#ifndef W_EXITCODE
1800#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1801#endif
1802
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001803static int
Denys Vlasenko12014262011-05-30 14:00:14 +02001804printstatus(int status)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001805{
1806 int exited = 0;
1807
1808 /*
1809 * Here is a tricky presentation problem. This solution
1810 * is still not entirely satisfactory but since there
1811 * are no wait status constructors it will have to do.
1812 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001813 if (WIFSTOPPED(status)) {
1814 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001815 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001816 status &= ~W_STOPCODE(WSTOPSIG(status));
1817 }
1818 else if (WIFSIGNALED(status)) {
1819 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001820 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001821 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001822 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1823 }
1824 else if (WIFEXITED(status)) {
1825 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001826 WEXITSTATUS(status));
1827 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001828 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001829 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001830 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001831 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001832 return 0;
1833 }
1834
1835 if (status == 0)
1836 tprintf("]");
1837 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001838 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001839
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001840 return exited;
1841}
1842
1843static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001844printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001845{
1846 int status;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001847#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001848 int exited = 0;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001849#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001850
1851 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001852#ifdef LINUX
1853 /* On Linux, kernel-side pid_t is typedef'ed to int
1854 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001855 * pid argument to int on 64bit arches, producing,
1856 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001857 * in strace. We have to use int here, not long.
1858 */
1859 int pid = tcp->u_arg[0];
1860 tprintf("%d, ", pid);
1861#else
1862 /*
1863 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001864 */
1865 long pid = tcp->u_arg[0];
1866 if (personality_wordsize[current_personality] < sizeof pid)
1867 pid = (long) (int) pid;
1868 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001869#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001870 } else {
1871 /* status */
1872 if (!tcp->u_arg[1])
1873 tprintf("NULL");
1874 else if (syserror(tcp) || tcp->u_rval == 0)
1875 tprintf("%#lx", tcp->u_arg[1]);
1876 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1877 tprintf("[?]");
1878 else
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001879#ifdef SUNOS4
1880 exited =
1881#endif
1882 printstatus(status);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001883 /* options */
1884 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001885 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001886 if (n == 4) {
1887 tprintf(", ");
1888 /* usage */
1889 if (!tcp->u_arg[3])
1890 tprintf("NULL");
1891#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001892 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001893#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001894 if (bitness)
1895 printrusage32(tcp, tcp->u_arg[3]);
1896 else
1897#endif
1898 printrusage(tcp, tcp->u_arg[3]);
1899 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001900#endif /* LINUX */
1901#ifdef SUNOS4
1902 else if (tcp->u_rval > 0 && exited)
1903 printrusage(tcp, tcp->u_arg[3]);
1904#endif /* SUNOS4 */
1905 else
1906 tprintf("%#lx", tcp->u_arg[3]);
1907 }
1908 }
1909 return 0;
1910}
1911
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001912#ifdef SVR4
1913
1914int
Denys Vlasenko12014262011-05-30 14:00:14 +02001915sys_wait(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001916{
1917 if (exiting(tcp)) {
1918 /* The library wrapper stuffs this into the user variable. */
1919 if (!syserror(tcp))
1920 printstatus(getrval2(tcp));
1921 }
1922 return 0;
1923}
1924
1925#endif /* SVR4 */
1926
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001927#ifdef FREEBSD
1928int
Denys Vlasenko12014262011-05-30 14:00:14 +02001929sys_wait(struct tcb *tcp)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001930{
1931 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00001932
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001933 if (exiting(tcp)) {
1934 if (!syserror(tcp)) {
1935 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1936 tprintf("%#lx", tcp->u_arg[0]);
1937 else
1938 printstatus(status);
1939 }
1940 }
1941 return 0;
1942}
1943#endif
1944
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001945int
Denys Vlasenko12014262011-05-30 14:00:14 +02001946sys_waitpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001947{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001948 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001949}
1950
1951int
Denys Vlasenko12014262011-05-30 14:00:14 +02001952sys_wait4(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001953{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001954 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001955}
1956
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001957#ifdef ALPHA
1958int
Denys Vlasenko12014262011-05-30 14:00:14 +02001959sys_osf_wait4(struct tcb *tcp)
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001960{
1961 return printwaitn(tcp, 4, 1);
1962}
1963#endif
1964
Roland McGrathc74c0b72004-09-01 19:39:46 +00001965#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001966
Roland McGrathd9f816f2004-09-04 03:39:20 +00001967static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001968 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001969#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001970 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001971#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001972 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001973#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001974 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001975#endif
1976#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001977 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001978#endif
1979#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001980 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001981#endif
1982#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001983 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001984#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001985 { P_ALL, "P_ALL" },
1986#ifdef P_LWPID
1987 { P_LWPID, "P_LWPID" },
1988#endif
1989 { 0, NULL },
1990};
1991
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001992int
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00001993sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001994{
1995 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001996
1997 if (entering(tcp)) {
1998 printxval(waitid_types, tcp->u_arg[0], "P_???");
1999 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002000 }
2001 else {
2002 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002003 if (!tcp->u_arg[2])
2004 tprintf("NULL");
2005 else if (syserror(tcp))
2006 tprintf("%#lx", tcp->u_arg[2]);
2007 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2008 tprintf("{???}");
2009 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002010 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002011 /* options */
2012 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002013 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002014 if (tcp->u_nargs > 4) {
2015 /* usage */
2016 tprintf(", ");
2017 if (!tcp->u_arg[4])
2018 tprintf("NULL");
2019 else if (tcp->u_error)
2020 tprintf("%#lx", tcp->u_arg[4]);
2021 else
2022 printrusage(tcp, tcp->u_arg[4]);
2023 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002024 }
2025 return 0;
2026}
2027
Roland McGrathc74c0b72004-09-01 19:39:46 +00002028#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002029
2030int
Denys Vlasenko12014262011-05-30 14:00:14 +02002031sys_alarm(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002032{
2033 if (entering(tcp))
2034 tprintf("%lu", tcp->u_arg[0]);
2035 return 0;
2036}
2037
2038int
Denys Vlasenko12014262011-05-30 14:00:14 +02002039sys_uname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002040{
2041 struct utsname uname;
2042
2043 if (exiting(tcp)) {
2044 if (syserror(tcp) || !verbose(tcp))
2045 tprintf("%#lx", tcp->u_arg[0]);
2046 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2047 tprintf("{...}");
2048 else if (!abbrev(tcp)) {
2049
2050 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2051 uname.sysname, uname.nodename);
2052 tprintf("release=\"%s\", version=\"%s\", ",
2053 uname.release, uname.version);
2054 tprintf("machine=\"%s\"", uname.machine);
2055#ifdef LINUX
2056#ifndef __GLIBC__
2057 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002058#endif
2059#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002060 tprintf("}");
2061 }
2062 else
2063 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2064 uname.sysname, uname.nodename);
2065 }
2066 return 0;
2067}
2068
2069#ifndef SVR4
2070
Roland McGratheb9e2e82009-06-02 16:49:22 -07002071static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002072# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002073 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2074 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2075 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2076 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2077 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2078 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2079 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2080 { PTRACE_CONT, "PTRACE_CONT" },
2081 { PTRACE_KILL, "PTRACE_KILL" },
2082 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2083 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2084 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002085# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002086 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002087# endif
2088# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002089 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002090# endif
2091# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002092 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002093# endif
2094# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002095 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002096# endif
2097# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002098 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002099# endif
2100# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002101 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002102# endif
2103# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002104 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002105# endif
2106# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002107 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002108# endif
2109# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002110 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002111# endif
2112# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002113 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002114# endif
2115# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002116 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002117# endif
2118# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002119 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002120# endif
Dmitry V. Levinbb668a52011-03-14 21:58:59 +00002121# ifdef PTRACE_GETREGSET
2122 { PTRACE_GETREGSET, "PTRACE_GETREGSET", },
2123# endif
2124# ifdef PTRACE_SETREGSET
2125 { PTRACE_SETREGSET, "PTRACE_SETREGSET", },
2126# endif
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002127# ifdef PTRACE_SET_SYSCALL
2128 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2129# endif
2130# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002131 { PTRACE_READDATA, "PTRACE_READDATA" },
2132 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2133 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2134 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2135 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2136 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002137# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002138 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2139 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002140# else /* !SPARC */
2141 { PTRACE_22, "PTRACE_22" },
2142 { PTRACE_23, "PTRACE_3" },
2143# endif /* !SPARC */
2144# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002145 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002146# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002147 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002148# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002149 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2150 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2151 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002152# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002153 { PTRACE_26, "PTRACE_26" },
2154 { PTRACE_27, "PTRACE_27" },
2155 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002156# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002157 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002158# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002159
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002160# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002161
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002162 { PT_TRACE_ME, "PT_TRACE_ME" },
2163 { PT_READ_I, "PT_READ_I" },
2164 { PT_READ_D, "PT_READ_D" },
2165 { PT_WRITE_I, "PT_WRITE_I" },
2166 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002167# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002168 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002169# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002170 { PT_CONTINUE, "PT_CONTINUE" },
2171 { PT_KILL, "PT_KILL" },
2172 { PT_STEP, "PT_STEP" },
2173 { PT_ATTACH, "PT_ATTACH" },
2174 { PT_DETACH, "PT_DETACH" },
2175 { PT_GETREGS, "PT_GETREGS" },
2176 { PT_SETREGS, "PT_SETREGS" },
2177 { PT_GETFPREGS, "PT_GETFPREGS" },
2178 { PT_SETFPREGS, "PT_SETFPREGS" },
2179 { PT_GETDBREGS, "PT_GETDBREGS" },
2180 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002181# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002182 { 0, NULL },
2183};
2184
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002185# ifndef FREEBSD
2186# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002187static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002188# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002189 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002190# endif
2191# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002192 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002193# endif
2194# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002195 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002196# endif
2197# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002198 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002199# endif
2200# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002201 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002202# endif
2203# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002204 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002205# endif
2206# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002207 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002208# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002209 { 0, NULL },
2210};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002211# endif /* PTRACE_SETOPTIONS */
2212# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002213
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002214# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002215const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002216# ifdef LINUX
2217# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002218 { PT_PSWMASK, "psw_mask" },
2219 { PT_PSWADDR, "psw_addr" },
2220 { PT_GPR0, "gpr0" },
2221 { PT_GPR1, "gpr1" },
2222 { PT_GPR2, "gpr2" },
2223 { PT_GPR3, "gpr3" },
2224 { PT_GPR4, "gpr4" },
2225 { PT_GPR5, "gpr5" },
2226 { PT_GPR6, "gpr6" },
2227 { PT_GPR7, "gpr7" },
2228 { PT_GPR8, "gpr8" },
2229 { PT_GPR9, "gpr9" },
2230 { PT_GPR10, "gpr10" },
2231 { PT_GPR11, "gpr11" },
2232 { PT_GPR12, "gpr12" },
2233 { PT_GPR13, "gpr13" },
2234 { PT_GPR14, "gpr14" },
2235 { PT_GPR15, "gpr15" },
2236 { PT_ACR0, "acr0" },
2237 { PT_ACR1, "acr1" },
2238 { PT_ACR2, "acr2" },
2239 { PT_ACR3, "acr3" },
2240 { PT_ACR4, "acr4" },
2241 { PT_ACR5, "acr5" },
2242 { PT_ACR6, "acr6" },
2243 { PT_ACR7, "acr7" },
2244 { PT_ACR8, "acr8" },
2245 { PT_ACR9, "acr9" },
2246 { PT_ACR10, "acr10" },
2247 { PT_ACR11, "acr11" },
2248 { PT_ACR12, "acr12" },
2249 { PT_ACR13, "acr13" },
2250 { PT_ACR14, "acr14" },
2251 { PT_ACR15, "acr15" },
2252 { PT_ORIGGPR2, "orig_gpr2" },
2253 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002254# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002255 { PT_FPR0_HI, "fpr0.hi" },
2256 { PT_FPR0_LO, "fpr0.lo" },
2257 { PT_FPR1_HI, "fpr1.hi" },
2258 { PT_FPR1_LO, "fpr1.lo" },
2259 { PT_FPR2_HI, "fpr2.hi" },
2260 { PT_FPR2_LO, "fpr2.lo" },
2261 { PT_FPR3_HI, "fpr3.hi" },
2262 { PT_FPR3_LO, "fpr3.lo" },
2263 { PT_FPR4_HI, "fpr4.hi" },
2264 { PT_FPR4_LO, "fpr4.lo" },
2265 { PT_FPR5_HI, "fpr5.hi" },
2266 { PT_FPR5_LO, "fpr5.lo" },
2267 { PT_FPR6_HI, "fpr6.hi" },
2268 { PT_FPR6_LO, "fpr6.lo" },
2269 { PT_FPR7_HI, "fpr7.hi" },
2270 { PT_FPR7_LO, "fpr7.lo" },
2271 { PT_FPR8_HI, "fpr8.hi" },
2272 { PT_FPR8_LO, "fpr8.lo" },
2273 { PT_FPR9_HI, "fpr9.hi" },
2274 { PT_FPR9_LO, "fpr9.lo" },
2275 { PT_FPR10_HI, "fpr10.hi" },
2276 { PT_FPR10_LO, "fpr10.lo" },
2277 { PT_FPR11_HI, "fpr11.hi" },
2278 { PT_FPR11_LO, "fpr11.lo" },
2279 { PT_FPR12_HI, "fpr12.hi" },
2280 { PT_FPR12_LO, "fpr12.lo" },
2281 { PT_FPR13_HI, "fpr13.hi" },
2282 { PT_FPR13_LO, "fpr13.lo" },
2283 { PT_FPR14_HI, "fpr14.hi" },
2284 { PT_FPR14_LO, "fpr14.lo" },
2285 { PT_FPR15_HI, "fpr15.hi" },
2286 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002287# endif
2288# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002289 { PT_FPR0, "fpr0" },
2290 { PT_FPR1, "fpr1" },
2291 { PT_FPR2, "fpr2" },
2292 { PT_FPR3, "fpr3" },
2293 { PT_FPR4, "fpr4" },
2294 { PT_FPR5, "fpr5" },
2295 { PT_FPR6, "fpr6" },
2296 { PT_FPR7, "fpr7" },
2297 { PT_FPR8, "fpr8" },
2298 { PT_FPR9, "fpr9" },
2299 { PT_FPR10, "fpr10" },
2300 { PT_FPR11, "fpr11" },
2301 { PT_FPR12, "fpr12" },
2302 { PT_FPR13, "fpr13" },
2303 { PT_FPR14, "fpr14" },
2304 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002305# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002306 { PT_CR_9, "cr9" },
2307 { PT_CR_10, "cr10" },
2308 { PT_CR_11, "cr11" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002309 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002310# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002311 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002312# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002313 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002314# elif defined(POWERPC)
2315# ifndef PT_ORIG_R3
2316# define PT_ORIG_R3 34
2317# endif
2318# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002319 { REGSIZE*PT_R0, "r0" },
2320 { REGSIZE*PT_R1, "r1" },
2321 { REGSIZE*PT_R2, "r2" },
2322 { REGSIZE*PT_R3, "r3" },
2323 { REGSIZE*PT_R4, "r4" },
2324 { REGSIZE*PT_R5, "r5" },
2325 { REGSIZE*PT_R6, "r6" },
2326 { REGSIZE*PT_R7, "r7" },
2327 { REGSIZE*PT_R8, "r8" },
2328 { REGSIZE*PT_R9, "r9" },
2329 { REGSIZE*PT_R10, "r10" },
2330 { REGSIZE*PT_R11, "r11" },
2331 { REGSIZE*PT_R12, "r12" },
2332 { REGSIZE*PT_R13, "r13" },
2333 { REGSIZE*PT_R14, "r14" },
2334 { REGSIZE*PT_R15, "r15" },
2335 { REGSIZE*PT_R16, "r16" },
2336 { REGSIZE*PT_R17, "r17" },
2337 { REGSIZE*PT_R18, "r18" },
2338 { REGSIZE*PT_R19, "r19" },
2339 { REGSIZE*PT_R20, "r20" },
2340 { REGSIZE*PT_R21, "r21" },
2341 { REGSIZE*PT_R22, "r22" },
2342 { REGSIZE*PT_R23, "r23" },
2343 { REGSIZE*PT_R24, "r24" },
2344 { REGSIZE*PT_R25, "r25" },
2345 { REGSIZE*PT_R26, "r26" },
2346 { REGSIZE*PT_R27, "r27" },
2347 { REGSIZE*PT_R28, "r28" },
2348 { REGSIZE*PT_R29, "r29" },
2349 { REGSIZE*PT_R30, "r30" },
2350 { REGSIZE*PT_R31, "r31" },
2351 { REGSIZE*PT_NIP, "NIP" },
2352 { REGSIZE*PT_MSR, "MSR" },
2353 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2354 { REGSIZE*PT_CTR, "CTR" },
2355 { REGSIZE*PT_LNK, "LNK" },
2356 { REGSIZE*PT_XER, "XER" },
2357 { REGSIZE*PT_CCR, "CCR" },
2358 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002359# undef REGSIZE
2360# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002361 { 0, "r0" },
2362 { 1, "r1" },
2363 { 2, "r2" },
2364 { 3, "r3" },
2365 { 4, "r4" },
2366 { 5, "r5" },
2367 { 6, "r6" },
2368 { 7, "r7" },
2369 { 8, "r8" },
2370 { 9, "r9" },
2371 { 10, "r10" },
2372 { 11, "r11" },
2373 { 12, "r12" },
2374 { 13, "r13" },
2375 { 14, "r14" },
2376 { 15, "r15" },
2377 { 16, "r16" },
2378 { 17, "r17" },
2379 { 18, "r18" },
2380 { 19, "r19" },
2381 { 20, "r20" },
2382 { 21, "r21" },
2383 { 22, "r22" },
2384 { 23, "r23" },
2385 { 24, "r24" },
2386 { 25, "r25" },
2387 { 26, "r26" },
2388 { 27, "r27" },
2389 { 28, "r28" },
2390 { 29, "gp" },
2391 { 30, "fp" },
2392 { 31, "zero" },
2393 { 32, "fp0" },
2394 { 33, "fp" },
2395 { 34, "fp2" },
2396 { 35, "fp3" },
2397 { 36, "fp4" },
2398 { 37, "fp5" },
2399 { 38, "fp6" },
2400 { 39, "fp7" },
2401 { 40, "fp8" },
2402 { 41, "fp9" },
2403 { 42, "fp10" },
2404 { 43, "fp11" },
2405 { 44, "fp12" },
2406 { 45, "fp13" },
2407 { 46, "fp14" },
2408 { 47, "fp15" },
2409 { 48, "fp16" },
2410 { 49, "fp17" },
2411 { 50, "fp18" },
2412 { 51, "fp19" },
2413 { 52, "fp20" },
2414 { 53, "fp21" },
2415 { 54, "fp22" },
2416 { 55, "fp23" },
2417 { 56, "fp24" },
2418 { 57, "fp25" },
2419 { 58, "fp26" },
2420 { 59, "fp27" },
2421 { 60, "fp28" },
2422 { 61, "fp29" },
2423 { 62, "fp30" },
2424 { 63, "fp31" },
2425 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002426# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002427 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2428 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2429 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2430 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2431 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2432 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2433 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2434 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2435 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2436 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2437 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2438 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2439 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2440 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2441 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2442 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2443 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2444 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2445 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2446 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2447 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2448 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2449 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2450 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2451 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2452 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2453 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2454 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2455 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2456 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2457 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2458 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2459 /* switch stack: */
2460 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2461 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2462 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2463 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2464 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2465 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2466 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2467 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2468 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2469 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002470 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2471 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002472 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002473 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002474 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2475 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002476 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2477 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2478 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2479 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2480 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2481 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2482 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2483 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2484 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2485 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2486 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2487 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2488 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2489 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2490 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002491# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002492 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002493# endif
2494# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002495 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002496# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002497 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002498# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002499 { 4*EBX, "4*EBX" },
2500 { 4*ECX, "4*ECX" },
2501 { 4*EDX, "4*EDX" },
2502 { 4*ESI, "4*ESI" },
2503 { 4*EDI, "4*EDI" },
2504 { 4*EBP, "4*EBP" },
2505 { 4*EAX, "4*EAX" },
2506 { 4*DS, "4*DS" },
2507 { 4*ES, "4*ES" },
2508 { 4*FS, "4*FS" },
2509 { 4*GS, "4*GS" },
2510 { 4*ORIG_EAX, "4*ORIG_EAX" },
2511 { 4*EIP, "4*EIP" },
2512 { 4*CS, "4*CS" },
2513 { 4*EFL, "4*EFL" },
2514 { 4*UESP, "4*UESP" },
2515 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002516# elif defined(X86_64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002517 { 8*R15, "8*R15" },
2518 { 8*R14, "8*R14" },
2519 { 8*R13, "8*R13" },
2520 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002521 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002522 { 8*RBX, "8*RBX" },
2523 { 8*R11, "8*R11" },
2524 { 8*R10, "8*R10" },
2525 { 8*R9, "8*R9" },
2526 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002527 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002528 { 8*RCX, "8*RCX" },
2529 { 8*RDX, "8*RDX" },
2530 { 8*RSI, "8*RSI" },
2531 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002532 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002533 { 8*RIP, "8*RIP" },
2534 { 8*CS, "8*CS" },
2535 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002536 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002537 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002538# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002539 { 4*PT_D1, "4*PT_D1" },
2540 { 4*PT_D2, "4*PT_D2" },
2541 { 4*PT_D3, "4*PT_D3" },
2542 { 4*PT_D4, "4*PT_D4" },
2543 { 4*PT_D5, "4*PT_D5" },
2544 { 4*PT_D6, "4*PT_D6" },
2545 { 4*PT_D7, "4*PT_D7" },
2546 { 4*PT_A0, "4*PT_A0" },
2547 { 4*PT_A1, "4*PT_A1" },
2548 { 4*PT_A2, "4*PT_A2" },
2549 { 4*PT_A3, "4*PT_A3" },
2550 { 4*PT_A4, "4*PT_A4" },
2551 { 4*PT_A5, "4*PT_A5" },
2552 { 4*PT_A6, "4*PT_A6" },
2553 { 4*PT_D0, "4*PT_D0" },
2554 { 4*PT_USP, "4*PT_USP" },
2555 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2556 { 4*PT_SR, "4*PT_SR" },
2557 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002558# elif defined(SH)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002559 { 4*REG_REG0, "4*REG_REG0" },
2560 { 4*(REG_REG0+1), "4*REG_REG1" },
2561 { 4*(REG_REG0+2), "4*REG_REG2" },
2562 { 4*(REG_REG0+3), "4*REG_REG3" },
2563 { 4*(REG_REG0+4), "4*REG_REG4" },
2564 { 4*(REG_REG0+5), "4*REG_REG5" },
2565 { 4*(REG_REG0+6), "4*REG_REG6" },
2566 { 4*(REG_REG0+7), "4*REG_REG7" },
2567 { 4*(REG_REG0+8), "4*REG_REG8" },
2568 { 4*(REG_REG0+9), "4*REG_REG9" },
2569 { 4*(REG_REG0+10), "4*REG_REG10" },
2570 { 4*(REG_REG0+11), "4*REG_REG11" },
2571 { 4*(REG_REG0+12), "4*REG_REG12" },
2572 { 4*(REG_REG0+13), "4*REG_REG13" },
2573 { 4*(REG_REG0+14), "4*REG_REG14" },
2574 { 4*REG_REG15, "4*REG_REG15" },
2575 { 4*REG_PC, "4*REG_PC" },
2576 { 4*REG_PR, "4*REG_PR" },
2577 { 4*REG_SR, "4*REG_SR" },
2578 { 4*REG_GBR, "4*REG_GBR" },
2579 { 4*REG_MACH, "4*REG_MACH" },
2580 { 4*REG_MACL, "4*REG_MACL" },
2581 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2582 { 4*REG_FPUL, "4*REG_FPUL" },
2583 { 4*REG_FPREG0, "4*REG_FPREG0" },
2584 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2585 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2586 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2587 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2588 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2589 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2590 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2591 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2592 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2593 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2594 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2595 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2596 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2597 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2598 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002599# ifdef REG_XDREG0
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002600 { 4*REG_XDREG0, "4*REG_XDREG0" },
2601 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2602 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2603 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2604 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2605 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2606 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2607 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002608# endif
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002609 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002610# elif defined(SH64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002611 { 0, "PC(L)" },
2612 { 4, "PC(U)" },
2613 { 8, "SR(L)" },
2614 { 12, "SR(U)" },
2615 { 16, "syscall no.(L)" },
2616 { 20, "syscall_no.(U)" },
2617 { 24, "R0(L)" },
2618 { 28, "R0(U)" },
2619 { 32, "R1(L)" },
2620 { 36, "R1(U)" },
2621 { 40, "R2(L)" },
2622 { 44, "R2(U)" },
2623 { 48, "R3(L)" },
2624 { 52, "R3(U)" },
2625 { 56, "R4(L)" },
2626 { 60, "R4(U)" },
2627 { 64, "R5(L)" },
2628 { 68, "R5(U)" },
2629 { 72, "R6(L)" },
2630 { 76, "R6(U)" },
2631 { 80, "R7(L)" },
2632 { 84, "R7(U)" },
2633 { 88, "R8(L)" },
2634 { 92, "R8(U)" },
2635 { 96, "R9(L)" },
2636 { 100, "R9(U)" },
2637 { 104, "R10(L)" },
2638 { 108, "R10(U)" },
2639 { 112, "R11(L)" },
2640 { 116, "R11(U)" },
2641 { 120, "R12(L)" },
2642 { 124, "R12(U)" },
2643 { 128, "R13(L)" },
2644 { 132, "R13(U)" },
2645 { 136, "R14(L)" },
2646 { 140, "R14(U)" },
2647 { 144, "R15(L)" },
2648 { 148, "R15(U)" },
2649 { 152, "R16(L)" },
2650 { 156, "R16(U)" },
2651 { 160, "R17(L)" },
2652 { 164, "R17(U)" },
2653 { 168, "R18(L)" },
2654 { 172, "R18(U)" },
2655 { 176, "R19(L)" },
2656 { 180, "R19(U)" },
2657 { 184, "R20(L)" },
2658 { 188, "R20(U)" },
2659 { 192, "R21(L)" },
2660 { 196, "R21(U)" },
2661 { 200, "R22(L)" },
2662 { 204, "R22(U)" },
2663 { 208, "R23(L)" },
2664 { 212, "R23(U)" },
2665 { 216, "R24(L)" },
2666 { 220, "R24(U)" },
2667 { 224, "R25(L)" },
2668 { 228, "R25(U)" },
2669 { 232, "R26(L)" },
2670 { 236, "R26(U)" },
2671 { 240, "R27(L)" },
2672 { 244, "R27(U)" },
2673 { 248, "R28(L)" },
2674 { 252, "R28(U)" },
2675 { 256, "R29(L)" },
2676 { 260, "R29(U)" },
2677 { 264, "R30(L)" },
2678 { 268, "R30(U)" },
2679 { 272, "R31(L)" },
2680 { 276, "R31(U)" },
2681 { 280, "R32(L)" },
2682 { 284, "R32(U)" },
2683 { 288, "R33(L)" },
2684 { 292, "R33(U)" },
2685 { 296, "R34(L)" },
2686 { 300, "R34(U)" },
2687 { 304, "R35(L)" },
2688 { 308, "R35(U)" },
2689 { 312, "R36(L)" },
2690 { 316, "R36(U)" },
2691 { 320, "R37(L)" },
2692 { 324, "R37(U)" },
2693 { 328, "R38(L)" },
2694 { 332, "R38(U)" },
2695 { 336, "R39(L)" },
2696 { 340, "R39(U)" },
2697 { 344, "R40(L)" },
2698 { 348, "R40(U)" },
2699 { 352, "R41(L)" },
2700 { 356, "R41(U)" },
2701 { 360, "R42(L)" },
2702 { 364, "R42(U)" },
2703 { 368, "R43(L)" },
2704 { 372, "R43(U)" },
2705 { 376, "R44(L)" },
2706 { 380, "R44(U)" },
2707 { 384, "R45(L)" },
2708 { 388, "R45(U)" },
2709 { 392, "R46(L)" },
2710 { 396, "R46(U)" },
2711 { 400, "R47(L)" },
2712 { 404, "R47(U)" },
2713 { 408, "R48(L)" },
2714 { 412, "R48(U)" },
2715 { 416, "R49(L)" },
2716 { 420, "R49(U)" },
2717 { 424, "R50(L)" },
2718 { 428, "R50(U)" },
2719 { 432, "R51(L)" },
2720 { 436, "R51(U)" },
2721 { 440, "R52(L)" },
2722 { 444, "R52(U)" },
2723 { 448, "R53(L)" },
2724 { 452, "R53(U)" },
2725 { 456, "R54(L)" },
2726 { 460, "R54(U)" },
2727 { 464, "R55(L)" },
2728 { 468, "R55(U)" },
2729 { 472, "R56(L)" },
2730 { 476, "R56(U)" },
2731 { 480, "R57(L)" },
2732 { 484, "R57(U)" },
2733 { 488, "R58(L)" },
2734 { 492, "R58(U)" },
2735 { 496, "R59(L)" },
2736 { 500, "R59(U)" },
2737 { 504, "R60(L)" },
2738 { 508, "R60(U)" },
2739 { 512, "R61(L)" },
2740 { 516, "R61(U)" },
2741 { 520, "R62(L)" },
2742 { 524, "R62(U)" },
2743 { 528, "TR0(L)" },
2744 { 532, "TR0(U)" },
2745 { 536, "TR1(L)" },
2746 { 540, "TR1(U)" },
2747 { 544, "TR2(L)" },
2748 { 548, "TR2(U)" },
2749 { 552, "TR3(L)" },
2750 { 556, "TR3(U)" },
2751 { 560, "TR4(L)" },
2752 { 564, "TR4(U)" },
2753 { 568, "TR5(L)" },
2754 { 572, "TR5(U)" },
2755 { 576, "TR6(L)" },
2756 { 580, "TR6(U)" },
2757 { 584, "TR7(L)" },
2758 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002759 /* This entry is in case pt_regs contains dregs (depends on
2760 the kernel build options). */
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002761 { uoff(regs), "offsetof(struct user, regs)" },
2762 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002763# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002764 { uoff(regs.ARM_r0), "r0" },
2765 { uoff(regs.ARM_r1), "r1" },
2766 { uoff(regs.ARM_r2), "r2" },
2767 { uoff(regs.ARM_r3), "r3" },
2768 { uoff(regs.ARM_r4), "r4" },
2769 { uoff(regs.ARM_r5), "r5" },
2770 { uoff(regs.ARM_r6), "r6" },
2771 { uoff(regs.ARM_r7), "r7" },
2772 { uoff(regs.ARM_r8), "r8" },
2773 { uoff(regs.ARM_r9), "r9" },
2774 { uoff(regs.ARM_r10), "r10" },
2775 { uoff(regs.ARM_fp), "fp" },
2776 { uoff(regs.ARM_ip), "ip" },
2777 { uoff(regs.ARM_sp), "sp" },
2778 { uoff(regs.ARM_lr), "lr" },
2779 { uoff(regs.ARM_pc), "pc" },
2780 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002781# elif defined(AVR32)
2782 { uoff(regs.sr), "sr" },
2783 { uoff(regs.pc), "pc" },
2784 { uoff(regs.lr), "lr" },
2785 { uoff(regs.sp), "sp" },
2786 { uoff(regs.r12), "r12" },
2787 { uoff(regs.r11), "r11" },
2788 { uoff(regs.r10), "r10" },
2789 { uoff(regs.r9), "r9" },
2790 { uoff(regs.r8), "r8" },
2791 { uoff(regs.r7), "r7" },
2792 { uoff(regs.r6), "r6" },
2793 { uoff(regs.r5), "r5" },
2794 { uoff(regs.r4), "r4" },
2795 { uoff(regs.r3), "r3" },
2796 { uoff(regs.r2), "r2" },
2797 { uoff(regs.r1), "r1" },
2798 { uoff(regs.r0), "r0" },
2799 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002800# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002801 { 0, "r0" },
2802 { 1, "r1" },
2803 { 2, "r2" },
2804 { 3, "r3" },
2805 { 4, "r4" },
2806 { 5, "r5" },
2807 { 6, "r6" },
2808 { 7, "r7" },
2809 { 8, "r8" },
2810 { 9, "r9" },
2811 { 10, "r10" },
2812 { 11, "r11" },
2813 { 12, "r12" },
2814 { 13, "r13" },
2815 { 14, "r14" },
2816 { 15, "r15" },
2817 { 16, "r16" },
2818 { 17, "r17" },
2819 { 18, "r18" },
2820 { 19, "r19" },
2821 { 20, "r20" },
2822 { 21, "r21" },
2823 { 22, "r22" },
2824 { 23, "r23" },
2825 { 24, "r24" },
2826 { 25, "r25" },
2827 { 26, "r26" },
2828 { 27, "r27" },
2829 { 28, "r28" },
2830 { 29, "r29" },
2831 { 30, "r30" },
2832 { 31, "r31" },
2833 { 32, "f0" },
2834 { 33, "f1" },
2835 { 34, "f2" },
2836 { 35, "f3" },
2837 { 36, "f4" },
2838 { 37, "f5" },
2839 { 38, "f6" },
2840 { 39, "f7" },
2841 { 40, "f8" },
2842 { 41, "f9" },
2843 { 42, "f10" },
2844 { 43, "f11" },
2845 { 44, "f12" },
2846 { 45, "f13" },
2847 { 46, "f14" },
2848 { 47, "f15" },
2849 { 48, "f16" },
2850 { 49, "f17" },
2851 { 50, "f18" },
2852 { 51, "f19" },
2853 { 52, "f20" },
2854 { 53, "f21" },
2855 { 54, "f22" },
2856 { 55, "f23" },
2857 { 56, "f24" },
2858 { 57, "f25" },
2859 { 58, "f26" },
2860 { 59, "f27" },
2861 { 60, "f28" },
2862 { 61, "f29" },
2863 { 62, "f30" },
2864 { 63, "f31" },
2865 { 64, "pc" },
2866 { 65, "cause" },
2867 { 66, "badvaddr" },
2868 { 67, "mmhi" },
2869 { 68, "mmlo" },
2870 { 69, "fpcsr" },
2871 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002872# elif defined(TILE)
2873 { PTREGS_OFFSET_REG(0), "r0" },
2874 { PTREGS_OFFSET_REG(1), "r1" },
2875 { PTREGS_OFFSET_REG(2), "r2" },
2876 { PTREGS_OFFSET_REG(3), "r3" },
2877 { PTREGS_OFFSET_REG(4), "r4" },
2878 { PTREGS_OFFSET_REG(5), "r5" },
2879 { PTREGS_OFFSET_REG(6), "r6" },
2880 { PTREGS_OFFSET_REG(7), "r7" },
2881 { PTREGS_OFFSET_REG(8), "r8" },
2882 { PTREGS_OFFSET_REG(9), "r9" },
2883 { PTREGS_OFFSET_REG(10), "r10" },
2884 { PTREGS_OFFSET_REG(11), "r11" },
2885 { PTREGS_OFFSET_REG(12), "r12" },
2886 { PTREGS_OFFSET_REG(13), "r13" },
2887 { PTREGS_OFFSET_REG(14), "r14" },
2888 { PTREGS_OFFSET_REG(15), "r15" },
2889 { PTREGS_OFFSET_REG(16), "r16" },
2890 { PTREGS_OFFSET_REG(17), "r17" },
2891 { PTREGS_OFFSET_REG(18), "r18" },
2892 { PTREGS_OFFSET_REG(19), "r19" },
2893 { PTREGS_OFFSET_REG(20), "r20" },
2894 { PTREGS_OFFSET_REG(21), "r21" },
2895 { PTREGS_OFFSET_REG(22), "r22" },
2896 { PTREGS_OFFSET_REG(23), "r23" },
2897 { PTREGS_OFFSET_REG(24), "r24" },
2898 { PTREGS_OFFSET_REG(25), "r25" },
2899 { PTREGS_OFFSET_REG(26), "r26" },
2900 { PTREGS_OFFSET_REG(27), "r27" },
2901 { PTREGS_OFFSET_REG(28), "r28" },
2902 { PTREGS_OFFSET_REG(29), "r29" },
2903 { PTREGS_OFFSET_REG(30), "r30" },
2904 { PTREGS_OFFSET_REG(31), "r31" },
2905 { PTREGS_OFFSET_REG(32), "r32" },
2906 { PTREGS_OFFSET_REG(33), "r33" },
2907 { PTREGS_OFFSET_REG(34), "r34" },
2908 { PTREGS_OFFSET_REG(35), "r35" },
2909 { PTREGS_OFFSET_REG(36), "r36" },
2910 { PTREGS_OFFSET_REG(37), "r37" },
2911 { PTREGS_OFFSET_REG(38), "r38" },
2912 { PTREGS_OFFSET_REG(39), "r39" },
2913 { PTREGS_OFFSET_REG(40), "r40" },
2914 { PTREGS_OFFSET_REG(41), "r41" },
2915 { PTREGS_OFFSET_REG(42), "r42" },
2916 { PTREGS_OFFSET_REG(43), "r43" },
2917 { PTREGS_OFFSET_REG(44), "r44" },
2918 { PTREGS_OFFSET_REG(45), "r45" },
2919 { PTREGS_OFFSET_REG(46), "r46" },
2920 { PTREGS_OFFSET_REG(47), "r47" },
2921 { PTREGS_OFFSET_REG(48), "r48" },
2922 { PTREGS_OFFSET_REG(49), "r49" },
2923 { PTREGS_OFFSET_REG(50), "r50" },
2924 { PTREGS_OFFSET_REG(51), "r51" },
2925 { PTREGS_OFFSET_REG(52), "r52" },
2926 { PTREGS_OFFSET_TP, "tp" },
2927 { PTREGS_OFFSET_SP, "sp" },
2928 { PTREGS_OFFSET_LR, "lr" },
2929 { PTREGS_OFFSET_PC, "pc" },
2930 { PTREGS_OFFSET_EX1, "ex1" },
2931 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
2932 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
2933 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002934# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00002935# ifdef CRISV10
2936 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
2937 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2938 { 4*PT_R13, "4*PT_R13" },
2939 { 4*PT_R12, "4*PT_R12" },
2940 { 4*PT_R11, "4*PT_R11" },
2941 { 4*PT_R10, "4*PT_R10" },
2942 { 4*PT_R9, "4*PT_R9" },
2943 { 4*PT_R8, "4*PT_R8" },
2944 { 4*PT_R7, "4*PT_R7" },
2945 { 4*PT_R6, "4*PT_R6" },
2946 { 4*PT_R5, "4*PT_R5" },
2947 { 4*PT_R4, "4*PT_R4" },
2948 { 4*PT_R3, "4*PT_R3" },
2949 { 4*PT_R2, "4*PT_R2" },
2950 { 4*PT_R1, "4*PT_R1" },
2951 { 4*PT_R0, "4*PT_R0" },
2952 { 4*PT_MOF, "4*PT_MOF" },
2953 { 4*PT_DCCR, "4*PT_DCCR" },
2954 { 4*PT_SRP, "4*PT_SRP" },
2955 { 4*PT_IRP, "4*PT_IRP" },
2956 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
2957 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
2958 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
2959 { 4*PT_USP, "4*PT_USP" },
2960# endif
2961# ifdef CRISV32
2962 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2963 { 4*PT_R0, "4*PT_R0" },
2964 { 4*PT_R1, "4*PT_R1" },
2965 { 4*PT_R2, "4*PT_R2" },
2966 { 4*PT_R3, "4*PT_R3" },
2967 { 4*PT_R4, "4*PT_R4" },
2968 { 4*PT_R5, "4*PT_R5" },
2969 { 4*PT_R6, "4*PT_R6" },
2970 { 4*PT_R7, "4*PT_R7" },
2971 { 4*PT_R8, "4*PT_R8" },
2972 { 4*PT_R9, "4*PT_R9" },
2973 { 4*PT_R10, "4*PT_R10" },
2974 { 4*PT_R11, "4*PT_R11" },
2975 { 4*PT_R12, "4*PT_R12" },
2976 { 4*PT_R13, "4*PT_R13" },
2977 { 4*PT_ACR, "4*PT_ACR" },
2978 { 4*PT_SRS, "4*PT_SRS" },
2979 { 4*PT_MOF, "4*PT_MOF" },
2980 { 4*PT_SPC, "4*PT_SPC" },
2981 { 4*PT_CCS, "4*PT_CCS" },
2982 { 4*PT_SRP, "4*PT_SRP" },
2983 { 4*PT_ERP, "4*PT_ERP" },
2984 { 4*PT_EXS, "4*PT_EXS" },
2985 { 4*PT_EDA, "4*PT_EDA" },
2986 { 4*PT_USP, "4*PT_USP" },
2987 { 4*PT_PPC, "4*PT_PPC" },
2988 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
2989 { 4*PT_BP+4, "4*PT_BP+4" },
2990 { 4*PT_BP+8, "4*PT_BP+8" },
2991 { 4*PT_BP+12, "4*PT_BP+12" },
2992 { 4*PT_BP+16, "4*PT_BP+16" },
2993 { 4*PT_BP+20, "4*PT_BP+20" },
2994 { 4*PT_BP+24, "4*PT_BP+24" },
2995 { 4*PT_BP+28, "4*PT_BP+28" },
2996 { 4*PT_BP+32, "4*PT_BP+32" },
2997 { 4*PT_BP+36, "4*PT_BP+36" },
2998 { 4*PT_BP+40, "4*PT_BP+40" },
2999 { 4*PT_BP+44, "4*PT_BP+44" },
3000 { 4*PT_BP+48, "4*PT_BP+48" },
3001 { 4*PT_BP+52, "4*PT_BP+52" },
3002 { 4*PT_BP+56, "4*PT_BP+56" },
3003# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003004# ifdef MICROBLAZE
3005 { PT_GPR(0), "r0" },
3006 { PT_GPR(1), "r1" },
3007 { PT_GPR(2), "r2" },
3008 { PT_GPR(3), "r3" },
3009 { PT_GPR(4), "r4" },
3010 { PT_GPR(5), "r5" },
3011 { PT_GPR(6), "r6" },
3012 { PT_GPR(7), "r7" },
3013 { PT_GPR(8), "r8" },
3014 { PT_GPR(9), "r9" },
3015 { PT_GPR(10), "r10" },
3016 { PT_GPR(11), "r11" },
3017 { PT_GPR(12), "r12" },
3018 { PT_GPR(13), "r13" },
3019 { PT_GPR(14), "r14" },
3020 { PT_GPR(15), "r15" },
3021 { PT_GPR(16), "r16" },
3022 { PT_GPR(17), "r17" },
3023 { PT_GPR(18), "r18" },
3024 { PT_GPR(19), "r19" },
3025 { PT_GPR(20), "r20" },
3026 { PT_GPR(21), "r21" },
3027 { PT_GPR(22), "r22" },
3028 { PT_GPR(23), "r23" },
3029 { PT_GPR(24), "r24" },
3030 { PT_GPR(25), "r25" },
3031 { PT_GPR(26), "r26" },
3032 { PT_GPR(27), "r27" },
3033 { PT_GPR(28), "r28" },
3034 { PT_GPR(29), "r29" },
3035 { PT_GPR(30), "r30" },
3036 { PT_GPR(31), "r31" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003037 { PT_PC, "rpc", },
3038 { PT_MSR, "rmsr", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003039 { PT_EAR, "rear", },
3040 { PT_ESR, "resr", },
3041 { PT_FSR, "rfsr", },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003042 { PT_KERNEL_MODE, "kernel_mode", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003043# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003044
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003045# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3046 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003047 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003048# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003049 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003050# endif
3051# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003052 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003053# endif
3054# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003055 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003056# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003057 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3058 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3059 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003060# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003061 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003062# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003063# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003064 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003065# endif
3066# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003067 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003068# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003069 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003070# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003071 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003072# endif
3073# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003074 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003075# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003076# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003077 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003078# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003079 { uoff(magic), "offsetof(struct user, magic)" },
3080 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003081# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003082 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003083# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003084# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003085
3086# endif /* LINUX */
3087
3088# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003089 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3090 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3091 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3092 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3093 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3094 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3095 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3096 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3097 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3098 { uoff(u_error), "offsetof(struct user, u_error)" },
3099 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3100 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3101 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3102 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3103 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3104 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3105 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3106 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3107 { uoff(u_code), "offsetof(struct user, u_code)" },
3108 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3109 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3110 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3111 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3112 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3113 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3114 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3115 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3116 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3117 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3118 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3119 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3120 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3121 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3122 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3123 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3124 { uoff(u_start), "offsetof(struct user, u_start)" },
3125 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3126 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3127 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3128 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3129 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3130 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3131 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3132 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3133 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003134# endif /* SUNOS4 */
3135# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003136 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003137# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003138 { 0, NULL },
3139};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003140# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003141
3142int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003143sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003144{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003145 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003146 long addr;
3147
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003148 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003149 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003150# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003151 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003152# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003153 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003154# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003155 );
3156 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003157 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003158# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003159 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3160 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3161 for (x = struct_user_offsets; x->str; x++) {
3162 if (x->val >= addr)
3163 break;
3164 }
3165 if (!x->str)
3166 tprintf("%#lx, ", addr);
3167 else if (x->val > addr && x != struct_user_offsets) {
3168 x--;
3169 tprintf("%s + %ld, ", x->str, addr - x->val);
3170 }
3171 else
3172 tprintf("%s, ", x->str);
3173 }
3174 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003175# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003176 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003177# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003178 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003179# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003180 case PTRACE_PEEKDATA:
3181 case PTRACE_PEEKTEXT:
3182 case PTRACE_PEEKUSER:
3183 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003184# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003185 case PTRACE_CONT:
3186 case PTRACE_SINGLESTEP:
3187 case PTRACE_SYSCALL:
3188 case PTRACE_DETACH:
3189 printsignal(tcp->u_arg[3]);
3190 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003191# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003192 case PTRACE_SETOPTIONS:
3193 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3194 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003195# endif
3196# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003197 case PTRACE_SETSIGINFO: {
3198 siginfo_t si;
3199 if (!tcp->u_arg[3])
3200 tprintf("NULL");
3201 else if (syserror(tcp))
3202 tprintf("%#lx", tcp->u_arg[3]);
3203 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3204 tprintf("{???}");
3205 else
3206 printsiginfo(&si, verbose(tcp));
3207 break;
3208 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003209# endif
3210# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003211 case PTRACE_GETSIGINFO:
3212 /* Don't print anything, do it at syscall return. */
3213 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003214# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003215 default:
3216 tprintf("%#lx", tcp->u_arg[3]);
3217 break;
3218 }
3219 } else {
3220 switch (tcp->u_arg[0]) {
3221 case PTRACE_PEEKDATA:
3222 case PTRACE_PEEKTEXT:
3223 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003224# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003225 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003226# else
Roland McGratheb285352003-01-14 09:59:00 +00003227 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003228 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003229# endif
3230# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003231 case PTRACE_GETSIGINFO: {
3232 siginfo_t si;
3233 if (!tcp->u_arg[3])
3234 tprintf("NULL");
3235 else if (syserror(tcp))
3236 tprintf("%#lx", tcp->u_arg[3]);
3237 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3238 tprintf("{???}");
3239 else
3240 printsiginfo(&si, verbose(tcp));
3241 break;
3242 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003243# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003244 }
3245 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003246# endif /* LINUX */
3247# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003248 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3249 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3250 tprintf("%lu, ", tcp->u_arg[3]);
3251 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3252 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3253 tcp->u_arg[0] != PTRACE_READTEXT) {
3254 tprintf("%#lx", tcp->u_arg[3]);
3255 }
3256 } else {
3257 if (tcp->u_arg[0] == PTRACE_READDATA ||
3258 tcp->u_arg[0] == PTRACE_READTEXT) {
3259 tprintf("%lu, ", tcp->u_arg[3]);
3260 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3261 }
3262 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003263# endif /* SUNOS4 */
3264# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003265 tprintf("%lu", tcp->u_arg[3]);
3266 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003267# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003268 return 0;
3269}
3270
3271#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003272
3273#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003274# ifndef FUTEX_CMP_REQUEUE
3275# define FUTEX_CMP_REQUEUE 4
3276# endif
3277# ifndef FUTEX_WAKE_OP
3278# define FUTEX_WAKE_OP 5
3279# endif
3280# ifndef FUTEX_LOCK_PI
3281# define FUTEX_LOCK_PI 6
3282# define FUTEX_UNLOCK_PI 7
3283# define FUTEX_TRYLOCK_PI 8
3284# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003285# ifndef FUTEX_WAIT_BITSET
3286# define FUTEX_WAIT_BITSET 9
3287# endif
3288# ifndef FUTEX_WAKE_BITSET
3289# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003290# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003291# ifndef FUTEX_WAIT_REQUEUE_PI
3292# define FUTEX_WAIT_REQUEUE_PI 11
3293# endif
3294# ifndef FUTEX_CMP_REQUEUE_PI
3295# define FUTEX_CMP_REQUEUE_PI 12
3296# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003297# ifndef FUTEX_PRIVATE_FLAG
3298# define FUTEX_PRIVATE_FLAG 128
3299# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003300# ifndef FUTEX_CLOCK_REALTIME
3301# define FUTEX_CLOCK_REALTIME 256
3302# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003303static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003304 { FUTEX_WAIT, "FUTEX_WAIT" },
3305 { FUTEX_WAKE, "FUTEX_WAKE" },
3306 { FUTEX_FD, "FUTEX_FD" },
3307 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3308 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3309 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3310 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3311 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3312 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003313 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3314 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003315 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3316 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003317 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3318 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3319 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3320 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3321 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3322 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3323 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3324 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3325 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003326 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3327 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003328 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3329 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3330 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3331 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3332 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3333 { 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 +00003334 { 0, NULL }
3335};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003336# ifndef FUTEX_OP_SET
3337# define FUTEX_OP_SET 0
3338# define FUTEX_OP_ADD 1
3339# define FUTEX_OP_OR 2
3340# define FUTEX_OP_ANDN 3
3341# define FUTEX_OP_XOR 4
3342# define FUTEX_OP_CMP_EQ 0
3343# define FUTEX_OP_CMP_NE 1
3344# define FUTEX_OP_CMP_LT 2
3345# define FUTEX_OP_CMP_LE 3
3346# define FUTEX_OP_CMP_GT 4
3347# define FUTEX_OP_CMP_GE 5
3348# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003349static const struct xlat futexwakeops[] = {
3350 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3351 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3352 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3353 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3354 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3355 { 0, NULL }
3356};
3357static const struct xlat futexwakecmps[] = {
3358 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3359 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3360 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3361 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3362 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3363 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3364 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003365};
3366
3367int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003368sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003369{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003370 if (entering(tcp)) {
3371 long int cmd = tcp->u_arg[1] & 127;
3372 tprintf("%p, ", (void *) tcp->u_arg[0]);
3373 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3374 tprintf(", %ld", tcp->u_arg[2]);
3375 if (cmd == FUTEX_WAKE_BITSET)
3376 tprintf(", %lx", tcp->u_arg[5]);
3377 else if (cmd == FUTEX_WAIT) {
3378 tprintf(", ");
3379 printtv(tcp, tcp->u_arg[3]);
3380 } else if (cmd == FUTEX_WAIT_BITSET) {
3381 tprintf(", ");
3382 printtv(tcp, tcp->u_arg[3]);
3383 tprintf(", %lx", tcp->u_arg[5]);
3384 } else if (cmd == FUTEX_REQUEUE)
3385 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003386 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003387 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3388 else if (cmd == FUTEX_WAKE_OP) {
3389 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3390 if ((tcp->u_arg[5] >> 28) & 8)
3391 tprintf("FUTEX_OP_OPARG_SHIFT|");
3392 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3393 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3394 if ((tcp->u_arg[5] >> 24) & 8)
3395 tprintf("FUTEX_OP_OPARG_SHIFT|");
3396 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3397 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003398 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3399 tprintf(", ");
3400 printtv(tcp, tcp->u_arg[3]);
3401 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003402 }
Roland McGrath51942a92007-07-05 18:59:11 +00003403 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003404 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003405}
3406
3407static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003408print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003409{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003410 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003411 unsigned long w, min_len;
3412
3413 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3414 min_len = len - max_strlen * sizeof(w);
3415 else
3416 min_len = 0;
3417 for (; len >= sizeof(w) && len > min_len;
3418 len -= sizeof(w), list += sizeof(w)) {
3419 if (umove(tcp, list, &w) < 0)
3420 break;
3421 if (first)
3422 tprintf("{");
3423 else
3424 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003425 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003426 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003427 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003428 if (len) {
3429 if (first)
3430 tprintf("%#lx", list);
3431 else
3432 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3433 "???" : "..."));
3434 } else {
3435 tprintf(first ? "{}" : "}");
3436 }
Roland McGrath5a223472002-12-15 23:58:26 +00003437}
3438
3439int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003440sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003441{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003442 if (entering(tcp)) {
3443 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3444 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3445 }
3446 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003447}
3448
3449int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003450sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003451{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003452 if (entering(tcp)) {
3453 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3454 } else {
3455 if (tcp->u_rval == -1)
3456 tprintf("%#lx", tcp->u_arg[2]);
3457 else
3458 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3459 }
3460 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003461}
Roland McGrath279d3782004-03-01 20:27:37 +00003462
Roland McGrathd9f816f2004-09-04 03:39:20 +00003463static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003464 { SCHED_OTHER, "SCHED_OTHER" },
3465 { SCHED_RR, "SCHED_RR" },
3466 { SCHED_FIFO, "SCHED_FIFO" },
3467 { 0, NULL }
3468};
3469
3470int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003471sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003472{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003473 if (entering(tcp)) {
3474 tprintf("%d", (int) tcp->u_arg[0]);
3475 } else if (! syserror(tcp)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003476 tcp->auxstr = xlookup(schedulers, tcp->u_rval);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003477 if (tcp->auxstr != NULL)
3478 return RVAL_STR;
3479 }
3480 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003481}
3482
3483int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003484sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003485{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003486 if (entering(tcp)) {
3487 struct sched_param p;
3488 tprintf("%d, ", (int) tcp->u_arg[0]);
3489 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3490 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3491 tprintf(", %#lx", tcp->u_arg[2]);
3492 else
3493 tprintf(", { %d }", p.__sched_priority);
3494 }
3495 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003496}
3497
3498int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003499sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003500{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003501 if (entering(tcp)) {
3502 tprintf("%d, ", (int) tcp->u_arg[0]);
3503 } else {
3504 struct sched_param p;
3505 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3506 tprintf("%#lx", tcp->u_arg[1]);
3507 else
3508 tprintf("{ %d }", p.__sched_priority);
3509 }
3510 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003511}
3512
3513int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003514sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003515{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003516 if (entering(tcp)) {
3517 struct sched_param p;
3518 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3519 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3520 else
3521 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3522 }
3523 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003524}
3525
3526int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003527sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003528{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003529 if (entering(tcp)) {
3530 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3531 }
3532 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003533}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003534
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003535# ifdef X86_64
3536# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003537
3538static const struct xlat archvals[] = {
3539 { ARCH_SET_GS, "ARCH_SET_GS" },
3540 { ARCH_SET_FS, "ARCH_SET_FS" },
3541 { ARCH_GET_FS, "ARCH_GET_FS" },
3542 { ARCH_GET_GS, "ARCH_GET_GS" },
3543 { 0, NULL },
3544};
3545
3546int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003547sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003548{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003549 if (entering(tcp)) {
3550 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3551 if (tcp->u_arg[0] == ARCH_SET_GS
3552 || tcp->u_arg[0] == ARCH_SET_FS
3553 ) {
3554 tprintf(", %#lx", tcp->u_arg[1]);
3555 }
3556 } else {
3557 if (tcp->u_arg[0] == ARCH_GET_GS
3558 || tcp->u_arg[0] == ARCH_GET_FS
3559 ) {
3560 long int v;
3561 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3562 tprintf(", [%#lx]", v);
3563 else
3564 tprintf(", %#lx", tcp->u_arg[1]);
3565 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003566 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003567 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003568}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003569# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003570
Roland McGrathdb8319f2007-08-02 01:37:55 +00003571
3572int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003573sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003574{
3575 if (exiting(tcp)) {
3576 unsigned u;
3577 if (tcp->u_arg[0] == 0)
3578 tprintf("NULL, ");
3579 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3580 tprintf("%#lx, ", tcp->u_arg[0]);
3581 else
3582 tprintf("[%u], ", u);
3583 if (tcp->u_arg[1] == 0)
3584 tprintf("NULL, ");
3585 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3586 tprintf("%#lx, ", tcp->u_arg[1]);
3587 else
3588 tprintf("[%u], ", u);
3589 tprintf("%#lx", tcp->u_arg[2]);
3590 }
3591 return 0;
3592}
3593
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003594#endif /* LINUX */