blob: 2366d1f3ada1c05e4d128545e194d1bf157951ef [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 *
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000254unalignctl_string (unsigned int ctl)
255{
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
276sys_prctl(tcp)
277struct tcb *tcp;
278{
279 int i;
280
281 if (entering(tcp)) {
282 printxval(prctl_options, tcp->u_arg[0], "PR_???");
283 switch (tcp->u_arg[0]) {
284#ifdef PR_GETNSHARE
285 case PR_GETNSHARE:
286 break;
287#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000288#ifdef PR_SET_PDEATHSIG
289 case PR_SET_PDEATHSIG:
290 tprintf(", %lu", tcp->u_arg[1]);
291 break;
292#endif
293#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000294 case PR_GET_PDEATHSIG:
295 break;
296#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000297#ifdef PR_SET_DUMPABLE
298 case PR_SET_DUMPABLE:
299 tprintf(", %lu", tcp->u_arg[1]);
300 break;
301#endif
302#ifdef PR_GET_DUMPABLE
303 case PR_GET_DUMPABLE:
304 break;
305#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000306#ifdef PR_SET_UNALIGN
307 case PR_SET_UNALIGN:
308 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
309 break;
310#endif
311#ifdef PR_GET_UNALIGN
312 case PR_GET_UNALIGN:
313 tprintf(", %#lx", tcp->u_arg[1]);
314 break;
315#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000316#ifdef PR_SET_KEEPCAPS
317 case PR_SET_KEEPCAPS:
318 tprintf(", %lu", tcp->u_arg[1]);
319 break;
320#endif
321#ifdef PR_GET_KEEPCAPS
322 case PR_GET_KEEPCAPS:
323 break;
324#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000325 default:
326 for (i = 1; i < tcp->u_nargs; i++)
327 tprintf(", %#lx", tcp->u_arg[i]);
328 break;
329 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000330 } else {
331 switch (tcp->u_arg[0]) {
332#ifdef PR_GET_PDEATHSIG
333 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000334 if (umove(tcp, tcp->u_arg[1], &i) < 0)
335 tprintf(", %#lx", tcp->u_arg[1]);
336 else
337 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000338 break;
339#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000340#ifdef PR_GET_DUMPABLE
341 case PR_GET_DUMPABLE:
342 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000343#endif
344#ifdef PR_GET_UNALIGN
345 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000346 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
347 break;
348 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000349 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000350#endif
351#ifdef PR_GET_KEEPCAPS
352 case PR_GET_KEEPCAPS:
353 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000354#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000355 default:
356 break;
357 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000358 }
359 return 0;
360}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000361#endif /* HAVE_PRCTL */
362
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000363#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000364int
365sys_gethostid(tcp)
366struct tcb *tcp;
367{
368 if (exiting(tcp))
369 return RVAL_HEX;
370 return 0;
371}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000372#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000373
374int
375sys_sethostname(tcp)
376struct tcb *tcp;
377{
378 if (entering(tcp)) {
379 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
380 tprintf(", %lu", tcp->u_arg[1]);
381 }
382 return 0;
383}
384
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000385#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000386int
387sys_gethostname(tcp)
388struct tcb *tcp;
389{
390 if (exiting(tcp)) {
391 if (syserror(tcp))
392 tprintf("%#lx", tcp->u_arg[0]);
393 else
394 printpath(tcp, tcp->u_arg[0]);
395 tprintf(", %lu", tcp->u_arg[1]);
396 }
397 return 0;
398}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000399#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000400
401int
402sys_setdomainname(tcp)
403struct tcb *tcp;
404{
405 if (entering(tcp)) {
406 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
407 tprintf(", %lu", tcp->u_arg[1]);
408 }
409 return 0;
410}
411
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000412#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000413
414int
415sys_getdomainname(tcp)
416struct tcb *tcp;
417{
418 if (exiting(tcp)) {
419 if (syserror(tcp))
420 tprintf("%#lx", tcp->u_arg[0]);
421 else
422 printpath(tcp, tcp->u_arg[0]);
423 tprintf(", %lu", tcp->u_arg[1]);
424 }
425 return 0;
426}
427#endif /* !LINUX */
428
429int
430sys_exit(tcp)
431struct tcb *tcp;
432{
433 if (exiting(tcp)) {
434 fprintf(stderr, "_exit returned!\n");
435 return -1;
436 }
437 /* special case: we stop tracing this process, finish line now */
438 tprintf("%ld) ", tcp->u_arg[0]);
439 tabto(acolumn);
440 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000441 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000442 return 0;
443}
444
445int
446internal_exit(tcp)
447struct tcb *tcp;
448{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000449 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000450 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000451#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000452# ifdef IA64
453 if (ia32) {
454 if (tcp->scno == 252)
455 tcp->flags |= TCB_GROUP_EXITING;
456 } else
457# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000458 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000459 tcp->flags |= TCB_GROUP_EXITING;
460#endif
461 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000462 return 0;
463}
464
Roland McGratheb9e2e82009-06-02 16:49:22 -0700465/* TCP is creating a child we want to follow.
466 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
467 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
468static void
469fork_tcb(struct tcb *tcp)
470{
471 if (nprocs == tcbtabsize)
472 expand_tcbtab();
473
474 tcp->flags |= TCB_FOLLOWFORK;
475}
476
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000477#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000478
479int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000480sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000481{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000482 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000483 if (getrval2(tcp)) {
484 tcp->auxstr = "child process";
485 return RVAL_UDECIMAL | RVAL_STR;
486 }
487 }
488 return 0;
489}
490
John Hughes4e36a812001-04-18 15:11:51 +0000491#if UNIXWARE > 2
492
493int
494sys_rfork(tcp)
495struct tcb *tcp;
496{
497 if (entering(tcp)) {
498 tprintf ("%ld", tcp->u_arg[0]);
499 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000500 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000501 if (getrval2(tcp)) {
502 tcp->auxstr = "child process";
503 return RVAL_UDECIMAL | RVAL_STR;
504 }
505 }
506 return 0;
507}
508
509#endif
510
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000511int
512internal_fork(tcp)
513struct tcb *tcp;
514{
515 struct tcb *tcpchild;
516
517 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000518#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000519 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000520 return 0;
521#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000522 if (getrval2(tcp))
523 return 0;
524 if (!followfork)
525 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700526 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000527 if (syserror(tcp))
528 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000529 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000530 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000531 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000532 }
533 return 0;
534}
535
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000536#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000537
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000538#ifdef LINUX
539
540/* defines copied from linux/sched.h since we can't include that
541 * ourselves (it conflicts with *lots* of libc includes)
542 */
543#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
544#define CLONE_VM 0x00000100 /* set if VM shared between processes */
545#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
546#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
547#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000548#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000549#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
550#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
551#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000552#define CLONE_THREAD 0x00010000 /* Same thread group? */
553#define CLONE_NEWNS 0x00020000 /* New namespace group? */
554#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
555#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
556#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
557#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
Roland McGrath909875b2002-12-22 03:34:36 +0000558#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
559#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000560
Roland McGrathd9f816f2004-09-04 03:39:20 +0000561static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000562 { CLONE_VM, "CLONE_VM" },
563 { CLONE_FS, "CLONE_FS" },
564 { CLONE_FILES, "CLONE_FILES" },
565 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000566 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000567 { CLONE_PTRACE, "CLONE_PTRACE" },
568 { CLONE_VFORK, "CLONE_VFORK" },
569 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000570 { CLONE_THREAD, "CLONE_THREAD" },
571 { CLONE_NEWNS, "CLONE_NEWNS" },
572 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
573 { CLONE_SETTLS, "CLONE_SETTLS" },
574 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
575 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
Roland McGrath909875b2002-12-22 03:34:36 +0000576 { CLONE_UNTRACED, "CLONE_UNTRACED" },
577 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000578 { 0, NULL },
579};
580
Roland McGrath909875b2002-12-22 03:34:36 +0000581# ifdef I386
582# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000583# ifdef HAVE_STRUCT_USER_DESC
584# define modify_ldt_ldt_s user_desc
585# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000586extern void print_ldt_entry();
587# endif
588
Roland McGrath9677b3a2003-03-12 09:54:36 +0000589# if defined IA64
590# define ARG_FLAGS 0
591# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000592# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
593# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
594# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
595# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000596# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000597# define ARG_STACK 0
598# define ARG_FLAGS 1
599# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000600# define ARG_CTID 3
601# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000602# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000603# define ARG_FLAGS 0
604# define ARG_STACK 1
605# define ARG_PTID 2
606# define ARG_CTID 3
607# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000608# else
609# define ARG_FLAGS 0
610# define ARG_STACK 1
611# define ARG_PTID 2
612# define ARG_TLS 3
613# define ARG_CTID 4
614# endif
615
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000616int
617sys_clone(tcp)
618struct tcb *tcp;
619{
620 if (exiting(tcp)) {
Wang Chaocbdd1902010-09-02 15:08:59 +0800621 const char *sep = "|";
Roland McGrath9677b3a2003-03-12 09:54:36 +0000622 unsigned long flags = tcp->u_arg[ARG_FLAGS];
623 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
624# ifdef ARG_STACKSIZE
625 if (ARG_STACKSIZE != -1)
626 tprintf("stack_size=%#lx, ",
627 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000628# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000629 tprintf("flags=");
Wang Chaocbdd1902010-09-02 15:08:59 +0800630 if (!printflags(clone_flags, flags &~ CSIGNAL, NULL))
631 sep = "";
Roland McGrath984154d2003-05-23 01:08:42 +0000632 if ((flags & CSIGNAL) != 0)
Wang Chaocbdd1902010-09-02 15:08:59 +0800633 tprintf("%s%s", sep, signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000634 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000635 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000636 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000637 if (flags & CLONE_PARENT_SETTID)
638 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000639 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000640# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000641 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000642 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000643 tprintf(", {entry_number:%d, ",
644 copy.entry_number);
645 if (!verbose(tcp))
646 tprintf("...}");
647 else
648 print_ldt_entry(&copy);
649 }
650 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000651# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000652 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000653 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000654 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
655 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000656 }
657 return 0;
658}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000659
660int
661sys_unshare(struct tcb *tcp)
662{
663 if (entering(tcp))
664 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
665 return 0;
666}
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000667#endif /* LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000668
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000669int
670sys_fork(tcp)
671struct tcb *tcp;
672{
673 if (exiting(tcp))
674 return RVAL_UDECIMAL;
675 return 0;
676}
677
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000678int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000679change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000680{
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000681#ifdef LINUX
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000682#if defined(I386)
683 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000684 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000685 return -1;
686 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000687#elif defined(X86_64)
688 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000689 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000690 return -1;
691 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000692#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000693 if (ptrace(PTRACE_POKEUSER, tcp->pid,
694 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000695 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000696 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000697#elif defined(S390) || defined(S390X)
698 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
699 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000700 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701 return 0;
702#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000703 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000704 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000705 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000706#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400707 struct pt_regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000708 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
709 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400710 regs.u_regs[U_REG_G1] = new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000711 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000712 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000713 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000714#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000715 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000716 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000717 return 0;
718#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000719 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000720 return -1;
721 return 0;
722#elif defined(AVR32)
723 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
724 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000725 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000726#elif defined(BFIN)
727 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
728 return -1;
729 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000730#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000731 if (ia32) {
732 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000733 case 2:
734 break; /* x86 SYS_fork */
735 case SYS_clone:
736 new = 120;
737 break;
738 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000739 fprintf(stderr, "%s: unexpected syscall %d\n",
740 __FUNCTION__, new);
741 return -1;
742 }
743 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
744 return -1;
745 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000746 return -1;
747 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000748#elif defined(HPPA)
749 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000750 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000751 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000752#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000753 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
754 return -1;
755 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000756#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000757 /* Top half of reg encodes the no. of args n as 0x1n.
758 Assume 0 args as kernel never actually checks... */
759 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
760 0x100000 | new) < 0)
761 return -1;
762 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000763#elif defined(CRISV10) || defined(CRISV32)
764 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
765 return -1;
766 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000767#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000768 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000769# ifndef PTRACE_SET_SYSCALL
770# define PTRACE_SET_SYSCALL 23
771# endif
772
Dmitry V. Levin76740062009-09-18 11:30:14 +0000773 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000774 return -1;
775
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000776 return 0;
Chris Metcalfc8c66982009-12-28 10:00:15 -0500777#elif defined(TILE)
778 if (ptrace(PTRACE_POKEUSER, tcp->pid,
779 (char*)PTREGS_OFFSET_REG(0),
780 new) != 0)
781 return -1;
782 return 0;
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200783#elif defined(MICROBLAZE)
784 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new)<0)
785 return -1;
786 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000787#else
788#warning Do not know how to handle change_syscall for this architecture
789#endif /* architecture */
790#endif /* LINUX */
791 return -1;
792}
793
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000794#ifdef LINUX
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000795int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000796internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000797{
798 if (entering(tcp)) {
Wang Chaoe636c852010-09-16 11:20:56 +0800799 tcp->flags &= ~TCB_FOLLOWFORK;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700800 if (!followfork)
801 return 0;
Wang Chaoe636c852010-09-16 11:20:56 +0800802 /*
803 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
804 * new child if clone is called with flag CLONE_UNTRACED, so
805 * we keep the same logic with that option and don't trace it.
806 */
807 if ((sysent[tcp->scno].sys_func == sys_clone) &&
808 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
809 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700810 fork_tcb(tcp);
811 if (setbpt(tcp) < 0)
812 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000813 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000814 struct tcb *tcpchild;
815 int pid;
816 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700817
818 if (!(tcp->flags & TCB_FOLLOWFORK))
819 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000820
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000821 bpt = tcp->flags & TCB_BPTSET;
822
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000823 if (syserror(tcp)) {
824 if (bpt)
825 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000826 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000827 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000828
829 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000830
831#ifdef CLONE_PTRACE /* See new setbpt code. */
832 tcpchild = pid2tcb(pid);
833 if (tcpchild != NULL) {
834 /* The child already reported its startup trap
835 before the parent reported its syscall return. */
836 if ((tcpchild->flags
837 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
838 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
839 fprintf(stderr, "\
840[preattached child %d of %d in weird state!]\n",
841 pid, tcp->pid);
842 }
843 else
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000844#endif /* CLONE_PTRACE */
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000845 {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700846 fork_tcb(tcp);
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000847 tcpchild = alloctcb(pid);
848 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000849
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000850#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000851 /* Attach to the new child */
852 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000853 if (bpt)
854 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000855 perror("PTRACE_ATTACH");
856 fprintf(stderr, "Too late?\n");
857 droptcb(tcpchild);
858 return 0;
859 }
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000860#endif /* !CLONE_PTRACE */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000861
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000862 if (bpt)
863 clearbpt(tcp);
864
Ulrich Drepper90512f01999-12-24 07:22:25 +0000865 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000866 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000867 if (bpt) {
868 tcpchild->flags |= TCB_BPTSET;
869 tcpchild->baddr = tcp->baddr;
870 memcpy(tcpchild->inst, tcp->inst,
871 sizeof tcpchild->inst);
872 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000873 tcpchild->parent = tcp;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000874 tcp->nchildren++;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000875 if (tcpchild->flags & TCB_SUSPENDED) {
876 /* The child was born suspended, due to our having
877 forced CLONE_PTRACE. */
878 if (bpt)
879 clearbpt(tcpchild);
880
881 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000882 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000883 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000884
885 if (!qflag)
886 fprintf(stderr, "\
887Process %u resumed (parent %d ready)\n",
888 pid, tcp->pid);
889 }
890 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000891 if (!qflag)
892 fprintf(stderr, "Process %d attached\n", pid);
893 }
894
895#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000896 {
897 /*
898 * Save the flags used in this call,
899 * in case we point TCP to our parent below.
900 */
901 int call_flags = tcp->u_arg[ARG_FLAGS];
902 if ((tcp->flags & TCB_CLONE_THREAD) &&
903 tcp->parent != NULL) {
904 /* The parent in this clone is itself a
905 thread belonging to another process.
906 There is no meaning to the parentage
907 relationship of the new child with the
908 thread, only with the process. We
909 associate the new thread with our
910 parent. Since this is done for every
911 new thread, there will never be a
912 TCB_CLONE_THREAD process that has
913 children. */
914 --tcp->nchildren;
915 tcp = tcp->parent;
916 tcpchild->parent = tcp;
917 ++tcp->nchildren;
918 }
919 if (call_flags & CLONE_THREAD) {
920 tcpchild->flags |= TCB_CLONE_THREAD;
921 ++tcp->nclone_threads;
922 }
Wang Chao5a22b312010-08-05 14:58:37 +0800923 if ((call_flags & CLONE_PARENT) &&
924 !(call_flags & CLONE_THREAD)) {
925 --tcp->nchildren;
926 tcpchild->parent = NULL;
927 if (tcp->parent != NULL) {
928 tcp = tcp->parent;
929 tcpchild->parent = tcp;
930 ++tcp->nchildren;
931 }
932 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000933 }
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000934#endif /* TCB_CLONE_THREAD */
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000935 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000936 return 0;
937}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000938
939#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000940
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000941int
942internal_fork(tcp)
943struct tcb *tcp;
944{
945 struct tcb *tcpchild;
946 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700947 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000948
949#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000950 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000951 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000952 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700953 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000954 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000955#endif
956 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700957 if (!followfork || dont_follow)
958 return 0;
959 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000960 if (setbpt(tcp) < 0)
961 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000962 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000963 else {
964 int bpt = tcp->flags & TCB_BPTSET;
965
Roland McGratheb9e2e82009-06-02 16:49:22 -0700966 if (!(tcp->flags & TCB_FOLLOWFORK))
967 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000968 if (bpt)
969 clearbpt(tcp);
970
971 if (syserror(tcp))
972 return 0;
973
974 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700975 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000976 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000977#ifdef SUNOS4
978#ifdef oldway
979 /* The child must have run before it can be attached. */
980 {
981 struct timeval tv;
982 tv.tv_sec = 0;
983 tv.tv_usec = 10000;
984 select(0, NULL, NULL, NULL, &tv);
985 }
986 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
987 perror("PTRACE_ATTACH");
988 fprintf(stderr, "Too late?\n");
989 droptcb(tcpchild);
990 return 0;
991 }
992#else /* !oldway */
993 /* Try to catch the new process as soon as possible. */
994 {
995 int i;
996 for (i = 0; i < 1024; i++)
997 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
998 break;
999 if (i == 1024) {
1000 perror("PTRACE_ATTACH");
1001 fprintf(stderr, "Too late?\n");
1002 droptcb(tcpchild);
1003 return 0;
1004 }
1005 }
1006#endif /* !oldway */
1007#endif /* SUNOS4 */
1008 tcpchild->flags |= TCB_ATTACHED;
1009 /* Child has BPT too, must be removed on first occasion */
1010 if (bpt) {
1011 tcpchild->flags |= TCB_BPTSET;
1012 tcpchild->baddr = tcp->baddr;
1013 memcpy(tcpchild->inst, tcp->inst,
1014 sizeof tcpchild->inst);
1015 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001016 tcpchild->parent = tcp;
1017 tcp->nchildren++;
1018 if (!qflag)
1019 fprintf(stderr, "Process %d attached\n", pid);
1020 }
1021 return 0;
1022}
1023
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001024#endif /* !LINUX */
1025
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001026#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001027
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001028#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001029
1030int
1031sys_vfork(tcp)
1032struct tcb *tcp;
1033{
1034 if (exiting(tcp))
1035 return RVAL_UDECIMAL;
1036 return 0;
1037}
1038
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001039#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001040
1041#ifndef LINUX
1042
1043static char idstr[16];
1044
1045int
1046sys_getpid(tcp)
1047struct tcb *tcp;
1048{
1049 if (exiting(tcp)) {
1050 sprintf(idstr, "ppid %lu", getrval2(tcp));
1051 tcp->auxstr = idstr;
1052 return RVAL_STR;
1053 }
1054 return 0;
1055}
1056
1057int
1058sys_getuid(tcp)
1059struct tcb *tcp;
1060{
1061 if (exiting(tcp)) {
1062 sprintf(idstr, "euid %lu", getrval2(tcp));
1063 tcp->auxstr = idstr;
1064 return RVAL_STR;
1065 }
1066 return 0;
1067}
1068
1069int
1070sys_getgid(tcp)
1071struct tcb *tcp;
1072{
1073 if (exiting(tcp)) {
1074 sprintf(idstr, "egid %lu", getrval2(tcp));
1075 tcp->auxstr = idstr;
1076 return RVAL_STR;
1077 }
1078 return 0;
1079}
1080
1081#endif /* !LINUX */
1082
1083#ifdef LINUX
1084
1085int
1086sys_setuid(tcp)
1087struct tcb *tcp;
1088{
1089 if (entering(tcp)) {
1090 tprintf("%u", (uid_t) tcp->u_arg[0]);
1091 }
1092 return 0;
1093}
1094
1095int
1096sys_setgid(tcp)
1097struct tcb *tcp;
1098{
1099 if (entering(tcp)) {
1100 tprintf("%u", (gid_t) tcp->u_arg[0]);
1101 }
1102 return 0;
1103}
1104
1105int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001106sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001107{
1108 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001109 __kernel_uid_t uid;
1110 if (syserror(tcp))
1111 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1112 tcp->u_arg[1], tcp->u_arg[2]);
1113 else {
1114 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1115 tprintf("%#lx, ", tcp->u_arg[0]);
1116 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001117 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001118 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1119 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001120 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001121 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001122 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1123 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001124 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001125 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001126 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001127 }
1128 return 0;
1129}
1130
1131int
1132sys_getresgid(tcp)
1133struct tcb *tcp;
1134{
1135 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001136 __kernel_gid_t gid;
1137 if (syserror(tcp))
1138 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1139 tcp->u_arg[1], tcp->u_arg[2]);
1140 else {
1141 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1142 tprintf("%#lx, ", tcp->u_arg[0]);
1143 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001144 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001145 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1146 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001147 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001148 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001149 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1150 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001151 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001152 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001153 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001154 }
1155 return 0;
1156}
1157
1158#endif /* LINUX */
1159
1160int
1161sys_setreuid(tcp)
1162struct tcb *tcp;
1163{
1164 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001165 printuid("", tcp->u_arg[0]);
1166 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001167 }
1168 return 0;
1169}
1170
1171int
1172sys_setregid(tcp)
1173struct tcb *tcp;
1174{
1175 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001176 printuid("", tcp->u_arg[0]);
1177 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001178 }
1179 return 0;
1180}
1181
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001182#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001183int
1184sys_setresuid(tcp)
1185 struct tcb *tcp;
1186{
1187 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001188 printuid("", tcp->u_arg[0]);
1189 printuid(", ", tcp->u_arg[1]);
1190 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001191 }
1192 return 0;
1193}
1194int
1195sys_setresgid(tcp)
1196 struct tcb *tcp;
1197{
1198 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001199 printuid("", tcp->u_arg[0]);
1200 printuid(", ", tcp->u_arg[1]);
1201 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001202 }
1203 return 0;
1204}
1205
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001206#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001207
1208int
1209sys_setgroups(tcp)
1210struct tcb *tcp;
1211{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001212 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001213 unsigned long len, size, start, cur, end, abbrev_end;
1214 GETGROUPS_T gid;
1215 int failed = 0;
1216
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001217 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001218 tprintf("%lu, ", len);
1219 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001220 tprintf("[]");
1221 return 0;
1222 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001223 start = tcp->u_arg[1];
1224 if (start == 0) {
1225 tprintf("NULL");
1226 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001227 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001228 size = len * sizeof(gid);
1229 end = start + size;
1230 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1231 tprintf("%#lx", start);
1232 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001233 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001234 if (abbrev(tcp)) {
1235 abbrev_end = start + max_strlen * sizeof(gid);
1236 if (abbrev_end < start)
1237 abbrev_end = end;
1238 } else {
1239 abbrev_end = end;
1240 }
1241 tprintf("[");
1242 for (cur = start; cur < end; cur += sizeof(gid)) {
1243 if (cur > start)
1244 tprintf(", ");
1245 if (cur >= abbrev_end) {
1246 tprintf("...");
1247 break;
1248 }
1249 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1250 tprintf("?");
1251 failed = 1;
1252 break;
1253 }
1254 tprintf("%lu", (unsigned long) gid);
1255 }
1256 tprintf("]");
1257 if (failed)
1258 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001259 }
1260 return 0;
1261}
1262
1263int
1264sys_getgroups(tcp)
1265struct tcb *tcp;
1266{
Roland McGrathaa524c82005-06-01 19:22:06 +00001267 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001268
1269 if (entering(tcp)) {
1270 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001271 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001272 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001273 unsigned long size, start, cur, end, abbrev_end;
1274 GETGROUPS_T gid;
1275 int failed = 0;
1276
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001277 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001278 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001279 tprintf("[]");
1280 return 0;
1281 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001282 start = tcp->u_arg[1];
1283 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001284 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001285 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001286 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001287 if (tcp->u_arg[0] == 0) {
1288 tprintf("%#lx", start);
1289 return 0;
1290 }
1291 size = len * sizeof(gid);
1292 end = start + size;
1293 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1294 size / sizeof(gid) != len || end < start) {
1295 tprintf("%#lx", start);
1296 return 0;
1297 }
1298 if (abbrev(tcp)) {
1299 abbrev_end = start + max_strlen * sizeof(gid);
1300 if (abbrev_end < start)
1301 abbrev_end = end;
1302 } else {
1303 abbrev_end = end;
1304 }
1305 tprintf("[");
1306 for (cur = start; cur < end; cur += sizeof(gid)) {
1307 if (cur > start)
1308 tprintf(", ");
1309 if (cur >= abbrev_end) {
1310 tprintf("...");
1311 break;
1312 }
1313 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1314 tprintf("?");
1315 failed = 1;
1316 break;
1317 }
1318 tprintf("%lu", (unsigned long) gid);
1319 }
1320 tprintf("]");
1321 if (failed)
1322 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001323 }
1324 return 0;
1325}
1326
Roland McGrath83bd47a2003-11-13 22:32:26 +00001327#ifdef LINUX
1328int
1329sys_setgroups32(tcp)
1330struct tcb *tcp;
1331{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001332 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001333 unsigned long len, size, start, cur, end, abbrev_end;
1334 GETGROUPS32_T gid;
1335 int failed = 0;
1336
Roland McGrath83bd47a2003-11-13 22:32:26 +00001337 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001338 tprintf("%lu, ", len);
1339 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001340 tprintf("[]");
1341 return 0;
1342 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001343 start = tcp->u_arg[1];
1344 if (start == 0) {
1345 tprintf("NULL");
1346 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001347 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001348 size = len * sizeof(gid);
1349 end = start + size;
1350 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1351 tprintf("%#lx", start);
1352 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001353 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001354 if (abbrev(tcp)) {
1355 abbrev_end = start + max_strlen * sizeof(gid);
1356 if (abbrev_end < start)
1357 abbrev_end = end;
1358 } else {
1359 abbrev_end = end;
1360 }
1361 tprintf("[");
1362 for (cur = start; cur < end; cur += sizeof(gid)) {
1363 if (cur > start)
1364 tprintf(", ");
1365 if (cur >= abbrev_end) {
1366 tprintf("...");
1367 break;
1368 }
1369 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1370 tprintf("?");
1371 failed = 1;
1372 break;
1373 }
1374 tprintf("%lu", (unsigned long) gid);
1375 }
1376 tprintf("]");
1377 if (failed)
1378 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001379 }
1380 return 0;
1381}
1382
1383int
1384sys_getgroups32(tcp)
1385struct tcb *tcp;
1386{
Roland McGrathaa524c82005-06-01 19:22:06 +00001387 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001388
1389 if (entering(tcp)) {
1390 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001391 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001392 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001393 unsigned long size, start, cur, end, abbrev_end;
1394 GETGROUPS32_T gid;
1395 int failed = 0;
1396
Roland McGrath83bd47a2003-11-13 22:32:26 +00001397 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001398 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001399 tprintf("[]");
1400 return 0;
1401 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001402 start = tcp->u_arg[1];
1403 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001404 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001405 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001406 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001407 size = len * sizeof(gid);
1408 end = start + size;
1409 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1410 size / sizeof(gid) != len || end < start) {
1411 tprintf("%#lx", start);
1412 return 0;
1413 }
1414 if (abbrev(tcp)) {
1415 abbrev_end = start + max_strlen * sizeof(gid);
1416 if (abbrev_end < start)
1417 abbrev_end = end;
1418 } else {
1419 abbrev_end = end;
1420 }
1421 tprintf("[");
1422 for (cur = start; cur < end; cur += sizeof(gid)) {
1423 if (cur > start)
1424 tprintf(", ");
1425 if (cur >= abbrev_end) {
1426 tprintf("...");
1427 break;
1428 }
1429 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1430 tprintf("?");
1431 failed = 1;
1432 break;
1433 }
1434 tprintf("%lu", (unsigned long) gid);
1435 }
1436 tprintf("]");
1437 if (failed)
1438 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001439 }
1440 return 0;
1441}
1442#endif /* LINUX */
1443
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001444#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001445int
1446sys_setpgrp(tcp)
1447struct tcb *tcp;
1448{
1449 if (entering(tcp)) {
1450#ifndef SVR4
1451 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1452#endif /* !SVR4 */
1453 }
1454 return 0;
1455}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001456#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001457
1458int
1459sys_getpgrp(tcp)
1460struct tcb *tcp;
1461{
1462 if (entering(tcp)) {
1463#ifndef SVR4
1464 tprintf("%lu", tcp->u_arg[0]);
1465#endif /* !SVR4 */
1466 }
1467 return 0;
1468}
1469
1470int
1471sys_getsid(tcp)
1472struct tcb *tcp;
1473{
1474 if (entering(tcp)) {
1475 tprintf("%lu", tcp->u_arg[0]);
1476 }
1477 return 0;
1478}
1479
1480int
1481sys_setsid(tcp)
1482struct tcb *tcp;
1483{
1484 return 0;
1485}
1486
1487int
1488sys_getpgid(tcp)
1489struct tcb *tcp;
1490{
1491 if (entering(tcp)) {
1492 tprintf("%lu", tcp->u_arg[0]);
1493 }
1494 return 0;
1495}
1496
1497int
1498sys_setpgid(tcp)
1499struct tcb *tcp;
1500{
1501 if (entering(tcp)) {
1502 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1503 }
1504 return 0;
1505}
1506
John Hughesc61eb3d2002-05-17 11:37:50 +00001507#if UNIXWARE >= 2
1508
1509#include <sys/privilege.h>
1510
1511
Roland McGrathd9f816f2004-09-04 03:39:20 +00001512static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001513 { SETPRV, "SETPRV" },
1514 { CLRPRV, "CLRPRV" },
1515 { PUTPRV, "PUTPRV" },
1516 { GETPRV, "GETPRV" },
1517 { CNTPRV, "CNTPRV" },
1518 { 0, NULL },
1519};
1520
1521
Roland McGrathd9f816f2004-09-04 03:39:20 +00001522static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001523 { P_OWNER, "P_OWNER" },
1524 { P_AUDIT, "P_AUDIT" },
1525 { P_COMPAT, "P_COMPAT" },
1526 { P_DACREAD, "P_DACREAD" },
1527 { P_DACWRITE, "P_DACWRITE" },
1528 { P_DEV, "P_DEV" },
1529 { P_FILESYS, "P_FILESYS" },
1530 { P_MACREAD, "P_MACREAD" },
1531 { P_MACWRITE, "P_MACWRITE" },
1532 { P_MOUNT, "P_MOUNT" },
1533 { P_MULTIDIR, "P_MULTIDIR" },
1534 { P_SETPLEVEL, "P_SETPLEVEL" },
1535 { P_SETSPRIV, "P_SETSPRIV" },
1536 { P_SETUID, "P_SETUID" },
1537 { P_SYSOPS, "P_SYSOPS" },
1538 { P_SETUPRIV, "P_SETUPRIV" },
1539 { P_DRIVER, "P_DRIVER" },
1540 { P_RTIME, "P_RTIME" },
1541 { P_MACUPGRADE, "P_MACUPGRADE" },
1542 { P_FSYSRANGE, "P_FSYSRANGE" },
1543 { P_SETFLEVEL, "P_SETFLEVEL" },
1544 { P_AUDITWR, "P_AUDITWR" },
1545 { P_TSHAR, "P_TSHAR" },
1546 { P_PLOCK, "P_PLOCK" },
1547 { P_CORE, "P_CORE" },
1548 { P_LOADMOD, "P_LOADMOD" },
1549 { P_BIND, "P_BIND" },
1550 { P_ALLPRIVS, "P_ALLPRIVS" },
1551 { 0, NULL },
1552};
1553
1554
Roland McGrathd9f816f2004-09-04 03:39:20 +00001555static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001556 { PS_FIX, "PS_FIX" },
1557 { PS_INH, "PS_INH" },
1558 { PS_MAX, "PS_MAX" },
1559 { PS_WKG, "PS_WKG" },
1560 { 0, NULL },
1561};
1562
1563
1564static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001565printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001566{
1567 priv_t buf [128];
1568 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1569 int dots = len > max;
1570 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001571
John Hughesc61eb3d2002-05-17 11:37:50 +00001572 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001573
John Hughesc61eb3d2002-05-17 11:37:50 +00001574 if (len <= 0 ||
1575 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1576 {
1577 tprintf ("%#lx", addr);
1578 return;
1579 }
1580
1581 tprintf ("[");
1582
1583 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001584 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001585
1586 if (i) tprintf (", ");
1587
1588 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1589 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1590 {
1591 tprintf ("%s|%s", t, p);
1592 }
1593 else {
1594 tprintf ("%#lx", buf [i]);
1595 }
1596 }
1597
1598 if (dots) tprintf (" ...");
1599
1600 tprintf ("]");
1601}
1602
1603
1604int
1605sys_procpriv(tcp)
1606struct tcb *tcp;
1607{
1608 if (entering(tcp)) {
1609 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1610 switch (tcp->u_arg[0]) {
1611 case CNTPRV:
1612 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1613 break;
1614
1615 case GETPRV:
1616 break;
1617
1618 default:
1619 tprintf (", ");
1620 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1621 tprintf (", %ld", tcp->u_arg[2]);
1622 }
1623 }
1624 else if (tcp->u_arg[0] == GETPRV) {
1625 if (syserror (tcp)) {
1626 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1627 }
1628 else {
1629 tprintf (", ");
1630 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1631 tprintf (", %ld", tcp->u_arg[2]);
1632 }
1633 }
Roland McGrath5a223472002-12-15 23:58:26 +00001634
John Hughesc61eb3d2002-05-17 11:37:50 +00001635 return 0;
1636}
1637
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001638#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001639
1640
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001641static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001642printargv(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001643{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001644 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001645 unsigned int p32;
1646 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001647 char data[sizeof(long)];
1648 } cp;
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001649 const char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001650 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001651
Roland McGrath85a3bc42007-08-02 02:13:05 +00001652 cp.p64 = 1;
1653 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1654 if (umoven(tcp, addr, personality_wordsize[current_personality],
1655 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001656 tprintf("%#lx", addr);
1657 return;
1658 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001659 if (personality_wordsize[current_personality] == 4)
1660 cp.p64 = cp.p32;
1661 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001662 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001663 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001664 printstr(tcp, cp.p64, -1);
1665 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001666 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001667 if (cp.p64)
1668 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001669}
1670
1671static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001672printargc(const char *fmt, struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001673{
1674 int count;
1675 char *cp;
1676
1677 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1678 addr += sizeof(char *);
1679 }
1680 tprintf(fmt, count, count == 1 ? "" : "s");
1681}
1682
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001683#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001684int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001685sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001686{
1687 if (entering(tcp)) {
1688 printpath(tcp, tcp->u_arg[0]);
1689 if (!verbose(tcp))
1690 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001691 else {
1692 tprintf(", [");
1693 printargv(tcp, tcp->u_arg[1]);
1694 tprintf("]");
1695 }
1696 }
1697 return 0;
1698}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001699#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001700
1701int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001702sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001703{
1704 if (entering(tcp)) {
1705 printpath(tcp, tcp->u_arg[0]);
1706 if (!verbose(tcp))
1707 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001708 else {
1709 tprintf(", [");
1710 printargv(tcp, tcp->u_arg[1]);
1711 tprintf("]");
1712 }
1713 if (!verbose(tcp))
1714 tprintf(", %#lx", tcp->u_arg[2]);
1715 else if (abbrev(tcp))
1716 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1717 else {
1718 tprintf(", [");
1719 printargv(tcp, tcp->u_arg[2]);
1720 tprintf("]");
1721 }
1722 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001723 return 0;
1724}
1725
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001726#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001727
1728int sys_rexecve(tcp)
1729struct tcb *tcp;
1730{
1731 if (entering (tcp)) {
1732 sys_execve (tcp);
1733 tprintf (", %ld", tcp->u_arg[3]);
1734 }
1735 return 0;
1736}
1737
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001738#endif
John Hughes4e36a812001-04-18 15:11:51 +00001739
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001740int
1741internal_exec(tcp)
1742struct tcb *tcp;
1743{
1744#ifdef SUNOS4
1745 if (exiting(tcp) && !syserror(tcp) && followfork)
1746 fixvfork(tcp);
1747#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001748#if defined LINUX && defined TCB_WAITEXECVE
1749 if (exiting(tcp) && syserror(tcp))
1750 tcp->flags &= ~TCB_WAITEXECVE;
1751 else
1752 tcp->flags |= TCB_WAITEXECVE;
1753#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001754 return 0;
1755}
1756
1757#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001758#ifndef __WNOTHREAD
1759#define __WNOTHREAD 0x20000000
1760#endif
1761#ifndef __WALL
1762#define __WALL 0x40000000
1763#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001764#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001765#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001766#endif
1767#endif /* LINUX */
1768
Roland McGrathd9f816f2004-09-04 03:39:20 +00001769static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001770 { WNOHANG, "WNOHANG" },
1771#ifndef WSTOPPED
1772 { WUNTRACED, "WUNTRACED" },
1773#endif
1774#ifdef WEXITED
1775 { WEXITED, "WEXITED" },
1776#endif
1777#ifdef WTRAPPED
1778 { WTRAPPED, "WTRAPPED" },
1779#endif
1780#ifdef WSTOPPED
1781 { WSTOPPED, "WSTOPPED" },
1782#endif
1783#ifdef WCONTINUED
1784 { WCONTINUED, "WCONTINUED" },
1785#endif
1786#ifdef WNOWAIT
1787 { WNOWAIT, "WNOWAIT" },
1788#endif
1789#ifdef __WCLONE
1790 { __WCLONE, "__WCLONE" },
1791#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001792#ifdef __WALL
1793 { __WALL, "__WALL" },
1794#endif
1795#ifdef __WNOTHREAD
1796 { __WNOTHREAD, "__WNOTHREAD" },
1797#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001798 { 0, NULL },
1799};
1800
Roland McGrath5e02a572004-10-19 23:33:47 +00001801#if !defined WCOREFLAG && defined WCOREFLG
1802# define WCOREFLAG WCOREFLG
1803#endif
1804#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001805# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001806#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001807#ifndef WCOREDUMP
1808# define WCOREDUMP(status) ((status) & 0200)
1809#endif
1810
Roland McGrath5e02a572004-10-19 23:33:47 +00001811
1812#ifndef W_STOPCODE
1813#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1814#endif
1815#ifndef W_EXITCODE
1816#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1817#endif
1818
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001819static int
1820printstatus(status)
1821int status;
1822{
1823 int exited = 0;
1824
1825 /*
1826 * Here is a tricky presentation problem. This solution
1827 * is still not entirely satisfactory but since there
1828 * are no wait status constructors it will have to do.
1829 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001830 if (WIFSTOPPED(status)) {
1831 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001832 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001833 status &= ~W_STOPCODE(WSTOPSIG(status));
1834 }
1835 else if (WIFSIGNALED(status)) {
1836 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001837 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001838 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001839 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1840 }
1841 else if (WIFEXITED(status)) {
1842 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001843 WEXITSTATUS(status));
1844 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001845 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001846 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001847 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001848 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001849 return 0;
1850 }
1851
1852 if (status == 0)
1853 tprintf("]");
1854 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001855 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001856
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001857 return exited;
1858}
1859
1860static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001861printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001862{
1863 int status;
1864 int exited = 0;
1865
1866 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001867#ifdef LINUX
1868 /* On Linux, kernel-side pid_t is typedef'ed to int
1869 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001870 * pid argument to int on 64bit arches, producing,
1871 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001872 * in strace. We have to use int here, not long.
1873 */
1874 int pid = tcp->u_arg[0];
1875 tprintf("%d, ", pid);
1876#else
1877 /*
1878 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001879 */
1880 long pid = tcp->u_arg[0];
1881 if (personality_wordsize[current_personality] < sizeof pid)
1882 pid = (long) (int) pid;
1883 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001884#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001885 } else {
1886 /* status */
1887 if (!tcp->u_arg[1])
1888 tprintf("NULL");
1889 else if (syserror(tcp) || tcp->u_rval == 0)
1890 tprintf("%#lx", tcp->u_arg[1]);
1891 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1892 tprintf("[?]");
1893 else
1894 exited = printstatus(status);
1895 /* options */
1896 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001897 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001898 if (n == 4) {
1899 tprintf(", ");
1900 /* usage */
1901 if (!tcp->u_arg[3])
1902 tprintf("NULL");
1903#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001904 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001905#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001906 if (bitness)
1907 printrusage32(tcp, tcp->u_arg[3]);
1908 else
1909#endif
1910 printrusage(tcp, tcp->u_arg[3]);
1911 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001912#endif /* LINUX */
1913#ifdef SUNOS4
1914 else if (tcp->u_rval > 0 && exited)
1915 printrusage(tcp, tcp->u_arg[3]);
1916#endif /* SUNOS4 */
1917 else
1918 tprintf("%#lx", tcp->u_arg[3]);
1919 }
1920 }
1921 return 0;
1922}
1923
1924int
Roland McGrathc74c0b72004-09-01 19:39:46 +00001925internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001926struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00001927int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001928{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001929 int got_kids;
1930
1931#ifdef TCB_CLONE_THREAD
1932 if (tcp->flags & TCB_CLONE_THREAD)
1933 /* The children we wait for are our parent's children. */
1934 got_kids = (tcp->parent->nchildren
Wang Chao21b8db42010-08-27 17:43:16 +08001935 > tcp->parent->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001936 else
Wang Chao21b8db42010-08-27 17:43:16 +08001937 got_kids = (tcp->nchildren > tcp->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001938#else
1939 got_kids = tcp->nchildren > 0;
1940#endif
1941
1942 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001943 /* There are children that this parent should block for.
1944 But ptrace made us the parent of the traced children
1945 and the real parent will get ECHILD from the wait call.
1946
1947 XXX If we attached with strace -f -p PID, then there
1948 may be untraced dead children the parent could be reaping
1949 now, but we make him block. */
1950
1951 /* ??? WTA: fix bug with hanging children */
1952
Roland McGrathc74c0b72004-09-01 19:39:46 +00001953 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001954 /*
1955 * There are traced children. We'll make the parent
1956 * block to avoid a false ECHILD error due to our
1957 * ptrace having stolen the children. However,
1958 * we shouldn't block if there are zombies to reap.
1959 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1960 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001961 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001962 if (tcp->nzombies > 0 &&
1963 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001964 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001965 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001966 if (tcp->u_arg[0] > 0) {
1967 /*
1968 * If the parent waits for a specified child
1969 * PID, then it must get ECHILD right away
1970 * if that PID is not one of its children.
1971 * Make sure that the requested PID matches
1972 * one of the parent's children that we are
1973 * tracing, and don't suspend it otherwise.
1974 */
1975 if (child == NULL)
1976 child = pid2tcb(tcp->u_arg[0]);
1977 if (child == NULL || child->parent != (
1978#ifdef TCB_CLONE_THREAD
1979 (tcp->flags & TCB_CLONE_THREAD)
1980 ? tcp->parent :
1981#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00001982 tcp) ||
1983 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00001984 return 0;
1985 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001986 tcp->flags |= TCB_SUSPENDED;
1987 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001988#ifdef TCB_CLONE_THREAD
1989 if (tcp->flags & TCB_CLONE_THREAD)
1990 tcp->parent->nclone_waiting++;
1991#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001992 }
1993 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001994 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00001995 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001996 /* We must force a fake result of 0 instead of
1997 the ECHILD error. */
Roland McGrathb69f81b2002-12-21 23:25:18 +00001998 return force_result(tcp, 0, 0);
1999 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002000 }
Roland McGrath09623452003-05-23 02:27:13 +00002001 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2002 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2003 /*
2004 * We just reaped a child we don't know about,
2005 * presumably a zombie we already droptcb'd.
2006 */
2007 tcp->nzombies--;
2008 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002009 return 0;
2010}
2011
2012#ifdef SVR4
2013
2014int
2015sys_wait(tcp)
2016struct tcb *tcp;
2017{
2018 if (exiting(tcp)) {
2019 /* The library wrapper stuffs this into the user variable. */
2020 if (!syserror(tcp))
2021 printstatus(getrval2(tcp));
2022 }
2023 return 0;
2024}
2025
2026#endif /* SVR4 */
2027
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002028#ifdef FREEBSD
2029int
2030sys_wait(tcp)
2031struct tcb *tcp;
2032{
2033 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002034
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002035 if (exiting(tcp)) {
2036 if (!syserror(tcp)) {
2037 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2038 tprintf("%#lx", tcp->u_arg[0]);
2039 else
2040 printstatus(status);
2041 }
2042 }
2043 return 0;
2044}
2045#endif
2046
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002047int
2048sys_waitpid(tcp)
2049struct tcb *tcp;
2050{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002051 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002052}
2053
2054int
2055sys_wait4(tcp)
2056struct tcb *tcp;
2057{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002058 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002059}
2060
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002061#ifdef ALPHA
2062int
2063sys_osf_wait4(tcp)
2064struct tcb *tcp;
2065{
2066 return printwaitn(tcp, 4, 1);
2067}
2068#endif
2069
Roland McGrathc74c0b72004-09-01 19:39:46 +00002070#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002071
Roland McGrathd9f816f2004-09-04 03:39:20 +00002072static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002073 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002074#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002075 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002076#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002077 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002078#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002079 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002080#endif
2081#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002082 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002083#endif
2084#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002085 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002086#endif
2087#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002088 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002089#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002090 { P_ALL, "P_ALL" },
2091#ifdef P_LWPID
2092 { P_LWPID, "P_LWPID" },
2093#endif
2094 { 0, NULL },
2095};
2096
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002097int
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00002098sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002099{
2100 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002101
2102 if (entering(tcp)) {
2103 printxval(waitid_types, tcp->u_arg[0], "P_???");
2104 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002105 }
2106 else {
2107 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002108 if (!tcp->u_arg[2])
2109 tprintf("NULL");
2110 else if (syserror(tcp))
2111 tprintf("%#lx", tcp->u_arg[2]);
2112 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2113 tprintf("{???}");
2114 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002115 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002116 /* options */
2117 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002118 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002119 if (tcp->u_nargs > 4) {
2120 /* usage */
2121 tprintf(", ");
2122 if (!tcp->u_arg[4])
2123 tprintf("NULL");
2124 else if (tcp->u_error)
2125 tprintf("%#lx", tcp->u_arg[4]);
2126 else
2127 printrusage(tcp, tcp->u_arg[4]);
2128 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002129 }
2130 return 0;
2131}
2132
Roland McGrathc74c0b72004-09-01 19:39:46 +00002133#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002134
2135int
2136sys_alarm(tcp)
2137struct tcb *tcp;
2138{
2139 if (entering(tcp))
2140 tprintf("%lu", tcp->u_arg[0]);
2141 return 0;
2142}
2143
2144int
2145sys_uname(tcp)
2146struct tcb *tcp;
2147{
2148 struct utsname uname;
2149
2150 if (exiting(tcp)) {
2151 if (syserror(tcp) || !verbose(tcp))
2152 tprintf("%#lx", tcp->u_arg[0]);
2153 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2154 tprintf("{...}");
2155 else if (!abbrev(tcp)) {
2156
2157 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2158 uname.sysname, uname.nodename);
2159 tprintf("release=\"%s\", version=\"%s\", ",
2160 uname.release, uname.version);
2161 tprintf("machine=\"%s\"", uname.machine);
2162#ifdef LINUX
2163#ifndef __GLIBC__
2164 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002165#endif
2166#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002167 tprintf("}");
2168 }
2169 else
2170 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2171 uname.sysname, uname.nodename);
2172 }
2173 return 0;
2174}
2175
2176#ifndef SVR4
2177
Roland McGratheb9e2e82009-06-02 16:49:22 -07002178static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002179# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002180 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2181 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2182 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2183 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2184 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2185 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2186 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2187 { PTRACE_CONT, "PTRACE_CONT" },
2188 { PTRACE_KILL, "PTRACE_KILL" },
2189 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2190 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2191 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002192# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002193 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002194# endif
2195# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002196 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002197# endif
2198# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002199 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002200# endif
2201# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002202 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002203# endif
2204# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002205 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002206# endif
2207# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002208 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002209# endif
2210# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002211 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002212# endif
2213# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002214 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002215# endif
2216# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002217 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002218# endif
2219# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002220 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002221# endif
2222# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002223 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002224# endif
2225# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002226 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002227# endif
2228# ifdef PTRACE_SET_SYSCALL
2229 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2230# endif
2231# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002232 { PTRACE_READDATA, "PTRACE_READDATA" },
2233 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2234 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2235 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2236 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2237 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002238# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002239 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2240 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002241# else /* !SPARC */
2242 { PTRACE_22, "PTRACE_22" },
2243 { PTRACE_23, "PTRACE_3" },
2244# endif /* !SPARC */
2245# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002246 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002247# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002248 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002249# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002250 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2251 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2252 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002253# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002254 { PTRACE_26, "PTRACE_26" },
2255 { PTRACE_27, "PTRACE_27" },
2256 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002257# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002258 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002259# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002260
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002261# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002262
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002263 { PT_TRACE_ME, "PT_TRACE_ME" },
2264 { PT_READ_I, "PT_READ_I" },
2265 { PT_READ_D, "PT_READ_D" },
2266 { PT_WRITE_I, "PT_WRITE_I" },
2267 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002268# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002269 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002270# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002271 { PT_CONTINUE, "PT_CONTINUE" },
2272 { PT_KILL, "PT_KILL" },
2273 { PT_STEP, "PT_STEP" },
2274 { PT_ATTACH, "PT_ATTACH" },
2275 { PT_DETACH, "PT_DETACH" },
2276 { PT_GETREGS, "PT_GETREGS" },
2277 { PT_SETREGS, "PT_SETREGS" },
2278 { PT_GETFPREGS, "PT_GETFPREGS" },
2279 { PT_SETFPREGS, "PT_SETFPREGS" },
2280 { PT_GETDBREGS, "PT_GETDBREGS" },
2281 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002282# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002283 { 0, NULL },
2284};
2285
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002286# ifndef FREEBSD
2287# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002288static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002289# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002290 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002291# endif
2292# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002293 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002294# endif
2295# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002296 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002297# endif
2298# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002299 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002300# endif
2301# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002302 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002303# endif
2304# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002305 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002306# endif
2307# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002308 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002309# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002310 { 0, NULL },
2311};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002312# endif /* PTRACE_SETOPTIONS */
2313# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002314
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002315# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002316const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002317# ifdef LINUX
2318# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002319 { PT_PSWMASK, "psw_mask" },
2320 { PT_PSWADDR, "psw_addr" },
2321 { PT_GPR0, "gpr0" },
2322 { PT_GPR1, "gpr1" },
2323 { PT_GPR2, "gpr2" },
2324 { PT_GPR3, "gpr3" },
2325 { PT_GPR4, "gpr4" },
2326 { PT_GPR5, "gpr5" },
2327 { PT_GPR6, "gpr6" },
2328 { PT_GPR7, "gpr7" },
2329 { PT_GPR8, "gpr8" },
2330 { PT_GPR9, "gpr9" },
2331 { PT_GPR10, "gpr10" },
2332 { PT_GPR11, "gpr11" },
2333 { PT_GPR12, "gpr12" },
2334 { PT_GPR13, "gpr13" },
2335 { PT_GPR14, "gpr14" },
2336 { PT_GPR15, "gpr15" },
2337 { PT_ACR0, "acr0" },
2338 { PT_ACR1, "acr1" },
2339 { PT_ACR2, "acr2" },
2340 { PT_ACR3, "acr3" },
2341 { PT_ACR4, "acr4" },
2342 { PT_ACR5, "acr5" },
2343 { PT_ACR6, "acr6" },
2344 { PT_ACR7, "acr7" },
2345 { PT_ACR8, "acr8" },
2346 { PT_ACR9, "acr9" },
2347 { PT_ACR10, "acr10" },
2348 { PT_ACR11, "acr11" },
2349 { PT_ACR12, "acr12" },
2350 { PT_ACR13, "acr13" },
2351 { PT_ACR14, "acr14" },
2352 { PT_ACR15, "acr15" },
2353 { PT_ORIGGPR2, "orig_gpr2" },
2354 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002355# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002356 { PT_FPR0_HI, "fpr0.hi" },
2357 { PT_FPR0_LO, "fpr0.lo" },
2358 { PT_FPR1_HI, "fpr1.hi" },
2359 { PT_FPR1_LO, "fpr1.lo" },
2360 { PT_FPR2_HI, "fpr2.hi" },
2361 { PT_FPR2_LO, "fpr2.lo" },
2362 { PT_FPR3_HI, "fpr3.hi" },
2363 { PT_FPR3_LO, "fpr3.lo" },
2364 { PT_FPR4_HI, "fpr4.hi" },
2365 { PT_FPR4_LO, "fpr4.lo" },
2366 { PT_FPR5_HI, "fpr5.hi" },
2367 { PT_FPR5_LO, "fpr5.lo" },
2368 { PT_FPR6_HI, "fpr6.hi" },
2369 { PT_FPR6_LO, "fpr6.lo" },
2370 { PT_FPR7_HI, "fpr7.hi" },
2371 { PT_FPR7_LO, "fpr7.lo" },
2372 { PT_FPR8_HI, "fpr8.hi" },
2373 { PT_FPR8_LO, "fpr8.lo" },
2374 { PT_FPR9_HI, "fpr9.hi" },
2375 { PT_FPR9_LO, "fpr9.lo" },
2376 { PT_FPR10_HI, "fpr10.hi" },
2377 { PT_FPR10_LO, "fpr10.lo" },
2378 { PT_FPR11_HI, "fpr11.hi" },
2379 { PT_FPR11_LO, "fpr11.lo" },
2380 { PT_FPR12_HI, "fpr12.hi" },
2381 { PT_FPR12_LO, "fpr12.lo" },
2382 { PT_FPR13_HI, "fpr13.hi" },
2383 { PT_FPR13_LO, "fpr13.lo" },
2384 { PT_FPR14_HI, "fpr14.hi" },
2385 { PT_FPR14_LO, "fpr14.lo" },
2386 { PT_FPR15_HI, "fpr15.hi" },
2387 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002388# endif
2389# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002390 { PT_FPR0, "fpr0" },
2391 { PT_FPR1, "fpr1" },
2392 { PT_FPR2, "fpr2" },
2393 { PT_FPR3, "fpr3" },
2394 { PT_FPR4, "fpr4" },
2395 { PT_FPR5, "fpr5" },
2396 { PT_FPR6, "fpr6" },
2397 { PT_FPR7, "fpr7" },
2398 { PT_FPR8, "fpr8" },
2399 { PT_FPR9, "fpr9" },
2400 { PT_FPR10, "fpr10" },
2401 { PT_FPR11, "fpr11" },
2402 { PT_FPR12, "fpr12" },
2403 { PT_FPR13, "fpr13" },
2404 { PT_FPR14, "fpr14" },
2405 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002406# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002407 { PT_CR_9, "cr9" },
2408 { PT_CR_10, "cr10" },
2409 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002410 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002411# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002412 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002413# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002414 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002415# elif defined(POWERPC)
2416# ifndef PT_ORIG_R3
2417# define PT_ORIG_R3 34
2418# endif
2419# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002420 { REGSIZE*PT_R0, "r0" },
2421 { REGSIZE*PT_R1, "r1" },
2422 { REGSIZE*PT_R2, "r2" },
2423 { REGSIZE*PT_R3, "r3" },
2424 { REGSIZE*PT_R4, "r4" },
2425 { REGSIZE*PT_R5, "r5" },
2426 { REGSIZE*PT_R6, "r6" },
2427 { REGSIZE*PT_R7, "r7" },
2428 { REGSIZE*PT_R8, "r8" },
2429 { REGSIZE*PT_R9, "r9" },
2430 { REGSIZE*PT_R10, "r10" },
2431 { REGSIZE*PT_R11, "r11" },
2432 { REGSIZE*PT_R12, "r12" },
2433 { REGSIZE*PT_R13, "r13" },
2434 { REGSIZE*PT_R14, "r14" },
2435 { REGSIZE*PT_R15, "r15" },
2436 { REGSIZE*PT_R16, "r16" },
2437 { REGSIZE*PT_R17, "r17" },
2438 { REGSIZE*PT_R18, "r18" },
2439 { REGSIZE*PT_R19, "r19" },
2440 { REGSIZE*PT_R20, "r20" },
2441 { REGSIZE*PT_R21, "r21" },
2442 { REGSIZE*PT_R22, "r22" },
2443 { REGSIZE*PT_R23, "r23" },
2444 { REGSIZE*PT_R24, "r24" },
2445 { REGSIZE*PT_R25, "r25" },
2446 { REGSIZE*PT_R26, "r26" },
2447 { REGSIZE*PT_R27, "r27" },
2448 { REGSIZE*PT_R28, "r28" },
2449 { REGSIZE*PT_R29, "r29" },
2450 { REGSIZE*PT_R30, "r30" },
2451 { REGSIZE*PT_R31, "r31" },
2452 { REGSIZE*PT_NIP, "NIP" },
2453 { REGSIZE*PT_MSR, "MSR" },
2454 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2455 { REGSIZE*PT_CTR, "CTR" },
2456 { REGSIZE*PT_LNK, "LNK" },
2457 { REGSIZE*PT_XER, "XER" },
2458 { REGSIZE*PT_CCR, "CCR" },
2459 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002460# undef REGSIZE
2461# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002462 { 0, "r0" },
2463 { 1, "r1" },
2464 { 2, "r2" },
2465 { 3, "r3" },
2466 { 4, "r4" },
2467 { 5, "r5" },
2468 { 6, "r6" },
2469 { 7, "r7" },
2470 { 8, "r8" },
2471 { 9, "r9" },
2472 { 10, "r10" },
2473 { 11, "r11" },
2474 { 12, "r12" },
2475 { 13, "r13" },
2476 { 14, "r14" },
2477 { 15, "r15" },
2478 { 16, "r16" },
2479 { 17, "r17" },
2480 { 18, "r18" },
2481 { 19, "r19" },
2482 { 20, "r20" },
2483 { 21, "r21" },
2484 { 22, "r22" },
2485 { 23, "r23" },
2486 { 24, "r24" },
2487 { 25, "r25" },
2488 { 26, "r26" },
2489 { 27, "r27" },
2490 { 28, "r28" },
2491 { 29, "gp" },
2492 { 30, "fp" },
2493 { 31, "zero" },
2494 { 32, "fp0" },
2495 { 33, "fp" },
2496 { 34, "fp2" },
2497 { 35, "fp3" },
2498 { 36, "fp4" },
2499 { 37, "fp5" },
2500 { 38, "fp6" },
2501 { 39, "fp7" },
2502 { 40, "fp8" },
2503 { 41, "fp9" },
2504 { 42, "fp10" },
2505 { 43, "fp11" },
2506 { 44, "fp12" },
2507 { 45, "fp13" },
2508 { 46, "fp14" },
2509 { 47, "fp15" },
2510 { 48, "fp16" },
2511 { 49, "fp17" },
2512 { 50, "fp18" },
2513 { 51, "fp19" },
2514 { 52, "fp20" },
2515 { 53, "fp21" },
2516 { 54, "fp22" },
2517 { 55, "fp23" },
2518 { 56, "fp24" },
2519 { 57, "fp25" },
2520 { 58, "fp26" },
2521 { 59, "fp27" },
2522 { 60, "fp28" },
2523 { 61, "fp29" },
2524 { 62, "fp30" },
2525 { 63, "fp31" },
2526 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002527# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002528 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2529 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2530 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2531 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2532 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2533 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2534 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2535 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2536 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2537 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2538 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2539 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2540 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2541 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2542 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2543 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2544 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2545 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2546 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2547 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2548 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2549 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2550 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2551 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2552 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2553 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2554 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2555 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2556 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2557 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2558 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2559 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2560 /* switch stack: */
2561 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2562 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2563 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2564 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2565 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2566 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2567 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2568 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2569 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2570 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002571 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2572 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002573 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002574 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002575 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2576 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002577 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2578 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2579 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2580 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2581 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2582 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2583 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2584 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2585 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2586 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2587 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2588 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2589 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2590 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2591 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002592# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002593 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002594# endif
2595# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002596 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002597# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002598 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002599# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002600 { 4*EBX, "4*EBX" },
2601 { 4*ECX, "4*ECX" },
2602 { 4*EDX, "4*EDX" },
2603 { 4*ESI, "4*ESI" },
2604 { 4*EDI, "4*EDI" },
2605 { 4*EBP, "4*EBP" },
2606 { 4*EAX, "4*EAX" },
2607 { 4*DS, "4*DS" },
2608 { 4*ES, "4*ES" },
2609 { 4*FS, "4*FS" },
2610 { 4*GS, "4*GS" },
2611 { 4*ORIG_EAX, "4*ORIG_EAX" },
2612 { 4*EIP, "4*EIP" },
2613 { 4*CS, "4*CS" },
2614 { 4*EFL, "4*EFL" },
2615 { 4*UESP, "4*UESP" },
2616 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002617# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002618 { 8*R15, "8*R15" },
2619 { 8*R14, "8*R14" },
2620 { 8*R13, "8*R13" },
2621 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002622 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002623 { 8*RBX, "8*RBX" },
2624 { 8*R11, "8*R11" },
2625 { 8*R10, "8*R10" },
2626 { 8*R9, "8*R9" },
2627 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002628 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002629 { 8*RCX, "8*RCX" },
2630 { 8*RDX, "8*RDX" },
2631 { 8*RSI, "8*RSI" },
2632 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002633 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002634 { 8*RIP, "8*RIP" },
2635 { 8*CS, "8*CS" },
2636 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002637 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002638 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002639# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002640 { 4*PT_D1, "4*PT_D1" },
2641 { 4*PT_D2, "4*PT_D2" },
2642 { 4*PT_D3, "4*PT_D3" },
2643 { 4*PT_D4, "4*PT_D4" },
2644 { 4*PT_D5, "4*PT_D5" },
2645 { 4*PT_D6, "4*PT_D6" },
2646 { 4*PT_D7, "4*PT_D7" },
2647 { 4*PT_A0, "4*PT_A0" },
2648 { 4*PT_A1, "4*PT_A1" },
2649 { 4*PT_A2, "4*PT_A2" },
2650 { 4*PT_A3, "4*PT_A3" },
2651 { 4*PT_A4, "4*PT_A4" },
2652 { 4*PT_A5, "4*PT_A5" },
2653 { 4*PT_A6, "4*PT_A6" },
2654 { 4*PT_D0, "4*PT_D0" },
2655 { 4*PT_USP, "4*PT_USP" },
2656 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2657 { 4*PT_SR, "4*PT_SR" },
2658 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002659# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002660 { 4*REG_REG0, "4*REG_REG0" },
2661 { 4*(REG_REG0+1), "4*REG_REG1" },
2662 { 4*(REG_REG0+2), "4*REG_REG2" },
2663 { 4*(REG_REG0+3), "4*REG_REG3" },
2664 { 4*(REG_REG0+4), "4*REG_REG4" },
2665 { 4*(REG_REG0+5), "4*REG_REG5" },
2666 { 4*(REG_REG0+6), "4*REG_REG6" },
2667 { 4*(REG_REG0+7), "4*REG_REG7" },
2668 { 4*(REG_REG0+8), "4*REG_REG8" },
2669 { 4*(REG_REG0+9), "4*REG_REG9" },
2670 { 4*(REG_REG0+10), "4*REG_REG10" },
2671 { 4*(REG_REG0+11), "4*REG_REG11" },
2672 { 4*(REG_REG0+12), "4*REG_REG12" },
2673 { 4*(REG_REG0+13), "4*REG_REG13" },
2674 { 4*(REG_REG0+14), "4*REG_REG14" },
2675 { 4*REG_REG15, "4*REG_REG15" },
2676 { 4*REG_PC, "4*REG_PC" },
2677 { 4*REG_PR, "4*REG_PR" },
2678 { 4*REG_SR, "4*REG_SR" },
2679 { 4*REG_GBR, "4*REG_GBR" },
2680 { 4*REG_MACH, "4*REG_MACH" },
2681 { 4*REG_MACL, "4*REG_MACL" },
2682 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2683 { 4*REG_FPUL, "4*REG_FPUL" },
2684 { 4*REG_FPREG0, "4*REG_FPREG0" },
2685 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2686 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2687 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2688 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2689 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2690 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2691 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2692 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2693 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2694 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2695 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2696 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2697 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2698 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2699 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002700# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002701 { 4*REG_XDREG0, "4*REG_XDREG0" },
2702 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2703 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2704 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2705 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2706 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2707 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2708 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002709# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002710 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002711# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002712 { 0, "PC(L)" },
2713 { 4, "PC(U)" },
2714 { 8, "SR(L)" },
2715 { 12, "SR(U)" },
2716 { 16, "syscall no.(L)" },
2717 { 20, "syscall_no.(U)" },
2718 { 24, "R0(L)" },
2719 { 28, "R0(U)" },
2720 { 32, "R1(L)" },
2721 { 36, "R1(U)" },
2722 { 40, "R2(L)" },
2723 { 44, "R2(U)" },
2724 { 48, "R3(L)" },
2725 { 52, "R3(U)" },
2726 { 56, "R4(L)" },
2727 { 60, "R4(U)" },
2728 { 64, "R5(L)" },
2729 { 68, "R5(U)" },
2730 { 72, "R6(L)" },
2731 { 76, "R6(U)" },
2732 { 80, "R7(L)" },
2733 { 84, "R7(U)" },
2734 { 88, "R8(L)" },
2735 { 92, "R8(U)" },
2736 { 96, "R9(L)" },
2737 { 100, "R9(U)" },
2738 { 104, "R10(L)" },
2739 { 108, "R10(U)" },
2740 { 112, "R11(L)" },
2741 { 116, "R11(U)" },
2742 { 120, "R12(L)" },
2743 { 124, "R12(U)" },
2744 { 128, "R13(L)" },
2745 { 132, "R13(U)" },
2746 { 136, "R14(L)" },
2747 { 140, "R14(U)" },
2748 { 144, "R15(L)" },
2749 { 148, "R15(U)" },
2750 { 152, "R16(L)" },
2751 { 156, "R16(U)" },
2752 { 160, "R17(L)" },
2753 { 164, "R17(U)" },
2754 { 168, "R18(L)" },
2755 { 172, "R18(U)" },
2756 { 176, "R19(L)" },
2757 { 180, "R19(U)" },
2758 { 184, "R20(L)" },
2759 { 188, "R20(U)" },
2760 { 192, "R21(L)" },
2761 { 196, "R21(U)" },
2762 { 200, "R22(L)" },
2763 { 204, "R22(U)" },
2764 { 208, "R23(L)" },
2765 { 212, "R23(U)" },
2766 { 216, "R24(L)" },
2767 { 220, "R24(U)" },
2768 { 224, "R25(L)" },
2769 { 228, "R25(U)" },
2770 { 232, "R26(L)" },
2771 { 236, "R26(U)" },
2772 { 240, "R27(L)" },
2773 { 244, "R27(U)" },
2774 { 248, "R28(L)" },
2775 { 252, "R28(U)" },
2776 { 256, "R29(L)" },
2777 { 260, "R29(U)" },
2778 { 264, "R30(L)" },
2779 { 268, "R30(U)" },
2780 { 272, "R31(L)" },
2781 { 276, "R31(U)" },
2782 { 280, "R32(L)" },
2783 { 284, "R32(U)" },
2784 { 288, "R33(L)" },
2785 { 292, "R33(U)" },
2786 { 296, "R34(L)" },
2787 { 300, "R34(U)" },
2788 { 304, "R35(L)" },
2789 { 308, "R35(U)" },
2790 { 312, "R36(L)" },
2791 { 316, "R36(U)" },
2792 { 320, "R37(L)" },
2793 { 324, "R37(U)" },
2794 { 328, "R38(L)" },
2795 { 332, "R38(U)" },
2796 { 336, "R39(L)" },
2797 { 340, "R39(U)" },
2798 { 344, "R40(L)" },
2799 { 348, "R40(U)" },
2800 { 352, "R41(L)" },
2801 { 356, "R41(U)" },
2802 { 360, "R42(L)" },
2803 { 364, "R42(U)" },
2804 { 368, "R43(L)" },
2805 { 372, "R43(U)" },
2806 { 376, "R44(L)" },
2807 { 380, "R44(U)" },
2808 { 384, "R45(L)" },
2809 { 388, "R45(U)" },
2810 { 392, "R46(L)" },
2811 { 396, "R46(U)" },
2812 { 400, "R47(L)" },
2813 { 404, "R47(U)" },
2814 { 408, "R48(L)" },
2815 { 412, "R48(U)" },
2816 { 416, "R49(L)" },
2817 { 420, "R49(U)" },
2818 { 424, "R50(L)" },
2819 { 428, "R50(U)" },
2820 { 432, "R51(L)" },
2821 { 436, "R51(U)" },
2822 { 440, "R52(L)" },
2823 { 444, "R52(U)" },
2824 { 448, "R53(L)" },
2825 { 452, "R53(U)" },
2826 { 456, "R54(L)" },
2827 { 460, "R54(U)" },
2828 { 464, "R55(L)" },
2829 { 468, "R55(U)" },
2830 { 472, "R56(L)" },
2831 { 476, "R56(U)" },
2832 { 480, "R57(L)" },
2833 { 484, "R57(U)" },
2834 { 488, "R58(L)" },
2835 { 492, "R58(U)" },
2836 { 496, "R59(L)" },
2837 { 500, "R59(U)" },
2838 { 504, "R60(L)" },
2839 { 508, "R60(U)" },
2840 { 512, "R61(L)" },
2841 { 516, "R61(U)" },
2842 { 520, "R62(L)" },
2843 { 524, "R62(U)" },
2844 { 528, "TR0(L)" },
2845 { 532, "TR0(U)" },
2846 { 536, "TR1(L)" },
2847 { 540, "TR1(U)" },
2848 { 544, "TR2(L)" },
2849 { 548, "TR2(U)" },
2850 { 552, "TR3(L)" },
2851 { 556, "TR3(U)" },
2852 { 560, "TR4(L)" },
2853 { 564, "TR4(U)" },
2854 { 568, "TR5(L)" },
2855 { 572, "TR5(U)" },
2856 { 576, "TR6(L)" },
2857 { 580, "TR6(U)" },
2858 { 584, "TR7(L)" },
2859 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002860 /* This entry is in case pt_regs contains dregs (depends on
2861 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002862 { uoff(regs), "offsetof(struct user, regs)" },
2863 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002864# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002865 { uoff(regs.ARM_r0), "r0" },
2866 { uoff(regs.ARM_r1), "r1" },
2867 { uoff(regs.ARM_r2), "r2" },
2868 { uoff(regs.ARM_r3), "r3" },
2869 { uoff(regs.ARM_r4), "r4" },
2870 { uoff(regs.ARM_r5), "r5" },
2871 { uoff(regs.ARM_r6), "r6" },
2872 { uoff(regs.ARM_r7), "r7" },
2873 { uoff(regs.ARM_r8), "r8" },
2874 { uoff(regs.ARM_r9), "r9" },
2875 { uoff(regs.ARM_r10), "r10" },
2876 { uoff(regs.ARM_fp), "fp" },
2877 { uoff(regs.ARM_ip), "ip" },
2878 { uoff(regs.ARM_sp), "sp" },
2879 { uoff(regs.ARM_lr), "lr" },
2880 { uoff(regs.ARM_pc), "pc" },
2881 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002882# elif defined(AVR32)
2883 { uoff(regs.sr), "sr" },
2884 { uoff(regs.pc), "pc" },
2885 { uoff(regs.lr), "lr" },
2886 { uoff(regs.sp), "sp" },
2887 { uoff(regs.r12), "r12" },
2888 { uoff(regs.r11), "r11" },
2889 { uoff(regs.r10), "r10" },
2890 { uoff(regs.r9), "r9" },
2891 { uoff(regs.r8), "r8" },
2892 { uoff(regs.r7), "r7" },
2893 { uoff(regs.r6), "r6" },
2894 { uoff(regs.r5), "r5" },
2895 { uoff(regs.r4), "r4" },
2896 { uoff(regs.r3), "r3" },
2897 { uoff(regs.r2), "r2" },
2898 { uoff(regs.r1), "r1" },
2899 { uoff(regs.r0), "r0" },
2900 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002901# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002902 { 0, "r0" },
2903 { 1, "r1" },
2904 { 2, "r2" },
2905 { 3, "r3" },
2906 { 4, "r4" },
2907 { 5, "r5" },
2908 { 6, "r6" },
2909 { 7, "r7" },
2910 { 8, "r8" },
2911 { 9, "r9" },
2912 { 10, "r10" },
2913 { 11, "r11" },
2914 { 12, "r12" },
2915 { 13, "r13" },
2916 { 14, "r14" },
2917 { 15, "r15" },
2918 { 16, "r16" },
2919 { 17, "r17" },
2920 { 18, "r18" },
2921 { 19, "r19" },
2922 { 20, "r20" },
2923 { 21, "r21" },
2924 { 22, "r22" },
2925 { 23, "r23" },
2926 { 24, "r24" },
2927 { 25, "r25" },
2928 { 26, "r26" },
2929 { 27, "r27" },
2930 { 28, "r28" },
2931 { 29, "r29" },
2932 { 30, "r30" },
2933 { 31, "r31" },
2934 { 32, "f0" },
2935 { 33, "f1" },
2936 { 34, "f2" },
2937 { 35, "f3" },
2938 { 36, "f4" },
2939 { 37, "f5" },
2940 { 38, "f6" },
2941 { 39, "f7" },
2942 { 40, "f8" },
2943 { 41, "f9" },
2944 { 42, "f10" },
2945 { 43, "f11" },
2946 { 44, "f12" },
2947 { 45, "f13" },
2948 { 46, "f14" },
2949 { 47, "f15" },
2950 { 48, "f16" },
2951 { 49, "f17" },
2952 { 50, "f18" },
2953 { 51, "f19" },
2954 { 52, "f20" },
2955 { 53, "f21" },
2956 { 54, "f22" },
2957 { 55, "f23" },
2958 { 56, "f24" },
2959 { 57, "f25" },
2960 { 58, "f26" },
2961 { 59, "f27" },
2962 { 60, "f28" },
2963 { 61, "f29" },
2964 { 62, "f30" },
2965 { 63, "f31" },
2966 { 64, "pc" },
2967 { 65, "cause" },
2968 { 66, "badvaddr" },
2969 { 67, "mmhi" },
2970 { 68, "mmlo" },
2971 { 69, "fpcsr" },
2972 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002973# elif defined(TILE)
2974 { PTREGS_OFFSET_REG(0), "r0" },
2975 { PTREGS_OFFSET_REG(1), "r1" },
2976 { PTREGS_OFFSET_REG(2), "r2" },
2977 { PTREGS_OFFSET_REG(3), "r3" },
2978 { PTREGS_OFFSET_REG(4), "r4" },
2979 { PTREGS_OFFSET_REG(5), "r5" },
2980 { PTREGS_OFFSET_REG(6), "r6" },
2981 { PTREGS_OFFSET_REG(7), "r7" },
2982 { PTREGS_OFFSET_REG(8), "r8" },
2983 { PTREGS_OFFSET_REG(9), "r9" },
2984 { PTREGS_OFFSET_REG(10), "r10" },
2985 { PTREGS_OFFSET_REG(11), "r11" },
2986 { PTREGS_OFFSET_REG(12), "r12" },
2987 { PTREGS_OFFSET_REG(13), "r13" },
2988 { PTREGS_OFFSET_REG(14), "r14" },
2989 { PTREGS_OFFSET_REG(15), "r15" },
2990 { PTREGS_OFFSET_REG(16), "r16" },
2991 { PTREGS_OFFSET_REG(17), "r17" },
2992 { PTREGS_OFFSET_REG(18), "r18" },
2993 { PTREGS_OFFSET_REG(19), "r19" },
2994 { PTREGS_OFFSET_REG(20), "r20" },
2995 { PTREGS_OFFSET_REG(21), "r21" },
2996 { PTREGS_OFFSET_REG(22), "r22" },
2997 { PTREGS_OFFSET_REG(23), "r23" },
2998 { PTREGS_OFFSET_REG(24), "r24" },
2999 { PTREGS_OFFSET_REG(25), "r25" },
3000 { PTREGS_OFFSET_REG(26), "r26" },
3001 { PTREGS_OFFSET_REG(27), "r27" },
3002 { PTREGS_OFFSET_REG(28), "r28" },
3003 { PTREGS_OFFSET_REG(29), "r29" },
3004 { PTREGS_OFFSET_REG(30), "r30" },
3005 { PTREGS_OFFSET_REG(31), "r31" },
3006 { PTREGS_OFFSET_REG(32), "r32" },
3007 { PTREGS_OFFSET_REG(33), "r33" },
3008 { PTREGS_OFFSET_REG(34), "r34" },
3009 { PTREGS_OFFSET_REG(35), "r35" },
3010 { PTREGS_OFFSET_REG(36), "r36" },
3011 { PTREGS_OFFSET_REG(37), "r37" },
3012 { PTREGS_OFFSET_REG(38), "r38" },
3013 { PTREGS_OFFSET_REG(39), "r39" },
3014 { PTREGS_OFFSET_REG(40), "r40" },
3015 { PTREGS_OFFSET_REG(41), "r41" },
3016 { PTREGS_OFFSET_REG(42), "r42" },
3017 { PTREGS_OFFSET_REG(43), "r43" },
3018 { PTREGS_OFFSET_REG(44), "r44" },
3019 { PTREGS_OFFSET_REG(45), "r45" },
3020 { PTREGS_OFFSET_REG(46), "r46" },
3021 { PTREGS_OFFSET_REG(47), "r47" },
3022 { PTREGS_OFFSET_REG(48), "r48" },
3023 { PTREGS_OFFSET_REG(49), "r49" },
3024 { PTREGS_OFFSET_REG(50), "r50" },
3025 { PTREGS_OFFSET_REG(51), "r51" },
3026 { PTREGS_OFFSET_REG(52), "r52" },
3027 { PTREGS_OFFSET_TP, "tp" },
3028 { PTREGS_OFFSET_SP, "sp" },
3029 { PTREGS_OFFSET_LR, "lr" },
3030 { PTREGS_OFFSET_PC, "pc" },
3031 { PTREGS_OFFSET_EX1, "ex1" },
3032 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
3033 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
3034 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003035# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003036# ifdef CRISV10
3037 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3038 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3039 { 4*PT_R13, "4*PT_R13" },
3040 { 4*PT_R12, "4*PT_R12" },
3041 { 4*PT_R11, "4*PT_R11" },
3042 { 4*PT_R10, "4*PT_R10" },
3043 { 4*PT_R9, "4*PT_R9" },
3044 { 4*PT_R8, "4*PT_R8" },
3045 { 4*PT_R7, "4*PT_R7" },
3046 { 4*PT_R6, "4*PT_R6" },
3047 { 4*PT_R5, "4*PT_R5" },
3048 { 4*PT_R4, "4*PT_R4" },
3049 { 4*PT_R3, "4*PT_R3" },
3050 { 4*PT_R2, "4*PT_R2" },
3051 { 4*PT_R1, "4*PT_R1" },
3052 { 4*PT_R0, "4*PT_R0" },
3053 { 4*PT_MOF, "4*PT_MOF" },
3054 { 4*PT_DCCR, "4*PT_DCCR" },
3055 { 4*PT_SRP, "4*PT_SRP" },
3056 { 4*PT_IRP, "4*PT_IRP" },
3057 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3058 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3059 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3060 { 4*PT_USP, "4*PT_USP" },
3061# endif
3062# ifdef CRISV32
3063 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3064 { 4*PT_R0, "4*PT_R0" },
3065 { 4*PT_R1, "4*PT_R1" },
3066 { 4*PT_R2, "4*PT_R2" },
3067 { 4*PT_R3, "4*PT_R3" },
3068 { 4*PT_R4, "4*PT_R4" },
3069 { 4*PT_R5, "4*PT_R5" },
3070 { 4*PT_R6, "4*PT_R6" },
3071 { 4*PT_R7, "4*PT_R7" },
3072 { 4*PT_R8, "4*PT_R8" },
3073 { 4*PT_R9, "4*PT_R9" },
3074 { 4*PT_R10, "4*PT_R10" },
3075 { 4*PT_R11, "4*PT_R11" },
3076 { 4*PT_R12, "4*PT_R12" },
3077 { 4*PT_R13, "4*PT_R13" },
3078 { 4*PT_ACR, "4*PT_ACR" },
3079 { 4*PT_SRS, "4*PT_SRS" },
3080 { 4*PT_MOF, "4*PT_MOF" },
3081 { 4*PT_SPC, "4*PT_SPC" },
3082 { 4*PT_CCS, "4*PT_CCS" },
3083 { 4*PT_SRP, "4*PT_SRP" },
3084 { 4*PT_ERP, "4*PT_ERP" },
3085 { 4*PT_EXS, "4*PT_EXS" },
3086 { 4*PT_EDA, "4*PT_EDA" },
3087 { 4*PT_USP, "4*PT_USP" },
3088 { 4*PT_PPC, "4*PT_PPC" },
3089 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3090 { 4*PT_BP+4, "4*PT_BP+4" },
3091 { 4*PT_BP+8, "4*PT_BP+8" },
3092 { 4*PT_BP+12, "4*PT_BP+12" },
3093 { 4*PT_BP+16, "4*PT_BP+16" },
3094 { 4*PT_BP+20, "4*PT_BP+20" },
3095 { 4*PT_BP+24, "4*PT_BP+24" },
3096 { 4*PT_BP+28, "4*PT_BP+28" },
3097 { 4*PT_BP+32, "4*PT_BP+32" },
3098 { 4*PT_BP+36, "4*PT_BP+36" },
3099 { 4*PT_BP+40, "4*PT_BP+40" },
3100 { 4*PT_BP+44, "4*PT_BP+44" },
3101 { 4*PT_BP+48, "4*PT_BP+48" },
3102 { 4*PT_BP+52, "4*PT_BP+52" },
3103 { 4*PT_BP+56, "4*PT_BP+56" },
3104# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003105# ifdef MICROBLAZE
3106 { PT_GPR(0), "r0" },
3107 { PT_GPR(1), "r1" },
3108 { PT_GPR(2), "r2" },
3109 { PT_GPR(3), "r3" },
3110 { PT_GPR(4), "r4" },
3111 { PT_GPR(5), "r5" },
3112 { PT_GPR(6), "r6" },
3113 { PT_GPR(7), "r7" },
3114 { PT_GPR(8), "r8" },
3115 { PT_GPR(9), "r9" },
3116 { PT_GPR(10), "r10" },
3117 { PT_GPR(11), "r11" },
3118 { PT_GPR(12), "r12" },
3119 { PT_GPR(13), "r13" },
3120 { PT_GPR(14), "r14" },
3121 { PT_GPR(15), "r15" },
3122 { PT_GPR(16), "r16" },
3123 { PT_GPR(17), "r17" },
3124 { PT_GPR(18), "r18" },
3125 { PT_GPR(19), "r19" },
3126 { PT_GPR(20), "r20" },
3127 { PT_GPR(21), "r21" },
3128 { PT_GPR(22), "r22" },
3129 { PT_GPR(23), "r23" },
3130 { PT_GPR(24), "r24" },
3131 { PT_GPR(25), "r25" },
3132 { PT_GPR(26), "r26" },
3133 { PT_GPR(27), "r27" },
3134 { PT_GPR(28), "r28" },
3135 { PT_GPR(29), "r29" },
3136 { PT_GPR(30), "r30" },
3137 { PT_GPR(31), "r31" },
3138 { PT_PC, "rpc", },
3139 { PT_MSR, "rmsr", },
3140 { PT_EAR, "rear", },
3141 { PT_ESR, "resr", },
3142 { PT_FSR, "rfsr", },
3143 { PT_KERNEL_MODE, "kernel_mode", },
3144# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003145
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003146# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3147 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003148 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003149# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003150 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003151# endif
3152# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003153 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003154# endif
3155# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003156 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003157# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003158 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3159 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3160 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003161# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003162 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003163# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003164# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003165 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003166# endif
3167# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003168 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003169# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003170 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003171# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003172 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003173# endif
3174# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003175 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003176# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003177# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003178 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003179# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003180 { uoff(magic), "offsetof(struct user, magic)" },
3181 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003182# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003183 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003184# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003185# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003186
3187# endif /* LINUX */
3188
3189# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003190 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3191 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3192 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3193 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3194 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3195 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3196 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3197 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3198 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3199 { uoff(u_error), "offsetof(struct user, u_error)" },
3200 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3201 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3202 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3203 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3204 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3205 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3206 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3207 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3208 { uoff(u_code), "offsetof(struct user, u_code)" },
3209 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3210 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3211 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3212 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3213 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3214 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3215 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3216 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3217 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3218 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3219 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3220 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3221 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3222 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3223 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3224 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3225 { uoff(u_start), "offsetof(struct user, u_start)" },
3226 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3227 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3228 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3229 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3230 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3231 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3232 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3233 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3234 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003235# endif /* SUNOS4 */
3236# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003237 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003238# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003239 { 0, NULL },
3240};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003241# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003242
3243int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003244sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003245{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003246 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003247 long addr;
3248
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003249 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003250 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003251# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003252 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003253# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003254 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003255# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003256 );
3257 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003258 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003259# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003260 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3261 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3262 for (x = struct_user_offsets; x->str; x++) {
3263 if (x->val >= addr)
3264 break;
3265 }
3266 if (!x->str)
3267 tprintf("%#lx, ", addr);
3268 else if (x->val > addr && x != struct_user_offsets) {
3269 x--;
3270 tprintf("%s + %ld, ", x->str, addr - x->val);
3271 }
3272 else
3273 tprintf("%s, ", x->str);
3274 }
3275 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003276# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003277 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003278# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003279 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003280# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003281 case PTRACE_PEEKDATA:
3282 case PTRACE_PEEKTEXT:
3283 case PTRACE_PEEKUSER:
3284 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003285# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003286 case PTRACE_CONT:
3287 case PTRACE_SINGLESTEP:
3288 case PTRACE_SYSCALL:
3289 case PTRACE_DETACH:
3290 printsignal(tcp->u_arg[3]);
3291 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003292# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003293 case PTRACE_SETOPTIONS:
3294 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3295 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003296# endif
3297# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003298 case PTRACE_SETSIGINFO: {
3299 siginfo_t si;
3300 if (!tcp->u_arg[3])
3301 tprintf("NULL");
3302 else if (syserror(tcp))
3303 tprintf("%#lx", tcp->u_arg[3]);
3304 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3305 tprintf("{???}");
3306 else
3307 printsiginfo(&si, verbose(tcp));
3308 break;
3309 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003310# endif
3311# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003312 case PTRACE_GETSIGINFO:
3313 /* Don't print anything, do it at syscall return. */
3314 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003315# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003316 default:
3317 tprintf("%#lx", tcp->u_arg[3]);
3318 break;
3319 }
3320 } else {
3321 switch (tcp->u_arg[0]) {
3322 case PTRACE_PEEKDATA:
3323 case PTRACE_PEEKTEXT:
3324 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003325# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003326 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003327# else
Roland McGratheb285352003-01-14 09:59:00 +00003328 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003329 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003330# endif
3331# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003332 case PTRACE_GETSIGINFO: {
3333 siginfo_t si;
3334 if (!tcp->u_arg[3])
3335 tprintf("NULL");
3336 else if (syserror(tcp))
3337 tprintf("%#lx", tcp->u_arg[3]);
3338 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3339 tprintf("{???}");
3340 else
3341 printsiginfo(&si, verbose(tcp));
3342 break;
3343 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003344# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003345 }
3346 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003347# endif /* LINUX */
3348# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003349 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3350 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3351 tprintf("%lu, ", tcp->u_arg[3]);
3352 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3353 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3354 tcp->u_arg[0] != PTRACE_READTEXT) {
3355 tprintf("%#lx", tcp->u_arg[3]);
3356 }
3357 } else {
3358 if (tcp->u_arg[0] == PTRACE_READDATA ||
3359 tcp->u_arg[0] == PTRACE_READTEXT) {
3360 tprintf("%lu, ", tcp->u_arg[3]);
3361 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3362 }
3363 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003364# endif /* SUNOS4 */
3365# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003366 tprintf("%lu", tcp->u_arg[3]);
3367 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003368# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003369 return 0;
3370}
3371
3372#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003373
3374#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003375# ifndef FUTEX_CMP_REQUEUE
3376# define FUTEX_CMP_REQUEUE 4
3377# endif
3378# ifndef FUTEX_WAKE_OP
3379# define FUTEX_WAKE_OP 5
3380# endif
3381# ifndef FUTEX_LOCK_PI
3382# define FUTEX_LOCK_PI 6
3383# define FUTEX_UNLOCK_PI 7
3384# define FUTEX_TRYLOCK_PI 8
3385# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003386# ifndef FUTEX_WAIT_BITSET
3387# define FUTEX_WAIT_BITSET 9
3388# endif
3389# ifndef FUTEX_WAKE_BITSET
3390# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003391# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003392# ifndef FUTEX_WAIT_REQUEUE_PI
3393# define FUTEX_WAIT_REQUEUE_PI 11
3394# endif
3395# ifndef FUTEX_CMP_REQUEUE_PI
3396# define FUTEX_CMP_REQUEUE_PI 12
3397# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003398# ifndef FUTEX_PRIVATE_FLAG
3399# define FUTEX_PRIVATE_FLAG 128
3400# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003401# ifndef FUTEX_CLOCK_REALTIME
3402# define FUTEX_CLOCK_REALTIME 256
3403# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003404static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003405 { FUTEX_WAIT, "FUTEX_WAIT" },
3406 { FUTEX_WAKE, "FUTEX_WAKE" },
3407 { FUTEX_FD, "FUTEX_FD" },
3408 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3409 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3410 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3411 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3412 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3413 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003414 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3415 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003416 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3417 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003418 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3419 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3420 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3421 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3422 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3423 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3424 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3425 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3426 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003427 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3428 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003429 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3430 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3431 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3432 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3433 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3434 { 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 +00003435 { 0, NULL }
3436};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003437# ifndef FUTEX_OP_SET
3438# define FUTEX_OP_SET 0
3439# define FUTEX_OP_ADD 1
3440# define FUTEX_OP_OR 2
3441# define FUTEX_OP_ANDN 3
3442# define FUTEX_OP_XOR 4
3443# define FUTEX_OP_CMP_EQ 0
3444# define FUTEX_OP_CMP_NE 1
3445# define FUTEX_OP_CMP_LT 2
3446# define FUTEX_OP_CMP_LE 3
3447# define FUTEX_OP_CMP_GT 4
3448# define FUTEX_OP_CMP_GE 5
3449# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003450static const struct xlat futexwakeops[] = {
3451 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3452 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3453 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3454 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3455 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3456 { 0, NULL }
3457};
3458static const struct xlat futexwakecmps[] = {
3459 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3460 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3461 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3462 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3463 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3464 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3465 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003466};
3467
3468int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003469sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003470{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003471 if (entering(tcp)) {
3472 long int cmd = tcp->u_arg[1] & 127;
3473 tprintf("%p, ", (void *) tcp->u_arg[0]);
3474 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3475 tprintf(", %ld", tcp->u_arg[2]);
3476 if (cmd == FUTEX_WAKE_BITSET)
3477 tprintf(", %lx", tcp->u_arg[5]);
3478 else if (cmd == FUTEX_WAIT) {
3479 tprintf(", ");
3480 printtv(tcp, tcp->u_arg[3]);
3481 } else if (cmd == FUTEX_WAIT_BITSET) {
3482 tprintf(", ");
3483 printtv(tcp, tcp->u_arg[3]);
3484 tprintf(", %lx", tcp->u_arg[5]);
3485 } else if (cmd == FUTEX_REQUEUE)
3486 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003487 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003488 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3489 else if (cmd == FUTEX_WAKE_OP) {
3490 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3491 if ((tcp->u_arg[5] >> 28) & 8)
3492 tprintf("FUTEX_OP_OPARG_SHIFT|");
3493 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3494 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3495 if ((tcp->u_arg[5] >> 24) & 8)
3496 tprintf("FUTEX_OP_OPARG_SHIFT|");
3497 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3498 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003499 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3500 tprintf(", ");
3501 printtv(tcp, tcp->u_arg[3]);
3502 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003503 }
Roland McGrath51942a92007-07-05 18:59:11 +00003504 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003505 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003506}
3507
3508static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003509print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003510{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003511 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003512 unsigned long w, min_len;
3513
3514 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3515 min_len = len - max_strlen * sizeof(w);
3516 else
3517 min_len = 0;
3518 for (; len >= sizeof(w) && len > min_len;
3519 len -= sizeof(w), list += sizeof(w)) {
3520 if (umove(tcp, list, &w) < 0)
3521 break;
3522 if (first)
3523 tprintf("{");
3524 else
3525 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003526 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003527 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003528 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003529 if (len) {
3530 if (first)
3531 tprintf("%#lx", list);
3532 else
3533 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3534 "???" : "..."));
3535 } else {
3536 tprintf(first ? "{}" : "}");
3537 }
Roland McGrath5a223472002-12-15 23:58:26 +00003538}
3539
3540int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003541sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003542{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003543 if (entering(tcp)) {
3544 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3545 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3546 }
3547 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003548}
3549
3550int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003551sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003552{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003553 if (entering(tcp)) {
3554 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3555 } else {
3556 if (tcp->u_rval == -1)
3557 tprintf("%#lx", tcp->u_arg[2]);
3558 else
3559 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3560 }
3561 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003562}
Roland McGrath279d3782004-03-01 20:27:37 +00003563
Roland McGrathd9f816f2004-09-04 03:39:20 +00003564static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003565 { SCHED_OTHER, "SCHED_OTHER" },
3566 { SCHED_RR, "SCHED_RR" },
3567 { SCHED_FIFO, "SCHED_FIFO" },
3568 { 0, NULL }
3569};
3570
3571int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003572sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003573{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003574 if (entering(tcp)) {
3575 tprintf("%d", (int) tcp->u_arg[0]);
3576 } else if (! syserror(tcp)) {
3577 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3578 if (tcp->auxstr != NULL)
3579 return RVAL_STR;
3580 }
3581 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003582}
3583
3584int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003585sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003586{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003587 if (entering(tcp)) {
3588 struct sched_param p;
3589 tprintf("%d, ", (int) tcp->u_arg[0]);
3590 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3591 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3592 tprintf(", %#lx", tcp->u_arg[2]);
3593 else
3594 tprintf(", { %d }", p.__sched_priority);
3595 }
3596 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003597}
3598
3599int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003600sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003601{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003602 if (entering(tcp)) {
3603 tprintf("%d, ", (int) tcp->u_arg[0]);
3604 } else {
3605 struct sched_param p;
3606 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3607 tprintf("%#lx", tcp->u_arg[1]);
3608 else
3609 tprintf("{ %d }", p.__sched_priority);
3610 }
3611 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003612}
3613
3614int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003615sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003616{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003617 if (entering(tcp)) {
3618 struct sched_param p;
3619 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3620 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3621 else
3622 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3623 }
3624 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003625}
3626
3627int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003628sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003629{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003630 if (entering(tcp)) {
3631 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3632 }
3633 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003634}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003635
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003636# ifdef X86_64
3637# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003638
3639static const struct xlat archvals[] = {
3640 { ARCH_SET_GS, "ARCH_SET_GS" },
3641 { ARCH_SET_FS, "ARCH_SET_FS" },
3642 { ARCH_GET_FS, "ARCH_GET_FS" },
3643 { ARCH_GET_GS, "ARCH_GET_GS" },
3644 { 0, NULL },
3645};
3646
3647int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003648sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003649{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003650 if (entering(tcp)) {
3651 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3652 if (tcp->u_arg[0] == ARCH_SET_GS
3653 || tcp->u_arg[0] == ARCH_SET_FS
3654 ) {
3655 tprintf(", %#lx", tcp->u_arg[1]);
3656 }
3657 } else {
3658 if (tcp->u_arg[0] == ARCH_GET_GS
3659 || tcp->u_arg[0] == ARCH_GET_FS
3660 ) {
3661 long int v;
3662 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3663 tprintf(", [%#lx]", v);
3664 else
3665 tprintf(", %#lx", tcp->u_arg[1]);
3666 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003667 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003668 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003669}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003670# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003671
Roland McGrathdb8319f2007-08-02 01:37:55 +00003672
3673int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003674sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003675{
3676 if (exiting(tcp)) {
3677 unsigned u;
3678 if (tcp->u_arg[0] == 0)
3679 tprintf("NULL, ");
3680 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3681 tprintf("%#lx, ", tcp->u_arg[0]);
3682 else
3683 tprintf("[%u], ", u);
3684 if (tcp->u_arg[1] == 0)
3685 tprintf("NULL, ");
3686 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3687 tprintf("%#lx, ", tcp->u_arg[1]);
3688 else
3689 tprintf("[%u], ", u);
3690 tprintf("%#lx", tcp->u_arg[2]);
3691 }
3692 return 0;
3693}
3694
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003695#endif /* LINUX */