blob: 8af960a0ab5f05e533b555d814e178defb8160e2 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Linux for s390 port by D.J. Barrow
8 * <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
Wichert Akkermanccef6372002-05-01 16:39:22 +00009 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
11
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000012 *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000013 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 */
39
40#include "defs.h"
41
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <sys/time.h>
45#include <sys/wait.h>
46#include <sys/resource.h>
47#include <sys/utsname.h>
48#include <sys/user.h>
49#include <sys/syscall.h>
50#include <signal.h>
51#ifdef SUNOS4
52#include <machine/reg.h>
53#endif /* SUNOS4 */
54
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000055#ifdef FREEBSD
56#include <sys/ptrace.h>
57#endif
58
Wichert Akkerman36915a11999-07-13 15:45:02 +000059#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000060# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000061#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000062# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000063#endif
64#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000065# define PTRACE_POKEUSR PTRACE_POKEUSER
66#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000067#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000068
Roland McGrath5bd7cf82003-01-24 04:31:18 +000069#ifdef HAVE_LINUX_PTRACE_H
70#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000071# ifdef HAVE_STRUCT_IA64_FPREG
72# define ia64_fpreg XXX_ia64_fpreg
73# endif
74# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
75# define pt_all_user_regs XXX_pt_all_user_regs
76# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000077#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000078# undef ia64_fpreg
79# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000080#endif
81
Roland McGrath6d1a65c2004-07-12 07:44:08 +000082#if defined (LINUX) && defined (SPARC64)
83# define r_pc r_tpc
84# undef PTRACE_GETREGS
85# define PTRACE_GETREGS PTRACE_GETREGS64
86# undef PTRACE_SETREGS
87# define PTRACE_SETREGS PTRACE_SETREGS64
88#endif /* LINUX && SPARC64 */
89
Roland McGrath5a223472002-12-15 23:58:26 +000090#ifdef HAVE_LINUX_FUTEX_H
Dmitry V. Levine5e60852009-12-31 22:50:49 +000091# include <linux/futex.h>
Roland McGrath5a223472002-12-15 23:58:26 +000092#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +000093#ifdef LINUX
Roland McGrath5a223472002-12-15 23:58:26 +000094# ifndef FUTEX_WAIT
95# define FUTEX_WAIT 0
96# endif
97# ifndef FUTEX_WAKE
98# define FUTEX_WAKE 1
99# endif
100# ifndef FUTEX_FD
101# define FUTEX_FD 2
102# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000103# ifndef FUTEX_REQUEUE
104# define FUTEX_REQUEUE 3
105# endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000106#endif /* LINUX */
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000107
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000108#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000109#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000110#include <asm/posix_types.h>
111#undef GETGROUPS_T
112#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000113#undef GETGROUPS32_T
114#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000115#endif /* LINUX */
116
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000117#if defined(LINUX) && defined(IA64)
118# include <asm/ptrace_offsets.h>
119# include <asm/rse.h>
120#endif
121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef HAVE_PRCTL
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000123# include <sys/prctl.h>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000124
Roland McGrathd9f816f2004-09-04 03:39:20 +0000125static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000126#ifdef PR_MAXPROCS
127 { PR_MAXPROCS, "PR_MAXPROCS" },
128#endif
129#ifdef PR_ISBLOCKED
130 { PR_ISBLOCKED, "PR_ISBLOCKED" },
131#endif
132#ifdef PR_SETSTACKSIZE
133 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
134#endif
135#ifdef PR_GETSTACKSIZE
136 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
137#endif
138#ifdef PR_MAXPPROCS
139 { PR_MAXPPROCS, "PR_MAXPPROCS" },
140#endif
141#ifdef PR_UNBLKONEXEC
142 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
143#endif
144#ifdef PR_ATOMICSIM
145 { PR_ATOMICSIM, "PR_ATOMICSIM" },
146#endif
147#ifdef PR_SETEXITSIG
148 { PR_SETEXITSIG, "PR_SETEXITSIG" },
149#endif
150#ifdef PR_RESIDENT
151 { PR_RESIDENT, "PR_RESIDENT" },
152#endif
153#ifdef PR_ATTACHADDR
154 { PR_ATTACHADDR, "PR_ATTACHADDR" },
155#endif
156#ifdef PR_DETACHADDR
157 { PR_DETACHADDR, "PR_DETACHADDR" },
158#endif
159#ifdef PR_TERMCHILD
160 { PR_TERMCHILD, "PR_TERMCHILD" },
161#endif
162#ifdef PR_GETSHMASK
163 { PR_GETSHMASK, "PR_GETSHMASK" },
164#endif
165#ifdef PR_GETNSHARE
166 { PR_GETNSHARE, "PR_GETNSHARE" },
167#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000168#ifdef PR_COREPID
169 { PR_COREPID, "PR_COREPID" },
170#endif
171#ifdef PR_ATTACHADDRPERM
172 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
173#endif
174#ifdef PR_PTHREADEXIT
175 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
176#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000177#ifdef PR_SET_PDEATHSIG
178 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
179#endif
180#ifdef PR_GET_PDEATHSIG
181 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
182#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000183#ifdef PR_GET_DUMPABLE
184 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
185#endif
186#ifdef PR_SET_DUMPABLE
187 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
188#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000189#ifdef PR_GET_UNALIGN
190 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
191#endif
192#ifdef PR_SET_UNALIGN
193 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
194#endif
195#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000196 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000197#endif
198#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000199 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000200#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000201#ifdef PR_GET_FPEMU
202 { PR_GET_FPEMU, "PR_GET_FPEMU" },
203#endif
204#ifdef PR_SET_FPEMU
205 { PR_SET_FPEMU, "PR_SET_FPEMU" },
206#endif
207#ifdef PR_GET_FPEXC
208 { PR_GET_FPEXC, "PR_GET_FPEXC" },
209#endif
210#ifdef PR_SET_FPEXC
211 { PR_SET_FPEXC, "PR_SET_FPEXC" },
212#endif
213#ifdef PR_GET_TIMING
214 { PR_GET_TIMING, "PR_GET_TIMING" },
215#endif
216#ifdef PR_SET_TIMING
217 { PR_SET_TIMING, "PR_SET_TIMING" },
218#endif
219#ifdef PR_SET_NAME
220 { PR_SET_NAME, "PR_SET_NAME" },
221#endif
222#ifdef PR_GET_NAME
223 { PR_GET_NAME, "PR_GET_NAME" },
224#endif
225#ifdef PR_GET_ENDIAN
226 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
227#endif
228#ifdef PR_SET_ENDIAN
229 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
230#endif
231#ifdef PR_GET_SECCOMP
232 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
233#endif
234#ifdef PR_SET_SECCOMP
235 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
236#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000237#ifdef PR_GET_TSC
238 { PR_GET_TSC, "PR_GET_TSC" },
239#endif
240#ifdef PR_SET_TSC
241 { PR_SET_TSC, "PR_SET_TSC" },
242#endif
243#ifdef PR_GET_SECUREBITS
244 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
245#endif
246#ifdef PR_SET_SECUREBITS
247 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
248#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000249 { 0, NULL },
250};
251
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000252
Roland McGratha4d48532005-06-08 20:45:28 +0000253static const char *
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000254unalignctl_string (unsigned int ctl)
255{
256 static char buf[16];
257
258 switch (ctl) {
259#ifdef PR_UNALIGN_NOPRINT
260 case PR_UNALIGN_NOPRINT:
261 return "NOPRINT";
262#endif
263#ifdef PR_UNALIGN_SIGBUS
264 case PR_UNALIGN_SIGBUS:
265 return "SIGBUS";
266#endif
267 default:
268 break;
269 }
270 sprintf(buf, "%x", ctl);
271 return buf;
272}
273
274
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000275int
276sys_prctl(tcp)
277struct tcb *tcp;
278{
279 int i;
280
281 if (entering(tcp)) {
282 printxval(prctl_options, tcp->u_arg[0], "PR_???");
283 switch (tcp->u_arg[0]) {
284#ifdef PR_GETNSHARE
285 case PR_GETNSHARE:
286 break;
287#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000288#ifdef PR_SET_PDEATHSIG
289 case PR_SET_PDEATHSIG:
290 tprintf(", %lu", tcp->u_arg[1]);
291 break;
292#endif
293#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000294 case PR_GET_PDEATHSIG:
295 break;
296#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000297#ifdef PR_SET_DUMPABLE
298 case PR_SET_DUMPABLE:
299 tprintf(", %lu", tcp->u_arg[1]);
300 break;
301#endif
302#ifdef PR_GET_DUMPABLE
303 case PR_GET_DUMPABLE:
304 break;
305#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000306#ifdef PR_SET_UNALIGN
307 case PR_SET_UNALIGN:
308 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
309 break;
310#endif
311#ifdef PR_GET_UNALIGN
312 case PR_GET_UNALIGN:
313 tprintf(", %#lx", tcp->u_arg[1]);
314 break;
315#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000316#ifdef PR_SET_KEEPCAPS
317 case PR_SET_KEEPCAPS:
318 tprintf(", %lu", tcp->u_arg[1]);
319 break;
320#endif
321#ifdef PR_GET_KEEPCAPS
322 case PR_GET_KEEPCAPS:
323 break;
324#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000325 default:
326 for (i = 1; i < tcp->u_nargs; i++)
327 tprintf(", %#lx", tcp->u_arg[i]);
328 break;
329 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000330 } else {
331 switch (tcp->u_arg[0]) {
332#ifdef PR_GET_PDEATHSIG
333 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000334 if (umove(tcp, tcp->u_arg[1], &i) < 0)
335 tprintf(", %#lx", tcp->u_arg[1]);
336 else
337 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000338 break;
339#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000340#ifdef PR_GET_DUMPABLE
341 case PR_GET_DUMPABLE:
342 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000343#endif
344#ifdef PR_GET_UNALIGN
345 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000346 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
347 break;
348 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000349 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000350#endif
351#ifdef PR_GET_KEEPCAPS
352 case PR_GET_KEEPCAPS:
353 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000354#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000355 default:
356 break;
357 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000358 }
359 return 0;
360}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000361#endif /* HAVE_PRCTL */
362
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000363#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000364int
365sys_gethostid(tcp)
366struct tcb *tcp;
367{
368 if (exiting(tcp))
369 return RVAL_HEX;
370 return 0;
371}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000372#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000373
374int
375sys_sethostname(tcp)
376struct tcb *tcp;
377{
378 if (entering(tcp)) {
379 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
380 tprintf(", %lu", tcp->u_arg[1]);
381 }
382 return 0;
383}
384
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000385#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000386int
387sys_gethostname(tcp)
388struct tcb *tcp;
389{
390 if (exiting(tcp)) {
391 if (syserror(tcp))
392 tprintf("%#lx", tcp->u_arg[0]);
393 else
394 printpath(tcp, tcp->u_arg[0]);
395 tprintf(", %lu", tcp->u_arg[1]);
396 }
397 return 0;
398}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000399#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000400
401int
402sys_setdomainname(tcp)
403struct tcb *tcp;
404{
405 if (entering(tcp)) {
406 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
407 tprintf(", %lu", tcp->u_arg[1]);
408 }
409 return 0;
410}
411
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000412#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000413
414int
415sys_getdomainname(tcp)
416struct tcb *tcp;
417{
418 if (exiting(tcp)) {
419 if (syserror(tcp))
420 tprintf("%#lx", tcp->u_arg[0]);
421 else
422 printpath(tcp, tcp->u_arg[0]);
423 tprintf(", %lu", tcp->u_arg[1]);
424 }
425 return 0;
426}
427#endif /* !LINUX */
428
429int
430sys_exit(tcp)
431struct tcb *tcp;
432{
433 if (exiting(tcp)) {
434 fprintf(stderr, "_exit returned!\n");
435 return -1;
436 }
437 /* special case: we stop tracing this process, finish line now */
438 tprintf("%ld) ", tcp->u_arg[0]);
439 tabto(acolumn);
440 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000441 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000442 return 0;
443}
444
445int
446internal_exit(tcp)
447struct tcb *tcp;
448{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000449 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000450 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000451#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000452# ifdef IA64
453 if (ia32) {
454 if (tcp->scno == 252)
455 tcp->flags |= TCB_GROUP_EXITING;
456 } else
457# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000458 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000459 tcp->flags |= TCB_GROUP_EXITING;
460#endif
461 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000462 return 0;
463}
464
Roland McGratheb9e2e82009-06-02 16:49:22 -0700465/* TCP is creating a child we want to follow.
466 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
467 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
468static void
469fork_tcb(struct tcb *tcp)
470{
471 if (nprocs == tcbtabsize)
472 expand_tcbtab();
473
474 tcp->flags |= TCB_FOLLOWFORK;
475}
476
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000477#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000478
479int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000480sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000481{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000482 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000483 if (getrval2(tcp)) {
484 tcp->auxstr = "child process";
485 return RVAL_UDECIMAL | RVAL_STR;
486 }
487 }
488 return 0;
489}
490
John Hughes4e36a812001-04-18 15:11:51 +0000491#if UNIXWARE > 2
492
493int
494sys_rfork(tcp)
495struct tcb *tcp;
496{
497 if (entering(tcp)) {
498 tprintf ("%ld", tcp->u_arg[0]);
499 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000500 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000501 if (getrval2(tcp)) {
502 tcp->auxstr = "child process";
503 return RVAL_UDECIMAL | RVAL_STR;
504 }
505 }
506 return 0;
507}
508
509#endif
510
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000511int
512internal_fork(tcp)
513struct tcb *tcp;
514{
515 struct tcb *tcpchild;
516
517 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000518#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000519 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000520 return 0;
521#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000522 if (getrval2(tcp))
523 return 0;
524 if (!followfork)
525 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700526 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000527 if (syserror(tcp))
528 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000529 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000530 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000531 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000532 }
533 return 0;
534}
535
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000536#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000537
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000538#ifdef LINUX
539
540/* defines copied from linux/sched.h since we can't include that
541 * ourselves (it conflicts with *lots* of libc includes)
542 */
543#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
544#define CLONE_VM 0x00000100 /* set if VM shared between processes */
545#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
546#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
547#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000548#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000549#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
550#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
551#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000552#define CLONE_THREAD 0x00010000 /* Same thread group? */
553#define CLONE_NEWNS 0x00020000 /* New namespace group? */
554#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
555#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
556#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
557#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
Roland McGrath909875b2002-12-22 03:34:36 +0000558#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
559#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000560
Roland McGrathd9f816f2004-09-04 03:39:20 +0000561static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000562 { CLONE_VM, "CLONE_VM" },
563 { CLONE_FS, "CLONE_FS" },
564 { CLONE_FILES, "CLONE_FILES" },
565 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000566 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000567 { CLONE_PTRACE, "CLONE_PTRACE" },
568 { CLONE_VFORK, "CLONE_VFORK" },
569 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000570 { CLONE_THREAD, "CLONE_THREAD" },
571 { CLONE_NEWNS, "CLONE_NEWNS" },
572 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
573 { CLONE_SETTLS, "CLONE_SETTLS" },
574 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
575 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
Roland McGrath909875b2002-12-22 03:34:36 +0000576 { CLONE_UNTRACED, "CLONE_UNTRACED" },
577 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000578 { 0, NULL },
579};
580
Roland McGrath909875b2002-12-22 03:34:36 +0000581# ifdef I386
582# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000583# ifdef HAVE_STRUCT_USER_DESC
584# define modify_ldt_ldt_s user_desc
585# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000586extern void print_ldt_entry();
587# endif
588
Roland McGrath9677b3a2003-03-12 09:54:36 +0000589# if defined IA64
590# define ARG_FLAGS 0
591# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000592# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
593# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
594# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
595# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000596# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000597# define ARG_STACK 0
598# define ARG_FLAGS 1
599# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000600# define ARG_CTID 3
601# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000602# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000603# define ARG_FLAGS 0
604# define ARG_STACK 1
605# define ARG_PTID 2
606# define ARG_CTID 3
607# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000608# else
609# define ARG_FLAGS 0
610# define ARG_STACK 1
611# define ARG_PTID 2
612# define ARG_TLS 3
613# define ARG_CTID 4
614# endif
615
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000616int
617sys_clone(tcp)
618struct tcb *tcp;
619{
620 if (exiting(tcp)) {
Wang Chaocbdd1902010-09-02 15:08:59 +0800621 const char *sep = "|";
Roland McGrath9677b3a2003-03-12 09:54:36 +0000622 unsigned long flags = tcp->u_arg[ARG_FLAGS];
623 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
624# ifdef ARG_STACKSIZE
625 if (ARG_STACKSIZE != -1)
626 tprintf("stack_size=%#lx, ",
627 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000628# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000629 tprintf("flags=");
Wang Chaocbdd1902010-09-02 15:08:59 +0800630 if (!printflags(clone_flags, flags &~ CSIGNAL, NULL))
631 sep = "";
Roland McGrath984154d2003-05-23 01:08:42 +0000632 if ((flags & CSIGNAL) != 0)
Wang Chaocbdd1902010-09-02 15:08:59 +0800633 tprintf("%s%s", sep, signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000634 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000635 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000636 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000637 if (flags & CLONE_PARENT_SETTID)
638 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000639 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000640# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000641 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000642 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000643 tprintf(", {entry_number:%d, ",
644 copy.entry_number);
645 if (!verbose(tcp))
646 tprintf("...}");
647 else
648 print_ldt_entry(&copy);
649 }
650 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000651# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000652 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000653 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000654 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
655 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000656 }
657 return 0;
658}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000659
660int
661sys_unshare(struct tcb *tcp)
662{
663 if (entering(tcp))
664 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
665 return 0;
666}
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000667#endif /* LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000668
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000669int
670sys_fork(tcp)
671struct tcb *tcp;
672{
673 if (exiting(tcp))
674 return RVAL_UDECIMAL;
675 return 0;
676}
677
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000678int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000679change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000680{
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000681#ifdef LINUX
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000682#if defined(I386)
683 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000684 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000685 return -1;
686 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000687#elif defined(X86_64)
688 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000689 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000690 return -1;
691 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000692#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000693 if (ptrace(PTRACE_POKEUSER, tcp->pid,
694 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000695 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000696 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000697#elif defined(S390) || defined(S390X)
698 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
699 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000700 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701 return 0;
702#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000703 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000704 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000705 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000706#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400707 struct pt_regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000708 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
709 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400710 regs.u_regs[U_REG_G1] = new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000711 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000712 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000713 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000714#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000715 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000716 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000717 return 0;
718#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000719 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000720 return -1;
721 return 0;
722#elif defined(AVR32)
723 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
724 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000725 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000726#elif defined(BFIN)
727 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
728 return -1;
729 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000730#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000731 if (ia32) {
732 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000733 case 2:
734 break; /* x86 SYS_fork */
735 case SYS_clone:
736 new = 120;
737 break;
738 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000739 fprintf(stderr, "%s: unexpected syscall %d\n",
740 __FUNCTION__, new);
741 return -1;
742 }
743 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
744 return -1;
745 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000746 return -1;
747 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000748#elif defined(HPPA)
749 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000750 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000751 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000752#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000753 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
754 return -1;
755 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000756#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000757 /* Top half of reg encodes the no. of args n as 0x1n.
758 Assume 0 args as kernel never actually checks... */
759 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
760 0x100000 | new) < 0)
761 return -1;
762 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000763#elif defined(CRISV10) || defined(CRISV32)
764 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
765 return -1;
766 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000767#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000768 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000769# ifndef PTRACE_SET_SYSCALL
770# define PTRACE_SET_SYSCALL 23
771# endif
772
Dmitry V. Levin76740062009-09-18 11:30:14 +0000773 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000774 return -1;
775
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000776 return 0;
Chris Metcalfc8c66982009-12-28 10:00:15 -0500777#elif defined(TILE)
778 if (ptrace(PTRACE_POKEUSER, tcp->pid,
779 (char*)PTREGS_OFFSET_REG(0),
780 new) != 0)
781 return -1;
782 return 0;
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200783#elif defined(MICROBLAZE)
784 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new)<0)
785 return -1;
786 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000787#else
788#warning Do not know how to handle change_syscall for this architecture
789#endif /* architecture */
790#endif /* LINUX */
791 return -1;
792}
793
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000794#ifdef LINUX
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000795int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000796internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000797{
798 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700799 if (!followfork)
800 return 0;
801 fork_tcb(tcp);
802 if (setbpt(tcp) < 0)
803 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000804 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000805 struct tcb *tcpchild;
806 int pid;
807 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700808
809 if (!(tcp->flags & TCB_FOLLOWFORK))
810 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000811
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000812 bpt = tcp->flags & TCB_BPTSET;
813
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000814 if (syserror(tcp)) {
815 if (bpt)
816 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000817 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000818 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000819
820 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000821
822#ifdef CLONE_PTRACE /* See new setbpt code. */
823 tcpchild = pid2tcb(pid);
824 if (tcpchild != NULL) {
825 /* The child already reported its startup trap
826 before the parent reported its syscall return. */
827 if ((tcpchild->flags
828 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
829 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
830 fprintf(stderr, "\
831[preattached child %d of %d in weird state!]\n",
832 pid, tcp->pid);
833 }
834 else
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000835#endif /* CLONE_PTRACE */
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000836 {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700837 fork_tcb(tcp);
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000838 tcpchild = alloctcb(pid);
839 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000840
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000841#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000842 /* Attach to the new child */
843 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000844 if (bpt)
845 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000846 perror("PTRACE_ATTACH");
847 fprintf(stderr, "Too late?\n");
848 droptcb(tcpchild);
849 return 0;
850 }
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000851#endif /* !CLONE_PTRACE */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000852
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000853 if (bpt)
854 clearbpt(tcp);
855
Ulrich Drepper90512f01999-12-24 07:22:25 +0000856 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000857 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000858 if (bpt) {
859 tcpchild->flags |= TCB_BPTSET;
860 tcpchild->baddr = tcp->baddr;
861 memcpy(tcpchild->inst, tcp->inst,
862 sizeof tcpchild->inst);
863 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000864 tcpchild->parent = tcp;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000865 tcp->nchildren++;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000866 if (tcpchild->flags & TCB_SUSPENDED) {
867 /* The child was born suspended, due to our having
868 forced CLONE_PTRACE. */
869 if (bpt)
870 clearbpt(tcpchild);
871
872 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000873 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000874 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000875
876 if (!qflag)
877 fprintf(stderr, "\
878Process %u resumed (parent %d ready)\n",
879 pid, tcp->pid);
880 }
881 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000882 if (!qflag)
883 fprintf(stderr, "Process %d attached\n", pid);
884 }
885
886#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000887 {
888 /*
889 * Save the flags used in this call,
890 * in case we point TCP to our parent below.
891 */
892 int call_flags = tcp->u_arg[ARG_FLAGS];
893 if ((tcp->flags & TCB_CLONE_THREAD) &&
894 tcp->parent != NULL) {
895 /* The parent in this clone is itself a
896 thread belonging to another process.
897 There is no meaning to the parentage
898 relationship of the new child with the
899 thread, only with the process. We
900 associate the new thread with our
901 parent. Since this is done for every
902 new thread, there will never be a
903 TCB_CLONE_THREAD process that has
904 children. */
905 --tcp->nchildren;
906 tcp = tcp->parent;
907 tcpchild->parent = tcp;
908 ++tcp->nchildren;
909 }
910 if (call_flags & CLONE_THREAD) {
911 tcpchild->flags |= TCB_CLONE_THREAD;
912 ++tcp->nclone_threads;
913 }
Wang Chao5a22b312010-08-05 14:58:37 +0800914 if ((call_flags & CLONE_PARENT) &&
915 !(call_flags & CLONE_THREAD)) {
916 --tcp->nchildren;
917 tcpchild->parent = NULL;
918 if (tcp->parent != NULL) {
919 tcp = tcp->parent;
920 tcpchild->parent = tcp;
921 ++tcp->nchildren;
922 }
923 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000924 }
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000925#endif /* TCB_CLONE_THREAD */
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000926 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000927 return 0;
928}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000929
930#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000931
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000932int
933internal_fork(tcp)
934struct tcb *tcp;
935{
936 struct tcb *tcpchild;
937 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700938 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000939
940#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000941 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000942 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000943 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700944 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000945 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000946#endif
947 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700948 if (!followfork || dont_follow)
949 return 0;
950 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000951 if (setbpt(tcp) < 0)
952 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000953 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000954 else {
955 int bpt = tcp->flags & TCB_BPTSET;
956
Roland McGratheb9e2e82009-06-02 16:49:22 -0700957 if (!(tcp->flags & TCB_FOLLOWFORK))
958 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000959 if (bpt)
960 clearbpt(tcp);
961
962 if (syserror(tcp))
963 return 0;
964
965 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700966 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000967 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000968#ifdef SUNOS4
969#ifdef oldway
970 /* The child must have run before it can be attached. */
971 {
972 struct timeval tv;
973 tv.tv_sec = 0;
974 tv.tv_usec = 10000;
975 select(0, NULL, NULL, NULL, &tv);
976 }
977 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
978 perror("PTRACE_ATTACH");
979 fprintf(stderr, "Too late?\n");
980 droptcb(tcpchild);
981 return 0;
982 }
983#else /* !oldway */
984 /* Try to catch the new process as soon as possible. */
985 {
986 int i;
987 for (i = 0; i < 1024; i++)
988 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
989 break;
990 if (i == 1024) {
991 perror("PTRACE_ATTACH");
992 fprintf(stderr, "Too late?\n");
993 droptcb(tcpchild);
994 return 0;
995 }
996 }
997#endif /* !oldway */
998#endif /* SUNOS4 */
999 tcpchild->flags |= TCB_ATTACHED;
1000 /* Child has BPT too, must be removed on first occasion */
1001 if (bpt) {
1002 tcpchild->flags |= TCB_BPTSET;
1003 tcpchild->baddr = tcp->baddr;
1004 memcpy(tcpchild->inst, tcp->inst,
1005 sizeof tcpchild->inst);
1006 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001007 tcpchild->parent = tcp;
1008 tcp->nchildren++;
1009 if (!qflag)
1010 fprintf(stderr, "Process %d attached\n", pid);
1011 }
1012 return 0;
1013}
1014
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001015#endif /* !LINUX */
1016
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001017#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001018
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001019#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001020
1021int
1022sys_vfork(tcp)
1023struct tcb *tcp;
1024{
1025 if (exiting(tcp))
1026 return RVAL_UDECIMAL;
1027 return 0;
1028}
1029
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001030#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001031
1032#ifndef LINUX
1033
1034static char idstr[16];
1035
1036int
1037sys_getpid(tcp)
1038struct tcb *tcp;
1039{
1040 if (exiting(tcp)) {
1041 sprintf(idstr, "ppid %lu", getrval2(tcp));
1042 tcp->auxstr = idstr;
1043 return RVAL_STR;
1044 }
1045 return 0;
1046}
1047
1048int
1049sys_getuid(tcp)
1050struct tcb *tcp;
1051{
1052 if (exiting(tcp)) {
1053 sprintf(idstr, "euid %lu", getrval2(tcp));
1054 tcp->auxstr = idstr;
1055 return RVAL_STR;
1056 }
1057 return 0;
1058}
1059
1060int
1061sys_getgid(tcp)
1062struct tcb *tcp;
1063{
1064 if (exiting(tcp)) {
1065 sprintf(idstr, "egid %lu", getrval2(tcp));
1066 tcp->auxstr = idstr;
1067 return RVAL_STR;
1068 }
1069 return 0;
1070}
1071
1072#endif /* !LINUX */
1073
1074#ifdef LINUX
1075
1076int
1077sys_setuid(tcp)
1078struct tcb *tcp;
1079{
1080 if (entering(tcp)) {
1081 tprintf("%u", (uid_t) tcp->u_arg[0]);
1082 }
1083 return 0;
1084}
1085
1086int
1087sys_setgid(tcp)
1088struct tcb *tcp;
1089{
1090 if (entering(tcp)) {
1091 tprintf("%u", (gid_t) tcp->u_arg[0]);
1092 }
1093 return 0;
1094}
1095
1096int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001097sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001098{
1099 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001100 __kernel_uid_t uid;
1101 if (syserror(tcp))
1102 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1103 tcp->u_arg[1], tcp->u_arg[2]);
1104 else {
1105 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1106 tprintf("%#lx, ", tcp->u_arg[0]);
1107 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001108 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001109 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1110 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001111 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001112 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001113 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1114 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001115 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001116 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001117 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001118 }
1119 return 0;
1120}
1121
1122int
1123sys_getresgid(tcp)
1124struct tcb *tcp;
1125{
1126 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001127 __kernel_gid_t gid;
1128 if (syserror(tcp))
1129 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1130 tcp->u_arg[1], tcp->u_arg[2]);
1131 else {
1132 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1133 tprintf("%#lx, ", tcp->u_arg[0]);
1134 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001135 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001136 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1137 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001138 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001139 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001140 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1141 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001142 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001143 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001144 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001145 }
1146 return 0;
1147}
1148
1149#endif /* LINUX */
1150
1151int
1152sys_setreuid(tcp)
1153struct tcb *tcp;
1154{
1155 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001156 printuid("", tcp->u_arg[0]);
1157 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001158 }
1159 return 0;
1160}
1161
1162int
1163sys_setregid(tcp)
1164struct tcb *tcp;
1165{
1166 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001167 printuid("", tcp->u_arg[0]);
1168 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001169 }
1170 return 0;
1171}
1172
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001173#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001174int
1175sys_setresuid(tcp)
1176 struct 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]);
1181 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001182 }
1183 return 0;
1184}
1185int
1186sys_setresgid(tcp)
1187 struct 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]);
1192 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001193 }
1194 return 0;
1195}
1196
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001197#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001198
1199int
1200sys_setgroups(tcp)
1201struct tcb *tcp;
1202{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001203 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001204 unsigned long len, size, start, cur, end, abbrev_end;
1205 GETGROUPS_T gid;
1206 int failed = 0;
1207
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001208 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001209 tprintf("%lu, ", len);
1210 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001211 tprintf("[]");
1212 return 0;
1213 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001214 start = tcp->u_arg[1];
1215 if (start == 0) {
1216 tprintf("NULL");
1217 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001218 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001219 size = len * sizeof(gid);
1220 end = start + size;
1221 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1222 tprintf("%#lx", start);
1223 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001224 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001225 if (abbrev(tcp)) {
1226 abbrev_end = start + max_strlen * sizeof(gid);
1227 if (abbrev_end < start)
1228 abbrev_end = end;
1229 } else {
1230 abbrev_end = end;
1231 }
1232 tprintf("[");
1233 for (cur = start; cur < end; cur += sizeof(gid)) {
1234 if (cur > start)
1235 tprintf(", ");
1236 if (cur >= abbrev_end) {
1237 tprintf("...");
1238 break;
1239 }
1240 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1241 tprintf("?");
1242 failed = 1;
1243 break;
1244 }
1245 tprintf("%lu", (unsigned long) gid);
1246 }
1247 tprintf("]");
1248 if (failed)
1249 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001250 }
1251 return 0;
1252}
1253
1254int
1255sys_getgroups(tcp)
1256struct tcb *tcp;
1257{
Roland McGrathaa524c82005-06-01 19:22:06 +00001258 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001259
1260 if (entering(tcp)) {
1261 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001262 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001263 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001264 unsigned long size, start, cur, end, abbrev_end;
1265 GETGROUPS_T gid;
1266 int failed = 0;
1267
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001268 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001269 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001270 tprintf("[]");
1271 return 0;
1272 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001273 start = tcp->u_arg[1];
1274 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001275 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001276 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001277 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001278 if (tcp->u_arg[0] == 0) {
1279 tprintf("%#lx", start);
1280 return 0;
1281 }
1282 size = len * sizeof(gid);
1283 end = start + size;
1284 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1285 size / sizeof(gid) != len || end < start) {
1286 tprintf("%#lx", start);
1287 return 0;
1288 }
1289 if (abbrev(tcp)) {
1290 abbrev_end = start + max_strlen * sizeof(gid);
1291 if (abbrev_end < start)
1292 abbrev_end = end;
1293 } else {
1294 abbrev_end = end;
1295 }
1296 tprintf("[");
1297 for (cur = start; cur < end; cur += sizeof(gid)) {
1298 if (cur > start)
1299 tprintf(", ");
1300 if (cur >= abbrev_end) {
1301 tprintf("...");
1302 break;
1303 }
1304 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1305 tprintf("?");
1306 failed = 1;
1307 break;
1308 }
1309 tprintf("%lu", (unsigned long) gid);
1310 }
1311 tprintf("]");
1312 if (failed)
1313 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001314 }
1315 return 0;
1316}
1317
Roland McGrath83bd47a2003-11-13 22:32:26 +00001318#ifdef LINUX
1319int
1320sys_setgroups32(tcp)
1321struct tcb *tcp;
1322{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001323 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001324 unsigned long len, size, start, cur, end, abbrev_end;
1325 GETGROUPS32_T gid;
1326 int failed = 0;
1327
Roland McGrath83bd47a2003-11-13 22:32:26 +00001328 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001329 tprintf("%lu, ", len);
1330 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001331 tprintf("[]");
1332 return 0;
1333 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001334 start = tcp->u_arg[1];
1335 if (start == 0) {
1336 tprintf("NULL");
1337 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001338 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001339 size = len * sizeof(gid);
1340 end = start + size;
1341 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1342 tprintf("%#lx", start);
1343 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001344 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001345 if (abbrev(tcp)) {
1346 abbrev_end = start + max_strlen * sizeof(gid);
1347 if (abbrev_end < start)
1348 abbrev_end = end;
1349 } else {
1350 abbrev_end = end;
1351 }
1352 tprintf("[");
1353 for (cur = start; cur < end; cur += sizeof(gid)) {
1354 if (cur > start)
1355 tprintf(", ");
1356 if (cur >= abbrev_end) {
1357 tprintf("...");
1358 break;
1359 }
1360 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1361 tprintf("?");
1362 failed = 1;
1363 break;
1364 }
1365 tprintf("%lu", (unsigned long) gid);
1366 }
1367 tprintf("]");
1368 if (failed)
1369 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001370 }
1371 return 0;
1372}
1373
1374int
1375sys_getgroups32(tcp)
1376struct tcb *tcp;
1377{
Roland McGrathaa524c82005-06-01 19:22:06 +00001378 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001379
1380 if (entering(tcp)) {
1381 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001382 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001383 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001384 unsigned long size, start, cur, end, abbrev_end;
1385 GETGROUPS32_T gid;
1386 int failed = 0;
1387
Roland McGrath83bd47a2003-11-13 22:32:26 +00001388 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001389 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001390 tprintf("[]");
1391 return 0;
1392 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001393 start = tcp->u_arg[1];
1394 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001395 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001396 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001397 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001398 size = len * sizeof(gid);
1399 end = start + size;
1400 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1401 size / sizeof(gid) != len || end < start) {
1402 tprintf("%#lx", start);
1403 return 0;
1404 }
1405 if (abbrev(tcp)) {
1406 abbrev_end = start + max_strlen * sizeof(gid);
1407 if (abbrev_end < start)
1408 abbrev_end = end;
1409 } else {
1410 abbrev_end = end;
1411 }
1412 tprintf("[");
1413 for (cur = start; cur < end; cur += sizeof(gid)) {
1414 if (cur > start)
1415 tprintf(", ");
1416 if (cur >= abbrev_end) {
1417 tprintf("...");
1418 break;
1419 }
1420 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1421 tprintf("?");
1422 failed = 1;
1423 break;
1424 }
1425 tprintf("%lu", (unsigned long) gid);
1426 }
1427 tprintf("]");
1428 if (failed)
1429 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001430 }
1431 return 0;
1432}
1433#endif /* LINUX */
1434
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001435#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001436int
1437sys_setpgrp(tcp)
1438struct tcb *tcp;
1439{
1440 if (entering(tcp)) {
1441#ifndef SVR4
1442 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1443#endif /* !SVR4 */
1444 }
1445 return 0;
1446}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001447#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001448
1449int
1450sys_getpgrp(tcp)
1451struct tcb *tcp;
1452{
1453 if (entering(tcp)) {
1454#ifndef SVR4
1455 tprintf("%lu", tcp->u_arg[0]);
1456#endif /* !SVR4 */
1457 }
1458 return 0;
1459}
1460
1461int
1462sys_getsid(tcp)
1463struct tcb *tcp;
1464{
1465 if (entering(tcp)) {
1466 tprintf("%lu", tcp->u_arg[0]);
1467 }
1468 return 0;
1469}
1470
1471int
1472sys_setsid(tcp)
1473struct tcb *tcp;
1474{
1475 return 0;
1476}
1477
1478int
1479sys_getpgid(tcp)
1480struct tcb *tcp;
1481{
1482 if (entering(tcp)) {
1483 tprintf("%lu", tcp->u_arg[0]);
1484 }
1485 return 0;
1486}
1487
1488int
1489sys_setpgid(tcp)
1490struct tcb *tcp;
1491{
1492 if (entering(tcp)) {
1493 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1494 }
1495 return 0;
1496}
1497
John Hughesc61eb3d2002-05-17 11:37:50 +00001498#if UNIXWARE >= 2
1499
1500#include <sys/privilege.h>
1501
1502
Roland McGrathd9f816f2004-09-04 03:39:20 +00001503static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001504 { SETPRV, "SETPRV" },
1505 { CLRPRV, "CLRPRV" },
1506 { PUTPRV, "PUTPRV" },
1507 { GETPRV, "GETPRV" },
1508 { CNTPRV, "CNTPRV" },
1509 { 0, NULL },
1510};
1511
1512
Roland McGrathd9f816f2004-09-04 03:39:20 +00001513static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001514 { P_OWNER, "P_OWNER" },
1515 { P_AUDIT, "P_AUDIT" },
1516 { P_COMPAT, "P_COMPAT" },
1517 { P_DACREAD, "P_DACREAD" },
1518 { P_DACWRITE, "P_DACWRITE" },
1519 { P_DEV, "P_DEV" },
1520 { P_FILESYS, "P_FILESYS" },
1521 { P_MACREAD, "P_MACREAD" },
1522 { P_MACWRITE, "P_MACWRITE" },
1523 { P_MOUNT, "P_MOUNT" },
1524 { P_MULTIDIR, "P_MULTIDIR" },
1525 { P_SETPLEVEL, "P_SETPLEVEL" },
1526 { P_SETSPRIV, "P_SETSPRIV" },
1527 { P_SETUID, "P_SETUID" },
1528 { P_SYSOPS, "P_SYSOPS" },
1529 { P_SETUPRIV, "P_SETUPRIV" },
1530 { P_DRIVER, "P_DRIVER" },
1531 { P_RTIME, "P_RTIME" },
1532 { P_MACUPGRADE, "P_MACUPGRADE" },
1533 { P_FSYSRANGE, "P_FSYSRANGE" },
1534 { P_SETFLEVEL, "P_SETFLEVEL" },
1535 { P_AUDITWR, "P_AUDITWR" },
1536 { P_TSHAR, "P_TSHAR" },
1537 { P_PLOCK, "P_PLOCK" },
1538 { P_CORE, "P_CORE" },
1539 { P_LOADMOD, "P_LOADMOD" },
1540 { P_BIND, "P_BIND" },
1541 { P_ALLPRIVS, "P_ALLPRIVS" },
1542 { 0, NULL },
1543};
1544
1545
Roland McGrathd9f816f2004-09-04 03:39:20 +00001546static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001547 { PS_FIX, "PS_FIX" },
1548 { PS_INH, "PS_INH" },
1549 { PS_MAX, "PS_MAX" },
1550 { PS_WKG, "PS_WKG" },
1551 { 0, NULL },
1552};
1553
1554
1555static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001556printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001557{
1558 priv_t buf [128];
1559 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1560 int dots = len > max;
1561 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001562
John Hughesc61eb3d2002-05-17 11:37:50 +00001563 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001564
John Hughesc61eb3d2002-05-17 11:37:50 +00001565 if (len <= 0 ||
1566 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1567 {
1568 tprintf ("%#lx", addr);
1569 return;
1570 }
1571
1572 tprintf ("[");
1573
1574 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001575 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001576
1577 if (i) tprintf (", ");
1578
1579 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1580 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1581 {
1582 tprintf ("%s|%s", t, p);
1583 }
1584 else {
1585 tprintf ("%#lx", buf [i]);
1586 }
1587 }
1588
1589 if (dots) tprintf (" ...");
1590
1591 tprintf ("]");
1592}
1593
1594
1595int
1596sys_procpriv(tcp)
1597struct tcb *tcp;
1598{
1599 if (entering(tcp)) {
1600 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1601 switch (tcp->u_arg[0]) {
1602 case CNTPRV:
1603 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1604 break;
1605
1606 case GETPRV:
1607 break;
1608
1609 default:
1610 tprintf (", ");
1611 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1612 tprintf (", %ld", tcp->u_arg[2]);
1613 }
1614 }
1615 else if (tcp->u_arg[0] == GETPRV) {
1616 if (syserror (tcp)) {
1617 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1618 }
1619 else {
1620 tprintf (", ");
1621 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1622 tprintf (", %ld", tcp->u_arg[2]);
1623 }
1624 }
Roland McGrath5a223472002-12-15 23:58:26 +00001625
John Hughesc61eb3d2002-05-17 11:37:50 +00001626 return 0;
1627}
1628
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001629#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001630
1631
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001632static void
1633printargv(tcp, addr)
1634struct tcb *tcp;
1635long addr;
1636{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001637 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001638 unsigned int p32;
1639 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001640 char data[sizeof(long)];
1641 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001642 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001643 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001644
Roland McGrath85a3bc42007-08-02 02:13:05 +00001645 cp.p64 = 1;
1646 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1647 if (umoven(tcp, addr, personality_wordsize[current_personality],
1648 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001649 tprintf("%#lx", addr);
1650 return;
1651 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001652 if (personality_wordsize[current_personality] == 4)
1653 cp.p64 = cp.p32;
1654 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001655 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001656 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001657 printstr(tcp, cp.p64, -1);
1658 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001659 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001660 if (cp.p64)
1661 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001662}
1663
1664static void
1665printargc(fmt, tcp, addr)
1666char *fmt;
1667struct tcb *tcp;
1668long addr;
1669{
1670 int count;
1671 char *cp;
1672
1673 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1674 addr += sizeof(char *);
1675 }
1676 tprintf(fmt, count, count == 1 ? "" : "s");
1677}
1678
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001679#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001680int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001681sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001682{
1683 if (entering(tcp)) {
1684 printpath(tcp, tcp->u_arg[0]);
1685 if (!verbose(tcp))
1686 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001687 else {
1688 tprintf(", [");
1689 printargv(tcp, tcp->u_arg[1]);
1690 tprintf("]");
1691 }
1692 }
1693 return 0;
1694}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001695#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001696
1697int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001698sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001699{
1700 if (entering(tcp)) {
1701 printpath(tcp, tcp->u_arg[0]);
1702 if (!verbose(tcp))
1703 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001704 else {
1705 tprintf(", [");
1706 printargv(tcp, tcp->u_arg[1]);
1707 tprintf("]");
1708 }
1709 if (!verbose(tcp))
1710 tprintf(", %#lx", tcp->u_arg[2]);
1711 else if (abbrev(tcp))
1712 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1713 else {
1714 tprintf(", [");
1715 printargv(tcp, tcp->u_arg[2]);
1716 tprintf("]");
1717 }
1718 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001719 return 0;
1720}
1721
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001722#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001723
1724int sys_rexecve(tcp)
1725struct tcb *tcp;
1726{
1727 if (entering (tcp)) {
1728 sys_execve (tcp);
1729 tprintf (", %ld", tcp->u_arg[3]);
1730 }
1731 return 0;
1732}
1733
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001734#endif
John Hughes4e36a812001-04-18 15:11:51 +00001735
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001736int
1737internal_exec(tcp)
1738struct tcb *tcp;
1739{
1740#ifdef SUNOS4
1741 if (exiting(tcp) && !syserror(tcp) && followfork)
1742 fixvfork(tcp);
1743#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001744#if defined LINUX && defined TCB_WAITEXECVE
1745 if (exiting(tcp) && syserror(tcp))
1746 tcp->flags &= ~TCB_WAITEXECVE;
1747 else
1748 tcp->flags |= TCB_WAITEXECVE;
1749#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001750 return 0;
1751}
1752
1753#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001754#ifndef __WNOTHREAD
1755#define __WNOTHREAD 0x20000000
1756#endif
1757#ifndef __WALL
1758#define __WALL 0x40000000
1759#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001760#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001761#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001762#endif
1763#endif /* LINUX */
1764
Roland McGrathd9f816f2004-09-04 03:39:20 +00001765static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001766 { WNOHANG, "WNOHANG" },
1767#ifndef WSTOPPED
1768 { WUNTRACED, "WUNTRACED" },
1769#endif
1770#ifdef WEXITED
1771 { WEXITED, "WEXITED" },
1772#endif
1773#ifdef WTRAPPED
1774 { WTRAPPED, "WTRAPPED" },
1775#endif
1776#ifdef WSTOPPED
1777 { WSTOPPED, "WSTOPPED" },
1778#endif
1779#ifdef WCONTINUED
1780 { WCONTINUED, "WCONTINUED" },
1781#endif
1782#ifdef WNOWAIT
1783 { WNOWAIT, "WNOWAIT" },
1784#endif
1785#ifdef __WCLONE
1786 { __WCLONE, "__WCLONE" },
1787#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001788#ifdef __WALL
1789 { __WALL, "__WALL" },
1790#endif
1791#ifdef __WNOTHREAD
1792 { __WNOTHREAD, "__WNOTHREAD" },
1793#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001794 { 0, NULL },
1795};
1796
Roland McGrath5e02a572004-10-19 23:33:47 +00001797#if !defined WCOREFLAG && defined WCOREFLG
1798# define WCOREFLAG WCOREFLG
1799#endif
1800#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001801# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001802#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001803#ifndef WCOREDUMP
1804# define WCOREDUMP(status) ((status) & 0200)
1805#endif
1806
Roland McGrath5e02a572004-10-19 23:33:47 +00001807
1808#ifndef W_STOPCODE
1809#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1810#endif
1811#ifndef W_EXITCODE
1812#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1813#endif
1814
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001815static int
1816printstatus(status)
1817int status;
1818{
1819 int exited = 0;
1820
1821 /*
1822 * Here is a tricky presentation problem. This solution
1823 * is still not entirely satisfactory but since there
1824 * are no wait status constructors it will have to do.
1825 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001826 if (WIFSTOPPED(status)) {
1827 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001828 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001829 status &= ~W_STOPCODE(WSTOPSIG(status));
1830 }
1831 else if (WIFSIGNALED(status)) {
1832 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001833 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001834 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001835 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1836 }
1837 else if (WIFEXITED(status)) {
1838 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001839 WEXITSTATUS(status));
1840 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001841 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001842 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001843 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001844 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001845 return 0;
1846 }
1847
1848 if (status == 0)
1849 tprintf("]");
1850 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001851 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001852
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001853 return exited;
1854}
1855
1856static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001857printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001858{
1859 int status;
1860 int exited = 0;
1861
1862 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001863#ifdef LINUX
1864 /* On Linux, kernel-side pid_t is typedef'ed to int
1865 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001866 * pid argument to int on 64bit arches, producing,
1867 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001868 * in strace. We have to use int here, not long.
1869 */
1870 int pid = tcp->u_arg[0];
1871 tprintf("%d, ", pid);
1872#else
1873 /*
1874 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001875 */
1876 long pid = tcp->u_arg[0];
1877 if (personality_wordsize[current_personality] < sizeof pid)
1878 pid = (long) (int) pid;
1879 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001880#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001881 } else {
1882 /* status */
1883 if (!tcp->u_arg[1])
1884 tprintf("NULL");
1885 else if (syserror(tcp) || tcp->u_rval == 0)
1886 tprintf("%#lx", tcp->u_arg[1]);
1887 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1888 tprintf("[?]");
1889 else
1890 exited = printstatus(status);
1891 /* options */
1892 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001893 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001894 if (n == 4) {
1895 tprintf(", ");
1896 /* usage */
1897 if (!tcp->u_arg[3])
1898 tprintf("NULL");
1899#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001900 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001901#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001902 if (bitness)
1903 printrusage32(tcp, tcp->u_arg[3]);
1904 else
1905#endif
1906 printrusage(tcp, tcp->u_arg[3]);
1907 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001908#endif /* LINUX */
1909#ifdef SUNOS4
1910 else if (tcp->u_rval > 0 && exited)
1911 printrusage(tcp, tcp->u_arg[3]);
1912#endif /* SUNOS4 */
1913 else
1914 tprintf("%#lx", tcp->u_arg[3]);
1915 }
1916 }
1917 return 0;
1918}
1919
1920int
Roland McGrathc74c0b72004-09-01 19:39:46 +00001921internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001922struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00001923int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001924{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001925 int got_kids;
1926
1927#ifdef TCB_CLONE_THREAD
1928 if (tcp->flags & TCB_CLONE_THREAD)
1929 /* The children we wait for are our parent's children. */
1930 got_kids = (tcp->parent->nchildren
Wang Chao21b8db42010-08-27 17:43:16 +08001931 > tcp->parent->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001932 else
Wang Chao21b8db42010-08-27 17:43:16 +08001933 got_kids = (tcp->nchildren > tcp->nclone_threads);
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001934#else
1935 got_kids = tcp->nchildren > 0;
1936#endif
1937
1938 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001939 /* There are children that this parent should block for.
1940 But ptrace made us the parent of the traced children
1941 and the real parent will get ECHILD from the wait call.
1942
1943 XXX If we attached with strace -f -p PID, then there
1944 may be untraced dead children the parent could be reaping
1945 now, but we make him block. */
1946
1947 /* ??? WTA: fix bug with hanging children */
1948
Roland McGrathc74c0b72004-09-01 19:39:46 +00001949 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001950 /*
1951 * There are traced children. We'll make the parent
1952 * block to avoid a false ECHILD error due to our
1953 * ptrace having stolen the children. However,
1954 * we shouldn't block if there are zombies to reap.
1955 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1956 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001957 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001958 if (tcp->nzombies > 0 &&
1959 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001960 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001961 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001962 if (tcp->u_arg[0] > 0) {
1963 /*
1964 * If the parent waits for a specified child
1965 * PID, then it must get ECHILD right away
1966 * if that PID is not one of its children.
1967 * Make sure that the requested PID matches
1968 * one of the parent's children that we are
1969 * tracing, and don't suspend it otherwise.
1970 */
1971 if (child == NULL)
1972 child = pid2tcb(tcp->u_arg[0]);
1973 if (child == NULL || child->parent != (
1974#ifdef TCB_CLONE_THREAD
1975 (tcp->flags & TCB_CLONE_THREAD)
1976 ? tcp->parent :
1977#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00001978 tcp) ||
1979 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00001980 return 0;
1981 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001982 tcp->flags |= TCB_SUSPENDED;
1983 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001984#ifdef TCB_CLONE_THREAD
1985 if (tcp->flags & TCB_CLONE_THREAD)
1986 tcp->parent->nclone_waiting++;
1987#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001988 }
1989 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001990 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00001991 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001992 /* We must force a fake result of 0 instead of
1993 the ECHILD error. */
Roland McGrathb69f81b2002-12-21 23:25:18 +00001994 return force_result(tcp, 0, 0);
1995 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00001996 }
Roland McGrath09623452003-05-23 02:27:13 +00001997 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
1998 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
1999 /*
2000 * We just reaped a child we don't know about,
2001 * presumably a zombie we already droptcb'd.
2002 */
2003 tcp->nzombies--;
2004 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002005 return 0;
2006}
2007
2008#ifdef SVR4
2009
2010int
2011sys_wait(tcp)
2012struct tcb *tcp;
2013{
2014 if (exiting(tcp)) {
2015 /* The library wrapper stuffs this into the user variable. */
2016 if (!syserror(tcp))
2017 printstatus(getrval2(tcp));
2018 }
2019 return 0;
2020}
2021
2022#endif /* SVR4 */
2023
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002024#ifdef FREEBSD
2025int
2026sys_wait(tcp)
2027struct tcb *tcp;
2028{
2029 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002030
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002031 if (exiting(tcp)) {
2032 if (!syserror(tcp)) {
2033 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2034 tprintf("%#lx", tcp->u_arg[0]);
2035 else
2036 printstatus(status);
2037 }
2038 }
2039 return 0;
2040}
2041#endif
2042
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002043int
2044sys_waitpid(tcp)
2045struct tcb *tcp;
2046{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002047 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002048}
2049
2050int
2051sys_wait4(tcp)
2052struct tcb *tcp;
2053{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002054 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002055}
2056
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002057#ifdef ALPHA
2058int
2059sys_osf_wait4(tcp)
2060struct tcb *tcp;
2061{
2062 return printwaitn(tcp, 4, 1);
2063}
2064#endif
2065
Roland McGrathc74c0b72004-09-01 19:39:46 +00002066#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002067
Roland McGrathd9f816f2004-09-04 03:39:20 +00002068static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002069 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002070#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002071 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002072#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002073 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002074#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002075 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002076#endif
2077#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002078 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002079#endif
2080#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002081 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002082#endif
2083#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002084 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002085#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002086 { P_ALL, "P_ALL" },
2087#ifdef P_LWPID
2088 { P_LWPID, "P_LWPID" },
2089#endif
2090 { 0, NULL },
2091};
2092
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002093int
2094sys_waitid(tcp)
2095struct tcb *tcp;
2096{
2097 siginfo_t si;
2098 int exited;
2099
2100 if (entering(tcp)) {
2101 printxval(waitid_types, tcp->u_arg[0], "P_???");
2102 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002103 }
2104 else {
2105 /* siginfo */
2106 exited = 0;
2107 if (!tcp->u_arg[2])
2108 tprintf("NULL");
2109 else if (syserror(tcp))
2110 tprintf("%#lx", tcp->u_arg[2]);
2111 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2112 tprintf("{???}");
2113 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002114 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002115 /* options */
2116 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002117 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002118 if (tcp->u_nargs > 4) {
2119 /* usage */
2120 tprintf(", ");
2121 if (!tcp->u_arg[4])
2122 tprintf("NULL");
2123 else if (tcp->u_error)
2124 tprintf("%#lx", tcp->u_arg[4]);
2125 else
2126 printrusage(tcp, tcp->u_arg[4]);
2127 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002128 }
2129 return 0;
2130}
2131
Roland McGrathc74c0b72004-09-01 19:39:46 +00002132#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002133
2134int
2135sys_alarm(tcp)
2136struct tcb *tcp;
2137{
2138 if (entering(tcp))
2139 tprintf("%lu", tcp->u_arg[0]);
2140 return 0;
2141}
2142
2143int
2144sys_uname(tcp)
2145struct tcb *tcp;
2146{
2147 struct utsname uname;
2148
2149 if (exiting(tcp)) {
2150 if (syserror(tcp) || !verbose(tcp))
2151 tprintf("%#lx", tcp->u_arg[0]);
2152 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2153 tprintf("{...}");
2154 else if (!abbrev(tcp)) {
2155
2156 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2157 uname.sysname, uname.nodename);
2158 tprintf("release=\"%s\", version=\"%s\", ",
2159 uname.release, uname.version);
2160 tprintf("machine=\"%s\"", uname.machine);
2161#ifdef LINUX
2162#ifndef __GLIBC__
2163 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002164#endif
2165#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002166 tprintf("}");
2167 }
2168 else
2169 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2170 uname.sysname, uname.nodename);
2171 }
2172 return 0;
2173}
2174
2175#ifndef SVR4
2176
Roland McGratheb9e2e82009-06-02 16:49:22 -07002177static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002178# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002179 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2180 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2181 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2182 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2183 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2184 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2185 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2186 { PTRACE_CONT, "PTRACE_CONT" },
2187 { PTRACE_KILL, "PTRACE_KILL" },
2188 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2189 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2190 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002191# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002192 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002193# endif
2194# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002195 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002196# endif
2197# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002198 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002199# endif
2200# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002201 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002202# endif
2203# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002204 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002205# endif
2206# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002207 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002208# endif
2209# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002210 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002211# endif
2212# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002213 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002214# endif
2215# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002216 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002217# endif
2218# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002219 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002220# endif
2221# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002222 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002223# endif
2224# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002225 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002226# endif
2227# ifdef PTRACE_SET_SYSCALL
2228 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2229# endif
2230# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002231 { PTRACE_READDATA, "PTRACE_READDATA" },
2232 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2233 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2234 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2235 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2236 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002237# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002238 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2239 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002240# else /* !SPARC */
2241 { PTRACE_22, "PTRACE_22" },
2242 { PTRACE_23, "PTRACE_3" },
2243# endif /* !SPARC */
2244# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002245 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002246# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002247 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002248# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002249 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2250 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2251 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002252# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002253 { PTRACE_26, "PTRACE_26" },
2254 { PTRACE_27, "PTRACE_27" },
2255 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002256# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002257 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002258# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002259
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002260# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002261
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002262 { PT_TRACE_ME, "PT_TRACE_ME" },
2263 { PT_READ_I, "PT_READ_I" },
2264 { PT_READ_D, "PT_READ_D" },
2265 { PT_WRITE_I, "PT_WRITE_I" },
2266 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002267# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002268 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002269# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002270 { PT_CONTINUE, "PT_CONTINUE" },
2271 { PT_KILL, "PT_KILL" },
2272 { PT_STEP, "PT_STEP" },
2273 { PT_ATTACH, "PT_ATTACH" },
2274 { PT_DETACH, "PT_DETACH" },
2275 { PT_GETREGS, "PT_GETREGS" },
2276 { PT_SETREGS, "PT_SETREGS" },
2277 { PT_GETFPREGS, "PT_GETFPREGS" },
2278 { PT_SETFPREGS, "PT_SETFPREGS" },
2279 { PT_GETDBREGS, "PT_GETDBREGS" },
2280 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002281# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002282 { 0, NULL },
2283};
2284
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002285# ifndef FREEBSD
2286# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002287static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002288# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002289 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002290# endif
2291# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002292 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002293# endif
2294# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002295 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002296# endif
2297# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002298 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002299# endif
2300# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002301 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002302# endif
2303# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002304 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002305# endif
2306# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002307 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002308# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002309 { 0, NULL },
2310};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002311# endif /* PTRACE_SETOPTIONS */
2312# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002313
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002314# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002315const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002316# ifdef LINUX
2317# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002318 { PT_PSWMASK, "psw_mask" },
2319 { PT_PSWADDR, "psw_addr" },
2320 { PT_GPR0, "gpr0" },
2321 { PT_GPR1, "gpr1" },
2322 { PT_GPR2, "gpr2" },
2323 { PT_GPR3, "gpr3" },
2324 { PT_GPR4, "gpr4" },
2325 { PT_GPR5, "gpr5" },
2326 { PT_GPR6, "gpr6" },
2327 { PT_GPR7, "gpr7" },
2328 { PT_GPR8, "gpr8" },
2329 { PT_GPR9, "gpr9" },
2330 { PT_GPR10, "gpr10" },
2331 { PT_GPR11, "gpr11" },
2332 { PT_GPR12, "gpr12" },
2333 { PT_GPR13, "gpr13" },
2334 { PT_GPR14, "gpr14" },
2335 { PT_GPR15, "gpr15" },
2336 { PT_ACR0, "acr0" },
2337 { PT_ACR1, "acr1" },
2338 { PT_ACR2, "acr2" },
2339 { PT_ACR3, "acr3" },
2340 { PT_ACR4, "acr4" },
2341 { PT_ACR5, "acr5" },
2342 { PT_ACR6, "acr6" },
2343 { PT_ACR7, "acr7" },
2344 { PT_ACR8, "acr8" },
2345 { PT_ACR9, "acr9" },
2346 { PT_ACR10, "acr10" },
2347 { PT_ACR11, "acr11" },
2348 { PT_ACR12, "acr12" },
2349 { PT_ACR13, "acr13" },
2350 { PT_ACR14, "acr14" },
2351 { PT_ACR15, "acr15" },
2352 { PT_ORIGGPR2, "orig_gpr2" },
2353 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002354# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002355 { PT_FPR0_HI, "fpr0.hi" },
2356 { PT_FPR0_LO, "fpr0.lo" },
2357 { PT_FPR1_HI, "fpr1.hi" },
2358 { PT_FPR1_LO, "fpr1.lo" },
2359 { PT_FPR2_HI, "fpr2.hi" },
2360 { PT_FPR2_LO, "fpr2.lo" },
2361 { PT_FPR3_HI, "fpr3.hi" },
2362 { PT_FPR3_LO, "fpr3.lo" },
2363 { PT_FPR4_HI, "fpr4.hi" },
2364 { PT_FPR4_LO, "fpr4.lo" },
2365 { PT_FPR5_HI, "fpr5.hi" },
2366 { PT_FPR5_LO, "fpr5.lo" },
2367 { PT_FPR6_HI, "fpr6.hi" },
2368 { PT_FPR6_LO, "fpr6.lo" },
2369 { PT_FPR7_HI, "fpr7.hi" },
2370 { PT_FPR7_LO, "fpr7.lo" },
2371 { PT_FPR8_HI, "fpr8.hi" },
2372 { PT_FPR8_LO, "fpr8.lo" },
2373 { PT_FPR9_HI, "fpr9.hi" },
2374 { PT_FPR9_LO, "fpr9.lo" },
2375 { PT_FPR10_HI, "fpr10.hi" },
2376 { PT_FPR10_LO, "fpr10.lo" },
2377 { PT_FPR11_HI, "fpr11.hi" },
2378 { PT_FPR11_LO, "fpr11.lo" },
2379 { PT_FPR12_HI, "fpr12.hi" },
2380 { PT_FPR12_LO, "fpr12.lo" },
2381 { PT_FPR13_HI, "fpr13.hi" },
2382 { PT_FPR13_LO, "fpr13.lo" },
2383 { PT_FPR14_HI, "fpr14.hi" },
2384 { PT_FPR14_LO, "fpr14.lo" },
2385 { PT_FPR15_HI, "fpr15.hi" },
2386 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002387# endif
2388# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002389 { PT_FPR0, "fpr0" },
2390 { PT_FPR1, "fpr1" },
2391 { PT_FPR2, "fpr2" },
2392 { PT_FPR3, "fpr3" },
2393 { PT_FPR4, "fpr4" },
2394 { PT_FPR5, "fpr5" },
2395 { PT_FPR6, "fpr6" },
2396 { PT_FPR7, "fpr7" },
2397 { PT_FPR8, "fpr8" },
2398 { PT_FPR9, "fpr9" },
2399 { PT_FPR10, "fpr10" },
2400 { PT_FPR11, "fpr11" },
2401 { PT_FPR12, "fpr12" },
2402 { PT_FPR13, "fpr13" },
2403 { PT_FPR14, "fpr14" },
2404 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002405# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002406 { PT_CR_9, "cr9" },
2407 { PT_CR_10, "cr10" },
2408 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002409 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002410# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002411 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002412# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002413 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002414# elif defined(POWERPC)
2415# ifndef PT_ORIG_R3
2416# define PT_ORIG_R3 34
2417# endif
2418# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002419 { REGSIZE*PT_R0, "r0" },
2420 { REGSIZE*PT_R1, "r1" },
2421 { REGSIZE*PT_R2, "r2" },
2422 { REGSIZE*PT_R3, "r3" },
2423 { REGSIZE*PT_R4, "r4" },
2424 { REGSIZE*PT_R5, "r5" },
2425 { REGSIZE*PT_R6, "r6" },
2426 { REGSIZE*PT_R7, "r7" },
2427 { REGSIZE*PT_R8, "r8" },
2428 { REGSIZE*PT_R9, "r9" },
2429 { REGSIZE*PT_R10, "r10" },
2430 { REGSIZE*PT_R11, "r11" },
2431 { REGSIZE*PT_R12, "r12" },
2432 { REGSIZE*PT_R13, "r13" },
2433 { REGSIZE*PT_R14, "r14" },
2434 { REGSIZE*PT_R15, "r15" },
2435 { REGSIZE*PT_R16, "r16" },
2436 { REGSIZE*PT_R17, "r17" },
2437 { REGSIZE*PT_R18, "r18" },
2438 { REGSIZE*PT_R19, "r19" },
2439 { REGSIZE*PT_R20, "r20" },
2440 { REGSIZE*PT_R21, "r21" },
2441 { REGSIZE*PT_R22, "r22" },
2442 { REGSIZE*PT_R23, "r23" },
2443 { REGSIZE*PT_R24, "r24" },
2444 { REGSIZE*PT_R25, "r25" },
2445 { REGSIZE*PT_R26, "r26" },
2446 { REGSIZE*PT_R27, "r27" },
2447 { REGSIZE*PT_R28, "r28" },
2448 { REGSIZE*PT_R29, "r29" },
2449 { REGSIZE*PT_R30, "r30" },
2450 { REGSIZE*PT_R31, "r31" },
2451 { REGSIZE*PT_NIP, "NIP" },
2452 { REGSIZE*PT_MSR, "MSR" },
2453 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2454 { REGSIZE*PT_CTR, "CTR" },
2455 { REGSIZE*PT_LNK, "LNK" },
2456 { REGSIZE*PT_XER, "XER" },
2457 { REGSIZE*PT_CCR, "CCR" },
2458 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002459# undef REGSIZE
2460# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002461 { 0, "r0" },
2462 { 1, "r1" },
2463 { 2, "r2" },
2464 { 3, "r3" },
2465 { 4, "r4" },
2466 { 5, "r5" },
2467 { 6, "r6" },
2468 { 7, "r7" },
2469 { 8, "r8" },
2470 { 9, "r9" },
2471 { 10, "r10" },
2472 { 11, "r11" },
2473 { 12, "r12" },
2474 { 13, "r13" },
2475 { 14, "r14" },
2476 { 15, "r15" },
2477 { 16, "r16" },
2478 { 17, "r17" },
2479 { 18, "r18" },
2480 { 19, "r19" },
2481 { 20, "r20" },
2482 { 21, "r21" },
2483 { 22, "r22" },
2484 { 23, "r23" },
2485 { 24, "r24" },
2486 { 25, "r25" },
2487 { 26, "r26" },
2488 { 27, "r27" },
2489 { 28, "r28" },
2490 { 29, "gp" },
2491 { 30, "fp" },
2492 { 31, "zero" },
2493 { 32, "fp0" },
2494 { 33, "fp" },
2495 { 34, "fp2" },
2496 { 35, "fp3" },
2497 { 36, "fp4" },
2498 { 37, "fp5" },
2499 { 38, "fp6" },
2500 { 39, "fp7" },
2501 { 40, "fp8" },
2502 { 41, "fp9" },
2503 { 42, "fp10" },
2504 { 43, "fp11" },
2505 { 44, "fp12" },
2506 { 45, "fp13" },
2507 { 46, "fp14" },
2508 { 47, "fp15" },
2509 { 48, "fp16" },
2510 { 49, "fp17" },
2511 { 50, "fp18" },
2512 { 51, "fp19" },
2513 { 52, "fp20" },
2514 { 53, "fp21" },
2515 { 54, "fp22" },
2516 { 55, "fp23" },
2517 { 56, "fp24" },
2518 { 57, "fp25" },
2519 { 58, "fp26" },
2520 { 59, "fp27" },
2521 { 60, "fp28" },
2522 { 61, "fp29" },
2523 { 62, "fp30" },
2524 { 63, "fp31" },
2525 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002526# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002527 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2528 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2529 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2530 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2531 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2532 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2533 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2534 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2535 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2536 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2537 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2538 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2539 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2540 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2541 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2542 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2543 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2544 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2545 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2546 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2547 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2548 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2549 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2550 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2551 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2552 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2553 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2554 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2555 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2556 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2557 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2558 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2559 /* switch stack: */
2560 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2561 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2562 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2563 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2564 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2565 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2566 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2567 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2568 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2569 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002570 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2571 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002572 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002573 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002574 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2575 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002576 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2577 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2578 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2579 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2580 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2581 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2582 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2583 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2584 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2585 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2586 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2587 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2588 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2589 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2590 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002591# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002592 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002593# endif
2594# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002595 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002596# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002597 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002598# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002599 { 4*EBX, "4*EBX" },
2600 { 4*ECX, "4*ECX" },
2601 { 4*EDX, "4*EDX" },
2602 { 4*ESI, "4*ESI" },
2603 { 4*EDI, "4*EDI" },
2604 { 4*EBP, "4*EBP" },
2605 { 4*EAX, "4*EAX" },
2606 { 4*DS, "4*DS" },
2607 { 4*ES, "4*ES" },
2608 { 4*FS, "4*FS" },
2609 { 4*GS, "4*GS" },
2610 { 4*ORIG_EAX, "4*ORIG_EAX" },
2611 { 4*EIP, "4*EIP" },
2612 { 4*CS, "4*CS" },
2613 { 4*EFL, "4*EFL" },
2614 { 4*UESP, "4*UESP" },
2615 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002616# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002617 { 8*R15, "8*R15" },
2618 { 8*R14, "8*R14" },
2619 { 8*R13, "8*R13" },
2620 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002621 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002622 { 8*RBX, "8*RBX" },
2623 { 8*R11, "8*R11" },
2624 { 8*R10, "8*R10" },
2625 { 8*R9, "8*R9" },
2626 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002627 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002628 { 8*RCX, "8*RCX" },
2629 { 8*RDX, "8*RDX" },
2630 { 8*RSI, "8*RSI" },
2631 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002632 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002633 { 8*RIP, "8*RIP" },
2634 { 8*CS, "8*CS" },
2635 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002636 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002637 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002638# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002639 { 4*PT_D1, "4*PT_D1" },
2640 { 4*PT_D2, "4*PT_D2" },
2641 { 4*PT_D3, "4*PT_D3" },
2642 { 4*PT_D4, "4*PT_D4" },
2643 { 4*PT_D5, "4*PT_D5" },
2644 { 4*PT_D6, "4*PT_D6" },
2645 { 4*PT_D7, "4*PT_D7" },
2646 { 4*PT_A0, "4*PT_A0" },
2647 { 4*PT_A1, "4*PT_A1" },
2648 { 4*PT_A2, "4*PT_A2" },
2649 { 4*PT_A3, "4*PT_A3" },
2650 { 4*PT_A4, "4*PT_A4" },
2651 { 4*PT_A5, "4*PT_A5" },
2652 { 4*PT_A6, "4*PT_A6" },
2653 { 4*PT_D0, "4*PT_D0" },
2654 { 4*PT_USP, "4*PT_USP" },
2655 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2656 { 4*PT_SR, "4*PT_SR" },
2657 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002658# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002659 { 4*REG_REG0, "4*REG_REG0" },
2660 { 4*(REG_REG0+1), "4*REG_REG1" },
2661 { 4*(REG_REG0+2), "4*REG_REG2" },
2662 { 4*(REG_REG0+3), "4*REG_REG3" },
2663 { 4*(REG_REG0+4), "4*REG_REG4" },
2664 { 4*(REG_REG0+5), "4*REG_REG5" },
2665 { 4*(REG_REG0+6), "4*REG_REG6" },
2666 { 4*(REG_REG0+7), "4*REG_REG7" },
2667 { 4*(REG_REG0+8), "4*REG_REG8" },
2668 { 4*(REG_REG0+9), "4*REG_REG9" },
2669 { 4*(REG_REG0+10), "4*REG_REG10" },
2670 { 4*(REG_REG0+11), "4*REG_REG11" },
2671 { 4*(REG_REG0+12), "4*REG_REG12" },
2672 { 4*(REG_REG0+13), "4*REG_REG13" },
2673 { 4*(REG_REG0+14), "4*REG_REG14" },
2674 { 4*REG_REG15, "4*REG_REG15" },
2675 { 4*REG_PC, "4*REG_PC" },
2676 { 4*REG_PR, "4*REG_PR" },
2677 { 4*REG_SR, "4*REG_SR" },
2678 { 4*REG_GBR, "4*REG_GBR" },
2679 { 4*REG_MACH, "4*REG_MACH" },
2680 { 4*REG_MACL, "4*REG_MACL" },
2681 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2682 { 4*REG_FPUL, "4*REG_FPUL" },
2683 { 4*REG_FPREG0, "4*REG_FPREG0" },
2684 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2685 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2686 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2687 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2688 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2689 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2690 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2691 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2692 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2693 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2694 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2695 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2696 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2697 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2698 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002699# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002700 { 4*REG_XDREG0, "4*REG_XDREG0" },
2701 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2702 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2703 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2704 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2705 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2706 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2707 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002708# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002709 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002710# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002711 { 0, "PC(L)" },
2712 { 4, "PC(U)" },
2713 { 8, "SR(L)" },
2714 { 12, "SR(U)" },
2715 { 16, "syscall no.(L)" },
2716 { 20, "syscall_no.(U)" },
2717 { 24, "R0(L)" },
2718 { 28, "R0(U)" },
2719 { 32, "R1(L)" },
2720 { 36, "R1(U)" },
2721 { 40, "R2(L)" },
2722 { 44, "R2(U)" },
2723 { 48, "R3(L)" },
2724 { 52, "R3(U)" },
2725 { 56, "R4(L)" },
2726 { 60, "R4(U)" },
2727 { 64, "R5(L)" },
2728 { 68, "R5(U)" },
2729 { 72, "R6(L)" },
2730 { 76, "R6(U)" },
2731 { 80, "R7(L)" },
2732 { 84, "R7(U)" },
2733 { 88, "R8(L)" },
2734 { 92, "R8(U)" },
2735 { 96, "R9(L)" },
2736 { 100, "R9(U)" },
2737 { 104, "R10(L)" },
2738 { 108, "R10(U)" },
2739 { 112, "R11(L)" },
2740 { 116, "R11(U)" },
2741 { 120, "R12(L)" },
2742 { 124, "R12(U)" },
2743 { 128, "R13(L)" },
2744 { 132, "R13(U)" },
2745 { 136, "R14(L)" },
2746 { 140, "R14(U)" },
2747 { 144, "R15(L)" },
2748 { 148, "R15(U)" },
2749 { 152, "R16(L)" },
2750 { 156, "R16(U)" },
2751 { 160, "R17(L)" },
2752 { 164, "R17(U)" },
2753 { 168, "R18(L)" },
2754 { 172, "R18(U)" },
2755 { 176, "R19(L)" },
2756 { 180, "R19(U)" },
2757 { 184, "R20(L)" },
2758 { 188, "R20(U)" },
2759 { 192, "R21(L)" },
2760 { 196, "R21(U)" },
2761 { 200, "R22(L)" },
2762 { 204, "R22(U)" },
2763 { 208, "R23(L)" },
2764 { 212, "R23(U)" },
2765 { 216, "R24(L)" },
2766 { 220, "R24(U)" },
2767 { 224, "R25(L)" },
2768 { 228, "R25(U)" },
2769 { 232, "R26(L)" },
2770 { 236, "R26(U)" },
2771 { 240, "R27(L)" },
2772 { 244, "R27(U)" },
2773 { 248, "R28(L)" },
2774 { 252, "R28(U)" },
2775 { 256, "R29(L)" },
2776 { 260, "R29(U)" },
2777 { 264, "R30(L)" },
2778 { 268, "R30(U)" },
2779 { 272, "R31(L)" },
2780 { 276, "R31(U)" },
2781 { 280, "R32(L)" },
2782 { 284, "R32(U)" },
2783 { 288, "R33(L)" },
2784 { 292, "R33(U)" },
2785 { 296, "R34(L)" },
2786 { 300, "R34(U)" },
2787 { 304, "R35(L)" },
2788 { 308, "R35(U)" },
2789 { 312, "R36(L)" },
2790 { 316, "R36(U)" },
2791 { 320, "R37(L)" },
2792 { 324, "R37(U)" },
2793 { 328, "R38(L)" },
2794 { 332, "R38(U)" },
2795 { 336, "R39(L)" },
2796 { 340, "R39(U)" },
2797 { 344, "R40(L)" },
2798 { 348, "R40(U)" },
2799 { 352, "R41(L)" },
2800 { 356, "R41(U)" },
2801 { 360, "R42(L)" },
2802 { 364, "R42(U)" },
2803 { 368, "R43(L)" },
2804 { 372, "R43(U)" },
2805 { 376, "R44(L)" },
2806 { 380, "R44(U)" },
2807 { 384, "R45(L)" },
2808 { 388, "R45(U)" },
2809 { 392, "R46(L)" },
2810 { 396, "R46(U)" },
2811 { 400, "R47(L)" },
2812 { 404, "R47(U)" },
2813 { 408, "R48(L)" },
2814 { 412, "R48(U)" },
2815 { 416, "R49(L)" },
2816 { 420, "R49(U)" },
2817 { 424, "R50(L)" },
2818 { 428, "R50(U)" },
2819 { 432, "R51(L)" },
2820 { 436, "R51(U)" },
2821 { 440, "R52(L)" },
2822 { 444, "R52(U)" },
2823 { 448, "R53(L)" },
2824 { 452, "R53(U)" },
2825 { 456, "R54(L)" },
2826 { 460, "R54(U)" },
2827 { 464, "R55(L)" },
2828 { 468, "R55(U)" },
2829 { 472, "R56(L)" },
2830 { 476, "R56(U)" },
2831 { 480, "R57(L)" },
2832 { 484, "R57(U)" },
2833 { 488, "R58(L)" },
2834 { 492, "R58(U)" },
2835 { 496, "R59(L)" },
2836 { 500, "R59(U)" },
2837 { 504, "R60(L)" },
2838 { 508, "R60(U)" },
2839 { 512, "R61(L)" },
2840 { 516, "R61(U)" },
2841 { 520, "R62(L)" },
2842 { 524, "R62(U)" },
2843 { 528, "TR0(L)" },
2844 { 532, "TR0(U)" },
2845 { 536, "TR1(L)" },
2846 { 540, "TR1(U)" },
2847 { 544, "TR2(L)" },
2848 { 548, "TR2(U)" },
2849 { 552, "TR3(L)" },
2850 { 556, "TR3(U)" },
2851 { 560, "TR4(L)" },
2852 { 564, "TR4(U)" },
2853 { 568, "TR5(L)" },
2854 { 572, "TR5(U)" },
2855 { 576, "TR6(L)" },
2856 { 580, "TR6(U)" },
2857 { 584, "TR7(L)" },
2858 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002859 /* This entry is in case pt_regs contains dregs (depends on
2860 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002861 { uoff(regs), "offsetof(struct user, regs)" },
2862 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002863# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002864 { uoff(regs.ARM_r0), "r0" },
2865 { uoff(regs.ARM_r1), "r1" },
2866 { uoff(regs.ARM_r2), "r2" },
2867 { uoff(regs.ARM_r3), "r3" },
2868 { uoff(regs.ARM_r4), "r4" },
2869 { uoff(regs.ARM_r5), "r5" },
2870 { uoff(regs.ARM_r6), "r6" },
2871 { uoff(regs.ARM_r7), "r7" },
2872 { uoff(regs.ARM_r8), "r8" },
2873 { uoff(regs.ARM_r9), "r9" },
2874 { uoff(regs.ARM_r10), "r10" },
2875 { uoff(regs.ARM_fp), "fp" },
2876 { uoff(regs.ARM_ip), "ip" },
2877 { uoff(regs.ARM_sp), "sp" },
2878 { uoff(regs.ARM_lr), "lr" },
2879 { uoff(regs.ARM_pc), "pc" },
2880 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002881# elif defined(AVR32)
2882 { uoff(regs.sr), "sr" },
2883 { uoff(regs.pc), "pc" },
2884 { uoff(regs.lr), "lr" },
2885 { uoff(regs.sp), "sp" },
2886 { uoff(regs.r12), "r12" },
2887 { uoff(regs.r11), "r11" },
2888 { uoff(regs.r10), "r10" },
2889 { uoff(regs.r9), "r9" },
2890 { uoff(regs.r8), "r8" },
2891 { uoff(regs.r7), "r7" },
2892 { uoff(regs.r6), "r6" },
2893 { uoff(regs.r5), "r5" },
2894 { uoff(regs.r4), "r4" },
2895 { uoff(regs.r3), "r3" },
2896 { uoff(regs.r2), "r2" },
2897 { uoff(regs.r1), "r1" },
2898 { uoff(regs.r0), "r0" },
2899 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002900# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002901 { 0, "r0" },
2902 { 1, "r1" },
2903 { 2, "r2" },
2904 { 3, "r3" },
2905 { 4, "r4" },
2906 { 5, "r5" },
2907 { 6, "r6" },
2908 { 7, "r7" },
2909 { 8, "r8" },
2910 { 9, "r9" },
2911 { 10, "r10" },
2912 { 11, "r11" },
2913 { 12, "r12" },
2914 { 13, "r13" },
2915 { 14, "r14" },
2916 { 15, "r15" },
2917 { 16, "r16" },
2918 { 17, "r17" },
2919 { 18, "r18" },
2920 { 19, "r19" },
2921 { 20, "r20" },
2922 { 21, "r21" },
2923 { 22, "r22" },
2924 { 23, "r23" },
2925 { 24, "r24" },
2926 { 25, "r25" },
2927 { 26, "r26" },
2928 { 27, "r27" },
2929 { 28, "r28" },
2930 { 29, "r29" },
2931 { 30, "r30" },
2932 { 31, "r31" },
2933 { 32, "f0" },
2934 { 33, "f1" },
2935 { 34, "f2" },
2936 { 35, "f3" },
2937 { 36, "f4" },
2938 { 37, "f5" },
2939 { 38, "f6" },
2940 { 39, "f7" },
2941 { 40, "f8" },
2942 { 41, "f9" },
2943 { 42, "f10" },
2944 { 43, "f11" },
2945 { 44, "f12" },
2946 { 45, "f13" },
2947 { 46, "f14" },
2948 { 47, "f15" },
2949 { 48, "f16" },
2950 { 49, "f17" },
2951 { 50, "f18" },
2952 { 51, "f19" },
2953 { 52, "f20" },
2954 { 53, "f21" },
2955 { 54, "f22" },
2956 { 55, "f23" },
2957 { 56, "f24" },
2958 { 57, "f25" },
2959 { 58, "f26" },
2960 { 59, "f27" },
2961 { 60, "f28" },
2962 { 61, "f29" },
2963 { 62, "f30" },
2964 { 63, "f31" },
2965 { 64, "pc" },
2966 { 65, "cause" },
2967 { 66, "badvaddr" },
2968 { 67, "mmhi" },
2969 { 68, "mmlo" },
2970 { 69, "fpcsr" },
2971 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002972# elif defined(TILE)
2973 { PTREGS_OFFSET_REG(0), "r0" },
2974 { PTREGS_OFFSET_REG(1), "r1" },
2975 { PTREGS_OFFSET_REG(2), "r2" },
2976 { PTREGS_OFFSET_REG(3), "r3" },
2977 { PTREGS_OFFSET_REG(4), "r4" },
2978 { PTREGS_OFFSET_REG(5), "r5" },
2979 { PTREGS_OFFSET_REG(6), "r6" },
2980 { PTREGS_OFFSET_REG(7), "r7" },
2981 { PTREGS_OFFSET_REG(8), "r8" },
2982 { PTREGS_OFFSET_REG(9), "r9" },
2983 { PTREGS_OFFSET_REG(10), "r10" },
2984 { PTREGS_OFFSET_REG(11), "r11" },
2985 { PTREGS_OFFSET_REG(12), "r12" },
2986 { PTREGS_OFFSET_REG(13), "r13" },
2987 { PTREGS_OFFSET_REG(14), "r14" },
2988 { PTREGS_OFFSET_REG(15), "r15" },
2989 { PTREGS_OFFSET_REG(16), "r16" },
2990 { PTREGS_OFFSET_REG(17), "r17" },
2991 { PTREGS_OFFSET_REG(18), "r18" },
2992 { PTREGS_OFFSET_REG(19), "r19" },
2993 { PTREGS_OFFSET_REG(20), "r20" },
2994 { PTREGS_OFFSET_REG(21), "r21" },
2995 { PTREGS_OFFSET_REG(22), "r22" },
2996 { PTREGS_OFFSET_REG(23), "r23" },
2997 { PTREGS_OFFSET_REG(24), "r24" },
2998 { PTREGS_OFFSET_REG(25), "r25" },
2999 { PTREGS_OFFSET_REG(26), "r26" },
3000 { PTREGS_OFFSET_REG(27), "r27" },
3001 { PTREGS_OFFSET_REG(28), "r28" },
3002 { PTREGS_OFFSET_REG(29), "r29" },
3003 { PTREGS_OFFSET_REG(30), "r30" },
3004 { PTREGS_OFFSET_REG(31), "r31" },
3005 { PTREGS_OFFSET_REG(32), "r32" },
3006 { PTREGS_OFFSET_REG(33), "r33" },
3007 { PTREGS_OFFSET_REG(34), "r34" },
3008 { PTREGS_OFFSET_REG(35), "r35" },
3009 { PTREGS_OFFSET_REG(36), "r36" },
3010 { PTREGS_OFFSET_REG(37), "r37" },
3011 { PTREGS_OFFSET_REG(38), "r38" },
3012 { PTREGS_OFFSET_REG(39), "r39" },
3013 { PTREGS_OFFSET_REG(40), "r40" },
3014 { PTREGS_OFFSET_REG(41), "r41" },
3015 { PTREGS_OFFSET_REG(42), "r42" },
3016 { PTREGS_OFFSET_REG(43), "r43" },
3017 { PTREGS_OFFSET_REG(44), "r44" },
3018 { PTREGS_OFFSET_REG(45), "r45" },
3019 { PTREGS_OFFSET_REG(46), "r46" },
3020 { PTREGS_OFFSET_REG(47), "r47" },
3021 { PTREGS_OFFSET_REG(48), "r48" },
3022 { PTREGS_OFFSET_REG(49), "r49" },
3023 { PTREGS_OFFSET_REG(50), "r50" },
3024 { PTREGS_OFFSET_REG(51), "r51" },
3025 { PTREGS_OFFSET_REG(52), "r52" },
3026 { PTREGS_OFFSET_TP, "tp" },
3027 { PTREGS_OFFSET_SP, "sp" },
3028 { PTREGS_OFFSET_LR, "lr" },
3029 { PTREGS_OFFSET_PC, "pc" },
3030 { PTREGS_OFFSET_EX1, "ex1" },
3031 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
3032 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
3033 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003034# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003035# ifdef CRISV10
3036 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3037 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3038 { 4*PT_R13, "4*PT_R13" },
3039 { 4*PT_R12, "4*PT_R12" },
3040 { 4*PT_R11, "4*PT_R11" },
3041 { 4*PT_R10, "4*PT_R10" },
3042 { 4*PT_R9, "4*PT_R9" },
3043 { 4*PT_R8, "4*PT_R8" },
3044 { 4*PT_R7, "4*PT_R7" },
3045 { 4*PT_R6, "4*PT_R6" },
3046 { 4*PT_R5, "4*PT_R5" },
3047 { 4*PT_R4, "4*PT_R4" },
3048 { 4*PT_R3, "4*PT_R3" },
3049 { 4*PT_R2, "4*PT_R2" },
3050 { 4*PT_R1, "4*PT_R1" },
3051 { 4*PT_R0, "4*PT_R0" },
3052 { 4*PT_MOF, "4*PT_MOF" },
3053 { 4*PT_DCCR, "4*PT_DCCR" },
3054 { 4*PT_SRP, "4*PT_SRP" },
3055 { 4*PT_IRP, "4*PT_IRP" },
3056 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3057 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3058 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3059 { 4*PT_USP, "4*PT_USP" },
3060# endif
3061# ifdef CRISV32
3062 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3063 { 4*PT_R0, "4*PT_R0" },
3064 { 4*PT_R1, "4*PT_R1" },
3065 { 4*PT_R2, "4*PT_R2" },
3066 { 4*PT_R3, "4*PT_R3" },
3067 { 4*PT_R4, "4*PT_R4" },
3068 { 4*PT_R5, "4*PT_R5" },
3069 { 4*PT_R6, "4*PT_R6" },
3070 { 4*PT_R7, "4*PT_R7" },
3071 { 4*PT_R8, "4*PT_R8" },
3072 { 4*PT_R9, "4*PT_R9" },
3073 { 4*PT_R10, "4*PT_R10" },
3074 { 4*PT_R11, "4*PT_R11" },
3075 { 4*PT_R12, "4*PT_R12" },
3076 { 4*PT_R13, "4*PT_R13" },
3077 { 4*PT_ACR, "4*PT_ACR" },
3078 { 4*PT_SRS, "4*PT_SRS" },
3079 { 4*PT_MOF, "4*PT_MOF" },
3080 { 4*PT_SPC, "4*PT_SPC" },
3081 { 4*PT_CCS, "4*PT_CCS" },
3082 { 4*PT_SRP, "4*PT_SRP" },
3083 { 4*PT_ERP, "4*PT_ERP" },
3084 { 4*PT_EXS, "4*PT_EXS" },
3085 { 4*PT_EDA, "4*PT_EDA" },
3086 { 4*PT_USP, "4*PT_USP" },
3087 { 4*PT_PPC, "4*PT_PPC" },
3088 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3089 { 4*PT_BP+4, "4*PT_BP+4" },
3090 { 4*PT_BP+8, "4*PT_BP+8" },
3091 { 4*PT_BP+12, "4*PT_BP+12" },
3092 { 4*PT_BP+16, "4*PT_BP+16" },
3093 { 4*PT_BP+20, "4*PT_BP+20" },
3094 { 4*PT_BP+24, "4*PT_BP+24" },
3095 { 4*PT_BP+28, "4*PT_BP+28" },
3096 { 4*PT_BP+32, "4*PT_BP+32" },
3097 { 4*PT_BP+36, "4*PT_BP+36" },
3098 { 4*PT_BP+40, "4*PT_BP+40" },
3099 { 4*PT_BP+44, "4*PT_BP+44" },
3100 { 4*PT_BP+48, "4*PT_BP+48" },
3101 { 4*PT_BP+52, "4*PT_BP+52" },
3102 { 4*PT_BP+56, "4*PT_BP+56" },
3103# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003104# ifdef MICROBLAZE
3105 { PT_GPR(0), "r0" },
3106 { PT_GPR(1), "r1" },
3107 { PT_GPR(2), "r2" },
3108 { PT_GPR(3), "r3" },
3109 { PT_GPR(4), "r4" },
3110 { PT_GPR(5), "r5" },
3111 { PT_GPR(6), "r6" },
3112 { PT_GPR(7), "r7" },
3113 { PT_GPR(8), "r8" },
3114 { PT_GPR(9), "r9" },
3115 { PT_GPR(10), "r10" },
3116 { PT_GPR(11), "r11" },
3117 { PT_GPR(12), "r12" },
3118 { PT_GPR(13), "r13" },
3119 { PT_GPR(14), "r14" },
3120 { PT_GPR(15), "r15" },
3121 { PT_GPR(16), "r16" },
3122 { PT_GPR(17), "r17" },
3123 { PT_GPR(18), "r18" },
3124 { PT_GPR(19), "r19" },
3125 { PT_GPR(20), "r20" },
3126 { PT_GPR(21), "r21" },
3127 { PT_GPR(22), "r22" },
3128 { PT_GPR(23), "r23" },
3129 { PT_GPR(24), "r24" },
3130 { PT_GPR(25), "r25" },
3131 { PT_GPR(26), "r26" },
3132 { PT_GPR(27), "r27" },
3133 { PT_GPR(28), "r28" },
3134 { PT_GPR(29), "r29" },
3135 { PT_GPR(30), "r30" },
3136 { PT_GPR(31), "r31" },
3137 { PT_PC, "rpc", },
3138 { PT_MSR, "rmsr", },
3139 { PT_EAR, "rear", },
3140 { PT_ESR, "resr", },
3141 { PT_FSR, "rfsr", },
3142 { PT_KERNEL_MODE, "kernel_mode", },
3143# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003144
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003145# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3146 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003147 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003148# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003149 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003150# endif
3151# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003152 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003153# endif
3154# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003155 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003156# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003157 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3158 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3159 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003160# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003161 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003162# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003163# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003164 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003165# endif
3166# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003167 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003168# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003169 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003170# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003171 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003172# endif
3173# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003174 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003175# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003176# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003177 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003178# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003179 { uoff(magic), "offsetof(struct user, magic)" },
3180 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003181# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003182 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003183# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003184# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003185
3186# endif /* LINUX */
3187
3188# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003189 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3190 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3191 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3192 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3193 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3194 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3195 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3196 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3197 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3198 { uoff(u_error), "offsetof(struct user, u_error)" },
3199 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3200 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3201 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3202 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3203 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3204 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3205 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3206 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3207 { uoff(u_code), "offsetof(struct user, u_code)" },
3208 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3209 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3210 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3211 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3212 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3213 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3214 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3215 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3216 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3217 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3218 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3219 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3220 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3221 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3222 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3223 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3224 { uoff(u_start), "offsetof(struct user, u_start)" },
3225 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3226 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3227 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3228 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3229 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3230 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3231 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3232 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3233 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003234# endif /* SUNOS4 */
3235# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003236 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003237# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003238 { 0, NULL },
3239};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003240# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003241
3242int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003243sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003244{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003245 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003246 long addr;
3247
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003248 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003249 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003250# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003251 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003252# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003253 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003254# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003255 );
3256 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003257 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003258# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003259 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3260 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3261 for (x = struct_user_offsets; x->str; x++) {
3262 if (x->val >= addr)
3263 break;
3264 }
3265 if (!x->str)
3266 tprintf("%#lx, ", addr);
3267 else if (x->val > addr && x != struct_user_offsets) {
3268 x--;
3269 tprintf("%s + %ld, ", x->str, addr - x->val);
3270 }
3271 else
3272 tprintf("%s, ", x->str);
3273 }
3274 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003275# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003276 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003277# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003278 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003279# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003280 case PTRACE_PEEKDATA:
3281 case PTRACE_PEEKTEXT:
3282 case PTRACE_PEEKUSER:
3283 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003284# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003285 case PTRACE_CONT:
3286 case PTRACE_SINGLESTEP:
3287 case PTRACE_SYSCALL:
3288 case PTRACE_DETACH:
3289 printsignal(tcp->u_arg[3]);
3290 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003291# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003292 case PTRACE_SETOPTIONS:
3293 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3294 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003295# endif
3296# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003297 case PTRACE_SETSIGINFO: {
3298 siginfo_t si;
3299 if (!tcp->u_arg[3])
3300 tprintf("NULL");
3301 else if (syserror(tcp))
3302 tprintf("%#lx", tcp->u_arg[3]);
3303 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3304 tprintf("{???}");
3305 else
3306 printsiginfo(&si, verbose(tcp));
3307 break;
3308 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003309# endif
3310# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003311 case PTRACE_GETSIGINFO:
3312 /* Don't print anything, do it at syscall return. */
3313 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003314# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003315 default:
3316 tprintf("%#lx", tcp->u_arg[3]);
3317 break;
3318 }
3319 } else {
3320 switch (tcp->u_arg[0]) {
3321 case PTRACE_PEEKDATA:
3322 case PTRACE_PEEKTEXT:
3323 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003324# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003325 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003326# else
Roland McGratheb285352003-01-14 09:59:00 +00003327 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003328 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003329# endif
3330# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003331 case PTRACE_GETSIGINFO: {
3332 siginfo_t si;
3333 if (!tcp->u_arg[3])
3334 tprintf("NULL");
3335 else if (syserror(tcp))
3336 tprintf("%#lx", tcp->u_arg[3]);
3337 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3338 tprintf("{???}");
3339 else
3340 printsiginfo(&si, verbose(tcp));
3341 break;
3342 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003343# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003344 }
3345 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003346# endif /* LINUX */
3347# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003348 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3349 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3350 tprintf("%lu, ", tcp->u_arg[3]);
3351 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3352 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3353 tcp->u_arg[0] != PTRACE_READTEXT) {
3354 tprintf("%#lx", tcp->u_arg[3]);
3355 }
3356 } else {
3357 if (tcp->u_arg[0] == PTRACE_READDATA ||
3358 tcp->u_arg[0] == PTRACE_READTEXT) {
3359 tprintf("%lu, ", tcp->u_arg[3]);
3360 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3361 }
3362 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003363# endif /* SUNOS4 */
3364# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003365 tprintf("%lu", tcp->u_arg[3]);
3366 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003367# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003368 return 0;
3369}
3370
3371#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003372
3373#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003374# ifndef FUTEX_CMP_REQUEUE
3375# define FUTEX_CMP_REQUEUE 4
3376# endif
3377# ifndef FUTEX_WAKE_OP
3378# define FUTEX_WAKE_OP 5
3379# endif
3380# ifndef FUTEX_LOCK_PI
3381# define FUTEX_LOCK_PI 6
3382# define FUTEX_UNLOCK_PI 7
3383# define FUTEX_TRYLOCK_PI 8
3384# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003385# ifndef FUTEX_WAIT_BITSET
3386# define FUTEX_WAIT_BITSET 9
3387# endif
3388# ifndef FUTEX_WAKE_BITSET
3389# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003390# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003391# ifndef FUTEX_WAIT_REQUEUE_PI
3392# define FUTEX_WAIT_REQUEUE_PI 11
3393# endif
3394# ifndef FUTEX_CMP_REQUEUE_PI
3395# define FUTEX_CMP_REQUEUE_PI 12
3396# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003397# ifndef FUTEX_PRIVATE_FLAG
3398# define FUTEX_PRIVATE_FLAG 128
3399# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003400# ifndef FUTEX_CLOCK_REALTIME
3401# define FUTEX_CLOCK_REALTIME 256
3402# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003403static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003404 { FUTEX_WAIT, "FUTEX_WAIT" },
3405 { FUTEX_WAKE, "FUTEX_WAKE" },
3406 { FUTEX_FD, "FUTEX_FD" },
3407 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3408 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3409 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3410 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3411 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3412 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003413 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3414 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003415 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3416 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003417 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3418 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3419 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3420 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3421 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3422 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3423 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3424 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3425 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003426 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3427 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003428 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3429 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3430 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3431 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3432 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3433 { 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 +00003434 { 0, NULL }
3435};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003436# ifndef FUTEX_OP_SET
3437# define FUTEX_OP_SET 0
3438# define FUTEX_OP_ADD 1
3439# define FUTEX_OP_OR 2
3440# define FUTEX_OP_ANDN 3
3441# define FUTEX_OP_XOR 4
3442# define FUTEX_OP_CMP_EQ 0
3443# define FUTEX_OP_CMP_NE 1
3444# define FUTEX_OP_CMP_LT 2
3445# define FUTEX_OP_CMP_LE 3
3446# define FUTEX_OP_CMP_GT 4
3447# define FUTEX_OP_CMP_GE 5
3448# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003449static const struct xlat futexwakeops[] = {
3450 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3451 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3452 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3453 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3454 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3455 { 0, NULL }
3456};
3457static const struct xlat futexwakecmps[] = {
3458 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3459 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3460 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3461 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3462 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3463 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3464 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003465};
3466
3467int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003468sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003469{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003470 if (entering(tcp)) {
3471 long int cmd = tcp->u_arg[1] & 127;
3472 tprintf("%p, ", (void *) tcp->u_arg[0]);
3473 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3474 tprintf(", %ld", tcp->u_arg[2]);
3475 if (cmd == FUTEX_WAKE_BITSET)
3476 tprintf(", %lx", tcp->u_arg[5]);
3477 else if (cmd == FUTEX_WAIT) {
3478 tprintf(", ");
3479 printtv(tcp, tcp->u_arg[3]);
3480 } else if (cmd == FUTEX_WAIT_BITSET) {
3481 tprintf(", ");
3482 printtv(tcp, tcp->u_arg[3]);
3483 tprintf(", %lx", tcp->u_arg[5]);
3484 } else if (cmd == FUTEX_REQUEUE)
3485 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003486 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003487 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3488 else if (cmd == FUTEX_WAKE_OP) {
3489 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3490 if ((tcp->u_arg[5] >> 28) & 8)
3491 tprintf("FUTEX_OP_OPARG_SHIFT|");
3492 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3493 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3494 if ((tcp->u_arg[5] >> 24) & 8)
3495 tprintf("FUTEX_OP_OPARG_SHIFT|");
3496 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3497 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003498 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3499 tprintf(", ");
3500 printtv(tcp, tcp->u_arg[3]);
3501 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003502 }
Roland McGrath51942a92007-07-05 18:59:11 +00003503 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003504 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003505}
3506
3507static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003508print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003509{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003510 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003511 unsigned long w, min_len;
3512
3513 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3514 min_len = len - max_strlen * sizeof(w);
3515 else
3516 min_len = 0;
3517 for (; len >= sizeof(w) && len > min_len;
3518 len -= sizeof(w), list += sizeof(w)) {
3519 if (umove(tcp, list, &w) < 0)
3520 break;
3521 if (first)
3522 tprintf("{");
3523 else
3524 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003525 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003526 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003527 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003528 if (len) {
3529 if (first)
3530 tprintf("%#lx", list);
3531 else
3532 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3533 "???" : "..."));
3534 } else {
3535 tprintf(first ? "{}" : "}");
3536 }
Roland McGrath5a223472002-12-15 23:58:26 +00003537}
3538
3539int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003540sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003541{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003542 if (entering(tcp)) {
3543 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3544 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3545 }
3546 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003547}
3548
3549int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003550sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003551{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003552 if (entering(tcp)) {
3553 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3554 } else {
3555 if (tcp->u_rval == -1)
3556 tprintf("%#lx", tcp->u_arg[2]);
3557 else
3558 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3559 }
3560 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003561}
Roland McGrath279d3782004-03-01 20:27:37 +00003562
Roland McGrathd9f816f2004-09-04 03:39:20 +00003563static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003564 { SCHED_OTHER, "SCHED_OTHER" },
3565 { SCHED_RR, "SCHED_RR" },
3566 { SCHED_FIFO, "SCHED_FIFO" },
3567 { 0, NULL }
3568};
3569
3570int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003571sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003572{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003573 if (entering(tcp)) {
3574 tprintf("%d", (int) tcp->u_arg[0]);
3575 } else if (! syserror(tcp)) {
3576 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3577 if (tcp->auxstr != NULL)
3578 return RVAL_STR;
3579 }
3580 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003581}
3582
3583int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003584sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003585{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003586 if (entering(tcp)) {
3587 struct sched_param p;
3588 tprintf("%d, ", (int) tcp->u_arg[0]);
3589 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3590 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3591 tprintf(", %#lx", tcp->u_arg[2]);
3592 else
3593 tprintf(", { %d }", p.__sched_priority);
3594 }
3595 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003596}
3597
3598int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003599sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003600{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003601 if (entering(tcp)) {
3602 tprintf("%d, ", (int) tcp->u_arg[0]);
3603 } else {
3604 struct sched_param p;
3605 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3606 tprintf("%#lx", tcp->u_arg[1]);
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_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003615{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003616 if (entering(tcp)) {
3617 struct sched_param p;
3618 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3619 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3620 else
3621 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3622 }
3623 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003624}
3625
3626int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003627sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003628{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003629 if (entering(tcp)) {
3630 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3631 }
3632 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003633}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003634
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003635# ifdef X86_64
3636# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003637
3638static const struct xlat archvals[] = {
3639 { ARCH_SET_GS, "ARCH_SET_GS" },
3640 { ARCH_SET_FS, "ARCH_SET_FS" },
3641 { ARCH_GET_FS, "ARCH_GET_FS" },
3642 { ARCH_GET_GS, "ARCH_GET_GS" },
3643 { 0, NULL },
3644};
3645
3646int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003647sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003648{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003649 if (entering(tcp)) {
3650 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3651 if (tcp->u_arg[0] == ARCH_SET_GS
3652 || tcp->u_arg[0] == ARCH_SET_FS
3653 ) {
3654 tprintf(", %#lx", tcp->u_arg[1]);
3655 }
3656 } else {
3657 if (tcp->u_arg[0] == ARCH_GET_GS
3658 || tcp->u_arg[0] == ARCH_GET_FS
3659 ) {
3660 long int v;
3661 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3662 tprintf(", [%#lx]", v);
3663 else
3664 tprintf(", %#lx", tcp->u_arg[1]);
3665 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003666 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003667 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003668}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003669# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003670
Roland McGrathdb8319f2007-08-02 01:37:55 +00003671
3672int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003673sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003674{
3675 if (exiting(tcp)) {
3676 unsigned u;
3677 if (tcp->u_arg[0] == 0)
3678 tprintf("NULL, ");
3679 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3680 tprintf("%#lx, ", tcp->u_arg[0]);
3681 else
3682 tprintf("[%u], ", u);
3683 if (tcp->u_arg[1] == 0)
3684 tprintf("NULL, ");
3685 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3686 tprintf("%#lx, ", tcp->u_arg[1]);
3687 else
3688 tprintf("[%u], ", u);
3689 tprintf("%#lx", tcp->u_arg[2]);
3690 }
3691 return 0;
3692}
3693
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003694#endif /* LINUX */