blob: 7b3eda1dc600804c24cb4f0e0a0d1113195db745 [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
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800796handle_new_child(struct tcb *tcp, int pid, int bpt)
797{
798 struct tcb *tcpchild;
799
800#ifdef CLONE_PTRACE /* See new setbpt code. */
801 tcpchild = pid2tcb(pid);
802 if (tcpchild != NULL) {
803 /* The child already reported its startup trap
804 before the parent reported its syscall return. */
805 if ((tcpchild->flags
806 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
807 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
808 fprintf(stderr, "\
809[preattached child %d of %d in weird state!]\n",
810 pid, tcp->pid);
811 }
812 else
813#endif /* CLONE_PTRACE */
814 {
815 fork_tcb(tcp);
816 tcpchild = alloctcb(pid);
817 }
818
819#ifndef CLONE_PTRACE
820 /* Attach to the new child */
821 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
822 if (bpt)
823 clearbpt(tcp);
824 perror("PTRACE_ATTACH");
825 fprintf(stderr, "Too late?\n");
826 droptcb(tcpchild);
827 return 0;
828 }
829#endif /* !CLONE_PTRACE */
830
831 if (bpt)
832 clearbpt(tcp);
833
834 tcpchild->flags |= TCB_ATTACHED;
835 /* Child has BPT too, must be removed on first occasion. */
836 if (bpt) {
837 tcpchild->flags |= TCB_BPTSET;
838 tcpchild->baddr = tcp->baddr;
839 memcpy(tcpchild->inst, tcp->inst,
840 sizeof tcpchild->inst);
841 }
842 tcpchild->parent = tcp;
843 tcp->nchildren++;
844 if (tcpchild->flags & TCB_SUSPENDED) {
845 /* The child was born suspended, due to our having
846 forced CLONE_PTRACE. */
847 if (bpt)
848 clearbpt(tcpchild);
849
850 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
851 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
852 return -1;
853
854 if (!qflag)
855 fprintf(stderr, "\
856Process %u resumed (parent %d ready)\n",
857 pid, tcp->pid);
858 }
859 else {
860 if (!qflag)
861 fprintf(stderr, "Process %d attached\n", pid);
862 }
863
864#ifdef TCB_CLONE_THREAD
865 if (sysent[tcp->scno].sys_func == sys_clone)
866 {
867 /*
868 * Save the flags used in this call,
869 * in case we point TCP to our parent below.
870 */
871 int call_flags = tcp->u_arg[ARG_FLAGS];
872 if ((tcp->flags & TCB_CLONE_THREAD) &&
873 tcp->parent != NULL) {
874 /* The parent in this clone is itself a
875 thread belonging to another process.
876 There is no meaning to the parentage
877 relationship of the new child with the
878 thread, only with the process. We
879 associate the new thread with our
880 parent. Since this is done for every
881 new thread, there will never be a
882 TCB_CLONE_THREAD process that has
883 children. */
884 --tcp->nchildren;
885 tcp = tcp->parent;
886 tcpchild->parent = tcp;
887 ++tcp->nchildren;
888 }
889 if (call_flags & CLONE_THREAD) {
890 tcpchild->flags |= TCB_CLONE_THREAD;
891 ++tcp->nclone_threads;
892 }
893 if ((call_flags & CLONE_PARENT) &&
894 !(call_flags & CLONE_THREAD)) {
895 --tcp->nchildren;
896 tcpchild->parent = NULL;
897 if (tcp->parent != NULL) {
898 tcp = tcp->parent;
899 tcpchild->parent = tcp;
900 ++tcp->nchildren;
901 }
902 }
903 }
904#endif /* TCB_CLONE_THREAD */
905 return 0;
906}
907
908int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000909internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000910{
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800911 if ((ptrace_setoptions
912 & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
913 == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
914 return 0;
915
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000916 if (entering(tcp)) {
Wang Chaoe636c852010-09-16 11:20:56 +0800917 tcp->flags &= ~TCB_FOLLOWFORK;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700918 if (!followfork)
919 return 0;
Wang Chaoe636c852010-09-16 11:20:56 +0800920 /*
921 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
922 * new child if clone is called with flag CLONE_UNTRACED, so
923 * we keep the same logic with that option and don't trace it.
924 */
925 if ((sysent[tcp->scno].sys_func == sys_clone) &&
926 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
927 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700928 fork_tcb(tcp);
929 if (setbpt(tcp) < 0)
930 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000931 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000932 int pid;
933 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700934
935 if (!(tcp->flags & TCB_FOLLOWFORK))
936 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000937
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000938 bpt = tcp->flags & TCB_BPTSET;
939
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000940 if (syserror(tcp)) {
941 if (bpt)
942 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000943 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000944 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000945
946 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000947
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800948 return handle_new_child(tcp, pid, bpt);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000949 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000950 return 0;
951}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000952
953#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000954
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000955int
956internal_fork(tcp)
957struct tcb *tcp;
958{
959 struct tcb *tcpchild;
960 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700961 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000962
963#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000964 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000965 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000966 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700967 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000968 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000969#endif
970 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700971 if (!followfork || dont_follow)
972 return 0;
973 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000974 if (setbpt(tcp) < 0)
975 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000976 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000977 else {
978 int bpt = tcp->flags & TCB_BPTSET;
979
Roland McGratheb9e2e82009-06-02 16:49:22 -0700980 if (!(tcp->flags & TCB_FOLLOWFORK))
981 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000982 if (bpt)
983 clearbpt(tcp);
984
985 if (syserror(tcp))
986 return 0;
987
988 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700989 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000990 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000991#ifdef SUNOS4
992#ifdef oldway
993 /* The child must have run before it can be attached. */
994 {
995 struct timeval tv;
996 tv.tv_sec = 0;
997 tv.tv_usec = 10000;
998 select(0, NULL, NULL, NULL, &tv);
999 }
1000 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1001 perror("PTRACE_ATTACH");
1002 fprintf(stderr, "Too late?\n");
1003 droptcb(tcpchild);
1004 return 0;
1005 }
1006#else /* !oldway */
1007 /* Try to catch the new process as soon as possible. */
1008 {
1009 int i;
1010 for (i = 0; i < 1024; i++)
1011 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1012 break;
1013 if (i == 1024) {
1014 perror("PTRACE_ATTACH");
1015 fprintf(stderr, "Too late?\n");
1016 droptcb(tcpchild);
1017 return 0;
1018 }
1019 }
1020#endif /* !oldway */
1021#endif /* SUNOS4 */
1022 tcpchild->flags |= TCB_ATTACHED;
1023 /* Child has BPT too, must be removed on first occasion */
1024 if (bpt) {
1025 tcpchild->flags |= TCB_BPTSET;
1026 tcpchild->baddr = tcp->baddr;
1027 memcpy(tcpchild->inst, tcp->inst,
1028 sizeof tcpchild->inst);
1029 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001030 tcpchild->parent = tcp;
1031 tcp->nchildren++;
1032 if (!qflag)
1033 fprintf(stderr, "Process %d attached\n", pid);
1034 }
1035 return 0;
1036}
1037
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001038#endif /* !LINUX */
1039
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001040#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001041
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001042#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001043
1044int
1045sys_vfork(tcp)
1046struct tcb *tcp;
1047{
1048 if (exiting(tcp))
1049 return RVAL_UDECIMAL;
1050 return 0;
1051}
1052
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001053#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001054
1055#ifndef LINUX
1056
1057static char idstr[16];
1058
1059int
1060sys_getpid(tcp)
1061struct tcb *tcp;
1062{
1063 if (exiting(tcp)) {
1064 sprintf(idstr, "ppid %lu", getrval2(tcp));
1065 tcp->auxstr = idstr;
1066 return RVAL_STR;
1067 }
1068 return 0;
1069}
1070
1071int
1072sys_getuid(tcp)
1073struct tcb *tcp;
1074{
1075 if (exiting(tcp)) {
1076 sprintf(idstr, "euid %lu", getrval2(tcp));
1077 tcp->auxstr = idstr;
1078 return RVAL_STR;
1079 }
1080 return 0;
1081}
1082
1083int
1084sys_getgid(tcp)
1085struct tcb *tcp;
1086{
1087 if (exiting(tcp)) {
1088 sprintf(idstr, "egid %lu", getrval2(tcp));
1089 tcp->auxstr = idstr;
1090 return RVAL_STR;
1091 }
1092 return 0;
1093}
1094
1095#endif /* !LINUX */
1096
1097#ifdef LINUX
1098
1099int
1100sys_setuid(tcp)
1101struct tcb *tcp;
1102{
1103 if (entering(tcp)) {
1104 tprintf("%u", (uid_t) tcp->u_arg[0]);
1105 }
1106 return 0;
1107}
1108
1109int
1110sys_setgid(tcp)
1111struct tcb *tcp;
1112{
1113 if (entering(tcp)) {
1114 tprintf("%u", (gid_t) tcp->u_arg[0]);
1115 }
1116 return 0;
1117}
1118
1119int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001120sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001121{
1122 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001123 __kernel_uid_t uid;
1124 if (syserror(tcp))
1125 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1126 tcp->u_arg[1], tcp->u_arg[2]);
1127 else {
1128 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1129 tprintf("%#lx, ", tcp->u_arg[0]);
1130 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001131 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001132 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1133 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001134 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001135 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001136 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1137 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001138 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001139 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001140 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001141 }
1142 return 0;
1143}
1144
1145int
1146sys_getresgid(tcp)
1147struct tcb *tcp;
1148{
1149 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001150 __kernel_gid_t gid;
1151 if (syserror(tcp))
1152 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1153 tcp->u_arg[1], tcp->u_arg[2]);
1154 else {
1155 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1156 tprintf("%#lx, ", tcp->u_arg[0]);
1157 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001158 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001159 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1160 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001161 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001162 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001163 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1164 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001165 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001166 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001167 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001168 }
1169 return 0;
1170}
1171
1172#endif /* LINUX */
1173
1174int
1175sys_setreuid(tcp)
1176struct tcb *tcp;
1177{
1178 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001179 printuid("", tcp->u_arg[0]);
1180 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001181 }
1182 return 0;
1183}
1184
1185int
1186sys_setregid(tcp)
1187struct tcb *tcp;
1188{
1189 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001190 printuid("", tcp->u_arg[0]);
1191 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001192 }
1193 return 0;
1194}
1195
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001196#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001197int
1198sys_setresuid(tcp)
1199 struct tcb *tcp;
1200{
1201 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001202 printuid("", tcp->u_arg[0]);
1203 printuid(", ", tcp->u_arg[1]);
1204 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001205 }
1206 return 0;
1207}
1208int
1209sys_setresgid(tcp)
1210 struct tcb *tcp;
1211{
1212 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001213 printuid("", tcp->u_arg[0]);
1214 printuid(", ", tcp->u_arg[1]);
1215 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001216 }
1217 return 0;
1218}
1219
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001220#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001221
1222int
1223sys_setgroups(tcp)
1224struct tcb *tcp;
1225{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001226 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001227 unsigned long len, size, start, cur, end, abbrev_end;
1228 GETGROUPS_T gid;
1229 int failed = 0;
1230
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001231 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001232 tprintf("%lu, ", len);
1233 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001234 tprintf("[]");
1235 return 0;
1236 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001237 start = tcp->u_arg[1];
1238 if (start == 0) {
1239 tprintf("NULL");
1240 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001241 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001242 size = len * sizeof(gid);
1243 end = start + size;
1244 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1245 tprintf("%#lx", start);
1246 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001247 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001248 if (abbrev(tcp)) {
1249 abbrev_end = start + max_strlen * sizeof(gid);
1250 if (abbrev_end < start)
1251 abbrev_end = end;
1252 } else {
1253 abbrev_end = end;
1254 }
1255 tprintf("[");
1256 for (cur = start; cur < end; cur += sizeof(gid)) {
1257 if (cur > start)
1258 tprintf(", ");
1259 if (cur >= abbrev_end) {
1260 tprintf("...");
1261 break;
1262 }
1263 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1264 tprintf("?");
1265 failed = 1;
1266 break;
1267 }
1268 tprintf("%lu", (unsigned long) gid);
1269 }
1270 tprintf("]");
1271 if (failed)
1272 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001273 }
1274 return 0;
1275}
1276
1277int
1278sys_getgroups(tcp)
1279struct tcb *tcp;
1280{
Roland McGrathaa524c82005-06-01 19:22:06 +00001281 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001282
1283 if (entering(tcp)) {
1284 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001285 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001286 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001287 unsigned long size, start, cur, end, abbrev_end;
1288 GETGROUPS_T gid;
1289 int failed = 0;
1290
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001291 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001292 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001293 tprintf("[]");
1294 return 0;
1295 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001296 start = tcp->u_arg[1];
1297 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001298 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001299 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001300 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001301 if (tcp->u_arg[0] == 0) {
1302 tprintf("%#lx", start);
1303 return 0;
1304 }
1305 size = len * sizeof(gid);
1306 end = start + size;
1307 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1308 size / sizeof(gid) != len || end < start) {
1309 tprintf("%#lx", start);
1310 return 0;
1311 }
1312 if (abbrev(tcp)) {
1313 abbrev_end = start + max_strlen * sizeof(gid);
1314 if (abbrev_end < start)
1315 abbrev_end = end;
1316 } else {
1317 abbrev_end = end;
1318 }
1319 tprintf("[");
1320 for (cur = start; cur < end; cur += sizeof(gid)) {
1321 if (cur > start)
1322 tprintf(", ");
1323 if (cur >= abbrev_end) {
1324 tprintf("...");
1325 break;
1326 }
1327 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1328 tprintf("?");
1329 failed = 1;
1330 break;
1331 }
1332 tprintf("%lu", (unsigned long) gid);
1333 }
1334 tprintf("]");
1335 if (failed)
1336 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001337 }
1338 return 0;
1339}
1340
Roland McGrath83bd47a2003-11-13 22:32:26 +00001341#ifdef LINUX
1342int
1343sys_setgroups32(tcp)
1344struct tcb *tcp;
1345{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001346 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001347 unsigned long len, size, start, cur, end, abbrev_end;
1348 GETGROUPS32_T gid;
1349 int failed = 0;
1350
Roland McGrath83bd47a2003-11-13 22:32:26 +00001351 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001352 tprintf("%lu, ", len);
1353 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001354 tprintf("[]");
1355 return 0;
1356 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001357 start = tcp->u_arg[1];
1358 if (start == 0) {
1359 tprintf("NULL");
1360 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001361 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001362 size = len * sizeof(gid);
1363 end = start + size;
1364 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1365 tprintf("%#lx", start);
1366 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001367 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001368 if (abbrev(tcp)) {
1369 abbrev_end = start + max_strlen * sizeof(gid);
1370 if (abbrev_end < start)
1371 abbrev_end = end;
1372 } else {
1373 abbrev_end = end;
1374 }
1375 tprintf("[");
1376 for (cur = start; cur < end; cur += sizeof(gid)) {
1377 if (cur > start)
1378 tprintf(", ");
1379 if (cur >= abbrev_end) {
1380 tprintf("...");
1381 break;
1382 }
1383 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1384 tprintf("?");
1385 failed = 1;
1386 break;
1387 }
1388 tprintf("%lu", (unsigned long) gid);
1389 }
1390 tprintf("]");
1391 if (failed)
1392 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001393 }
1394 return 0;
1395}
1396
1397int
1398sys_getgroups32(tcp)
1399struct tcb *tcp;
1400{
Roland McGrathaa524c82005-06-01 19:22:06 +00001401 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001402
1403 if (entering(tcp)) {
1404 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001405 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001406 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001407 unsigned long size, start, cur, end, abbrev_end;
1408 GETGROUPS32_T gid;
1409 int failed = 0;
1410
Roland McGrath83bd47a2003-11-13 22:32:26 +00001411 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001412 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001413 tprintf("[]");
1414 return 0;
1415 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001416 start = tcp->u_arg[1];
1417 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001418 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001419 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001420 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001421 size = len * sizeof(gid);
1422 end = start + size;
1423 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1424 size / sizeof(gid) != len || end < start) {
1425 tprintf("%#lx", start);
1426 return 0;
1427 }
1428 if (abbrev(tcp)) {
1429 abbrev_end = start + max_strlen * sizeof(gid);
1430 if (abbrev_end < start)
1431 abbrev_end = end;
1432 } else {
1433 abbrev_end = end;
1434 }
1435 tprintf("[");
1436 for (cur = start; cur < end; cur += sizeof(gid)) {
1437 if (cur > start)
1438 tprintf(", ");
1439 if (cur >= abbrev_end) {
1440 tprintf("...");
1441 break;
1442 }
1443 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1444 tprintf("?");
1445 failed = 1;
1446 break;
1447 }
1448 tprintf("%lu", (unsigned long) gid);
1449 }
1450 tprintf("]");
1451 if (failed)
1452 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001453 }
1454 return 0;
1455}
1456#endif /* LINUX */
1457
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001458#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001459int
1460sys_setpgrp(tcp)
1461struct tcb *tcp;
1462{
1463 if (entering(tcp)) {
1464#ifndef SVR4
1465 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1466#endif /* !SVR4 */
1467 }
1468 return 0;
1469}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001470#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001471
1472int
1473sys_getpgrp(tcp)
1474struct tcb *tcp;
1475{
1476 if (entering(tcp)) {
1477#ifndef SVR4
1478 tprintf("%lu", tcp->u_arg[0]);
1479#endif /* !SVR4 */
1480 }
1481 return 0;
1482}
1483
1484int
1485sys_getsid(tcp)
1486struct tcb *tcp;
1487{
1488 if (entering(tcp)) {
1489 tprintf("%lu", tcp->u_arg[0]);
1490 }
1491 return 0;
1492}
1493
1494int
1495sys_setsid(tcp)
1496struct tcb *tcp;
1497{
1498 return 0;
1499}
1500
1501int
1502sys_getpgid(tcp)
1503struct tcb *tcp;
1504{
1505 if (entering(tcp)) {
1506 tprintf("%lu", tcp->u_arg[0]);
1507 }
1508 return 0;
1509}
1510
1511int
1512sys_setpgid(tcp)
1513struct tcb *tcp;
1514{
1515 if (entering(tcp)) {
1516 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1517 }
1518 return 0;
1519}
1520
John Hughesc61eb3d2002-05-17 11:37:50 +00001521#if UNIXWARE >= 2
1522
1523#include <sys/privilege.h>
1524
1525
Roland McGrathd9f816f2004-09-04 03:39:20 +00001526static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001527 { SETPRV, "SETPRV" },
1528 { CLRPRV, "CLRPRV" },
1529 { PUTPRV, "PUTPRV" },
1530 { GETPRV, "GETPRV" },
1531 { CNTPRV, "CNTPRV" },
1532 { 0, NULL },
1533};
1534
1535
Roland McGrathd9f816f2004-09-04 03:39:20 +00001536static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001537 { P_OWNER, "P_OWNER" },
1538 { P_AUDIT, "P_AUDIT" },
1539 { P_COMPAT, "P_COMPAT" },
1540 { P_DACREAD, "P_DACREAD" },
1541 { P_DACWRITE, "P_DACWRITE" },
1542 { P_DEV, "P_DEV" },
1543 { P_FILESYS, "P_FILESYS" },
1544 { P_MACREAD, "P_MACREAD" },
1545 { P_MACWRITE, "P_MACWRITE" },
1546 { P_MOUNT, "P_MOUNT" },
1547 { P_MULTIDIR, "P_MULTIDIR" },
1548 { P_SETPLEVEL, "P_SETPLEVEL" },
1549 { P_SETSPRIV, "P_SETSPRIV" },
1550 { P_SETUID, "P_SETUID" },
1551 { P_SYSOPS, "P_SYSOPS" },
1552 { P_SETUPRIV, "P_SETUPRIV" },
1553 { P_DRIVER, "P_DRIVER" },
1554 { P_RTIME, "P_RTIME" },
1555 { P_MACUPGRADE, "P_MACUPGRADE" },
1556 { P_FSYSRANGE, "P_FSYSRANGE" },
1557 { P_SETFLEVEL, "P_SETFLEVEL" },
1558 { P_AUDITWR, "P_AUDITWR" },
1559 { P_TSHAR, "P_TSHAR" },
1560 { P_PLOCK, "P_PLOCK" },
1561 { P_CORE, "P_CORE" },
1562 { P_LOADMOD, "P_LOADMOD" },
1563 { P_BIND, "P_BIND" },
1564 { P_ALLPRIVS, "P_ALLPRIVS" },
1565 { 0, NULL },
1566};
1567
1568
Roland McGrathd9f816f2004-09-04 03:39:20 +00001569static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001570 { PS_FIX, "PS_FIX" },
1571 { PS_INH, "PS_INH" },
1572 { PS_MAX, "PS_MAX" },
1573 { PS_WKG, "PS_WKG" },
1574 { 0, NULL },
1575};
1576
1577
1578static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001579printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001580{
1581 priv_t buf [128];
1582 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1583 int dots = len > max;
1584 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001585
John Hughesc61eb3d2002-05-17 11:37:50 +00001586 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001587
John Hughesc61eb3d2002-05-17 11:37:50 +00001588 if (len <= 0 ||
1589 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1590 {
1591 tprintf ("%#lx", addr);
1592 return;
1593 }
1594
1595 tprintf ("[");
1596
1597 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001598 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001599
1600 if (i) tprintf (", ");
1601
1602 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1603 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1604 {
1605 tprintf ("%s|%s", t, p);
1606 }
1607 else {
1608 tprintf ("%#lx", buf [i]);
1609 }
1610 }
1611
1612 if (dots) tprintf (" ...");
1613
1614 tprintf ("]");
1615}
1616
1617
1618int
1619sys_procpriv(tcp)
1620struct tcb *tcp;
1621{
1622 if (entering(tcp)) {
1623 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1624 switch (tcp->u_arg[0]) {
1625 case CNTPRV:
1626 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1627 break;
1628
1629 case GETPRV:
1630 break;
1631
1632 default:
1633 tprintf (", ");
1634 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1635 tprintf (", %ld", tcp->u_arg[2]);
1636 }
1637 }
1638 else if (tcp->u_arg[0] == GETPRV) {
1639 if (syserror (tcp)) {
1640 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1641 }
1642 else {
1643 tprintf (", ");
1644 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1645 tprintf (", %ld", tcp->u_arg[2]);
1646 }
1647 }
Roland McGrath5a223472002-12-15 23:58:26 +00001648
John Hughesc61eb3d2002-05-17 11:37:50 +00001649 return 0;
1650}
1651
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001652#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001653
1654
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001655static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001656printargv(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001657{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001658 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001659 unsigned int p32;
1660 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001661 char data[sizeof(long)];
1662 } cp;
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001663 const char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001664 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001665
Roland McGrath85a3bc42007-08-02 02:13:05 +00001666 cp.p64 = 1;
1667 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1668 if (umoven(tcp, addr, personality_wordsize[current_personality],
1669 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001670 tprintf("%#lx", addr);
1671 return;
1672 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001673 if (personality_wordsize[current_personality] == 4)
1674 cp.p64 = cp.p32;
1675 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001676 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001677 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001678 printstr(tcp, cp.p64, -1);
1679 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001680 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001681 if (cp.p64)
1682 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001683}
1684
1685static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001686printargc(const char *fmt, struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001687{
1688 int count;
1689 char *cp;
1690
1691 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1692 addr += sizeof(char *);
1693 }
1694 tprintf(fmt, count, count == 1 ? "" : "s");
1695}
1696
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001697#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001698int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001699sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001700{
1701 if (entering(tcp)) {
1702 printpath(tcp, tcp->u_arg[0]);
1703 if (!verbose(tcp))
1704 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001705 else {
1706 tprintf(", [");
1707 printargv(tcp, tcp->u_arg[1]);
1708 tprintf("]");
1709 }
1710 }
1711 return 0;
1712}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001713#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001714
1715int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001716sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001717{
1718 if (entering(tcp)) {
1719 printpath(tcp, tcp->u_arg[0]);
1720 if (!verbose(tcp))
1721 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001722 else {
1723 tprintf(", [");
1724 printargv(tcp, tcp->u_arg[1]);
1725 tprintf("]");
1726 }
1727 if (!verbose(tcp))
1728 tprintf(", %#lx", tcp->u_arg[2]);
1729 else if (abbrev(tcp))
1730 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1731 else {
1732 tprintf(", [");
1733 printargv(tcp, tcp->u_arg[2]);
1734 tprintf("]");
1735 }
1736 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001737 return 0;
1738}
1739
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001740#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001741
1742int sys_rexecve(tcp)
1743struct tcb *tcp;
1744{
1745 if (entering (tcp)) {
1746 sys_execve (tcp);
1747 tprintf (", %ld", tcp->u_arg[3]);
1748 }
1749 return 0;
1750}
1751
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001752#endif
John Hughes4e36a812001-04-18 15:11:51 +00001753
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001754int
1755internal_exec(tcp)
1756struct tcb *tcp;
1757{
1758#ifdef SUNOS4
1759 if (exiting(tcp) && !syserror(tcp) && followfork)
1760 fixvfork(tcp);
1761#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001762#if defined LINUX && defined TCB_WAITEXECVE
1763 if (exiting(tcp) && syserror(tcp))
1764 tcp->flags &= ~TCB_WAITEXECVE;
1765 else
1766 tcp->flags |= TCB_WAITEXECVE;
1767#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001768 return 0;
1769}
1770
1771#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001772#ifndef __WNOTHREAD
1773#define __WNOTHREAD 0x20000000
1774#endif
1775#ifndef __WALL
1776#define __WALL 0x40000000
1777#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001778#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001779#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001780#endif
1781#endif /* LINUX */
1782
Roland McGrathd9f816f2004-09-04 03:39:20 +00001783static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001784 { WNOHANG, "WNOHANG" },
1785#ifndef WSTOPPED
1786 { WUNTRACED, "WUNTRACED" },
1787#endif
1788#ifdef WEXITED
1789 { WEXITED, "WEXITED" },
1790#endif
1791#ifdef WTRAPPED
1792 { WTRAPPED, "WTRAPPED" },
1793#endif
1794#ifdef WSTOPPED
1795 { WSTOPPED, "WSTOPPED" },
1796#endif
1797#ifdef WCONTINUED
1798 { WCONTINUED, "WCONTINUED" },
1799#endif
1800#ifdef WNOWAIT
1801 { WNOWAIT, "WNOWAIT" },
1802#endif
1803#ifdef __WCLONE
1804 { __WCLONE, "__WCLONE" },
1805#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001806#ifdef __WALL
1807 { __WALL, "__WALL" },
1808#endif
1809#ifdef __WNOTHREAD
1810 { __WNOTHREAD, "__WNOTHREAD" },
1811#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001812 { 0, NULL },
1813};
1814
Roland McGrath5e02a572004-10-19 23:33:47 +00001815#if !defined WCOREFLAG && defined WCOREFLG
1816# define WCOREFLAG WCOREFLG
1817#endif
1818#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001819# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001820#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001821#ifndef WCOREDUMP
1822# define WCOREDUMP(status) ((status) & 0200)
1823#endif
1824
Roland McGrath5e02a572004-10-19 23:33:47 +00001825
1826#ifndef W_STOPCODE
1827#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1828#endif
1829#ifndef W_EXITCODE
1830#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1831#endif
1832
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001833static int
1834printstatus(status)
1835int status;
1836{
1837 int exited = 0;
1838
1839 /*
1840 * Here is a tricky presentation problem. This solution
1841 * is still not entirely satisfactory but since there
1842 * are no wait status constructors it will have to do.
1843 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001844 if (WIFSTOPPED(status)) {
1845 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001846 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001847 status &= ~W_STOPCODE(WSTOPSIG(status));
1848 }
1849 else if (WIFSIGNALED(status)) {
1850 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001851 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001852 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001853 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1854 }
1855 else if (WIFEXITED(status)) {
1856 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001857 WEXITSTATUS(status));
1858 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001859 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001860 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001861 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001862 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001863 return 0;
1864 }
1865
1866 if (status == 0)
1867 tprintf("]");
1868 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001869 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001870
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001871 return exited;
1872}
1873
1874static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001875printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001876{
1877 int status;
1878 int exited = 0;
1879
1880 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001881#ifdef LINUX
1882 /* On Linux, kernel-side pid_t is typedef'ed to int
1883 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001884 * pid argument to int on 64bit arches, producing,
1885 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001886 * in strace. We have to use int here, not long.
1887 */
1888 int pid = tcp->u_arg[0];
1889 tprintf("%d, ", pid);
1890#else
1891 /*
1892 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001893 */
1894 long pid = tcp->u_arg[0];
1895 if (personality_wordsize[current_personality] < sizeof pid)
1896 pid = (long) (int) pid;
1897 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001898#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001899 } else {
1900 /* status */
1901 if (!tcp->u_arg[1])
1902 tprintf("NULL");
1903 else if (syserror(tcp) || tcp->u_rval == 0)
1904 tprintf("%#lx", tcp->u_arg[1]);
1905 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1906 tprintf("[?]");
1907 else
1908 exited = printstatus(status);
1909 /* options */
1910 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001911 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001912 if (n == 4) {
1913 tprintf(", ");
1914 /* usage */
1915 if (!tcp->u_arg[3])
1916 tprintf("NULL");
1917#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001918 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001919#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001920 if (bitness)
1921 printrusage32(tcp, tcp->u_arg[3]);
1922 else
1923#endif
1924 printrusage(tcp, tcp->u_arg[3]);
1925 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001926#endif /* LINUX */
1927#ifdef SUNOS4
1928 else if (tcp->u_rval > 0 && exited)
1929 printrusage(tcp, tcp->u_arg[3]);
1930#endif /* SUNOS4 */
1931 else
1932 tprintf("%#lx", tcp->u_arg[3]);
1933 }
1934 }
1935 return 0;
1936}
1937
1938int
Roland McGrathc74c0b72004-09-01 19:39:46 +00001939internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001940struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00001941int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001942{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001943 int got_kids;
1944
1945#ifdef TCB_CLONE_THREAD
1946 if (tcp->flags & TCB_CLONE_THREAD)
1947 /* The children we wait for are our parent's children. */
1948 got_kids = (tcp->parent->nchildren
Wang Chao21b8db42010-08-27 17:43:16 +08001949 > tcp->parent->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001950 else
Wang Chao21b8db42010-08-27 17:43:16 +08001951 got_kids = (tcp->nchildren > tcp->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001952#else
1953 got_kids = tcp->nchildren > 0;
1954#endif
1955
1956 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001957 /* There are children that this parent should block for.
1958 But ptrace made us the parent of the traced children
1959 and the real parent will get ECHILD from the wait call.
1960
1961 XXX If we attached with strace -f -p PID, then there
1962 may be untraced dead children the parent could be reaping
1963 now, but we make him block. */
1964
1965 /* ??? WTA: fix bug with hanging children */
1966
Roland McGrathc74c0b72004-09-01 19:39:46 +00001967 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001968 /*
1969 * There are traced children. We'll make the parent
1970 * block to avoid a false ECHILD error due to our
1971 * ptrace having stolen the children. However,
1972 * we shouldn't block if there are zombies to reap.
1973 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1974 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001975 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001976 if (tcp->nzombies > 0 &&
1977 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001978 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001979 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001980 if (tcp->u_arg[0] > 0) {
1981 /*
1982 * If the parent waits for a specified child
1983 * PID, then it must get ECHILD right away
1984 * if that PID is not one of its children.
1985 * Make sure that the requested PID matches
1986 * one of the parent's children that we are
1987 * tracing, and don't suspend it otherwise.
1988 */
1989 if (child == NULL)
1990 child = pid2tcb(tcp->u_arg[0]);
1991 if (child == NULL || child->parent != (
1992#ifdef TCB_CLONE_THREAD
1993 (tcp->flags & TCB_CLONE_THREAD)
1994 ? tcp->parent :
1995#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00001996 tcp) ||
1997 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00001998 return 0;
1999 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002000 tcp->flags |= TCB_SUSPENDED;
2001 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002002#ifdef TCB_CLONE_THREAD
2003 if (tcp->flags & TCB_CLONE_THREAD)
2004 tcp->parent->nclone_waiting++;
2005#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002006 }
2007 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002008 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002009 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002010 /* We must force a fake result of 0 instead of
2011 the ECHILD error. */
Roland McGrathb69f81b2002-12-21 23:25:18 +00002012 return force_result(tcp, 0, 0);
2013 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002014 }
Roland McGrath09623452003-05-23 02:27:13 +00002015 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2016 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2017 /*
2018 * We just reaped a child we don't know about,
2019 * presumably a zombie we already droptcb'd.
2020 */
2021 tcp->nzombies--;
2022 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002023 return 0;
2024}
2025
2026#ifdef SVR4
2027
2028int
2029sys_wait(tcp)
2030struct tcb *tcp;
2031{
2032 if (exiting(tcp)) {
2033 /* The library wrapper stuffs this into the user variable. */
2034 if (!syserror(tcp))
2035 printstatus(getrval2(tcp));
2036 }
2037 return 0;
2038}
2039
2040#endif /* SVR4 */
2041
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002042#ifdef FREEBSD
2043int
2044sys_wait(tcp)
2045struct tcb *tcp;
2046{
2047 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002048
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002049 if (exiting(tcp)) {
2050 if (!syserror(tcp)) {
2051 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2052 tprintf("%#lx", tcp->u_arg[0]);
2053 else
2054 printstatus(status);
2055 }
2056 }
2057 return 0;
2058}
2059#endif
2060
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002061int
2062sys_waitpid(tcp)
2063struct tcb *tcp;
2064{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002065 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002066}
2067
2068int
2069sys_wait4(tcp)
2070struct tcb *tcp;
2071{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002072 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002073}
2074
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002075#ifdef ALPHA
2076int
2077sys_osf_wait4(tcp)
2078struct tcb *tcp;
2079{
2080 return printwaitn(tcp, 4, 1);
2081}
2082#endif
2083
Roland McGrathc74c0b72004-09-01 19:39:46 +00002084#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002085
Roland McGrathd9f816f2004-09-04 03:39:20 +00002086static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002087 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002088#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002089 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002090#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002091 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002092#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002093 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002094#endif
2095#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002096 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002097#endif
2098#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002099 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002100#endif
2101#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002102 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002103#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002104 { P_ALL, "P_ALL" },
2105#ifdef P_LWPID
2106 { P_LWPID, "P_LWPID" },
2107#endif
2108 { 0, NULL },
2109};
2110
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002111int
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00002112sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002113{
2114 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002115
2116 if (entering(tcp)) {
2117 printxval(waitid_types, tcp->u_arg[0], "P_???");
2118 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002119 }
2120 else {
2121 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002122 if (!tcp->u_arg[2])
2123 tprintf("NULL");
2124 else if (syserror(tcp))
2125 tprintf("%#lx", tcp->u_arg[2]);
2126 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2127 tprintf("{???}");
2128 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002129 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002130 /* options */
2131 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002132 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002133 if (tcp->u_nargs > 4) {
2134 /* usage */
2135 tprintf(", ");
2136 if (!tcp->u_arg[4])
2137 tprintf("NULL");
2138 else if (tcp->u_error)
2139 tprintf("%#lx", tcp->u_arg[4]);
2140 else
2141 printrusage(tcp, tcp->u_arg[4]);
2142 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002143 }
2144 return 0;
2145}
2146
Roland McGrathc74c0b72004-09-01 19:39:46 +00002147#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002148
2149int
2150sys_alarm(tcp)
2151struct tcb *tcp;
2152{
2153 if (entering(tcp))
2154 tprintf("%lu", tcp->u_arg[0]);
2155 return 0;
2156}
2157
2158int
2159sys_uname(tcp)
2160struct tcb *tcp;
2161{
2162 struct utsname uname;
2163
2164 if (exiting(tcp)) {
2165 if (syserror(tcp) || !verbose(tcp))
2166 tprintf("%#lx", tcp->u_arg[0]);
2167 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2168 tprintf("{...}");
2169 else if (!abbrev(tcp)) {
2170
2171 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2172 uname.sysname, uname.nodename);
2173 tprintf("release=\"%s\", version=\"%s\", ",
2174 uname.release, uname.version);
2175 tprintf("machine=\"%s\"", uname.machine);
2176#ifdef LINUX
2177#ifndef __GLIBC__
2178 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002179#endif
2180#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002181 tprintf("}");
2182 }
2183 else
2184 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2185 uname.sysname, uname.nodename);
2186 }
2187 return 0;
2188}
2189
2190#ifndef SVR4
2191
Roland McGratheb9e2e82009-06-02 16:49:22 -07002192static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002193# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002194 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2195 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2196 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2197 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2198 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2199 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2200 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2201 { PTRACE_CONT, "PTRACE_CONT" },
2202 { PTRACE_KILL, "PTRACE_KILL" },
2203 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2204 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2205 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002206# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002207 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002208# endif
2209# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002210 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002211# endif
2212# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002213 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002214# endif
2215# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002216 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002217# endif
2218# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002219 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002220# endif
2221# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002222 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002223# endif
2224# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002225 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002226# endif
2227# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002228 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002229# endif
2230# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002231 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002232# endif
2233# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002234 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002235# endif
2236# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002237 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002238# endif
2239# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002240 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002241# endif
2242# ifdef PTRACE_SET_SYSCALL
2243 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2244# endif
2245# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002246 { PTRACE_READDATA, "PTRACE_READDATA" },
2247 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2248 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2249 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2250 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2251 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002252# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002253 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2254 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002255# else /* !SPARC */
2256 { PTRACE_22, "PTRACE_22" },
2257 { PTRACE_23, "PTRACE_3" },
2258# endif /* !SPARC */
2259# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002260 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002261# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002262 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002263# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002264 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2265 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2266 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002267# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002268 { PTRACE_26, "PTRACE_26" },
2269 { PTRACE_27, "PTRACE_27" },
2270 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002271# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002272 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002273# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002274
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002275# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002276
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002277 { PT_TRACE_ME, "PT_TRACE_ME" },
2278 { PT_READ_I, "PT_READ_I" },
2279 { PT_READ_D, "PT_READ_D" },
2280 { PT_WRITE_I, "PT_WRITE_I" },
2281 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002282# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002283 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002284# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002285 { PT_CONTINUE, "PT_CONTINUE" },
2286 { PT_KILL, "PT_KILL" },
2287 { PT_STEP, "PT_STEP" },
2288 { PT_ATTACH, "PT_ATTACH" },
2289 { PT_DETACH, "PT_DETACH" },
2290 { PT_GETREGS, "PT_GETREGS" },
2291 { PT_SETREGS, "PT_SETREGS" },
2292 { PT_GETFPREGS, "PT_GETFPREGS" },
2293 { PT_SETFPREGS, "PT_SETFPREGS" },
2294 { PT_GETDBREGS, "PT_GETDBREGS" },
2295 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002296# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002297 { 0, NULL },
2298};
2299
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002300# ifndef FREEBSD
2301# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002302static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002303# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002304 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002305# endif
2306# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002307 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002308# endif
2309# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002310 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002311# endif
2312# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002313 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002314# endif
2315# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002316 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002317# endif
2318# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002319 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002320# endif
2321# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002322 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002323# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002324 { 0, NULL },
2325};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002326# endif /* PTRACE_SETOPTIONS */
2327# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002328
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002329# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002330const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002331# ifdef LINUX
2332# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002333 { PT_PSWMASK, "psw_mask" },
2334 { PT_PSWADDR, "psw_addr" },
2335 { PT_GPR0, "gpr0" },
2336 { PT_GPR1, "gpr1" },
2337 { PT_GPR2, "gpr2" },
2338 { PT_GPR3, "gpr3" },
2339 { PT_GPR4, "gpr4" },
2340 { PT_GPR5, "gpr5" },
2341 { PT_GPR6, "gpr6" },
2342 { PT_GPR7, "gpr7" },
2343 { PT_GPR8, "gpr8" },
2344 { PT_GPR9, "gpr9" },
2345 { PT_GPR10, "gpr10" },
2346 { PT_GPR11, "gpr11" },
2347 { PT_GPR12, "gpr12" },
2348 { PT_GPR13, "gpr13" },
2349 { PT_GPR14, "gpr14" },
2350 { PT_GPR15, "gpr15" },
2351 { PT_ACR0, "acr0" },
2352 { PT_ACR1, "acr1" },
2353 { PT_ACR2, "acr2" },
2354 { PT_ACR3, "acr3" },
2355 { PT_ACR4, "acr4" },
2356 { PT_ACR5, "acr5" },
2357 { PT_ACR6, "acr6" },
2358 { PT_ACR7, "acr7" },
2359 { PT_ACR8, "acr8" },
2360 { PT_ACR9, "acr9" },
2361 { PT_ACR10, "acr10" },
2362 { PT_ACR11, "acr11" },
2363 { PT_ACR12, "acr12" },
2364 { PT_ACR13, "acr13" },
2365 { PT_ACR14, "acr14" },
2366 { PT_ACR15, "acr15" },
2367 { PT_ORIGGPR2, "orig_gpr2" },
2368 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002369# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002370 { PT_FPR0_HI, "fpr0.hi" },
2371 { PT_FPR0_LO, "fpr0.lo" },
2372 { PT_FPR1_HI, "fpr1.hi" },
2373 { PT_FPR1_LO, "fpr1.lo" },
2374 { PT_FPR2_HI, "fpr2.hi" },
2375 { PT_FPR2_LO, "fpr2.lo" },
2376 { PT_FPR3_HI, "fpr3.hi" },
2377 { PT_FPR3_LO, "fpr3.lo" },
2378 { PT_FPR4_HI, "fpr4.hi" },
2379 { PT_FPR4_LO, "fpr4.lo" },
2380 { PT_FPR5_HI, "fpr5.hi" },
2381 { PT_FPR5_LO, "fpr5.lo" },
2382 { PT_FPR6_HI, "fpr6.hi" },
2383 { PT_FPR6_LO, "fpr6.lo" },
2384 { PT_FPR7_HI, "fpr7.hi" },
2385 { PT_FPR7_LO, "fpr7.lo" },
2386 { PT_FPR8_HI, "fpr8.hi" },
2387 { PT_FPR8_LO, "fpr8.lo" },
2388 { PT_FPR9_HI, "fpr9.hi" },
2389 { PT_FPR9_LO, "fpr9.lo" },
2390 { PT_FPR10_HI, "fpr10.hi" },
2391 { PT_FPR10_LO, "fpr10.lo" },
2392 { PT_FPR11_HI, "fpr11.hi" },
2393 { PT_FPR11_LO, "fpr11.lo" },
2394 { PT_FPR12_HI, "fpr12.hi" },
2395 { PT_FPR12_LO, "fpr12.lo" },
2396 { PT_FPR13_HI, "fpr13.hi" },
2397 { PT_FPR13_LO, "fpr13.lo" },
2398 { PT_FPR14_HI, "fpr14.hi" },
2399 { PT_FPR14_LO, "fpr14.lo" },
2400 { PT_FPR15_HI, "fpr15.hi" },
2401 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002402# endif
2403# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002404 { PT_FPR0, "fpr0" },
2405 { PT_FPR1, "fpr1" },
2406 { PT_FPR2, "fpr2" },
2407 { PT_FPR3, "fpr3" },
2408 { PT_FPR4, "fpr4" },
2409 { PT_FPR5, "fpr5" },
2410 { PT_FPR6, "fpr6" },
2411 { PT_FPR7, "fpr7" },
2412 { PT_FPR8, "fpr8" },
2413 { PT_FPR9, "fpr9" },
2414 { PT_FPR10, "fpr10" },
2415 { PT_FPR11, "fpr11" },
2416 { PT_FPR12, "fpr12" },
2417 { PT_FPR13, "fpr13" },
2418 { PT_FPR14, "fpr14" },
2419 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002420# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002421 { PT_CR_9, "cr9" },
2422 { PT_CR_10, "cr10" },
2423 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002424 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002425# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002426 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002427# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002428 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002429# elif defined(POWERPC)
2430# ifndef PT_ORIG_R3
2431# define PT_ORIG_R3 34
2432# endif
2433# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002434 { REGSIZE*PT_R0, "r0" },
2435 { REGSIZE*PT_R1, "r1" },
2436 { REGSIZE*PT_R2, "r2" },
2437 { REGSIZE*PT_R3, "r3" },
2438 { REGSIZE*PT_R4, "r4" },
2439 { REGSIZE*PT_R5, "r5" },
2440 { REGSIZE*PT_R6, "r6" },
2441 { REGSIZE*PT_R7, "r7" },
2442 { REGSIZE*PT_R8, "r8" },
2443 { REGSIZE*PT_R9, "r9" },
2444 { REGSIZE*PT_R10, "r10" },
2445 { REGSIZE*PT_R11, "r11" },
2446 { REGSIZE*PT_R12, "r12" },
2447 { REGSIZE*PT_R13, "r13" },
2448 { REGSIZE*PT_R14, "r14" },
2449 { REGSIZE*PT_R15, "r15" },
2450 { REGSIZE*PT_R16, "r16" },
2451 { REGSIZE*PT_R17, "r17" },
2452 { REGSIZE*PT_R18, "r18" },
2453 { REGSIZE*PT_R19, "r19" },
2454 { REGSIZE*PT_R20, "r20" },
2455 { REGSIZE*PT_R21, "r21" },
2456 { REGSIZE*PT_R22, "r22" },
2457 { REGSIZE*PT_R23, "r23" },
2458 { REGSIZE*PT_R24, "r24" },
2459 { REGSIZE*PT_R25, "r25" },
2460 { REGSIZE*PT_R26, "r26" },
2461 { REGSIZE*PT_R27, "r27" },
2462 { REGSIZE*PT_R28, "r28" },
2463 { REGSIZE*PT_R29, "r29" },
2464 { REGSIZE*PT_R30, "r30" },
2465 { REGSIZE*PT_R31, "r31" },
2466 { REGSIZE*PT_NIP, "NIP" },
2467 { REGSIZE*PT_MSR, "MSR" },
2468 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2469 { REGSIZE*PT_CTR, "CTR" },
2470 { REGSIZE*PT_LNK, "LNK" },
2471 { REGSIZE*PT_XER, "XER" },
2472 { REGSIZE*PT_CCR, "CCR" },
2473 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002474# undef REGSIZE
2475# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002476 { 0, "r0" },
2477 { 1, "r1" },
2478 { 2, "r2" },
2479 { 3, "r3" },
2480 { 4, "r4" },
2481 { 5, "r5" },
2482 { 6, "r6" },
2483 { 7, "r7" },
2484 { 8, "r8" },
2485 { 9, "r9" },
2486 { 10, "r10" },
2487 { 11, "r11" },
2488 { 12, "r12" },
2489 { 13, "r13" },
2490 { 14, "r14" },
2491 { 15, "r15" },
2492 { 16, "r16" },
2493 { 17, "r17" },
2494 { 18, "r18" },
2495 { 19, "r19" },
2496 { 20, "r20" },
2497 { 21, "r21" },
2498 { 22, "r22" },
2499 { 23, "r23" },
2500 { 24, "r24" },
2501 { 25, "r25" },
2502 { 26, "r26" },
2503 { 27, "r27" },
2504 { 28, "r28" },
2505 { 29, "gp" },
2506 { 30, "fp" },
2507 { 31, "zero" },
2508 { 32, "fp0" },
2509 { 33, "fp" },
2510 { 34, "fp2" },
2511 { 35, "fp3" },
2512 { 36, "fp4" },
2513 { 37, "fp5" },
2514 { 38, "fp6" },
2515 { 39, "fp7" },
2516 { 40, "fp8" },
2517 { 41, "fp9" },
2518 { 42, "fp10" },
2519 { 43, "fp11" },
2520 { 44, "fp12" },
2521 { 45, "fp13" },
2522 { 46, "fp14" },
2523 { 47, "fp15" },
2524 { 48, "fp16" },
2525 { 49, "fp17" },
2526 { 50, "fp18" },
2527 { 51, "fp19" },
2528 { 52, "fp20" },
2529 { 53, "fp21" },
2530 { 54, "fp22" },
2531 { 55, "fp23" },
2532 { 56, "fp24" },
2533 { 57, "fp25" },
2534 { 58, "fp26" },
2535 { 59, "fp27" },
2536 { 60, "fp28" },
2537 { 61, "fp29" },
2538 { 62, "fp30" },
2539 { 63, "fp31" },
2540 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002541# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002542 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2543 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2544 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2545 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2546 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2547 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2548 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2549 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2550 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2551 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2552 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2553 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2554 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2555 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2556 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2557 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2558 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2559 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2560 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2561 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2562 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2563 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2564 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2565 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2566 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2567 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2568 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2569 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2570 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2571 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2572 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2573 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2574 /* switch stack: */
2575 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2576 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2577 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2578 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2579 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2580 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2581 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2582 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2583 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2584 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002585 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2586 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002587 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002588 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002589 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2590 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002591 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2592 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2593 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2594 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2595 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2596 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2597 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2598 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2599 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2600 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2601 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2602 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2603 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2604 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2605 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002606# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002607 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002608# endif
2609# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002610 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002611# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002612 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002613# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002614 { 4*EBX, "4*EBX" },
2615 { 4*ECX, "4*ECX" },
2616 { 4*EDX, "4*EDX" },
2617 { 4*ESI, "4*ESI" },
2618 { 4*EDI, "4*EDI" },
2619 { 4*EBP, "4*EBP" },
2620 { 4*EAX, "4*EAX" },
2621 { 4*DS, "4*DS" },
2622 { 4*ES, "4*ES" },
2623 { 4*FS, "4*FS" },
2624 { 4*GS, "4*GS" },
2625 { 4*ORIG_EAX, "4*ORIG_EAX" },
2626 { 4*EIP, "4*EIP" },
2627 { 4*CS, "4*CS" },
2628 { 4*EFL, "4*EFL" },
2629 { 4*UESP, "4*UESP" },
2630 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002631# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002632 { 8*R15, "8*R15" },
2633 { 8*R14, "8*R14" },
2634 { 8*R13, "8*R13" },
2635 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002636 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002637 { 8*RBX, "8*RBX" },
2638 { 8*R11, "8*R11" },
2639 { 8*R10, "8*R10" },
2640 { 8*R9, "8*R9" },
2641 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002642 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002643 { 8*RCX, "8*RCX" },
2644 { 8*RDX, "8*RDX" },
2645 { 8*RSI, "8*RSI" },
2646 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002647 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002648 { 8*RIP, "8*RIP" },
2649 { 8*CS, "8*CS" },
2650 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002651 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002652 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002653# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002654 { 4*PT_D1, "4*PT_D1" },
2655 { 4*PT_D2, "4*PT_D2" },
2656 { 4*PT_D3, "4*PT_D3" },
2657 { 4*PT_D4, "4*PT_D4" },
2658 { 4*PT_D5, "4*PT_D5" },
2659 { 4*PT_D6, "4*PT_D6" },
2660 { 4*PT_D7, "4*PT_D7" },
2661 { 4*PT_A0, "4*PT_A0" },
2662 { 4*PT_A1, "4*PT_A1" },
2663 { 4*PT_A2, "4*PT_A2" },
2664 { 4*PT_A3, "4*PT_A3" },
2665 { 4*PT_A4, "4*PT_A4" },
2666 { 4*PT_A5, "4*PT_A5" },
2667 { 4*PT_A6, "4*PT_A6" },
2668 { 4*PT_D0, "4*PT_D0" },
2669 { 4*PT_USP, "4*PT_USP" },
2670 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2671 { 4*PT_SR, "4*PT_SR" },
2672 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002673# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002674 { 4*REG_REG0, "4*REG_REG0" },
2675 { 4*(REG_REG0+1), "4*REG_REG1" },
2676 { 4*(REG_REG0+2), "4*REG_REG2" },
2677 { 4*(REG_REG0+3), "4*REG_REG3" },
2678 { 4*(REG_REG0+4), "4*REG_REG4" },
2679 { 4*(REG_REG0+5), "4*REG_REG5" },
2680 { 4*(REG_REG0+6), "4*REG_REG6" },
2681 { 4*(REG_REG0+7), "4*REG_REG7" },
2682 { 4*(REG_REG0+8), "4*REG_REG8" },
2683 { 4*(REG_REG0+9), "4*REG_REG9" },
2684 { 4*(REG_REG0+10), "4*REG_REG10" },
2685 { 4*(REG_REG0+11), "4*REG_REG11" },
2686 { 4*(REG_REG0+12), "4*REG_REG12" },
2687 { 4*(REG_REG0+13), "4*REG_REG13" },
2688 { 4*(REG_REG0+14), "4*REG_REG14" },
2689 { 4*REG_REG15, "4*REG_REG15" },
2690 { 4*REG_PC, "4*REG_PC" },
2691 { 4*REG_PR, "4*REG_PR" },
2692 { 4*REG_SR, "4*REG_SR" },
2693 { 4*REG_GBR, "4*REG_GBR" },
2694 { 4*REG_MACH, "4*REG_MACH" },
2695 { 4*REG_MACL, "4*REG_MACL" },
2696 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2697 { 4*REG_FPUL, "4*REG_FPUL" },
2698 { 4*REG_FPREG0, "4*REG_FPREG0" },
2699 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2700 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2701 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2702 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2703 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2704 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2705 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2706 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2707 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2708 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2709 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2710 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2711 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2712 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2713 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002714# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002715 { 4*REG_XDREG0, "4*REG_XDREG0" },
2716 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2717 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2718 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2719 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2720 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2721 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2722 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002723# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002724 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002725# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002726 { 0, "PC(L)" },
2727 { 4, "PC(U)" },
2728 { 8, "SR(L)" },
2729 { 12, "SR(U)" },
2730 { 16, "syscall no.(L)" },
2731 { 20, "syscall_no.(U)" },
2732 { 24, "R0(L)" },
2733 { 28, "R0(U)" },
2734 { 32, "R1(L)" },
2735 { 36, "R1(U)" },
2736 { 40, "R2(L)" },
2737 { 44, "R2(U)" },
2738 { 48, "R3(L)" },
2739 { 52, "R3(U)" },
2740 { 56, "R4(L)" },
2741 { 60, "R4(U)" },
2742 { 64, "R5(L)" },
2743 { 68, "R5(U)" },
2744 { 72, "R6(L)" },
2745 { 76, "R6(U)" },
2746 { 80, "R7(L)" },
2747 { 84, "R7(U)" },
2748 { 88, "R8(L)" },
2749 { 92, "R8(U)" },
2750 { 96, "R9(L)" },
2751 { 100, "R9(U)" },
2752 { 104, "R10(L)" },
2753 { 108, "R10(U)" },
2754 { 112, "R11(L)" },
2755 { 116, "R11(U)" },
2756 { 120, "R12(L)" },
2757 { 124, "R12(U)" },
2758 { 128, "R13(L)" },
2759 { 132, "R13(U)" },
2760 { 136, "R14(L)" },
2761 { 140, "R14(U)" },
2762 { 144, "R15(L)" },
2763 { 148, "R15(U)" },
2764 { 152, "R16(L)" },
2765 { 156, "R16(U)" },
2766 { 160, "R17(L)" },
2767 { 164, "R17(U)" },
2768 { 168, "R18(L)" },
2769 { 172, "R18(U)" },
2770 { 176, "R19(L)" },
2771 { 180, "R19(U)" },
2772 { 184, "R20(L)" },
2773 { 188, "R20(U)" },
2774 { 192, "R21(L)" },
2775 { 196, "R21(U)" },
2776 { 200, "R22(L)" },
2777 { 204, "R22(U)" },
2778 { 208, "R23(L)" },
2779 { 212, "R23(U)" },
2780 { 216, "R24(L)" },
2781 { 220, "R24(U)" },
2782 { 224, "R25(L)" },
2783 { 228, "R25(U)" },
2784 { 232, "R26(L)" },
2785 { 236, "R26(U)" },
2786 { 240, "R27(L)" },
2787 { 244, "R27(U)" },
2788 { 248, "R28(L)" },
2789 { 252, "R28(U)" },
2790 { 256, "R29(L)" },
2791 { 260, "R29(U)" },
2792 { 264, "R30(L)" },
2793 { 268, "R30(U)" },
2794 { 272, "R31(L)" },
2795 { 276, "R31(U)" },
2796 { 280, "R32(L)" },
2797 { 284, "R32(U)" },
2798 { 288, "R33(L)" },
2799 { 292, "R33(U)" },
2800 { 296, "R34(L)" },
2801 { 300, "R34(U)" },
2802 { 304, "R35(L)" },
2803 { 308, "R35(U)" },
2804 { 312, "R36(L)" },
2805 { 316, "R36(U)" },
2806 { 320, "R37(L)" },
2807 { 324, "R37(U)" },
2808 { 328, "R38(L)" },
2809 { 332, "R38(U)" },
2810 { 336, "R39(L)" },
2811 { 340, "R39(U)" },
2812 { 344, "R40(L)" },
2813 { 348, "R40(U)" },
2814 { 352, "R41(L)" },
2815 { 356, "R41(U)" },
2816 { 360, "R42(L)" },
2817 { 364, "R42(U)" },
2818 { 368, "R43(L)" },
2819 { 372, "R43(U)" },
2820 { 376, "R44(L)" },
2821 { 380, "R44(U)" },
2822 { 384, "R45(L)" },
2823 { 388, "R45(U)" },
2824 { 392, "R46(L)" },
2825 { 396, "R46(U)" },
2826 { 400, "R47(L)" },
2827 { 404, "R47(U)" },
2828 { 408, "R48(L)" },
2829 { 412, "R48(U)" },
2830 { 416, "R49(L)" },
2831 { 420, "R49(U)" },
2832 { 424, "R50(L)" },
2833 { 428, "R50(U)" },
2834 { 432, "R51(L)" },
2835 { 436, "R51(U)" },
2836 { 440, "R52(L)" },
2837 { 444, "R52(U)" },
2838 { 448, "R53(L)" },
2839 { 452, "R53(U)" },
2840 { 456, "R54(L)" },
2841 { 460, "R54(U)" },
2842 { 464, "R55(L)" },
2843 { 468, "R55(U)" },
2844 { 472, "R56(L)" },
2845 { 476, "R56(U)" },
2846 { 480, "R57(L)" },
2847 { 484, "R57(U)" },
2848 { 488, "R58(L)" },
2849 { 492, "R58(U)" },
2850 { 496, "R59(L)" },
2851 { 500, "R59(U)" },
2852 { 504, "R60(L)" },
2853 { 508, "R60(U)" },
2854 { 512, "R61(L)" },
2855 { 516, "R61(U)" },
2856 { 520, "R62(L)" },
2857 { 524, "R62(U)" },
2858 { 528, "TR0(L)" },
2859 { 532, "TR0(U)" },
2860 { 536, "TR1(L)" },
2861 { 540, "TR1(U)" },
2862 { 544, "TR2(L)" },
2863 { 548, "TR2(U)" },
2864 { 552, "TR3(L)" },
2865 { 556, "TR3(U)" },
2866 { 560, "TR4(L)" },
2867 { 564, "TR4(U)" },
2868 { 568, "TR5(L)" },
2869 { 572, "TR5(U)" },
2870 { 576, "TR6(L)" },
2871 { 580, "TR6(U)" },
2872 { 584, "TR7(L)" },
2873 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002874 /* This entry is in case pt_regs contains dregs (depends on
2875 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002876 { uoff(regs), "offsetof(struct user, regs)" },
2877 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002878# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002879 { uoff(regs.ARM_r0), "r0" },
2880 { uoff(regs.ARM_r1), "r1" },
2881 { uoff(regs.ARM_r2), "r2" },
2882 { uoff(regs.ARM_r3), "r3" },
2883 { uoff(regs.ARM_r4), "r4" },
2884 { uoff(regs.ARM_r5), "r5" },
2885 { uoff(regs.ARM_r6), "r6" },
2886 { uoff(regs.ARM_r7), "r7" },
2887 { uoff(regs.ARM_r8), "r8" },
2888 { uoff(regs.ARM_r9), "r9" },
2889 { uoff(regs.ARM_r10), "r10" },
2890 { uoff(regs.ARM_fp), "fp" },
2891 { uoff(regs.ARM_ip), "ip" },
2892 { uoff(regs.ARM_sp), "sp" },
2893 { uoff(regs.ARM_lr), "lr" },
2894 { uoff(regs.ARM_pc), "pc" },
2895 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002896# elif defined(AVR32)
2897 { uoff(regs.sr), "sr" },
2898 { uoff(regs.pc), "pc" },
2899 { uoff(regs.lr), "lr" },
2900 { uoff(regs.sp), "sp" },
2901 { uoff(regs.r12), "r12" },
2902 { uoff(regs.r11), "r11" },
2903 { uoff(regs.r10), "r10" },
2904 { uoff(regs.r9), "r9" },
2905 { uoff(regs.r8), "r8" },
2906 { uoff(regs.r7), "r7" },
2907 { uoff(regs.r6), "r6" },
2908 { uoff(regs.r5), "r5" },
2909 { uoff(regs.r4), "r4" },
2910 { uoff(regs.r3), "r3" },
2911 { uoff(regs.r2), "r2" },
2912 { uoff(regs.r1), "r1" },
2913 { uoff(regs.r0), "r0" },
2914 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002915# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002916 { 0, "r0" },
2917 { 1, "r1" },
2918 { 2, "r2" },
2919 { 3, "r3" },
2920 { 4, "r4" },
2921 { 5, "r5" },
2922 { 6, "r6" },
2923 { 7, "r7" },
2924 { 8, "r8" },
2925 { 9, "r9" },
2926 { 10, "r10" },
2927 { 11, "r11" },
2928 { 12, "r12" },
2929 { 13, "r13" },
2930 { 14, "r14" },
2931 { 15, "r15" },
2932 { 16, "r16" },
2933 { 17, "r17" },
2934 { 18, "r18" },
2935 { 19, "r19" },
2936 { 20, "r20" },
2937 { 21, "r21" },
2938 { 22, "r22" },
2939 { 23, "r23" },
2940 { 24, "r24" },
2941 { 25, "r25" },
2942 { 26, "r26" },
2943 { 27, "r27" },
2944 { 28, "r28" },
2945 { 29, "r29" },
2946 { 30, "r30" },
2947 { 31, "r31" },
2948 { 32, "f0" },
2949 { 33, "f1" },
2950 { 34, "f2" },
2951 { 35, "f3" },
2952 { 36, "f4" },
2953 { 37, "f5" },
2954 { 38, "f6" },
2955 { 39, "f7" },
2956 { 40, "f8" },
2957 { 41, "f9" },
2958 { 42, "f10" },
2959 { 43, "f11" },
2960 { 44, "f12" },
2961 { 45, "f13" },
2962 { 46, "f14" },
2963 { 47, "f15" },
2964 { 48, "f16" },
2965 { 49, "f17" },
2966 { 50, "f18" },
2967 { 51, "f19" },
2968 { 52, "f20" },
2969 { 53, "f21" },
2970 { 54, "f22" },
2971 { 55, "f23" },
2972 { 56, "f24" },
2973 { 57, "f25" },
2974 { 58, "f26" },
2975 { 59, "f27" },
2976 { 60, "f28" },
2977 { 61, "f29" },
2978 { 62, "f30" },
2979 { 63, "f31" },
2980 { 64, "pc" },
2981 { 65, "cause" },
2982 { 66, "badvaddr" },
2983 { 67, "mmhi" },
2984 { 68, "mmlo" },
2985 { 69, "fpcsr" },
2986 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002987# elif defined(TILE)
2988 { PTREGS_OFFSET_REG(0), "r0" },
2989 { PTREGS_OFFSET_REG(1), "r1" },
2990 { PTREGS_OFFSET_REG(2), "r2" },
2991 { PTREGS_OFFSET_REG(3), "r3" },
2992 { PTREGS_OFFSET_REG(4), "r4" },
2993 { PTREGS_OFFSET_REG(5), "r5" },
2994 { PTREGS_OFFSET_REG(6), "r6" },
2995 { PTREGS_OFFSET_REG(7), "r7" },
2996 { PTREGS_OFFSET_REG(8), "r8" },
2997 { PTREGS_OFFSET_REG(9), "r9" },
2998 { PTREGS_OFFSET_REG(10), "r10" },
2999 { PTREGS_OFFSET_REG(11), "r11" },
3000 { PTREGS_OFFSET_REG(12), "r12" },
3001 { PTREGS_OFFSET_REG(13), "r13" },
3002 { PTREGS_OFFSET_REG(14), "r14" },
3003 { PTREGS_OFFSET_REG(15), "r15" },
3004 { PTREGS_OFFSET_REG(16), "r16" },
3005 { PTREGS_OFFSET_REG(17), "r17" },
3006 { PTREGS_OFFSET_REG(18), "r18" },
3007 { PTREGS_OFFSET_REG(19), "r19" },
3008 { PTREGS_OFFSET_REG(20), "r20" },
3009 { PTREGS_OFFSET_REG(21), "r21" },
3010 { PTREGS_OFFSET_REG(22), "r22" },
3011 { PTREGS_OFFSET_REG(23), "r23" },
3012 { PTREGS_OFFSET_REG(24), "r24" },
3013 { PTREGS_OFFSET_REG(25), "r25" },
3014 { PTREGS_OFFSET_REG(26), "r26" },
3015 { PTREGS_OFFSET_REG(27), "r27" },
3016 { PTREGS_OFFSET_REG(28), "r28" },
3017 { PTREGS_OFFSET_REG(29), "r29" },
3018 { PTREGS_OFFSET_REG(30), "r30" },
3019 { PTREGS_OFFSET_REG(31), "r31" },
3020 { PTREGS_OFFSET_REG(32), "r32" },
3021 { PTREGS_OFFSET_REG(33), "r33" },
3022 { PTREGS_OFFSET_REG(34), "r34" },
3023 { PTREGS_OFFSET_REG(35), "r35" },
3024 { PTREGS_OFFSET_REG(36), "r36" },
3025 { PTREGS_OFFSET_REG(37), "r37" },
3026 { PTREGS_OFFSET_REG(38), "r38" },
3027 { PTREGS_OFFSET_REG(39), "r39" },
3028 { PTREGS_OFFSET_REG(40), "r40" },
3029 { PTREGS_OFFSET_REG(41), "r41" },
3030 { PTREGS_OFFSET_REG(42), "r42" },
3031 { PTREGS_OFFSET_REG(43), "r43" },
3032 { PTREGS_OFFSET_REG(44), "r44" },
3033 { PTREGS_OFFSET_REG(45), "r45" },
3034 { PTREGS_OFFSET_REG(46), "r46" },
3035 { PTREGS_OFFSET_REG(47), "r47" },
3036 { PTREGS_OFFSET_REG(48), "r48" },
3037 { PTREGS_OFFSET_REG(49), "r49" },
3038 { PTREGS_OFFSET_REG(50), "r50" },
3039 { PTREGS_OFFSET_REG(51), "r51" },
3040 { PTREGS_OFFSET_REG(52), "r52" },
3041 { PTREGS_OFFSET_TP, "tp" },
3042 { PTREGS_OFFSET_SP, "sp" },
3043 { PTREGS_OFFSET_LR, "lr" },
3044 { PTREGS_OFFSET_PC, "pc" },
3045 { PTREGS_OFFSET_EX1, "ex1" },
3046 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
3047 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
3048 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003049# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003050# ifdef CRISV10
3051 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3052 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3053 { 4*PT_R13, "4*PT_R13" },
3054 { 4*PT_R12, "4*PT_R12" },
3055 { 4*PT_R11, "4*PT_R11" },
3056 { 4*PT_R10, "4*PT_R10" },
3057 { 4*PT_R9, "4*PT_R9" },
3058 { 4*PT_R8, "4*PT_R8" },
3059 { 4*PT_R7, "4*PT_R7" },
3060 { 4*PT_R6, "4*PT_R6" },
3061 { 4*PT_R5, "4*PT_R5" },
3062 { 4*PT_R4, "4*PT_R4" },
3063 { 4*PT_R3, "4*PT_R3" },
3064 { 4*PT_R2, "4*PT_R2" },
3065 { 4*PT_R1, "4*PT_R1" },
3066 { 4*PT_R0, "4*PT_R0" },
3067 { 4*PT_MOF, "4*PT_MOF" },
3068 { 4*PT_DCCR, "4*PT_DCCR" },
3069 { 4*PT_SRP, "4*PT_SRP" },
3070 { 4*PT_IRP, "4*PT_IRP" },
3071 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3072 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3073 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3074 { 4*PT_USP, "4*PT_USP" },
3075# endif
3076# ifdef CRISV32
3077 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3078 { 4*PT_R0, "4*PT_R0" },
3079 { 4*PT_R1, "4*PT_R1" },
3080 { 4*PT_R2, "4*PT_R2" },
3081 { 4*PT_R3, "4*PT_R3" },
3082 { 4*PT_R4, "4*PT_R4" },
3083 { 4*PT_R5, "4*PT_R5" },
3084 { 4*PT_R6, "4*PT_R6" },
3085 { 4*PT_R7, "4*PT_R7" },
3086 { 4*PT_R8, "4*PT_R8" },
3087 { 4*PT_R9, "4*PT_R9" },
3088 { 4*PT_R10, "4*PT_R10" },
3089 { 4*PT_R11, "4*PT_R11" },
3090 { 4*PT_R12, "4*PT_R12" },
3091 { 4*PT_R13, "4*PT_R13" },
3092 { 4*PT_ACR, "4*PT_ACR" },
3093 { 4*PT_SRS, "4*PT_SRS" },
3094 { 4*PT_MOF, "4*PT_MOF" },
3095 { 4*PT_SPC, "4*PT_SPC" },
3096 { 4*PT_CCS, "4*PT_CCS" },
3097 { 4*PT_SRP, "4*PT_SRP" },
3098 { 4*PT_ERP, "4*PT_ERP" },
3099 { 4*PT_EXS, "4*PT_EXS" },
3100 { 4*PT_EDA, "4*PT_EDA" },
3101 { 4*PT_USP, "4*PT_USP" },
3102 { 4*PT_PPC, "4*PT_PPC" },
3103 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3104 { 4*PT_BP+4, "4*PT_BP+4" },
3105 { 4*PT_BP+8, "4*PT_BP+8" },
3106 { 4*PT_BP+12, "4*PT_BP+12" },
3107 { 4*PT_BP+16, "4*PT_BP+16" },
3108 { 4*PT_BP+20, "4*PT_BP+20" },
3109 { 4*PT_BP+24, "4*PT_BP+24" },
3110 { 4*PT_BP+28, "4*PT_BP+28" },
3111 { 4*PT_BP+32, "4*PT_BP+32" },
3112 { 4*PT_BP+36, "4*PT_BP+36" },
3113 { 4*PT_BP+40, "4*PT_BP+40" },
3114 { 4*PT_BP+44, "4*PT_BP+44" },
3115 { 4*PT_BP+48, "4*PT_BP+48" },
3116 { 4*PT_BP+52, "4*PT_BP+52" },
3117 { 4*PT_BP+56, "4*PT_BP+56" },
3118# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003119# ifdef MICROBLAZE
3120 { PT_GPR(0), "r0" },
3121 { PT_GPR(1), "r1" },
3122 { PT_GPR(2), "r2" },
3123 { PT_GPR(3), "r3" },
3124 { PT_GPR(4), "r4" },
3125 { PT_GPR(5), "r5" },
3126 { PT_GPR(6), "r6" },
3127 { PT_GPR(7), "r7" },
3128 { PT_GPR(8), "r8" },
3129 { PT_GPR(9), "r9" },
3130 { PT_GPR(10), "r10" },
3131 { PT_GPR(11), "r11" },
3132 { PT_GPR(12), "r12" },
3133 { PT_GPR(13), "r13" },
3134 { PT_GPR(14), "r14" },
3135 { PT_GPR(15), "r15" },
3136 { PT_GPR(16), "r16" },
3137 { PT_GPR(17), "r17" },
3138 { PT_GPR(18), "r18" },
3139 { PT_GPR(19), "r19" },
3140 { PT_GPR(20), "r20" },
3141 { PT_GPR(21), "r21" },
3142 { PT_GPR(22), "r22" },
3143 { PT_GPR(23), "r23" },
3144 { PT_GPR(24), "r24" },
3145 { PT_GPR(25), "r25" },
3146 { PT_GPR(26), "r26" },
3147 { PT_GPR(27), "r27" },
3148 { PT_GPR(28), "r28" },
3149 { PT_GPR(29), "r29" },
3150 { PT_GPR(30), "r30" },
3151 { PT_GPR(31), "r31" },
3152 { PT_PC, "rpc", },
3153 { PT_MSR, "rmsr", },
3154 { PT_EAR, "rear", },
3155 { PT_ESR, "resr", },
3156 { PT_FSR, "rfsr", },
3157 { PT_KERNEL_MODE, "kernel_mode", },
3158# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003159
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003160# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3161 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003162 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003163# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003164 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003165# endif
3166# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003167 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003168# endif
3169# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003170 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003171# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003172 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3173 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3174 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003175# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003176 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003177# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003178# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003179 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003180# endif
3181# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003182 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003183# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003184 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003185# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003186 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003187# endif
3188# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003189 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003190# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003191# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003192 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003193# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003194 { uoff(magic), "offsetof(struct user, magic)" },
3195 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003196# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003197 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003198# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003199# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003200
3201# endif /* LINUX */
3202
3203# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003204 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3205 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3206 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3207 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3208 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3209 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3210 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3211 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3212 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3213 { uoff(u_error), "offsetof(struct user, u_error)" },
3214 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3215 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3216 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3217 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3218 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3219 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3220 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3221 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3222 { uoff(u_code), "offsetof(struct user, u_code)" },
3223 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3224 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3225 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3226 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3227 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3228 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3229 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3230 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3231 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3232 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3233 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3234 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3235 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3236 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3237 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3238 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3239 { uoff(u_start), "offsetof(struct user, u_start)" },
3240 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3241 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3242 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3243 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3244 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3245 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3246 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3247 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3248 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003249# endif /* SUNOS4 */
3250# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003251 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003252# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003253 { 0, NULL },
3254};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003255# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003256
3257int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003258sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003259{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003260 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003261 long addr;
3262
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003263 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003264 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003265# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003266 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003267# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003268 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003269# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003270 );
3271 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003272 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003273# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003274 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3275 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3276 for (x = struct_user_offsets; x->str; x++) {
3277 if (x->val >= addr)
3278 break;
3279 }
3280 if (!x->str)
3281 tprintf("%#lx, ", addr);
3282 else if (x->val > addr && x != struct_user_offsets) {
3283 x--;
3284 tprintf("%s + %ld, ", x->str, addr - x->val);
3285 }
3286 else
3287 tprintf("%s, ", x->str);
3288 }
3289 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003290# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003291 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003292# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003293 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003294# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003295 case PTRACE_PEEKDATA:
3296 case PTRACE_PEEKTEXT:
3297 case PTRACE_PEEKUSER:
3298 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003299# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003300 case PTRACE_CONT:
3301 case PTRACE_SINGLESTEP:
3302 case PTRACE_SYSCALL:
3303 case PTRACE_DETACH:
3304 printsignal(tcp->u_arg[3]);
3305 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003306# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003307 case PTRACE_SETOPTIONS:
3308 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3309 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003310# endif
3311# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003312 case PTRACE_SETSIGINFO: {
3313 siginfo_t si;
3314 if (!tcp->u_arg[3])
3315 tprintf("NULL");
3316 else if (syserror(tcp))
3317 tprintf("%#lx", tcp->u_arg[3]);
3318 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3319 tprintf("{???}");
3320 else
3321 printsiginfo(&si, verbose(tcp));
3322 break;
3323 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003324# endif
3325# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003326 case PTRACE_GETSIGINFO:
3327 /* Don't print anything, do it at syscall return. */
3328 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003329# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003330 default:
3331 tprintf("%#lx", tcp->u_arg[3]);
3332 break;
3333 }
3334 } else {
3335 switch (tcp->u_arg[0]) {
3336 case PTRACE_PEEKDATA:
3337 case PTRACE_PEEKTEXT:
3338 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003339# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003340 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003341# else
Roland McGratheb285352003-01-14 09:59:00 +00003342 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003343 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003344# endif
3345# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003346 case PTRACE_GETSIGINFO: {
3347 siginfo_t si;
3348 if (!tcp->u_arg[3])
3349 tprintf("NULL");
3350 else if (syserror(tcp))
3351 tprintf("%#lx", tcp->u_arg[3]);
3352 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3353 tprintf("{???}");
3354 else
3355 printsiginfo(&si, verbose(tcp));
3356 break;
3357 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003358# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003359 }
3360 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003361# endif /* LINUX */
3362# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003363 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3364 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3365 tprintf("%lu, ", tcp->u_arg[3]);
3366 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3367 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3368 tcp->u_arg[0] != PTRACE_READTEXT) {
3369 tprintf("%#lx", tcp->u_arg[3]);
3370 }
3371 } else {
3372 if (tcp->u_arg[0] == PTRACE_READDATA ||
3373 tcp->u_arg[0] == PTRACE_READTEXT) {
3374 tprintf("%lu, ", tcp->u_arg[3]);
3375 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3376 }
3377 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003378# endif /* SUNOS4 */
3379# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003380 tprintf("%lu", tcp->u_arg[3]);
3381 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003382# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003383 return 0;
3384}
3385
3386#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003387
3388#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003389# ifndef FUTEX_CMP_REQUEUE
3390# define FUTEX_CMP_REQUEUE 4
3391# endif
3392# ifndef FUTEX_WAKE_OP
3393# define FUTEX_WAKE_OP 5
3394# endif
3395# ifndef FUTEX_LOCK_PI
3396# define FUTEX_LOCK_PI 6
3397# define FUTEX_UNLOCK_PI 7
3398# define FUTEX_TRYLOCK_PI 8
3399# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003400# ifndef FUTEX_WAIT_BITSET
3401# define FUTEX_WAIT_BITSET 9
3402# endif
3403# ifndef FUTEX_WAKE_BITSET
3404# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003405# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003406# ifndef FUTEX_WAIT_REQUEUE_PI
3407# define FUTEX_WAIT_REQUEUE_PI 11
3408# endif
3409# ifndef FUTEX_CMP_REQUEUE_PI
3410# define FUTEX_CMP_REQUEUE_PI 12
3411# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003412# ifndef FUTEX_PRIVATE_FLAG
3413# define FUTEX_PRIVATE_FLAG 128
3414# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003415# ifndef FUTEX_CLOCK_REALTIME
3416# define FUTEX_CLOCK_REALTIME 256
3417# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003418static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003419 { FUTEX_WAIT, "FUTEX_WAIT" },
3420 { FUTEX_WAKE, "FUTEX_WAKE" },
3421 { FUTEX_FD, "FUTEX_FD" },
3422 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3423 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3424 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3425 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3426 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3427 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003428 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3429 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003430 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3431 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003432 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3433 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3434 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3435 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3436 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3437 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3438 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3439 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3440 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003441 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3442 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003443 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3444 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3445 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3446 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3447 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3448 { 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 +00003449 { 0, NULL }
3450};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003451# ifndef FUTEX_OP_SET
3452# define FUTEX_OP_SET 0
3453# define FUTEX_OP_ADD 1
3454# define FUTEX_OP_OR 2
3455# define FUTEX_OP_ANDN 3
3456# define FUTEX_OP_XOR 4
3457# define FUTEX_OP_CMP_EQ 0
3458# define FUTEX_OP_CMP_NE 1
3459# define FUTEX_OP_CMP_LT 2
3460# define FUTEX_OP_CMP_LE 3
3461# define FUTEX_OP_CMP_GT 4
3462# define FUTEX_OP_CMP_GE 5
3463# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003464static const struct xlat futexwakeops[] = {
3465 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3466 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3467 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3468 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3469 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3470 { 0, NULL }
3471};
3472static const struct xlat futexwakecmps[] = {
3473 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3474 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3475 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3476 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3477 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3478 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3479 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003480};
3481
3482int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003483sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003484{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003485 if (entering(tcp)) {
3486 long int cmd = tcp->u_arg[1] & 127;
3487 tprintf("%p, ", (void *) tcp->u_arg[0]);
3488 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3489 tprintf(", %ld", tcp->u_arg[2]);
3490 if (cmd == FUTEX_WAKE_BITSET)
3491 tprintf(", %lx", tcp->u_arg[5]);
3492 else if (cmd == FUTEX_WAIT) {
3493 tprintf(", ");
3494 printtv(tcp, tcp->u_arg[3]);
3495 } else if (cmd == FUTEX_WAIT_BITSET) {
3496 tprintf(", ");
3497 printtv(tcp, tcp->u_arg[3]);
3498 tprintf(", %lx", tcp->u_arg[5]);
3499 } else if (cmd == FUTEX_REQUEUE)
3500 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003501 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003502 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3503 else if (cmd == FUTEX_WAKE_OP) {
3504 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3505 if ((tcp->u_arg[5] >> 28) & 8)
3506 tprintf("FUTEX_OP_OPARG_SHIFT|");
3507 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3508 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3509 if ((tcp->u_arg[5] >> 24) & 8)
3510 tprintf("FUTEX_OP_OPARG_SHIFT|");
3511 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3512 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003513 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3514 tprintf(", ");
3515 printtv(tcp, tcp->u_arg[3]);
3516 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003517 }
Roland McGrath51942a92007-07-05 18:59:11 +00003518 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003519 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003520}
3521
3522static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003523print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003524{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003525 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003526 unsigned long w, min_len;
3527
3528 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3529 min_len = len - max_strlen * sizeof(w);
3530 else
3531 min_len = 0;
3532 for (; len >= sizeof(w) && len > min_len;
3533 len -= sizeof(w), list += sizeof(w)) {
3534 if (umove(tcp, list, &w) < 0)
3535 break;
3536 if (first)
3537 tprintf("{");
3538 else
3539 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003540 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003541 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003542 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003543 if (len) {
3544 if (first)
3545 tprintf("%#lx", list);
3546 else
3547 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3548 "???" : "..."));
3549 } else {
3550 tprintf(first ? "{}" : "}");
3551 }
Roland McGrath5a223472002-12-15 23:58:26 +00003552}
3553
3554int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003555sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003556{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003557 if (entering(tcp)) {
3558 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3559 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3560 }
3561 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003562}
3563
3564int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003565sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003566{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003567 if (entering(tcp)) {
3568 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3569 } else {
3570 if (tcp->u_rval == -1)
3571 tprintf("%#lx", tcp->u_arg[2]);
3572 else
3573 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3574 }
3575 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003576}
Roland McGrath279d3782004-03-01 20:27:37 +00003577
Roland McGrathd9f816f2004-09-04 03:39:20 +00003578static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003579 { SCHED_OTHER, "SCHED_OTHER" },
3580 { SCHED_RR, "SCHED_RR" },
3581 { SCHED_FIFO, "SCHED_FIFO" },
3582 { 0, NULL }
3583};
3584
3585int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003586sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003587{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003588 if (entering(tcp)) {
3589 tprintf("%d", (int) tcp->u_arg[0]);
3590 } else if (! syserror(tcp)) {
3591 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3592 if (tcp->auxstr != NULL)
3593 return RVAL_STR;
3594 }
3595 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003596}
3597
3598int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003599sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003600{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003601 if (entering(tcp)) {
3602 struct sched_param p;
3603 tprintf("%d, ", (int) tcp->u_arg[0]);
3604 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3605 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3606 tprintf(", %#lx", tcp->u_arg[2]);
3607 else
3608 tprintf(", { %d }", p.__sched_priority);
3609 }
3610 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003611}
3612
3613int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003614sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003615{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003616 if (entering(tcp)) {
3617 tprintf("%d, ", (int) tcp->u_arg[0]);
3618 } else {
3619 struct sched_param p;
3620 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3621 tprintf("%#lx", tcp->u_arg[1]);
3622 else
3623 tprintf("{ %d }", p.__sched_priority);
3624 }
3625 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003626}
3627
3628int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003629sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003630{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003631 if (entering(tcp)) {
3632 struct sched_param p;
3633 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3634 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3635 else
3636 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3637 }
3638 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003639}
3640
3641int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003642sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003643{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003644 if (entering(tcp)) {
3645 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3646 }
3647 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003648}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003649
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003650# ifdef X86_64
3651# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003652
3653static const struct xlat archvals[] = {
3654 { ARCH_SET_GS, "ARCH_SET_GS" },
3655 { ARCH_SET_FS, "ARCH_SET_FS" },
3656 { ARCH_GET_FS, "ARCH_GET_FS" },
3657 { ARCH_GET_GS, "ARCH_GET_GS" },
3658 { 0, NULL },
3659};
3660
3661int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003662sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003663{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003664 if (entering(tcp)) {
3665 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3666 if (tcp->u_arg[0] == ARCH_SET_GS
3667 || tcp->u_arg[0] == ARCH_SET_FS
3668 ) {
3669 tprintf(", %#lx", tcp->u_arg[1]);
3670 }
3671 } else {
3672 if (tcp->u_arg[0] == ARCH_GET_GS
3673 || tcp->u_arg[0] == ARCH_GET_FS
3674 ) {
3675 long int v;
3676 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3677 tprintf(", [%#lx]", v);
3678 else
3679 tprintf(", %#lx", tcp->u_arg[1]);
3680 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003681 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003682 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003683}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003684# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003685
Roland McGrathdb8319f2007-08-02 01:37:55 +00003686
3687int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003688sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003689{
3690 if (exiting(tcp)) {
3691 unsigned u;
3692 if (tcp->u_arg[0] == 0)
3693 tprintf("NULL, ");
3694 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3695 tprintf("%#lx, ", tcp->u_arg[0]);
3696 else
3697 tprintf("[%u], ", u);
3698 if (tcp->u_arg[1] == 0)
3699 tprintf("NULL, ");
3700 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3701 tprintf("%#lx, ", tcp->u_arg[1]);
3702 else
3703 tprintf("[%u], ", u);
3704 tprintf("%#lx", tcp->u_arg[2]);
3705 }
3706 return 0;
3707}
3708
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003709#endif /* LINUX */