blob: 0584f54773f3e2c63b2234965738c6dfc35f14ab [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Linux for s390 port by D.J. Barrow
8 * <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
Wichert Akkermanccef6372002-05-01 16:39:22 +00009 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
11
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000012 *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000013 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 */
39
40#include "defs.h"
41
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <sys/time.h>
45#include <sys/wait.h>
46#include <sys/resource.h>
47#include <sys/utsname.h>
48#include <sys/user.h>
49#include <sys/syscall.h>
50#include <signal.h>
51#ifdef SUNOS4
52#include <machine/reg.h>
53#endif /* SUNOS4 */
54
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000055#ifdef FREEBSD
56#include <sys/ptrace.h>
57#endif
58
Wichert Akkerman36915a11999-07-13 15:45:02 +000059#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000060# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000061#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000062# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000063#endif
64#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000065# define PTRACE_POKEUSR PTRACE_POKEUSER
66#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000067#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000068
Roland McGrath5bd7cf82003-01-24 04:31:18 +000069#ifdef HAVE_LINUX_PTRACE_H
70#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000071# ifdef HAVE_STRUCT_IA64_FPREG
72# define ia64_fpreg XXX_ia64_fpreg
73# endif
74# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
75# define pt_all_user_regs XXX_pt_all_user_regs
76# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000077#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000078# undef ia64_fpreg
79# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000080#endif
81
Roland McGrath6d1a65c2004-07-12 07:44:08 +000082#if defined (LINUX) && defined (SPARC64)
83# define r_pc r_tpc
84# undef PTRACE_GETREGS
85# define PTRACE_GETREGS PTRACE_GETREGS64
86# undef PTRACE_SETREGS
87# define PTRACE_SETREGS PTRACE_SETREGS64
88#endif /* LINUX && SPARC64 */
89
Roland McGrath5a223472002-12-15 23:58:26 +000090#ifdef HAVE_LINUX_FUTEX_H
Dmitry V. Levine5e60852009-12-31 22:50:49 +000091# include <linux/futex.h>
Roland McGrath5a223472002-12-15 23:58:26 +000092#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +000093#ifdef LINUX
Roland McGrath5a223472002-12-15 23:58:26 +000094# ifndef FUTEX_WAIT
95# define FUTEX_WAIT 0
96# endif
97# ifndef FUTEX_WAKE
98# define FUTEX_WAKE 1
99# endif
100# ifndef FUTEX_FD
101# define FUTEX_FD 2
102# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000103# ifndef FUTEX_REQUEUE
104# define FUTEX_REQUEUE 3
105# endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000106#endif /* LINUX */
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000107
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000108#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000109#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000110#include <asm/posix_types.h>
111#undef GETGROUPS_T
112#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000113#undef GETGROUPS32_T
114#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000115#endif /* LINUX */
116
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000117#if defined(LINUX) && defined(IA64)
118# include <asm/ptrace_offsets.h>
119# include <asm/rse.h>
120#endif
121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef HAVE_PRCTL
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000123# include <sys/prctl.h>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000124
Roland McGrathd9f816f2004-09-04 03:39:20 +0000125static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000126#ifdef PR_MAXPROCS
127 { PR_MAXPROCS, "PR_MAXPROCS" },
128#endif
129#ifdef PR_ISBLOCKED
130 { PR_ISBLOCKED, "PR_ISBLOCKED" },
131#endif
132#ifdef PR_SETSTACKSIZE
133 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
134#endif
135#ifdef PR_GETSTACKSIZE
136 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
137#endif
138#ifdef PR_MAXPPROCS
139 { PR_MAXPPROCS, "PR_MAXPPROCS" },
140#endif
141#ifdef PR_UNBLKONEXEC
142 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
143#endif
144#ifdef PR_ATOMICSIM
145 { PR_ATOMICSIM, "PR_ATOMICSIM" },
146#endif
147#ifdef PR_SETEXITSIG
148 { PR_SETEXITSIG, "PR_SETEXITSIG" },
149#endif
150#ifdef PR_RESIDENT
151 { PR_RESIDENT, "PR_RESIDENT" },
152#endif
153#ifdef PR_ATTACHADDR
154 { PR_ATTACHADDR, "PR_ATTACHADDR" },
155#endif
156#ifdef PR_DETACHADDR
157 { PR_DETACHADDR, "PR_DETACHADDR" },
158#endif
159#ifdef PR_TERMCHILD
160 { PR_TERMCHILD, "PR_TERMCHILD" },
161#endif
162#ifdef PR_GETSHMASK
163 { PR_GETSHMASK, "PR_GETSHMASK" },
164#endif
165#ifdef PR_GETNSHARE
166 { PR_GETNSHARE, "PR_GETNSHARE" },
167#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000168#ifdef PR_COREPID
169 { PR_COREPID, "PR_COREPID" },
170#endif
171#ifdef PR_ATTACHADDRPERM
172 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
173#endif
174#ifdef PR_PTHREADEXIT
175 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
176#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000177#ifdef PR_SET_PDEATHSIG
178 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
179#endif
180#ifdef PR_GET_PDEATHSIG
181 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
182#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000183#ifdef PR_GET_DUMPABLE
184 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
185#endif
186#ifdef PR_SET_DUMPABLE
187 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
188#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000189#ifdef PR_GET_UNALIGN
190 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
191#endif
192#ifdef PR_SET_UNALIGN
193 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
194#endif
195#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000196 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000197#endif
198#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000199 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000200#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000201#ifdef PR_GET_FPEMU
202 { PR_GET_FPEMU, "PR_GET_FPEMU" },
203#endif
204#ifdef PR_SET_FPEMU
205 { PR_SET_FPEMU, "PR_SET_FPEMU" },
206#endif
207#ifdef PR_GET_FPEXC
208 { PR_GET_FPEXC, "PR_GET_FPEXC" },
209#endif
210#ifdef PR_SET_FPEXC
211 { PR_SET_FPEXC, "PR_SET_FPEXC" },
212#endif
213#ifdef PR_GET_TIMING
214 { PR_GET_TIMING, "PR_GET_TIMING" },
215#endif
216#ifdef PR_SET_TIMING
217 { PR_SET_TIMING, "PR_SET_TIMING" },
218#endif
219#ifdef PR_SET_NAME
220 { PR_SET_NAME, "PR_SET_NAME" },
221#endif
222#ifdef PR_GET_NAME
223 { PR_GET_NAME, "PR_GET_NAME" },
224#endif
225#ifdef PR_GET_ENDIAN
226 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
227#endif
228#ifdef PR_SET_ENDIAN
229 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
230#endif
231#ifdef PR_GET_SECCOMP
232 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
233#endif
234#ifdef PR_SET_SECCOMP
235 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
236#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000237#ifdef PR_GET_TSC
238 { PR_GET_TSC, "PR_GET_TSC" },
239#endif
240#ifdef PR_SET_TSC
241 { PR_SET_TSC, "PR_SET_TSC" },
242#endif
243#ifdef PR_GET_SECUREBITS
244 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
245#endif
246#ifdef PR_SET_SECUREBITS
247 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
248#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000249 { 0, NULL },
250};
251
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000252
Roland McGratha4d48532005-06-08 20:45:28 +0000253static const char *
Denys Vlasenko12014262011-05-30 14:00:14 +0200254unalignctl_string(unsigned int ctl)
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000255{
256 static char buf[16];
257
258 switch (ctl) {
259#ifdef PR_UNALIGN_NOPRINT
260 case PR_UNALIGN_NOPRINT:
261 return "NOPRINT";
262#endif
263#ifdef PR_UNALIGN_SIGBUS
264 case PR_UNALIGN_SIGBUS:
265 return "SIGBUS";
266#endif
267 default:
268 break;
269 }
270 sprintf(buf, "%x", ctl);
271 return buf;
272}
273
274
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000275int
Denys Vlasenko12014262011-05-30 14:00:14 +0200276sys_prctl(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000277{
278 int i;
279
280 if (entering(tcp)) {
281 printxval(prctl_options, tcp->u_arg[0], "PR_???");
282 switch (tcp->u_arg[0]) {
283#ifdef PR_GETNSHARE
284 case PR_GETNSHARE:
285 break;
286#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000287#ifdef PR_SET_PDEATHSIG
288 case PR_SET_PDEATHSIG:
289 tprintf(", %lu", tcp->u_arg[1]);
290 break;
291#endif
292#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000293 case PR_GET_PDEATHSIG:
294 break;
295#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000296#ifdef PR_SET_DUMPABLE
297 case PR_SET_DUMPABLE:
298 tprintf(", %lu", tcp->u_arg[1]);
299 break;
300#endif
301#ifdef PR_GET_DUMPABLE
302 case PR_GET_DUMPABLE:
303 break;
304#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000305#ifdef PR_SET_UNALIGN
306 case PR_SET_UNALIGN:
307 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
308 break;
309#endif
310#ifdef PR_GET_UNALIGN
311 case PR_GET_UNALIGN:
312 tprintf(", %#lx", tcp->u_arg[1]);
313 break;
314#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000315#ifdef PR_SET_KEEPCAPS
316 case PR_SET_KEEPCAPS:
317 tprintf(", %lu", tcp->u_arg[1]);
318 break;
319#endif
320#ifdef PR_GET_KEEPCAPS
321 case PR_GET_KEEPCAPS:
322 break;
323#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000324 default:
325 for (i = 1; i < tcp->u_nargs; i++)
326 tprintf(", %#lx", tcp->u_arg[i]);
327 break;
328 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000329 } else {
330 switch (tcp->u_arg[0]) {
331#ifdef PR_GET_PDEATHSIG
332 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000333 if (umove(tcp, tcp->u_arg[1], &i) < 0)
334 tprintf(", %#lx", tcp->u_arg[1]);
335 else
336 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000337 break;
338#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000339#ifdef PR_GET_DUMPABLE
340 case PR_GET_DUMPABLE:
341 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000342#endif
343#ifdef PR_GET_UNALIGN
344 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000345 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
346 break;
347 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000348 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000349#endif
350#ifdef PR_GET_KEEPCAPS
351 case PR_GET_KEEPCAPS:
352 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000353#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000354 default:
355 break;
356 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000357 }
358 return 0;
359}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000360#endif /* HAVE_PRCTL */
361
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000362#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000363int
Denys Vlasenko12014262011-05-30 14:00:14 +0200364sys_gethostid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000365{
366 if (exiting(tcp))
367 return RVAL_HEX;
368 return 0;
369}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000370#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000371
372int
Denys Vlasenko12014262011-05-30 14:00:14 +0200373sys_sethostname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000374{
375 if (entering(tcp)) {
376 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
377 tprintf(", %lu", tcp->u_arg[1]);
378 }
379 return 0;
380}
381
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000382#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000383int
Denys Vlasenko12014262011-05-30 14:00:14 +0200384sys_gethostname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000385{
386 if (exiting(tcp)) {
387 if (syserror(tcp))
388 tprintf("%#lx", tcp->u_arg[0]);
389 else
390 printpath(tcp, tcp->u_arg[0]);
391 tprintf(", %lu", tcp->u_arg[1]);
392 }
393 return 0;
394}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000395#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000396
397int
Denys Vlasenko12014262011-05-30 14:00:14 +0200398sys_setdomainname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000399{
400 if (entering(tcp)) {
401 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
402 tprintf(", %lu", tcp->u_arg[1]);
403 }
404 return 0;
405}
406
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000407#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000408
409int
Denys Vlasenko12014262011-05-30 14:00:14 +0200410sys_getdomainname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000411{
412 if (exiting(tcp)) {
413 if (syserror(tcp))
414 tprintf("%#lx", tcp->u_arg[0]);
415 else
416 printpath(tcp, tcp->u_arg[0]);
417 tprintf(", %lu", tcp->u_arg[1]);
418 }
419 return 0;
420}
421#endif /* !LINUX */
422
423int
Denys Vlasenko12014262011-05-30 14:00:14 +0200424sys_exit(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000425{
426 if (exiting(tcp)) {
427 fprintf(stderr, "_exit returned!\n");
428 return -1;
429 }
430 /* special case: we stop tracing this process, finish line now */
431 tprintf("%ld) ", tcp->u_arg[0]);
432 tabto(acolumn);
433 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000434 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000435 return 0;
436}
437
438int
Dmitry V. Levinfde119c2011-02-18 23:16:20 +0000439internal_exit(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000440{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000441 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000442 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000443#ifdef __NR_exit_group
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000444 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000445 tcp->flags |= TCB_GROUP_EXITING;
446#endif
447 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000448 return 0;
449}
450
Roland McGratheb9e2e82009-06-02 16:49:22 -0700451/* TCP is creating a child we want to follow.
452 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
453 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
454static void
455fork_tcb(struct tcb *tcp)
456{
457 if (nprocs == tcbtabsize)
458 expand_tcbtab();
459
460 tcp->flags |= TCB_FOLLOWFORK;
461}
462
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000463#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000464
465int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000466sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000467{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000468 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000469 if (getrval2(tcp)) {
470 tcp->auxstr = "child process";
471 return RVAL_UDECIMAL | RVAL_STR;
472 }
473 }
474 return 0;
475}
476
John Hughes4e36a812001-04-18 15:11:51 +0000477#if UNIXWARE > 2
478
479int
Denys Vlasenko12014262011-05-30 14:00:14 +0200480sys_rfork(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +0000481{
482 if (entering(tcp)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200483 tprintf("%ld", tcp->u_arg[0]);
John Hughes4e36a812001-04-18 15:11:51 +0000484 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000485 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000486 if (getrval2(tcp)) {
487 tcp->auxstr = "child process";
488 return RVAL_UDECIMAL | RVAL_STR;
489 }
490 }
491 return 0;
492}
493
494#endif
495
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000496int
Denys Vlasenko12014262011-05-30 14:00:14 +0200497internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000498{
499 struct tcb *tcpchild;
500
501 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000502#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000503 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000504 return 0;
505#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000506 if (getrval2(tcp))
507 return 0;
508 if (!followfork)
509 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700510 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000511 if (syserror(tcp))
512 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000513 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000514 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000515 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000516 }
517 return 0;
518}
519
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000520#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000521
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000522#ifdef LINUX
523
524/* defines copied from linux/sched.h since we can't include that
525 * ourselves (it conflicts with *lots* of libc includes)
526 */
527#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
528#define CLONE_VM 0x00000100 /* set if VM shared between processes */
529#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
530#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
531#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000532#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000533#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
534#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
535#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000536#define CLONE_THREAD 0x00010000 /* Same thread group? */
537#define CLONE_NEWNS 0x00020000 /* New namespace group? */
538#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
539#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
540#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
541#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
Roland McGrath909875b2002-12-22 03:34:36 +0000542#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
543#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000544#define CLONE_STOPPED 0x02000000 /* Start in stopped state */
545#define CLONE_NEWUTS 0x04000000 /* New utsname group? */
546#define CLONE_NEWIPC 0x08000000 /* New ipcs */
547#define CLONE_NEWUSER 0x10000000 /* New user namespace */
548#define CLONE_NEWPID 0x20000000 /* New pid namespace */
549#define CLONE_NEWNET 0x40000000 /* New network namespace */
550#define CLONE_IO 0x80000000 /* Clone io context */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000551
Roland McGrathd9f816f2004-09-04 03:39:20 +0000552static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000553 { CLONE_VM, "CLONE_VM" },
554 { CLONE_FS, "CLONE_FS" },
555 { CLONE_FILES, "CLONE_FILES" },
556 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000557 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000558 { CLONE_PTRACE, "CLONE_PTRACE" },
559 { CLONE_VFORK, "CLONE_VFORK" },
560 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000561 { CLONE_THREAD, "CLONE_THREAD" },
562 { CLONE_NEWNS, "CLONE_NEWNS" },
563 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
564 { CLONE_SETTLS, "CLONE_SETTLS" },
565 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
566 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
Roland McGrath909875b2002-12-22 03:34:36 +0000567 { CLONE_UNTRACED, "CLONE_UNTRACED" },
568 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000569 { CLONE_STOPPED, "CLONE_STOPPED" },
570 { CLONE_NEWUTS, "CLONE_NEWUTS" },
571 { CLONE_NEWIPC, "CLONE_NEWIPC" },
572 { CLONE_NEWUSER, "CLONE_NEWUSER" },
573 { CLONE_NEWPID, "CLONE_NEWPID" },
574 { CLONE_NEWNET, "CLONE_NEWNET" },
575 { CLONE_IO, "CLONE_IO" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000576 { 0, NULL },
577};
578
Roland McGrath909875b2002-12-22 03:34:36 +0000579# ifdef I386
580# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000581# ifdef HAVE_STRUCT_USER_DESC
582# define modify_ldt_ldt_s user_desc
583# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000584extern void print_ldt_entry();
585# endif
586
Roland McGrath9677b3a2003-03-12 09:54:36 +0000587# if defined IA64
588# define ARG_FLAGS 0
589# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000590# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
591# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
592# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
593# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000594# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000595# define ARG_STACK 0
596# define ARG_FLAGS 1
597# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000598# define ARG_CTID 3
599# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000600# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000601# define ARG_FLAGS 0
602# define ARG_STACK 1
603# define ARG_PTID 2
604# define ARG_CTID 3
605# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000606# else
607# define ARG_FLAGS 0
608# define ARG_STACK 1
609# define ARG_PTID 2
610# define ARG_TLS 3
611# define ARG_CTID 4
612# endif
613
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000614int
Denys Vlasenko12014262011-05-30 14:00:14 +0200615sys_clone(struct tcb *tcp)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000616{
617 if (exiting(tcp)) {
Wang Chaocbdd1902010-09-02 15:08:59 +0800618 const char *sep = "|";
Roland McGrath9677b3a2003-03-12 09:54:36 +0000619 unsigned long flags = tcp->u_arg[ARG_FLAGS];
620 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
621# ifdef ARG_STACKSIZE
622 if (ARG_STACKSIZE != -1)
623 tprintf("stack_size=%#lx, ",
624 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000625# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000626 tprintf("flags=");
Wang Chaocbdd1902010-09-02 15:08:59 +0800627 if (!printflags(clone_flags, flags &~ CSIGNAL, NULL))
628 sep = "";
Roland McGrath984154d2003-05-23 01:08:42 +0000629 if ((flags & CSIGNAL) != 0)
Wang Chaocbdd1902010-09-02 15:08:59 +0800630 tprintf("%s%s", sep, signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000631 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000632 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000633 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000634 if (flags & CLONE_PARENT_SETTID)
635 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000636 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000637# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000638 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000639 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000640 tprintf(", {entry_number:%d, ",
641 copy.entry_number);
642 if (!verbose(tcp))
643 tprintf("...}");
644 else
645 print_ldt_entry(&copy);
646 }
647 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000648# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000649 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000650 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000651 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
652 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000653 }
654 return 0;
655}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000656
657int
658sys_unshare(struct tcb *tcp)
659{
660 if (entering(tcp))
661 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
662 return 0;
663}
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000664#endif /* LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000665
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000666int
Denys Vlasenko12014262011-05-30 14:00:14 +0200667sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000668{
669 if (exiting(tcp))
670 return RVAL_UDECIMAL;
671 return 0;
672}
673
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000674int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000675change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000676{
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000677#ifdef LINUX
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000678#if defined(I386)
679 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000680 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000681 return -1;
682 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000683#elif defined(X86_64)
684 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000685 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000686 return -1;
687 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000688#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000689 if (ptrace(PTRACE_POKEUSER, tcp->pid,
690 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000691 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000692 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000693#elif defined(S390) || defined(S390X)
694 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200695 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000696 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000697 return 0;
698#elif defined(M68K)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200699 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000700 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000702#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400703 struct pt_regs regs;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200704 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0) < 0)
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000705 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400706 regs.u_regs[U_REG_G1] = new;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200707 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000708 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000709 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000710#elif defined(MIPS)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200711 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000712 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000713 return 0;
714#elif defined(ALPHA)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200715 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000716 return -1;
717 return 0;
718#elif defined(AVR32)
719 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
720 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000721 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000722#elif defined(BFIN)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200723 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new) < 0)
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000724 return -1;
725 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000726#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000727 if (ia32) {
728 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000729 case 2:
730 break; /* x86 SYS_fork */
731 case SYS_clone:
732 new = 120;
733 break;
734 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000735 fprintf(stderr, "%s: unexpected syscall %d\n",
736 __FUNCTION__, new);
737 return -1;
738 }
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200739 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0)
Roland McGrath08267b82004-02-20 22:56:43 +0000740 return -1;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200741 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new) < 0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000742 return -1;
743 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000744#elif defined(HPPA)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200745 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000746 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000747 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000748#elif defined(SH)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200749 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000750 return -1;
751 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000752#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000753 /* Top half of reg encodes the no. of args n as 0x1n.
754 Assume 0 args as kernel never actually checks... */
755 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
756 0x100000 | new) < 0)
757 return -1;
758 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000759#elif defined(CRISV10) || defined(CRISV32)
760 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
761 return -1;
762 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000763#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000764 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000765# ifndef PTRACE_SET_SYSCALL
766# define PTRACE_SET_SYSCALL 23
767# endif
768
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200769 if (ptrace(PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000770 return -1;
771
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000772 return 0;
Chris Metcalfc8c66982009-12-28 10:00:15 -0500773#elif defined(TILE)
774 if (ptrace(PTRACE_POKEUSER, tcp->pid,
775 (char*)PTREGS_OFFSET_REG(0),
776 new) != 0)
777 return -1;
778 return 0;
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200779#elif defined(MICROBLAZE)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200780 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0)
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200781 return -1;
782 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000783#else
784#warning Do not know how to handle change_syscall for this architecture
785#endif /* architecture */
786#endif /* LINUX */
787 return -1;
788}
789
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000790#ifdef LINUX
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000791int
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800792handle_new_child(struct tcb *tcp, int pid, int bpt)
793{
794 struct tcb *tcpchild;
795
796#ifdef CLONE_PTRACE /* See new setbpt code. */
797 tcpchild = pid2tcb(pid);
798 if (tcpchild != NULL) {
799 /* The child already reported its startup trap
800 before the parent reported its syscall return. */
801 if ((tcpchild->flags
802 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
803 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
804 fprintf(stderr, "\
805[preattached child %d of %d in weird state!]\n",
806 pid, tcp->pid);
807 }
808 else
809#endif /* CLONE_PTRACE */
810 {
811 fork_tcb(tcp);
812 tcpchild = alloctcb(pid);
813 }
814
815#ifndef CLONE_PTRACE
816 /* Attach to the new child */
817 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
818 if (bpt)
819 clearbpt(tcp);
820 perror("PTRACE_ATTACH");
821 fprintf(stderr, "Too late?\n");
822 droptcb(tcpchild);
823 return 0;
824 }
825#endif /* !CLONE_PTRACE */
826
827 if (bpt)
828 clearbpt(tcp);
829
830 tcpchild->flags |= TCB_ATTACHED;
831 /* Child has BPT too, must be removed on first occasion. */
832 if (bpt) {
833 tcpchild->flags |= TCB_BPTSET;
834 tcpchild->baddr = tcp->baddr;
835 memcpy(tcpchild->inst, tcp->inst,
836 sizeof tcpchild->inst);
837 }
838 tcpchild->parent = tcp;
839 tcp->nchildren++;
840 if (tcpchild->flags & TCB_SUSPENDED) {
841 /* The child was born suspended, due to our having
842 forced CLONE_PTRACE. */
843 if (bpt)
844 clearbpt(tcpchild);
845
846 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
847 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
848 return -1;
849
850 if (!qflag)
851 fprintf(stderr, "\
852Process %u resumed (parent %d ready)\n",
853 pid, tcp->pid);
854 }
855 else {
856 if (!qflag)
857 fprintf(stderr, "Process %d attached\n", pid);
858 }
859
860#ifdef TCB_CLONE_THREAD
861 if (sysent[tcp->scno].sys_func == sys_clone)
862 {
863 /*
864 * Save the flags used in this call,
865 * in case we point TCP to our parent below.
866 */
867 int call_flags = tcp->u_arg[ARG_FLAGS];
868 if ((tcp->flags & TCB_CLONE_THREAD) &&
869 tcp->parent != NULL) {
870 /* The parent in this clone is itself a
871 thread belonging to another process.
872 There is no meaning to the parentage
873 relationship of the new child with the
874 thread, only with the process. We
875 associate the new thread with our
876 parent. Since this is done for every
877 new thread, there will never be a
878 TCB_CLONE_THREAD process that has
879 children. */
880 --tcp->nchildren;
881 tcp = tcp->parent;
882 tcpchild->parent = tcp;
883 ++tcp->nchildren;
884 }
885 if (call_flags & CLONE_THREAD) {
886 tcpchild->flags |= TCB_CLONE_THREAD;
887 ++tcp->nclone_threads;
888 }
889 if ((call_flags & CLONE_PARENT) &&
890 !(call_flags & CLONE_THREAD)) {
891 --tcp->nchildren;
892 tcpchild->parent = NULL;
893 if (tcp->parent != NULL) {
894 tcp = tcp->parent;
895 tcpchild->parent = tcp;
896 ++tcp->nchildren;
897 }
898 }
899 }
900#endif /* TCB_CLONE_THREAD */
901 return 0;
902}
903
904int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000905internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000906{
Denys Vlasenkof44cce42011-06-21 14:34:10 +0200907 if ((ptrace_setoptions
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800908 & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
909 == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
910 return 0;
911
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000912 if (entering(tcp)) {
Wang Chaoe636c852010-09-16 11:20:56 +0800913 tcp->flags &= ~TCB_FOLLOWFORK;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700914 if (!followfork)
915 return 0;
Wang Chaoe636c852010-09-16 11:20:56 +0800916 /*
917 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
918 * new child if clone is called with flag CLONE_UNTRACED, so
919 * we keep the same logic with that option and don't trace it.
920 */
921 if ((sysent[tcp->scno].sys_func == sys_clone) &&
922 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
923 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700924 fork_tcb(tcp);
925 if (setbpt(tcp) < 0)
926 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000927 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000928 int pid;
929 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700930
931 if (!(tcp->flags & TCB_FOLLOWFORK))
932 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000933
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000934 bpt = tcp->flags & TCB_BPTSET;
935
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000936 if (syserror(tcp)) {
937 if (bpt)
938 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000939 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000940 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000941
942 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000943
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800944 return handle_new_child(tcp, pid, bpt);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000945 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000946 return 0;
947}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000948
949#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000950
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000951int
Denys Vlasenko12014262011-05-30 14:00:14 +0200952internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000953{
954 struct tcb *tcpchild;
955 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700956 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000957
958#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000959 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000960 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000961 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700962 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000963 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000964#endif
965 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700966 if (!followfork || dont_follow)
967 return 0;
968 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000969 if (setbpt(tcp) < 0)
970 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000971 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000972 else {
973 int bpt = tcp->flags & TCB_BPTSET;
974
Roland McGratheb9e2e82009-06-02 16:49:22 -0700975 if (!(tcp->flags & TCB_FOLLOWFORK))
976 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000977 if (bpt)
978 clearbpt(tcp);
979
980 if (syserror(tcp))
981 return 0;
982
983 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700984 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000985 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000986#ifdef SUNOS4
987#ifdef oldway
988 /* The child must have run before it can be attached. */
989 {
990 struct timeval tv;
991 tv.tv_sec = 0;
992 tv.tv_usec = 10000;
993 select(0, NULL, NULL, NULL, &tv);
994 }
995 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
996 perror("PTRACE_ATTACH");
997 fprintf(stderr, "Too late?\n");
998 droptcb(tcpchild);
999 return 0;
1000 }
1001#else /* !oldway */
1002 /* Try to catch the new process as soon as possible. */
1003 {
1004 int i;
1005 for (i = 0; i < 1024; i++)
1006 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1007 break;
1008 if (i == 1024) {
1009 perror("PTRACE_ATTACH");
1010 fprintf(stderr, "Too late?\n");
1011 droptcb(tcpchild);
1012 return 0;
1013 }
1014 }
1015#endif /* !oldway */
1016#endif /* SUNOS4 */
1017 tcpchild->flags |= TCB_ATTACHED;
1018 /* Child has BPT too, must be removed on first occasion */
1019 if (bpt) {
1020 tcpchild->flags |= TCB_BPTSET;
1021 tcpchild->baddr = tcp->baddr;
1022 memcpy(tcpchild->inst, tcp->inst,
1023 sizeof tcpchild->inst);
1024 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001025 tcpchild->parent = tcp;
1026 tcp->nchildren++;
1027 if (!qflag)
1028 fprintf(stderr, "Process %d attached\n", pid);
1029 }
1030 return 0;
1031}
1032
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001033#endif /* !LINUX */
1034
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001035#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001036
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001037#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001038
1039int
Denys Vlasenko12014262011-05-30 14:00:14 +02001040sys_vfork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001041{
1042 if (exiting(tcp))
1043 return RVAL_UDECIMAL;
1044 return 0;
1045}
1046
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001047#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001048
1049#ifndef LINUX
1050
1051static char idstr[16];
1052
1053int
Denys Vlasenko12014262011-05-30 14:00:14 +02001054sys_getpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001055{
1056 if (exiting(tcp)) {
1057 sprintf(idstr, "ppid %lu", getrval2(tcp));
1058 tcp->auxstr = idstr;
1059 return RVAL_STR;
1060 }
1061 return 0;
1062}
1063
1064int
Denys Vlasenko12014262011-05-30 14:00:14 +02001065sys_getuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001066{
1067 if (exiting(tcp)) {
1068 sprintf(idstr, "euid %lu", getrval2(tcp));
1069 tcp->auxstr = idstr;
1070 return RVAL_STR;
1071 }
1072 return 0;
1073}
1074
1075int
Denys Vlasenko12014262011-05-30 14:00:14 +02001076sys_getgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001077{
1078 if (exiting(tcp)) {
1079 sprintf(idstr, "egid %lu", getrval2(tcp));
1080 tcp->auxstr = idstr;
1081 return RVAL_STR;
1082 }
1083 return 0;
1084}
1085
1086#endif /* !LINUX */
1087
1088#ifdef LINUX
1089
Dmitry V. Levin50a218d2011-01-18 17:36:20 +00001090int sys_getuid(struct tcb *tcp)
1091{
1092 if (exiting(tcp))
1093 tcp->u_rval = (uid_t) tcp->u_rval;
1094 return RVAL_UDECIMAL;
1095}
1096
1097int sys_setfsuid(struct tcb *tcp)
1098{
1099 if (entering(tcp))
1100 tprintf("%u", (uid_t) tcp->u_arg[0]);
1101 else
1102 tcp->u_rval = (uid_t) tcp->u_rval;
1103 return RVAL_UDECIMAL;
1104}
1105
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001106int
Denys Vlasenko12014262011-05-30 14:00:14 +02001107sys_setuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001108{
1109 if (entering(tcp)) {
1110 tprintf("%u", (uid_t) tcp->u_arg[0]);
1111 }
1112 return 0;
1113}
1114
1115int
Denys Vlasenko12014262011-05-30 14:00:14 +02001116sys_setgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001117{
1118 if (entering(tcp)) {
1119 tprintf("%u", (gid_t) tcp->u_arg[0]);
1120 }
1121 return 0;
1122}
1123
1124int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001125sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001126{
1127 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001128 __kernel_uid_t uid;
1129 if (syserror(tcp))
1130 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1131 tcp->u_arg[1], tcp->u_arg[2]);
1132 else {
1133 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1134 tprintf("%#lx, ", tcp->u_arg[0]);
1135 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001136 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001137 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1138 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001139 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001140 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001141 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1142 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001143 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001144 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001145 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001146 }
1147 return 0;
1148}
1149
1150int
Denys Vlasenko12014262011-05-30 14:00:14 +02001151sys_getresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001152{
1153 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001154 __kernel_gid_t gid;
1155 if (syserror(tcp))
1156 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1157 tcp->u_arg[1], tcp->u_arg[2]);
1158 else {
1159 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1160 tprintf("%#lx, ", tcp->u_arg[0]);
1161 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001162 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001163 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1164 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001165 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001166 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001167 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1168 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001169 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001170 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001171 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001172 }
1173 return 0;
1174}
1175
1176#endif /* LINUX */
1177
1178int
Denys Vlasenko12014262011-05-30 14:00:14 +02001179sys_setreuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001180{
1181 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001182 printuid("", tcp->u_arg[0]);
1183 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001184 }
1185 return 0;
1186}
1187
1188int
Denys Vlasenko12014262011-05-30 14:00:14 +02001189sys_setregid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001190{
1191 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001192 printuid("", tcp->u_arg[0]);
1193 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001194 }
1195 return 0;
1196}
1197
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001198#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001199int
Denys Vlasenko12014262011-05-30 14:00:14 +02001200sys_setresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001201{
1202 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001203 printuid("", tcp->u_arg[0]);
1204 printuid(", ", tcp->u_arg[1]);
1205 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001206 }
1207 return 0;
1208}
1209int
Denys Vlasenko12014262011-05-30 14:00:14 +02001210sys_setresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001211{
1212 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001213 printuid("", tcp->u_arg[0]);
1214 printuid(", ", tcp->u_arg[1]);
1215 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001216 }
1217 return 0;
1218}
1219
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001220#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001221
1222int
Denys Vlasenko12014262011-05-30 14:00:14 +02001223sys_setgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001224{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001225 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001226 unsigned long len, size, start, cur, end, abbrev_end;
1227 GETGROUPS_T gid;
1228 int failed = 0;
1229
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001230 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001231 tprintf("%lu, ", len);
1232 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001233 tprintf("[]");
1234 return 0;
1235 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001236 start = tcp->u_arg[1];
1237 if (start == 0) {
1238 tprintf("NULL");
1239 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001240 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001241 size = len * sizeof(gid);
1242 end = start + size;
1243 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1244 tprintf("%#lx", start);
1245 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001246 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001247 if (abbrev(tcp)) {
1248 abbrev_end = start + max_strlen * sizeof(gid);
1249 if (abbrev_end < start)
1250 abbrev_end = end;
1251 } else {
1252 abbrev_end = end;
1253 }
1254 tprintf("[");
1255 for (cur = start; cur < end; cur += sizeof(gid)) {
1256 if (cur > start)
1257 tprintf(", ");
1258 if (cur >= abbrev_end) {
1259 tprintf("...");
1260 break;
1261 }
1262 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1263 tprintf("?");
1264 failed = 1;
1265 break;
1266 }
1267 tprintf("%lu", (unsigned long) gid);
1268 }
1269 tprintf("]");
1270 if (failed)
1271 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001272 }
1273 return 0;
1274}
1275
1276int
Denys Vlasenko12014262011-05-30 14:00:14 +02001277sys_getgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001278{
Roland McGrathaa524c82005-06-01 19:22:06 +00001279 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001280
1281 if (entering(tcp)) {
1282 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001283 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001284 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001285 unsigned long size, start, cur, end, abbrev_end;
1286 GETGROUPS_T gid;
1287 int failed = 0;
1288
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001289 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001290 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001291 tprintf("[]");
1292 return 0;
1293 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001294 start = tcp->u_arg[1];
1295 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001296 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001297 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001298 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001299 if (tcp->u_arg[0] == 0) {
1300 tprintf("%#lx", start);
1301 return 0;
1302 }
1303 size = len * sizeof(gid);
1304 end = start + size;
1305 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1306 size / sizeof(gid) != len || end < start) {
1307 tprintf("%#lx", start);
1308 return 0;
1309 }
1310 if (abbrev(tcp)) {
1311 abbrev_end = start + max_strlen * sizeof(gid);
1312 if (abbrev_end < start)
1313 abbrev_end = end;
1314 } else {
1315 abbrev_end = end;
1316 }
1317 tprintf("[");
1318 for (cur = start; cur < end; cur += sizeof(gid)) {
1319 if (cur > start)
1320 tprintf(", ");
1321 if (cur >= abbrev_end) {
1322 tprintf("...");
1323 break;
1324 }
1325 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1326 tprintf("?");
1327 failed = 1;
1328 break;
1329 }
1330 tprintf("%lu", (unsigned long) gid);
1331 }
1332 tprintf("]");
1333 if (failed)
1334 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001335 }
1336 return 0;
1337}
1338
Roland McGrath83bd47a2003-11-13 22:32:26 +00001339#ifdef LINUX
1340int
Denys Vlasenko12014262011-05-30 14:00:14 +02001341sys_setgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001342{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001343 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001344 unsigned long len, size, start, cur, end, abbrev_end;
1345 GETGROUPS32_T gid;
1346 int failed = 0;
1347
Roland McGrath83bd47a2003-11-13 22:32:26 +00001348 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001349 tprintf("%lu, ", len);
1350 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001351 tprintf("[]");
1352 return 0;
1353 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001354 start = tcp->u_arg[1];
1355 if (start == 0) {
1356 tprintf("NULL");
1357 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001358 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001359 size = len * sizeof(gid);
1360 end = start + size;
1361 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1362 tprintf("%#lx", start);
1363 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001364 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001365 if (abbrev(tcp)) {
1366 abbrev_end = start + max_strlen * sizeof(gid);
1367 if (abbrev_end < start)
1368 abbrev_end = end;
1369 } else {
1370 abbrev_end = end;
1371 }
1372 tprintf("[");
1373 for (cur = start; cur < end; cur += sizeof(gid)) {
1374 if (cur > start)
1375 tprintf(", ");
1376 if (cur >= abbrev_end) {
1377 tprintf("...");
1378 break;
1379 }
1380 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1381 tprintf("?");
1382 failed = 1;
1383 break;
1384 }
1385 tprintf("%lu", (unsigned long) gid);
1386 }
1387 tprintf("]");
1388 if (failed)
1389 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001390 }
1391 return 0;
1392}
1393
1394int
Denys Vlasenko12014262011-05-30 14:00:14 +02001395sys_getgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001396{
Roland McGrathaa524c82005-06-01 19:22:06 +00001397 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001398
1399 if (entering(tcp)) {
1400 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001401 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001402 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001403 unsigned long size, start, cur, end, abbrev_end;
1404 GETGROUPS32_T gid;
1405 int failed = 0;
1406
Roland McGrath83bd47a2003-11-13 22:32:26 +00001407 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001408 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001409 tprintf("[]");
1410 return 0;
1411 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001412 start = tcp->u_arg[1];
1413 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001414 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001415 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001416 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001417 size = len * sizeof(gid);
1418 end = start + size;
1419 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1420 size / sizeof(gid) != len || end < start) {
1421 tprintf("%#lx", start);
1422 return 0;
1423 }
1424 if (abbrev(tcp)) {
1425 abbrev_end = start + max_strlen * sizeof(gid);
1426 if (abbrev_end < start)
1427 abbrev_end = end;
1428 } else {
1429 abbrev_end = end;
1430 }
1431 tprintf("[");
1432 for (cur = start; cur < end; cur += sizeof(gid)) {
1433 if (cur > start)
1434 tprintf(", ");
1435 if (cur >= abbrev_end) {
1436 tprintf("...");
1437 break;
1438 }
1439 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1440 tprintf("?");
1441 failed = 1;
1442 break;
1443 }
1444 tprintf("%lu", (unsigned long) gid);
1445 }
1446 tprintf("]");
1447 if (failed)
1448 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001449 }
1450 return 0;
1451}
1452#endif /* LINUX */
1453
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001454#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001455int
Denys Vlasenko12014262011-05-30 14:00:14 +02001456sys_setpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001457{
1458 if (entering(tcp)) {
1459#ifndef SVR4
1460 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1461#endif /* !SVR4 */
1462 }
1463 return 0;
1464}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001465#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001466
1467int
Denys Vlasenko12014262011-05-30 14:00:14 +02001468sys_getpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001469{
1470 if (entering(tcp)) {
1471#ifndef SVR4
1472 tprintf("%lu", tcp->u_arg[0]);
1473#endif /* !SVR4 */
1474 }
1475 return 0;
1476}
1477
1478int
Denys Vlasenko12014262011-05-30 14:00:14 +02001479sys_getsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001480{
1481 if (entering(tcp)) {
1482 tprintf("%lu", tcp->u_arg[0]);
1483 }
1484 return 0;
1485}
1486
1487int
Denys Vlasenko12014262011-05-30 14:00:14 +02001488sys_setsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001489{
1490 return 0;
1491}
1492
1493int
Denys Vlasenko12014262011-05-30 14:00:14 +02001494sys_getpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001495{
1496 if (entering(tcp)) {
1497 tprintf("%lu", tcp->u_arg[0]);
1498 }
1499 return 0;
1500}
1501
1502int
Denys Vlasenko12014262011-05-30 14:00:14 +02001503sys_setpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001504{
1505 if (entering(tcp)) {
1506 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1507 }
1508 return 0;
1509}
1510
John Hughesc61eb3d2002-05-17 11:37:50 +00001511#if UNIXWARE >= 2
1512
1513#include <sys/privilege.h>
1514
1515
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001516static const struct xlat procpriv_cmds[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001517 { SETPRV, "SETPRV" },
1518 { CLRPRV, "CLRPRV" },
1519 { PUTPRV, "PUTPRV" },
1520 { GETPRV, "GETPRV" },
1521 { CNTPRV, "CNTPRV" },
1522 { 0, NULL },
1523};
1524
1525
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001526static const struct xlat procpriv_priv[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001527 { P_OWNER, "P_OWNER" },
1528 { P_AUDIT, "P_AUDIT" },
1529 { P_COMPAT, "P_COMPAT" },
1530 { P_DACREAD, "P_DACREAD" },
1531 { P_DACWRITE, "P_DACWRITE" },
1532 { P_DEV, "P_DEV" },
1533 { P_FILESYS, "P_FILESYS" },
1534 { P_MACREAD, "P_MACREAD" },
1535 { P_MACWRITE, "P_MACWRITE" },
1536 { P_MOUNT, "P_MOUNT" },
1537 { P_MULTIDIR, "P_MULTIDIR" },
1538 { P_SETPLEVEL, "P_SETPLEVEL" },
1539 { P_SETSPRIV, "P_SETSPRIV" },
1540 { P_SETUID, "P_SETUID" },
1541 { P_SYSOPS, "P_SYSOPS" },
1542 { P_SETUPRIV, "P_SETUPRIV" },
1543 { P_DRIVER, "P_DRIVER" },
1544 { P_RTIME, "P_RTIME" },
1545 { P_MACUPGRADE, "P_MACUPGRADE" },
1546 { P_FSYSRANGE, "P_FSYSRANGE" },
1547 { P_SETFLEVEL, "P_SETFLEVEL" },
1548 { P_AUDITWR, "P_AUDITWR" },
1549 { P_TSHAR, "P_TSHAR" },
1550 { P_PLOCK, "P_PLOCK" },
1551 { P_CORE, "P_CORE" },
1552 { P_LOADMOD, "P_LOADMOD" },
1553 { P_BIND, "P_BIND" },
1554 { P_ALLPRIVS, "P_ALLPRIVS" },
1555 { 0, NULL },
1556};
1557
1558
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001559static const struct xlat procpriv_type[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001560 { PS_FIX, "PS_FIX" },
1561 { PS_INH, "PS_INH" },
1562 { PS_MAX, "PS_MAX" },
1563 { PS_WKG, "PS_WKG" },
1564 { 0, NULL },
1565};
1566
1567
1568static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001569printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001570{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001571 priv_t buf[128];
Dmitry V. Levinfcda7a52011-06-13 21:58:43 +00001572 int max = verbose(tcp) ? ARRAY_SIZE(buf) : 10;
John Hughesc61eb3d2002-05-17 11:37:50 +00001573 int dots = len > max;
1574 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001575
John Hughesc61eb3d2002-05-17 11:37:50 +00001576 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001577
John Hughesc61eb3d2002-05-17 11:37:50 +00001578 if (len <= 0 ||
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001579 umoven(tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
John Hughesc61eb3d2002-05-17 11:37:50 +00001580 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001581 tprintf("%#lx", addr);
John Hughesc61eb3d2002-05-17 11:37:50 +00001582 return;
1583 }
1584
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001585 tprintf("[");
John Hughesc61eb3d2002-05-17 11:37:50 +00001586
1587 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001588 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001589
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001590 if (i) tprintf(", ");
John Hughesc61eb3d2002-05-17 11:37:50 +00001591
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001592 if ((t = xlookup(procpriv_type, buf[i] & PS_TYPE)) &&
1593 (p = xlookup(procpriv_priv, buf[i] & ~PS_TYPE)))
John Hughesc61eb3d2002-05-17 11:37:50 +00001594 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001595 tprintf("%s|%s", t, p);
John Hughesc61eb3d2002-05-17 11:37:50 +00001596 }
1597 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001598 tprintf("%#lx", buf[i]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001599 }
1600 }
1601
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001602 if (dots) tprintf(" ...");
John Hughesc61eb3d2002-05-17 11:37:50 +00001603
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001604 tprintf("]");
John Hughesc61eb3d2002-05-17 11:37:50 +00001605}
1606
1607
1608int
Denys Vlasenko12014262011-05-30 14:00:14 +02001609sys_procpriv(struct tcb *tcp)
John Hughesc61eb3d2002-05-17 11:37:50 +00001610{
1611 if (entering(tcp)) {
1612 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1613 switch (tcp->u_arg[0]) {
1614 case CNTPRV:
1615 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1616 break;
1617
1618 case GETPRV:
1619 break;
1620
1621 default:
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001622 tprintf(", ");
1623 printpriv(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1624 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001625 }
1626 }
1627 else if (tcp->u_arg[0] == GETPRV) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001628 if (syserror(tcp)) {
John Hughesc61eb3d2002-05-17 11:37:50 +00001629 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1630 }
1631 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001632 tprintf(", ");
1633 printpriv(tcp, tcp->u_arg[1], tcp->u_rval);
1634 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001635 }
1636 }
Roland McGrath5a223472002-12-15 23:58:26 +00001637
John Hughesc61eb3d2002-05-17 11:37:50 +00001638 return 0;
1639}
1640
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001641#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001642
1643
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001644static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001645printargv(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001646{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001647 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001648 unsigned int p32;
1649 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001650 char data[sizeof(long)];
1651 } cp;
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001652 const char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001653 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001654
Roland McGrath85a3bc42007-08-02 02:13:05 +00001655 cp.p64 = 1;
1656 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1657 if (umoven(tcp, addr, personality_wordsize[current_personality],
1658 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001659 tprintf("%#lx", addr);
1660 return;
1661 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001662 if (personality_wordsize[current_personality] == 4)
1663 cp.p64 = cp.p32;
1664 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001665 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001666 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001667 printstr(tcp, cp.p64, -1);
1668 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001669 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001670 if (cp.p64)
1671 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001672}
1673
1674static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001675printargc(const char *fmt, struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001676{
1677 int count;
1678 char *cp;
1679
1680 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1681 addr += sizeof(char *);
1682 }
1683 tprintf(fmt, count, count == 1 ? "" : "s");
1684}
1685
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001686#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001687int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001688sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001689{
1690 if (entering(tcp)) {
1691 printpath(tcp, tcp->u_arg[0]);
1692 if (!verbose(tcp))
1693 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001694 else {
1695 tprintf(", [");
1696 printargv(tcp, tcp->u_arg[1]);
1697 tprintf("]");
1698 }
1699 }
1700 return 0;
1701}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001702#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001703
1704int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001705sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001706{
1707 if (entering(tcp)) {
1708 printpath(tcp, tcp->u_arg[0]);
1709 if (!verbose(tcp))
1710 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001711 else {
1712 tprintf(", [");
1713 printargv(tcp, tcp->u_arg[1]);
1714 tprintf("]");
1715 }
1716 if (!verbose(tcp))
1717 tprintf(", %#lx", tcp->u_arg[2]);
1718 else if (abbrev(tcp))
1719 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1720 else {
1721 tprintf(", [");
1722 printargv(tcp, tcp->u_arg[2]);
1723 tprintf("]");
1724 }
1725 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001726 return 0;
1727}
1728
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001729#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001730
Denys Vlasenko12014262011-05-30 14:00:14 +02001731int sys_rexecve(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +00001732{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001733 if (entering(tcp)) {
1734 sys_execve(tcp);
1735 tprintf(", %ld", tcp->u_arg[3]);
John Hughes4e36a812001-04-18 15:11:51 +00001736 }
1737 return 0;
1738}
1739
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001740#endif
John Hughes4e36a812001-04-18 15:11:51 +00001741
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001742int
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001743internal_exec(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001744{
1745#ifdef SUNOS4
1746 if (exiting(tcp) && !syserror(tcp) && followfork)
1747 fixvfork(tcp);
1748#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001749#if defined LINUX && defined TCB_WAITEXECVE
1750 if (exiting(tcp) && syserror(tcp))
1751 tcp->flags &= ~TCB_WAITEXECVE;
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001752 else {
1753 /* Maybe we have post-execve SIGTRAP suppressed? */
Denys Vlasenkof44cce42011-06-21 14:34:10 +02001754 if (!(ptrace_setoptions & PTRACE_O_TRACEEXEC))
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001755 tcp->flags |= TCB_WAITEXECVE; /* no */
1756 }
Roland McGrathfdb097f2004-07-12 07:38:55 +00001757#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001758 return 0;
1759}
1760
1761#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001762#ifndef __WNOTHREAD
1763#define __WNOTHREAD 0x20000000
1764#endif
1765#ifndef __WALL
1766#define __WALL 0x40000000
1767#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001768#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001769#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001770#endif
1771#endif /* LINUX */
1772
Roland McGrathd9f816f2004-09-04 03:39:20 +00001773static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001774 { WNOHANG, "WNOHANG" },
1775#ifndef WSTOPPED
1776 { WUNTRACED, "WUNTRACED" },
1777#endif
1778#ifdef WEXITED
1779 { WEXITED, "WEXITED" },
1780#endif
1781#ifdef WTRAPPED
1782 { WTRAPPED, "WTRAPPED" },
1783#endif
1784#ifdef WSTOPPED
1785 { WSTOPPED, "WSTOPPED" },
1786#endif
1787#ifdef WCONTINUED
1788 { WCONTINUED, "WCONTINUED" },
1789#endif
1790#ifdef WNOWAIT
1791 { WNOWAIT, "WNOWAIT" },
1792#endif
1793#ifdef __WCLONE
1794 { __WCLONE, "__WCLONE" },
1795#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001796#ifdef __WALL
1797 { __WALL, "__WALL" },
1798#endif
1799#ifdef __WNOTHREAD
1800 { __WNOTHREAD, "__WNOTHREAD" },
1801#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001802 { 0, NULL },
1803};
1804
Roland McGrath5e02a572004-10-19 23:33:47 +00001805#if !defined WCOREFLAG && defined WCOREFLG
1806# define WCOREFLAG WCOREFLG
1807#endif
1808#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001809# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001810#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001811#ifndef WCOREDUMP
1812# define WCOREDUMP(status) ((status) & 0200)
1813#endif
1814
Roland McGrath5e02a572004-10-19 23:33:47 +00001815
1816#ifndef W_STOPCODE
1817#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1818#endif
1819#ifndef W_EXITCODE
1820#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1821#endif
1822
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001823static int
Denys Vlasenko12014262011-05-30 14:00:14 +02001824printstatus(int status)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001825{
1826 int exited = 0;
1827
1828 /*
1829 * Here is a tricky presentation problem. This solution
1830 * is still not entirely satisfactory but since there
1831 * are no wait status constructors it will have to do.
1832 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001833 if (WIFSTOPPED(status)) {
1834 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001835 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001836 status &= ~W_STOPCODE(WSTOPSIG(status));
1837 }
1838 else if (WIFSIGNALED(status)) {
1839 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001840 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001841 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001842 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1843 }
1844 else if (WIFEXITED(status)) {
1845 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001846 WEXITSTATUS(status));
1847 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001848 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001849 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001850 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001851 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001852 return 0;
1853 }
1854
1855 if (status == 0)
1856 tprintf("]");
1857 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001858 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001859
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001860 return exited;
1861}
1862
1863static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001864printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001865{
1866 int status;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001867#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001868 int exited = 0;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001869#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001870
1871 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001872#ifdef LINUX
1873 /* On Linux, kernel-side pid_t is typedef'ed to int
1874 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001875 * pid argument to int on 64bit arches, producing,
1876 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001877 * in strace. We have to use int here, not long.
1878 */
1879 int pid = tcp->u_arg[0];
1880 tprintf("%d, ", pid);
1881#else
1882 /*
1883 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001884 */
1885 long pid = tcp->u_arg[0];
1886 if (personality_wordsize[current_personality] < sizeof pid)
1887 pid = (long) (int) pid;
1888 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001889#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001890 } else {
1891 /* status */
1892 if (!tcp->u_arg[1])
1893 tprintf("NULL");
1894 else if (syserror(tcp) || tcp->u_rval == 0)
1895 tprintf("%#lx", tcp->u_arg[1]);
1896 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1897 tprintf("[?]");
1898 else
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001899#ifdef SUNOS4
1900 exited =
1901#endif
1902 printstatus(status);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001903 /* options */
1904 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001905 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001906 if (n == 4) {
1907 tprintf(", ");
1908 /* usage */
1909 if (!tcp->u_arg[3])
1910 tprintf("NULL");
1911#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001912 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001913#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001914 if (bitness)
1915 printrusage32(tcp, tcp->u_arg[3]);
1916 else
1917#endif
1918 printrusage(tcp, tcp->u_arg[3]);
1919 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001920#endif /* LINUX */
1921#ifdef SUNOS4
1922 else if (tcp->u_rval > 0 && exited)
1923 printrusage(tcp, tcp->u_arg[3]);
1924#endif /* SUNOS4 */
1925 else
1926 tprintf("%#lx", tcp->u_arg[3]);
1927 }
1928 }
1929 return 0;
1930}
1931
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001932#ifdef SVR4
1933
1934int
Denys Vlasenko12014262011-05-30 14:00:14 +02001935sys_wait(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001936{
1937 if (exiting(tcp)) {
1938 /* The library wrapper stuffs this into the user variable. */
1939 if (!syserror(tcp))
1940 printstatus(getrval2(tcp));
1941 }
1942 return 0;
1943}
1944
1945#endif /* SVR4 */
1946
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001947#ifdef FREEBSD
1948int
Denys Vlasenko12014262011-05-30 14:00:14 +02001949sys_wait(struct tcb *tcp)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001950{
1951 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00001952
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001953 if (exiting(tcp)) {
1954 if (!syserror(tcp)) {
1955 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1956 tprintf("%#lx", tcp->u_arg[0]);
1957 else
1958 printstatus(status);
1959 }
1960 }
1961 return 0;
1962}
1963#endif
1964
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001965int
Denys Vlasenko12014262011-05-30 14:00:14 +02001966sys_waitpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001967{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001968 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001969}
1970
1971int
Denys Vlasenko12014262011-05-30 14:00:14 +02001972sys_wait4(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001973{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001974 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001975}
1976
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001977#ifdef ALPHA
1978int
Denys Vlasenko12014262011-05-30 14:00:14 +02001979sys_osf_wait4(struct tcb *tcp)
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001980{
1981 return printwaitn(tcp, 4, 1);
1982}
1983#endif
1984
Roland McGrathc74c0b72004-09-01 19:39:46 +00001985#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001986
Roland McGrathd9f816f2004-09-04 03:39:20 +00001987static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001988 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001989#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001990 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001991#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001992 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001993#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001994 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001995#endif
1996#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001997 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001998#endif
1999#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002000 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002001#endif
2002#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002003 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002004#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002005 { P_ALL, "P_ALL" },
2006#ifdef P_LWPID
2007 { P_LWPID, "P_LWPID" },
2008#endif
2009 { 0, NULL },
2010};
2011
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002012int
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00002013sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002014{
2015 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002016
2017 if (entering(tcp)) {
2018 printxval(waitid_types, tcp->u_arg[0], "P_???");
2019 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002020 }
2021 else {
2022 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002023 if (!tcp->u_arg[2])
2024 tprintf("NULL");
2025 else if (syserror(tcp))
2026 tprintf("%#lx", tcp->u_arg[2]);
2027 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2028 tprintf("{???}");
2029 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002030 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002031 /* options */
2032 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002033 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002034 if (tcp->u_nargs > 4) {
2035 /* usage */
2036 tprintf(", ");
2037 if (!tcp->u_arg[4])
2038 tprintf("NULL");
2039 else if (tcp->u_error)
2040 tprintf("%#lx", tcp->u_arg[4]);
2041 else
2042 printrusage(tcp, tcp->u_arg[4]);
2043 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002044 }
2045 return 0;
2046}
2047
Roland McGrathc74c0b72004-09-01 19:39:46 +00002048#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002049
2050int
Denys Vlasenko12014262011-05-30 14:00:14 +02002051sys_alarm(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002052{
2053 if (entering(tcp))
2054 tprintf("%lu", tcp->u_arg[0]);
2055 return 0;
2056}
2057
2058int
Denys Vlasenko12014262011-05-30 14:00:14 +02002059sys_uname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002060{
2061 struct utsname uname;
2062
2063 if (exiting(tcp)) {
2064 if (syserror(tcp) || !verbose(tcp))
2065 tprintf("%#lx", tcp->u_arg[0]);
2066 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2067 tprintf("{...}");
2068 else if (!abbrev(tcp)) {
2069
2070 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2071 uname.sysname, uname.nodename);
2072 tprintf("release=\"%s\", version=\"%s\", ",
2073 uname.release, uname.version);
2074 tprintf("machine=\"%s\"", uname.machine);
2075#ifdef LINUX
2076#ifndef __GLIBC__
2077 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002078#endif
2079#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002080 tprintf("}");
2081 }
2082 else
2083 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2084 uname.sysname, uname.nodename);
2085 }
2086 return 0;
2087}
2088
2089#ifndef SVR4
2090
Roland McGratheb9e2e82009-06-02 16:49:22 -07002091static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002092# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002093 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2094 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2095 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2096 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2097 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2098 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2099 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2100 { PTRACE_CONT, "PTRACE_CONT" },
2101 { PTRACE_KILL, "PTRACE_KILL" },
2102 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2103 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2104 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002105# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002106 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002107# endif
2108# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002109 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002110# endif
2111# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002112 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002113# endif
2114# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002115 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002116# endif
2117# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002118 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002119# endif
2120# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002121 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002122# endif
2123# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002124 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002125# endif
2126# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002127 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002128# endif
2129# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002130 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002131# endif
2132# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002133 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002134# endif
2135# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002136 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002137# endif
2138# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002139 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002140# endif
Dmitry V. Levinbb668a52011-03-14 21:58:59 +00002141# ifdef PTRACE_GETREGSET
2142 { PTRACE_GETREGSET, "PTRACE_GETREGSET", },
2143# endif
2144# ifdef PTRACE_SETREGSET
2145 { PTRACE_SETREGSET, "PTRACE_SETREGSET", },
2146# endif
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002147# ifdef PTRACE_SET_SYSCALL
2148 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2149# endif
2150# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002151 { PTRACE_READDATA, "PTRACE_READDATA" },
2152 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2153 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2154 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2155 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2156 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002157# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002158 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2159 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002160# else /* !SPARC */
2161 { PTRACE_22, "PTRACE_22" },
2162 { PTRACE_23, "PTRACE_3" },
2163# endif /* !SPARC */
2164# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002165 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002166# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002167 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002168# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002169 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2170 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2171 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002172# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002173 { PTRACE_26, "PTRACE_26" },
2174 { PTRACE_27, "PTRACE_27" },
2175 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002176# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002177 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002178# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002179
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002180# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002181
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002182 { PT_TRACE_ME, "PT_TRACE_ME" },
2183 { PT_READ_I, "PT_READ_I" },
2184 { PT_READ_D, "PT_READ_D" },
2185 { PT_WRITE_I, "PT_WRITE_I" },
2186 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002187# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002188 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002189# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002190 { PT_CONTINUE, "PT_CONTINUE" },
2191 { PT_KILL, "PT_KILL" },
2192 { PT_STEP, "PT_STEP" },
2193 { PT_ATTACH, "PT_ATTACH" },
2194 { PT_DETACH, "PT_DETACH" },
2195 { PT_GETREGS, "PT_GETREGS" },
2196 { PT_SETREGS, "PT_SETREGS" },
2197 { PT_GETFPREGS, "PT_GETFPREGS" },
2198 { PT_SETFPREGS, "PT_SETFPREGS" },
2199 { PT_GETDBREGS, "PT_GETDBREGS" },
2200 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002201# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002202 { 0, NULL },
2203};
2204
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002205# ifndef FREEBSD
2206# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002207static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002208# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002209 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002210# endif
2211# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002212 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002213# endif
2214# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002215 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002216# endif
2217# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002218 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002219# endif
2220# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002221 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002222# endif
2223# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002224 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002225# endif
2226# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002227 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002228# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002229 { 0, NULL },
2230};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002231# endif /* PTRACE_SETOPTIONS */
2232# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002233
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002234# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002235const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002236# ifdef LINUX
2237# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002238 { PT_PSWMASK, "psw_mask" },
2239 { PT_PSWADDR, "psw_addr" },
2240 { PT_GPR0, "gpr0" },
2241 { PT_GPR1, "gpr1" },
2242 { PT_GPR2, "gpr2" },
2243 { PT_GPR3, "gpr3" },
2244 { PT_GPR4, "gpr4" },
2245 { PT_GPR5, "gpr5" },
2246 { PT_GPR6, "gpr6" },
2247 { PT_GPR7, "gpr7" },
2248 { PT_GPR8, "gpr8" },
2249 { PT_GPR9, "gpr9" },
2250 { PT_GPR10, "gpr10" },
2251 { PT_GPR11, "gpr11" },
2252 { PT_GPR12, "gpr12" },
2253 { PT_GPR13, "gpr13" },
2254 { PT_GPR14, "gpr14" },
2255 { PT_GPR15, "gpr15" },
2256 { PT_ACR0, "acr0" },
2257 { PT_ACR1, "acr1" },
2258 { PT_ACR2, "acr2" },
2259 { PT_ACR3, "acr3" },
2260 { PT_ACR4, "acr4" },
2261 { PT_ACR5, "acr5" },
2262 { PT_ACR6, "acr6" },
2263 { PT_ACR7, "acr7" },
2264 { PT_ACR8, "acr8" },
2265 { PT_ACR9, "acr9" },
2266 { PT_ACR10, "acr10" },
2267 { PT_ACR11, "acr11" },
2268 { PT_ACR12, "acr12" },
2269 { PT_ACR13, "acr13" },
2270 { PT_ACR14, "acr14" },
2271 { PT_ACR15, "acr15" },
2272 { PT_ORIGGPR2, "orig_gpr2" },
2273 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002274# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002275 { PT_FPR0_HI, "fpr0.hi" },
2276 { PT_FPR0_LO, "fpr0.lo" },
2277 { PT_FPR1_HI, "fpr1.hi" },
2278 { PT_FPR1_LO, "fpr1.lo" },
2279 { PT_FPR2_HI, "fpr2.hi" },
2280 { PT_FPR2_LO, "fpr2.lo" },
2281 { PT_FPR3_HI, "fpr3.hi" },
2282 { PT_FPR3_LO, "fpr3.lo" },
2283 { PT_FPR4_HI, "fpr4.hi" },
2284 { PT_FPR4_LO, "fpr4.lo" },
2285 { PT_FPR5_HI, "fpr5.hi" },
2286 { PT_FPR5_LO, "fpr5.lo" },
2287 { PT_FPR6_HI, "fpr6.hi" },
2288 { PT_FPR6_LO, "fpr6.lo" },
2289 { PT_FPR7_HI, "fpr7.hi" },
2290 { PT_FPR7_LO, "fpr7.lo" },
2291 { PT_FPR8_HI, "fpr8.hi" },
2292 { PT_FPR8_LO, "fpr8.lo" },
2293 { PT_FPR9_HI, "fpr9.hi" },
2294 { PT_FPR9_LO, "fpr9.lo" },
2295 { PT_FPR10_HI, "fpr10.hi" },
2296 { PT_FPR10_LO, "fpr10.lo" },
2297 { PT_FPR11_HI, "fpr11.hi" },
2298 { PT_FPR11_LO, "fpr11.lo" },
2299 { PT_FPR12_HI, "fpr12.hi" },
2300 { PT_FPR12_LO, "fpr12.lo" },
2301 { PT_FPR13_HI, "fpr13.hi" },
2302 { PT_FPR13_LO, "fpr13.lo" },
2303 { PT_FPR14_HI, "fpr14.hi" },
2304 { PT_FPR14_LO, "fpr14.lo" },
2305 { PT_FPR15_HI, "fpr15.hi" },
2306 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002307# endif
2308# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002309 { PT_FPR0, "fpr0" },
2310 { PT_FPR1, "fpr1" },
2311 { PT_FPR2, "fpr2" },
2312 { PT_FPR3, "fpr3" },
2313 { PT_FPR4, "fpr4" },
2314 { PT_FPR5, "fpr5" },
2315 { PT_FPR6, "fpr6" },
2316 { PT_FPR7, "fpr7" },
2317 { PT_FPR8, "fpr8" },
2318 { PT_FPR9, "fpr9" },
2319 { PT_FPR10, "fpr10" },
2320 { PT_FPR11, "fpr11" },
2321 { PT_FPR12, "fpr12" },
2322 { PT_FPR13, "fpr13" },
2323 { PT_FPR14, "fpr14" },
2324 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002325# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002326 { PT_CR_9, "cr9" },
2327 { PT_CR_10, "cr10" },
2328 { PT_CR_11, "cr11" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002329 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002330# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002331 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002332# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002333 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002334# elif defined(POWERPC)
2335# ifndef PT_ORIG_R3
2336# define PT_ORIG_R3 34
2337# endif
2338# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002339 { REGSIZE*PT_R0, "r0" },
2340 { REGSIZE*PT_R1, "r1" },
2341 { REGSIZE*PT_R2, "r2" },
2342 { REGSIZE*PT_R3, "r3" },
2343 { REGSIZE*PT_R4, "r4" },
2344 { REGSIZE*PT_R5, "r5" },
2345 { REGSIZE*PT_R6, "r6" },
2346 { REGSIZE*PT_R7, "r7" },
2347 { REGSIZE*PT_R8, "r8" },
2348 { REGSIZE*PT_R9, "r9" },
2349 { REGSIZE*PT_R10, "r10" },
2350 { REGSIZE*PT_R11, "r11" },
2351 { REGSIZE*PT_R12, "r12" },
2352 { REGSIZE*PT_R13, "r13" },
2353 { REGSIZE*PT_R14, "r14" },
2354 { REGSIZE*PT_R15, "r15" },
2355 { REGSIZE*PT_R16, "r16" },
2356 { REGSIZE*PT_R17, "r17" },
2357 { REGSIZE*PT_R18, "r18" },
2358 { REGSIZE*PT_R19, "r19" },
2359 { REGSIZE*PT_R20, "r20" },
2360 { REGSIZE*PT_R21, "r21" },
2361 { REGSIZE*PT_R22, "r22" },
2362 { REGSIZE*PT_R23, "r23" },
2363 { REGSIZE*PT_R24, "r24" },
2364 { REGSIZE*PT_R25, "r25" },
2365 { REGSIZE*PT_R26, "r26" },
2366 { REGSIZE*PT_R27, "r27" },
2367 { REGSIZE*PT_R28, "r28" },
2368 { REGSIZE*PT_R29, "r29" },
2369 { REGSIZE*PT_R30, "r30" },
2370 { REGSIZE*PT_R31, "r31" },
2371 { REGSIZE*PT_NIP, "NIP" },
2372 { REGSIZE*PT_MSR, "MSR" },
2373 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2374 { REGSIZE*PT_CTR, "CTR" },
2375 { REGSIZE*PT_LNK, "LNK" },
2376 { REGSIZE*PT_XER, "XER" },
2377 { REGSIZE*PT_CCR, "CCR" },
2378 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002379# undef REGSIZE
2380# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002381 { 0, "r0" },
2382 { 1, "r1" },
2383 { 2, "r2" },
2384 { 3, "r3" },
2385 { 4, "r4" },
2386 { 5, "r5" },
2387 { 6, "r6" },
2388 { 7, "r7" },
2389 { 8, "r8" },
2390 { 9, "r9" },
2391 { 10, "r10" },
2392 { 11, "r11" },
2393 { 12, "r12" },
2394 { 13, "r13" },
2395 { 14, "r14" },
2396 { 15, "r15" },
2397 { 16, "r16" },
2398 { 17, "r17" },
2399 { 18, "r18" },
2400 { 19, "r19" },
2401 { 20, "r20" },
2402 { 21, "r21" },
2403 { 22, "r22" },
2404 { 23, "r23" },
2405 { 24, "r24" },
2406 { 25, "r25" },
2407 { 26, "r26" },
2408 { 27, "r27" },
2409 { 28, "r28" },
2410 { 29, "gp" },
2411 { 30, "fp" },
2412 { 31, "zero" },
2413 { 32, "fp0" },
2414 { 33, "fp" },
2415 { 34, "fp2" },
2416 { 35, "fp3" },
2417 { 36, "fp4" },
2418 { 37, "fp5" },
2419 { 38, "fp6" },
2420 { 39, "fp7" },
2421 { 40, "fp8" },
2422 { 41, "fp9" },
2423 { 42, "fp10" },
2424 { 43, "fp11" },
2425 { 44, "fp12" },
2426 { 45, "fp13" },
2427 { 46, "fp14" },
2428 { 47, "fp15" },
2429 { 48, "fp16" },
2430 { 49, "fp17" },
2431 { 50, "fp18" },
2432 { 51, "fp19" },
2433 { 52, "fp20" },
2434 { 53, "fp21" },
2435 { 54, "fp22" },
2436 { 55, "fp23" },
2437 { 56, "fp24" },
2438 { 57, "fp25" },
2439 { 58, "fp26" },
2440 { 59, "fp27" },
2441 { 60, "fp28" },
2442 { 61, "fp29" },
2443 { 62, "fp30" },
2444 { 63, "fp31" },
2445 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002446# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002447 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2448 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2449 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2450 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2451 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2452 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2453 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2454 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2455 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2456 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2457 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2458 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2459 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2460 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2461 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2462 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2463 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2464 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2465 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2466 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2467 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2468 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2469 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2470 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2471 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2472 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2473 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2474 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2475 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2476 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2477 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2478 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2479 /* switch stack: */
2480 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2481 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2482 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2483 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2484 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2485 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2486 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2487 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2488 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2489 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002490 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2491 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002492 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002493 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002494 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2495 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002496 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2497 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2498 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2499 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2500 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2501 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2502 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2503 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2504 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2505 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2506 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2507 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2508 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2509 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2510 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002511# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002512 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002513# endif
2514# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002515 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002516# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002517 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002518# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002519 { 4*EBX, "4*EBX" },
2520 { 4*ECX, "4*ECX" },
2521 { 4*EDX, "4*EDX" },
2522 { 4*ESI, "4*ESI" },
2523 { 4*EDI, "4*EDI" },
2524 { 4*EBP, "4*EBP" },
2525 { 4*EAX, "4*EAX" },
2526 { 4*DS, "4*DS" },
2527 { 4*ES, "4*ES" },
2528 { 4*FS, "4*FS" },
2529 { 4*GS, "4*GS" },
2530 { 4*ORIG_EAX, "4*ORIG_EAX" },
2531 { 4*EIP, "4*EIP" },
2532 { 4*CS, "4*CS" },
2533 { 4*EFL, "4*EFL" },
2534 { 4*UESP, "4*UESP" },
2535 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002536# elif defined(X86_64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002537 { 8*R15, "8*R15" },
2538 { 8*R14, "8*R14" },
2539 { 8*R13, "8*R13" },
2540 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002541 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002542 { 8*RBX, "8*RBX" },
2543 { 8*R11, "8*R11" },
2544 { 8*R10, "8*R10" },
2545 { 8*R9, "8*R9" },
2546 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002547 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002548 { 8*RCX, "8*RCX" },
2549 { 8*RDX, "8*RDX" },
2550 { 8*RSI, "8*RSI" },
2551 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002552 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002553 { 8*RIP, "8*RIP" },
2554 { 8*CS, "8*CS" },
2555 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002556 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002557 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002558# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002559 { 4*PT_D1, "4*PT_D1" },
2560 { 4*PT_D2, "4*PT_D2" },
2561 { 4*PT_D3, "4*PT_D3" },
2562 { 4*PT_D4, "4*PT_D4" },
2563 { 4*PT_D5, "4*PT_D5" },
2564 { 4*PT_D6, "4*PT_D6" },
2565 { 4*PT_D7, "4*PT_D7" },
2566 { 4*PT_A0, "4*PT_A0" },
2567 { 4*PT_A1, "4*PT_A1" },
2568 { 4*PT_A2, "4*PT_A2" },
2569 { 4*PT_A3, "4*PT_A3" },
2570 { 4*PT_A4, "4*PT_A4" },
2571 { 4*PT_A5, "4*PT_A5" },
2572 { 4*PT_A6, "4*PT_A6" },
2573 { 4*PT_D0, "4*PT_D0" },
2574 { 4*PT_USP, "4*PT_USP" },
2575 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2576 { 4*PT_SR, "4*PT_SR" },
2577 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002578# elif defined(SH)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002579 { 4*REG_REG0, "4*REG_REG0" },
2580 { 4*(REG_REG0+1), "4*REG_REG1" },
2581 { 4*(REG_REG0+2), "4*REG_REG2" },
2582 { 4*(REG_REG0+3), "4*REG_REG3" },
2583 { 4*(REG_REG0+4), "4*REG_REG4" },
2584 { 4*(REG_REG0+5), "4*REG_REG5" },
2585 { 4*(REG_REG0+6), "4*REG_REG6" },
2586 { 4*(REG_REG0+7), "4*REG_REG7" },
2587 { 4*(REG_REG0+8), "4*REG_REG8" },
2588 { 4*(REG_REG0+9), "4*REG_REG9" },
2589 { 4*(REG_REG0+10), "4*REG_REG10" },
2590 { 4*(REG_REG0+11), "4*REG_REG11" },
2591 { 4*(REG_REG0+12), "4*REG_REG12" },
2592 { 4*(REG_REG0+13), "4*REG_REG13" },
2593 { 4*(REG_REG0+14), "4*REG_REG14" },
2594 { 4*REG_REG15, "4*REG_REG15" },
2595 { 4*REG_PC, "4*REG_PC" },
2596 { 4*REG_PR, "4*REG_PR" },
2597 { 4*REG_SR, "4*REG_SR" },
2598 { 4*REG_GBR, "4*REG_GBR" },
2599 { 4*REG_MACH, "4*REG_MACH" },
2600 { 4*REG_MACL, "4*REG_MACL" },
2601 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2602 { 4*REG_FPUL, "4*REG_FPUL" },
2603 { 4*REG_FPREG0, "4*REG_FPREG0" },
2604 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2605 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2606 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2607 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2608 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2609 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2610 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2611 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2612 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2613 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2614 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2615 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2616 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2617 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2618 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002619# ifdef REG_XDREG0
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002620 { 4*REG_XDREG0, "4*REG_XDREG0" },
2621 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2622 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2623 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2624 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2625 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2626 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2627 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002628# endif
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002629 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002630# elif defined(SH64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002631 { 0, "PC(L)" },
2632 { 4, "PC(U)" },
2633 { 8, "SR(L)" },
2634 { 12, "SR(U)" },
2635 { 16, "syscall no.(L)" },
2636 { 20, "syscall_no.(U)" },
2637 { 24, "R0(L)" },
2638 { 28, "R0(U)" },
2639 { 32, "R1(L)" },
2640 { 36, "R1(U)" },
2641 { 40, "R2(L)" },
2642 { 44, "R2(U)" },
2643 { 48, "R3(L)" },
2644 { 52, "R3(U)" },
2645 { 56, "R4(L)" },
2646 { 60, "R4(U)" },
2647 { 64, "R5(L)" },
2648 { 68, "R5(U)" },
2649 { 72, "R6(L)" },
2650 { 76, "R6(U)" },
2651 { 80, "R7(L)" },
2652 { 84, "R7(U)" },
2653 { 88, "R8(L)" },
2654 { 92, "R8(U)" },
2655 { 96, "R9(L)" },
2656 { 100, "R9(U)" },
2657 { 104, "R10(L)" },
2658 { 108, "R10(U)" },
2659 { 112, "R11(L)" },
2660 { 116, "R11(U)" },
2661 { 120, "R12(L)" },
2662 { 124, "R12(U)" },
2663 { 128, "R13(L)" },
2664 { 132, "R13(U)" },
2665 { 136, "R14(L)" },
2666 { 140, "R14(U)" },
2667 { 144, "R15(L)" },
2668 { 148, "R15(U)" },
2669 { 152, "R16(L)" },
2670 { 156, "R16(U)" },
2671 { 160, "R17(L)" },
2672 { 164, "R17(U)" },
2673 { 168, "R18(L)" },
2674 { 172, "R18(U)" },
2675 { 176, "R19(L)" },
2676 { 180, "R19(U)" },
2677 { 184, "R20(L)" },
2678 { 188, "R20(U)" },
2679 { 192, "R21(L)" },
2680 { 196, "R21(U)" },
2681 { 200, "R22(L)" },
2682 { 204, "R22(U)" },
2683 { 208, "R23(L)" },
2684 { 212, "R23(U)" },
2685 { 216, "R24(L)" },
2686 { 220, "R24(U)" },
2687 { 224, "R25(L)" },
2688 { 228, "R25(U)" },
2689 { 232, "R26(L)" },
2690 { 236, "R26(U)" },
2691 { 240, "R27(L)" },
2692 { 244, "R27(U)" },
2693 { 248, "R28(L)" },
2694 { 252, "R28(U)" },
2695 { 256, "R29(L)" },
2696 { 260, "R29(U)" },
2697 { 264, "R30(L)" },
2698 { 268, "R30(U)" },
2699 { 272, "R31(L)" },
2700 { 276, "R31(U)" },
2701 { 280, "R32(L)" },
2702 { 284, "R32(U)" },
2703 { 288, "R33(L)" },
2704 { 292, "R33(U)" },
2705 { 296, "R34(L)" },
2706 { 300, "R34(U)" },
2707 { 304, "R35(L)" },
2708 { 308, "R35(U)" },
2709 { 312, "R36(L)" },
2710 { 316, "R36(U)" },
2711 { 320, "R37(L)" },
2712 { 324, "R37(U)" },
2713 { 328, "R38(L)" },
2714 { 332, "R38(U)" },
2715 { 336, "R39(L)" },
2716 { 340, "R39(U)" },
2717 { 344, "R40(L)" },
2718 { 348, "R40(U)" },
2719 { 352, "R41(L)" },
2720 { 356, "R41(U)" },
2721 { 360, "R42(L)" },
2722 { 364, "R42(U)" },
2723 { 368, "R43(L)" },
2724 { 372, "R43(U)" },
2725 { 376, "R44(L)" },
2726 { 380, "R44(U)" },
2727 { 384, "R45(L)" },
2728 { 388, "R45(U)" },
2729 { 392, "R46(L)" },
2730 { 396, "R46(U)" },
2731 { 400, "R47(L)" },
2732 { 404, "R47(U)" },
2733 { 408, "R48(L)" },
2734 { 412, "R48(U)" },
2735 { 416, "R49(L)" },
2736 { 420, "R49(U)" },
2737 { 424, "R50(L)" },
2738 { 428, "R50(U)" },
2739 { 432, "R51(L)" },
2740 { 436, "R51(U)" },
2741 { 440, "R52(L)" },
2742 { 444, "R52(U)" },
2743 { 448, "R53(L)" },
2744 { 452, "R53(U)" },
2745 { 456, "R54(L)" },
2746 { 460, "R54(U)" },
2747 { 464, "R55(L)" },
2748 { 468, "R55(U)" },
2749 { 472, "R56(L)" },
2750 { 476, "R56(U)" },
2751 { 480, "R57(L)" },
2752 { 484, "R57(U)" },
2753 { 488, "R58(L)" },
2754 { 492, "R58(U)" },
2755 { 496, "R59(L)" },
2756 { 500, "R59(U)" },
2757 { 504, "R60(L)" },
2758 { 508, "R60(U)" },
2759 { 512, "R61(L)" },
2760 { 516, "R61(U)" },
2761 { 520, "R62(L)" },
2762 { 524, "R62(U)" },
2763 { 528, "TR0(L)" },
2764 { 532, "TR0(U)" },
2765 { 536, "TR1(L)" },
2766 { 540, "TR1(U)" },
2767 { 544, "TR2(L)" },
2768 { 548, "TR2(U)" },
2769 { 552, "TR3(L)" },
2770 { 556, "TR3(U)" },
2771 { 560, "TR4(L)" },
2772 { 564, "TR4(U)" },
2773 { 568, "TR5(L)" },
2774 { 572, "TR5(U)" },
2775 { 576, "TR6(L)" },
2776 { 580, "TR6(U)" },
2777 { 584, "TR7(L)" },
2778 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002779 /* This entry is in case pt_regs contains dregs (depends on
2780 the kernel build options). */
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002781 { uoff(regs), "offsetof(struct user, regs)" },
2782 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002783# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002784 { uoff(regs.ARM_r0), "r0" },
2785 { uoff(regs.ARM_r1), "r1" },
2786 { uoff(regs.ARM_r2), "r2" },
2787 { uoff(regs.ARM_r3), "r3" },
2788 { uoff(regs.ARM_r4), "r4" },
2789 { uoff(regs.ARM_r5), "r5" },
2790 { uoff(regs.ARM_r6), "r6" },
2791 { uoff(regs.ARM_r7), "r7" },
2792 { uoff(regs.ARM_r8), "r8" },
2793 { uoff(regs.ARM_r9), "r9" },
2794 { uoff(regs.ARM_r10), "r10" },
2795 { uoff(regs.ARM_fp), "fp" },
2796 { uoff(regs.ARM_ip), "ip" },
2797 { uoff(regs.ARM_sp), "sp" },
2798 { uoff(regs.ARM_lr), "lr" },
2799 { uoff(regs.ARM_pc), "pc" },
2800 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002801# elif defined(AVR32)
2802 { uoff(regs.sr), "sr" },
2803 { uoff(regs.pc), "pc" },
2804 { uoff(regs.lr), "lr" },
2805 { uoff(regs.sp), "sp" },
2806 { uoff(regs.r12), "r12" },
2807 { uoff(regs.r11), "r11" },
2808 { uoff(regs.r10), "r10" },
2809 { uoff(regs.r9), "r9" },
2810 { uoff(regs.r8), "r8" },
2811 { uoff(regs.r7), "r7" },
2812 { uoff(regs.r6), "r6" },
2813 { uoff(regs.r5), "r5" },
2814 { uoff(regs.r4), "r4" },
2815 { uoff(regs.r3), "r3" },
2816 { uoff(regs.r2), "r2" },
2817 { uoff(regs.r1), "r1" },
2818 { uoff(regs.r0), "r0" },
2819 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002820# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002821 { 0, "r0" },
2822 { 1, "r1" },
2823 { 2, "r2" },
2824 { 3, "r3" },
2825 { 4, "r4" },
2826 { 5, "r5" },
2827 { 6, "r6" },
2828 { 7, "r7" },
2829 { 8, "r8" },
2830 { 9, "r9" },
2831 { 10, "r10" },
2832 { 11, "r11" },
2833 { 12, "r12" },
2834 { 13, "r13" },
2835 { 14, "r14" },
2836 { 15, "r15" },
2837 { 16, "r16" },
2838 { 17, "r17" },
2839 { 18, "r18" },
2840 { 19, "r19" },
2841 { 20, "r20" },
2842 { 21, "r21" },
2843 { 22, "r22" },
2844 { 23, "r23" },
2845 { 24, "r24" },
2846 { 25, "r25" },
2847 { 26, "r26" },
2848 { 27, "r27" },
2849 { 28, "r28" },
2850 { 29, "r29" },
2851 { 30, "r30" },
2852 { 31, "r31" },
2853 { 32, "f0" },
2854 { 33, "f1" },
2855 { 34, "f2" },
2856 { 35, "f3" },
2857 { 36, "f4" },
2858 { 37, "f5" },
2859 { 38, "f6" },
2860 { 39, "f7" },
2861 { 40, "f8" },
2862 { 41, "f9" },
2863 { 42, "f10" },
2864 { 43, "f11" },
2865 { 44, "f12" },
2866 { 45, "f13" },
2867 { 46, "f14" },
2868 { 47, "f15" },
2869 { 48, "f16" },
2870 { 49, "f17" },
2871 { 50, "f18" },
2872 { 51, "f19" },
2873 { 52, "f20" },
2874 { 53, "f21" },
2875 { 54, "f22" },
2876 { 55, "f23" },
2877 { 56, "f24" },
2878 { 57, "f25" },
2879 { 58, "f26" },
2880 { 59, "f27" },
2881 { 60, "f28" },
2882 { 61, "f29" },
2883 { 62, "f30" },
2884 { 63, "f31" },
2885 { 64, "pc" },
2886 { 65, "cause" },
2887 { 66, "badvaddr" },
2888 { 67, "mmhi" },
2889 { 68, "mmlo" },
2890 { 69, "fpcsr" },
2891 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002892# elif defined(TILE)
2893 { PTREGS_OFFSET_REG(0), "r0" },
2894 { PTREGS_OFFSET_REG(1), "r1" },
2895 { PTREGS_OFFSET_REG(2), "r2" },
2896 { PTREGS_OFFSET_REG(3), "r3" },
2897 { PTREGS_OFFSET_REG(4), "r4" },
2898 { PTREGS_OFFSET_REG(5), "r5" },
2899 { PTREGS_OFFSET_REG(6), "r6" },
2900 { PTREGS_OFFSET_REG(7), "r7" },
2901 { PTREGS_OFFSET_REG(8), "r8" },
2902 { PTREGS_OFFSET_REG(9), "r9" },
2903 { PTREGS_OFFSET_REG(10), "r10" },
2904 { PTREGS_OFFSET_REG(11), "r11" },
2905 { PTREGS_OFFSET_REG(12), "r12" },
2906 { PTREGS_OFFSET_REG(13), "r13" },
2907 { PTREGS_OFFSET_REG(14), "r14" },
2908 { PTREGS_OFFSET_REG(15), "r15" },
2909 { PTREGS_OFFSET_REG(16), "r16" },
2910 { PTREGS_OFFSET_REG(17), "r17" },
2911 { PTREGS_OFFSET_REG(18), "r18" },
2912 { PTREGS_OFFSET_REG(19), "r19" },
2913 { PTREGS_OFFSET_REG(20), "r20" },
2914 { PTREGS_OFFSET_REG(21), "r21" },
2915 { PTREGS_OFFSET_REG(22), "r22" },
2916 { PTREGS_OFFSET_REG(23), "r23" },
2917 { PTREGS_OFFSET_REG(24), "r24" },
2918 { PTREGS_OFFSET_REG(25), "r25" },
2919 { PTREGS_OFFSET_REG(26), "r26" },
2920 { PTREGS_OFFSET_REG(27), "r27" },
2921 { PTREGS_OFFSET_REG(28), "r28" },
2922 { PTREGS_OFFSET_REG(29), "r29" },
2923 { PTREGS_OFFSET_REG(30), "r30" },
2924 { PTREGS_OFFSET_REG(31), "r31" },
2925 { PTREGS_OFFSET_REG(32), "r32" },
2926 { PTREGS_OFFSET_REG(33), "r33" },
2927 { PTREGS_OFFSET_REG(34), "r34" },
2928 { PTREGS_OFFSET_REG(35), "r35" },
2929 { PTREGS_OFFSET_REG(36), "r36" },
2930 { PTREGS_OFFSET_REG(37), "r37" },
2931 { PTREGS_OFFSET_REG(38), "r38" },
2932 { PTREGS_OFFSET_REG(39), "r39" },
2933 { PTREGS_OFFSET_REG(40), "r40" },
2934 { PTREGS_OFFSET_REG(41), "r41" },
2935 { PTREGS_OFFSET_REG(42), "r42" },
2936 { PTREGS_OFFSET_REG(43), "r43" },
2937 { PTREGS_OFFSET_REG(44), "r44" },
2938 { PTREGS_OFFSET_REG(45), "r45" },
2939 { PTREGS_OFFSET_REG(46), "r46" },
2940 { PTREGS_OFFSET_REG(47), "r47" },
2941 { PTREGS_OFFSET_REG(48), "r48" },
2942 { PTREGS_OFFSET_REG(49), "r49" },
2943 { PTREGS_OFFSET_REG(50), "r50" },
2944 { PTREGS_OFFSET_REG(51), "r51" },
2945 { PTREGS_OFFSET_REG(52), "r52" },
2946 { PTREGS_OFFSET_TP, "tp" },
2947 { PTREGS_OFFSET_SP, "sp" },
2948 { PTREGS_OFFSET_LR, "lr" },
2949 { PTREGS_OFFSET_PC, "pc" },
2950 { PTREGS_OFFSET_EX1, "ex1" },
2951 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
2952 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
2953 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002954# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00002955# ifdef CRISV10
2956 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
2957 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2958 { 4*PT_R13, "4*PT_R13" },
2959 { 4*PT_R12, "4*PT_R12" },
2960 { 4*PT_R11, "4*PT_R11" },
2961 { 4*PT_R10, "4*PT_R10" },
2962 { 4*PT_R9, "4*PT_R9" },
2963 { 4*PT_R8, "4*PT_R8" },
2964 { 4*PT_R7, "4*PT_R7" },
2965 { 4*PT_R6, "4*PT_R6" },
2966 { 4*PT_R5, "4*PT_R5" },
2967 { 4*PT_R4, "4*PT_R4" },
2968 { 4*PT_R3, "4*PT_R3" },
2969 { 4*PT_R2, "4*PT_R2" },
2970 { 4*PT_R1, "4*PT_R1" },
2971 { 4*PT_R0, "4*PT_R0" },
2972 { 4*PT_MOF, "4*PT_MOF" },
2973 { 4*PT_DCCR, "4*PT_DCCR" },
2974 { 4*PT_SRP, "4*PT_SRP" },
2975 { 4*PT_IRP, "4*PT_IRP" },
2976 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
2977 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
2978 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
2979 { 4*PT_USP, "4*PT_USP" },
2980# endif
2981# ifdef CRISV32
2982 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2983 { 4*PT_R0, "4*PT_R0" },
2984 { 4*PT_R1, "4*PT_R1" },
2985 { 4*PT_R2, "4*PT_R2" },
2986 { 4*PT_R3, "4*PT_R3" },
2987 { 4*PT_R4, "4*PT_R4" },
2988 { 4*PT_R5, "4*PT_R5" },
2989 { 4*PT_R6, "4*PT_R6" },
2990 { 4*PT_R7, "4*PT_R7" },
2991 { 4*PT_R8, "4*PT_R8" },
2992 { 4*PT_R9, "4*PT_R9" },
2993 { 4*PT_R10, "4*PT_R10" },
2994 { 4*PT_R11, "4*PT_R11" },
2995 { 4*PT_R12, "4*PT_R12" },
2996 { 4*PT_R13, "4*PT_R13" },
2997 { 4*PT_ACR, "4*PT_ACR" },
2998 { 4*PT_SRS, "4*PT_SRS" },
2999 { 4*PT_MOF, "4*PT_MOF" },
3000 { 4*PT_SPC, "4*PT_SPC" },
3001 { 4*PT_CCS, "4*PT_CCS" },
3002 { 4*PT_SRP, "4*PT_SRP" },
3003 { 4*PT_ERP, "4*PT_ERP" },
3004 { 4*PT_EXS, "4*PT_EXS" },
3005 { 4*PT_EDA, "4*PT_EDA" },
3006 { 4*PT_USP, "4*PT_USP" },
3007 { 4*PT_PPC, "4*PT_PPC" },
3008 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3009 { 4*PT_BP+4, "4*PT_BP+4" },
3010 { 4*PT_BP+8, "4*PT_BP+8" },
3011 { 4*PT_BP+12, "4*PT_BP+12" },
3012 { 4*PT_BP+16, "4*PT_BP+16" },
3013 { 4*PT_BP+20, "4*PT_BP+20" },
3014 { 4*PT_BP+24, "4*PT_BP+24" },
3015 { 4*PT_BP+28, "4*PT_BP+28" },
3016 { 4*PT_BP+32, "4*PT_BP+32" },
3017 { 4*PT_BP+36, "4*PT_BP+36" },
3018 { 4*PT_BP+40, "4*PT_BP+40" },
3019 { 4*PT_BP+44, "4*PT_BP+44" },
3020 { 4*PT_BP+48, "4*PT_BP+48" },
3021 { 4*PT_BP+52, "4*PT_BP+52" },
3022 { 4*PT_BP+56, "4*PT_BP+56" },
3023# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003024# ifdef MICROBLAZE
3025 { PT_GPR(0), "r0" },
3026 { PT_GPR(1), "r1" },
3027 { PT_GPR(2), "r2" },
3028 { PT_GPR(3), "r3" },
3029 { PT_GPR(4), "r4" },
3030 { PT_GPR(5), "r5" },
3031 { PT_GPR(6), "r6" },
3032 { PT_GPR(7), "r7" },
3033 { PT_GPR(8), "r8" },
3034 { PT_GPR(9), "r9" },
3035 { PT_GPR(10), "r10" },
3036 { PT_GPR(11), "r11" },
3037 { PT_GPR(12), "r12" },
3038 { PT_GPR(13), "r13" },
3039 { PT_GPR(14), "r14" },
3040 { PT_GPR(15), "r15" },
3041 { PT_GPR(16), "r16" },
3042 { PT_GPR(17), "r17" },
3043 { PT_GPR(18), "r18" },
3044 { PT_GPR(19), "r19" },
3045 { PT_GPR(20), "r20" },
3046 { PT_GPR(21), "r21" },
3047 { PT_GPR(22), "r22" },
3048 { PT_GPR(23), "r23" },
3049 { PT_GPR(24), "r24" },
3050 { PT_GPR(25), "r25" },
3051 { PT_GPR(26), "r26" },
3052 { PT_GPR(27), "r27" },
3053 { PT_GPR(28), "r28" },
3054 { PT_GPR(29), "r29" },
3055 { PT_GPR(30), "r30" },
3056 { PT_GPR(31), "r31" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003057 { PT_PC, "rpc", },
3058 { PT_MSR, "rmsr", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003059 { PT_EAR, "rear", },
3060 { PT_ESR, "resr", },
3061 { PT_FSR, "rfsr", },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003062 { PT_KERNEL_MODE, "kernel_mode", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003063# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003064
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003065# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3066 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003067 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003068# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003069 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003070# endif
3071# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003072 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003073# endif
3074# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003075 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003076# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003077 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3078 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3079 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003080# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003081 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003082# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003083# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003084 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003085# endif
3086# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003087 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003088# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003089 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003090# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003091 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003092# endif
3093# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003094 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003095# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003096# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003097 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003098# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003099 { uoff(magic), "offsetof(struct user, magic)" },
3100 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003101# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003102 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003103# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003104# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003105
3106# endif /* LINUX */
3107
3108# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003109 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3110 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3111 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3112 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3113 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3114 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3115 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3116 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3117 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3118 { uoff(u_error), "offsetof(struct user, u_error)" },
3119 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3120 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3121 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3122 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3123 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3124 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3125 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3126 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3127 { uoff(u_code), "offsetof(struct user, u_code)" },
3128 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3129 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3130 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3131 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3132 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3133 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3134 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3135 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3136 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3137 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3138 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3139 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3140 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3141 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3142 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3143 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3144 { uoff(u_start), "offsetof(struct user, u_start)" },
3145 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3146 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3147 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3148 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3149 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3150 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3151 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3152 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3153 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003154# endif /* SUNOS4 */
3155# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003156 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003157# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003158 { 0, NULL },
3159};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003160# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003161
3162int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003163sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003164{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003165 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003166 long addr;
3167
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003168 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003169 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003170# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003171 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003172# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003173 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003174# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003175 );
3176 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003177 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003178# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003179 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3180 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3181 for (x = struct_user_offsets; x->str; x++) {
3182 if (x->val >= addr)
3183 break;
3184 }
3185 if (!x->str)
3186 tprintf("%#lx, ", addr);
3187 else if (x->val > addr && x != struct_user_offsets) {
3188 x--;
3189 tprintf("%s + %ld, ", x->str, addr - x->val);
3190 }
3191 else
3192 tprintf("%s, ", x->str);
3193 }
3194 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003195# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003196 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003197# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003198 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003199# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003200 case PTRACE_PEEKDATA:
3201 case PTRACE_PEEKTEXT:
3202 case PTRACE_PEEKUSER:
3203 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003204# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003205 case PTRACE_CONT:
3206 case PTRACE_SINGLESTEP:
3207 case PTRACE_SYSCALL:
3208 case PTRACE_DETACH:
3209 printsignal(tcp->u_arg[3]);
3210 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003211# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003212 case PTRACE_SETOPTIONS:
3213 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3214 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003215# endif
3216# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003217 case PTRACE_SETSIGINFO: {
3218 siginfo_t si;
3219 if (!tcp->u_arg[3])
3220 tprintf("NULL");
3221 else if (syserror(tcp))
3222 tprintf("%#lx", tcp->u_arg[3]);
3223 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3224 tprintf("{???}");
3225 else
3226 printsiginfo(&si, verbose(tcp));
3227 break;
3228 }
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 /* Don't print anything, do it at syscall return. */
3233 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003234# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003235 default:
3236 tprintf("%#lx", tcp->u_arg[3]);
3237 break;
3238 }
3239 } else {
3240 switch (tcp->u_arg[0]) {
3241 case PTRACE_PEEKDATA:
3242 case PTRACE_PEEKTEXT:
3243 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003244# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003245 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003246# else
Roland McGratheb285352003-01-14 09:59:00 +00003247 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003248 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003249# endif
3250# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003251 case PTRACE_GETSIGINFO: {
3252 siginfo_t si;
3253 if (!tcp->u_arg[3])
3254 tprintf("NULL");
3255 else if (syserror(tcp))
3256 tprintf("%#lx", tcp->u_arg[3]);
3257 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3258 tprintf("{???}");
3259 else
3260 printsiginfo(&si, verbose(tcp));
3261 break;
3262 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003263# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003264 }
3265 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003266# endif /* LINUX */
3267# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003268 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3269 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3270 tprintf("%lu, ", tcp->u_arg[3]);
3271 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3272 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3273 tcp->u_arg[0] != PTRACE_READTEXT) {
3274 tprintf("%#lx", tcp->u_arg[3]);
3275 }
3276 } else {
3277 if (tcp->u_arg[0] == PTRACE_READDATA ||
3278 tcp->u_arg[0] == PTRACE_READTEXT) {
3279 tprintf("%lu, ", tcp->u_arg[3]);
3280 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3281 }
3282 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003283# endif /* SUNOS4 */
3284# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003285 tprintf("%lu", tcp->u_arg[3]);
3286 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003287# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003288 return 0;
3289}
3290
3291#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003292
3293#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003294# ifndef FUTEX_CMP_REQUEUE
3295# define FUTEX_CMP_REQUEUE 4
3296# endif
3297# ifndef FUTEX_WAKE_OP
3298# define FUTEX_WAKE_OP 5
3299# endif
3300# ifndef FUTEX_LOCK_PI
3301# define FUTEX_LOCK_PI 6
3302# define FUTEX_UNLOCK_PI 7
3303# define FUTEX_TRYLOCK_PI 8
3304# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003305# ifndef FUTEX_WAIT_BITSET
3306# define FUTEX_WAIT_BITSET 9
3307# endif
3308# ifndef FUTEX_WAKE_BITSET
3309# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003310# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003311# ifndef FUTEX_WAIT_REQUEUE_PI
3312# define FUTEX_WAIT_REQUEUE_PI 11
3313# endif
3314# ifndef FUTEX_CMP_REQUEUE_PI
3315# define FUTEX_CMP_REQUEUE_PI 12
3316# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003317# ifndef FUTEX_PRIVATE_FLAG
3318# define FUTEX_PRIVATE_FLAG 128
3319# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003320# ifndef FUTEX_CLOCK_REALTIME
3321# define FUTEX_CLOCK_REALTIME 256
3322# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003323static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003324 { FUTEX_WAIT, "FUTEX_WAIT" },
3325 { FUTEX_WAKE, "FUTEX_WAKE" },
3326 { FUTEX_FD, "FUTEX_FD" },
3327 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3328 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3329 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3330 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3331 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3332 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003333 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3334 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003335 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3336 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003337 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3338 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3339 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3340 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3341 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3342 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3343 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3344 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3345 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003346 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3347 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003348 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3349 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3350 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3351 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3352 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3353 { 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 +00003354 { 0, NULL }
3355};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003356# ifndef FUTEX_OP_SET
3357# define FUTEX_OP_SET 0
3358# define FUTEX_OP_ADD 1
3359# define FUTEX_OP_OR 2
3360# define FUTEX_OP_ANDN 3
3361# define FUTEX_OP_XOR 4
3362# define FUTEX_OP_CMP_EQ 0
3363# define FUTEX_OP_CMP_NE 1
3364# define FUTEX_OP_CMP_LT 2
3365# define FUTEX_OP_CMP_LE 3
3366# define FUTEX_OP_CMP_GT 4
3367# define FUTEX_OP_CMP_GE 5
3368# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003369static const struct xlat futexwakeops[] = {
3370 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3371 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3372 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3373 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3374 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3375 { 0, NULL }
3376};
3377static const struct xlat futexwakecmps[] = {
3378 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3379 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3380 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3381 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3382 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3383 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3384 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003385};
3386
3387int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003388sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003389{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003390 if (entering(tcp)) {
3391 long int cmd = tcp->u_arg[1] & 127;
3392 tprintf("%p, ", (void *) tcp->u_arg[0]);
3393 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3394 tprintf(", %ld", tcp->u_arg[2]);
3395 if (cmd == FUTEX_WAKE_BITSET)
3396 tprintf(", %lx", tcp->u_arg[5]);
3397 else if (cmd == FUTEX_WAIT) {
3398 tprintf(", ");
3399 printtv(tcp, tcp->u_arg[3]);
3400 } else if (cmd == FUTEX_WAIT_BITSET) {
3401 tprintf(", ");
3402 printtv(tcp, tcp->u_arg[3]);
3403 tprintf(", %lx", tcp->u_arg[5]);
3404 } else if (cmd == FUTEX_REQUEUE)
3405 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003406 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003407 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3408 else if (cmd == FUTEX_WAKE_OP) {
3409 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3410 if ((tcp->u_arg[5] >> 28) & 8)
3411 tprintf("FUTEX_OP_OPARG_SHIFT|");
3412 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3413 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3414 if ((tcp->u_arg[5] >> 24) & 8)
3415 tprintf("FUTEX_OP_OPARG_SHIFT|");
3416 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3417 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003418 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3419 tprintf(", ");
3420 printtv(tcp, tcp->u_arg[3]);
3421 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003422 }
Roland McGrath51942a92007-07-05 18:59:11 +00003423 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003424 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003425}
3426
3427static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003428print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003429{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003430 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003431 unsigned long w, min_len;
3432
3433 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3434 min_len = len - max_strlen * sizeof(w);
3435 else
3436 min_len = 0;
3437 for (; len >= sizeof(w) && len > min_len;
3438 len -= sizeof(w), list += sizeof(w)) {
3439 if (umove(tcp, list, &w) < 0)
3440 break;
3441 if (first)
3442 tprintf("{");
3443 else
3444 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003445 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003446 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003447 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003448 if (len) {
3449 if (first)
3450 tprintf("%#lx", list);
3451 else
3452 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3453 "???" : "..."));
3454 } else {
3455 tprintf(first ? "{}" : "}");
3456 }
Roland McGrath5a223472002-12-15 23:58:26 +00003457}
3458
3459int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003460sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003461{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003462 if (entering(tcp)) {
3463 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3464 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3465 }
3466 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003467}
3468
3469int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003470sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003471{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003472 if (entering(tcp)) {
3473 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3474 } else {
3475 if (tcp->u_rval == -1)
3476 tprintf("%#lx", tcp->u_arg[2]);
3477 else
3478 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3479 }
3480 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003481}
Roland McGrath279d3782004-03-01 20:27:37 +00003482
Roland McGrathd9f816f2004-09-04 03:39:20 +00003483static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003484 { SCHED_OTHER, "SCHED_OTHER" },
3485 { SCHED_RR, "SCHED_RR" },
3486 { SCHED_FIFO, "SCHED_FIFO" },
3487 { 0, NULL }
3488};
3489
3490int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003491sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003492{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003493 if (entering(tcp)) {
3494 tprintf("%d", (int) tcp->u_arg[0]);
3495 } else if (! syserror(tcp)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003496 tcp->auxstr = xlookup(schedulers, tcp->u_rval);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003497 if (tcp->auxstr != NULL)
3498 return RVAL_STR;
3499 }
3500 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003501}
3502
3503int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003504sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003505{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003506 if (entering(tcp)) {
3507 struct sched_param p;
3508 tprintf("%d, ", (int) tcp->u_arg[0]);
3509 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3510 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3511 tprintf(", %#lx", tcp->u_arg[2]);
3512 else
3513 tprintf(", { %d }", p.__sched_priority);
3514 }
3515 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003516}
3517
3518int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003519sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003520{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003521 if (entering(tcp)) {
3522 tprintf("%d, ", (int) tcp->u_arg[0]);
3523 } else {
3524 struct sched_param p;
3525 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3526 tprintf("%#lx", tcp->u_arg[1]);
3527 else
3528 tprintf("{ %d }", p.__sched_priority);
3529 }
3530 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003531}
3532
3533int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003534sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003535{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003536 if (entering(tcp)) {
3537 struct sched_param p;
3538 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3539 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3540 else
3541 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3542 }
3543 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003544}
3545
3546int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003547sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003548{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003549 if (entering(tcp)) {
3550 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3551 }
3552 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003553}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003554
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003555# ifdef X86_64
3556# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003557
3558static const struct xlat archvals[] = {
3559 { ARCH_SET_GS, "ARCH_SET_GS" },
3560 { ARCH_SET_FS, "ARCH_SET_FS" },
3561 { ARCH_GET_FS, "ARCH_GET_FS" },
3562 { ARCH_GET_GS, "ARCH_GET_GS" },
3563 { 0, NULL },
3564};
3565
3566int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003567sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003568{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003569 if (entering(tcp)) {
3570 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3571 if (tcp->u_arg[0] == ARCH_SET_GS
3572 || tcp->u_arg[0] == ARCH_SET_FS
3573 ) {
3574 tprintf(", %#lx", tcp->u_arg[1]);
3575 }
3576 } else {
3577 if (tcp->u_arg[0] == ARCH_GET_GS
3578 || tcp->u_arg[0] == ARCH_GET_FS
3579 ) {
3580 long int v;
3581 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3582 tprintf(", [%#lx]", v);
3583 else
3584 tprintf(", %#lx", tcp->u_arg[1]);
3585 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003586 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003587 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003588}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003589# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003590
Roland McGrathdb8319f2007-08-02 01:37:55 +00003591
3592int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003593sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003594{
3595 if (exiting(tcp)) {
3596 unsigned u;
3597 if (tcp->u_arg[0] == 0)
3598 tprintf("NULL, ");
3599 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3600 tprintf("%#lx, ", tcp->u_arg[0]);
3601 else
3602 tprintf("[%u], ", u);
3603 if (tcp->u_arg[1] == 0)
3604 tprintf("NULL, ");
3605 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3606 tprintf("%#lx, ", tcp->u_arg[1]);
3607 else
3608 tprintf("[%u], ", u);
3609 tprintf("%#lx", tcp->u_arg[2]);
3610 }
3611 return 0;
3612}
3613
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003614#endif /* LINUX */