blob: 59d7ba0401cd3a3f562ab1ef6ecb98d0468c94df [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 */
558#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
559#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
560#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000561
Roland McGrathd9f816f2004-09-04 03:39:20 +0000562static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000563 { CLONE_VM, "CLONE_VM" },
564 { CLONE_FS, "CLONE_FS" },
565 { CLONE_FILES, "CLONE_FILES" },
566 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000567 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000568 { CLONE_PTRACE, "CLONE_PTRACE" },
569 { CLONE_VFORK, "CLONE_VFORK" },
570 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000571 { CLONE_THREAD, "CLONE_THREAD" },
572 { CLONE_NEWNS, "CLONE_NEWNS" },
573 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
574 { CLONE_SETTLS, "CLONE_SETTLS" },
575 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
576 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
577 { CLONE_DETACHED, "CLONE_DETACHED" },
578 { CLONE_UNTRACED, "CLONE_UNTRACED" },
579 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000580 { 0, NULL },
581};
582
Roland McGrath909875b2002-12-22 03:34:36 +0000583# ifdef I386
584# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000585# ifdef HAVE_STRUCT_USER_DESC
586# define modify_ldt_ldt_s user_desc
587# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000588extern void print_ldt_entry();
589# endif
590
Roland McGrath9677b3a2003-03-12 09:54:36 +0000591# if defined IA64
592# define ARG_FLAGS 0
593# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000594# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
595# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
596# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
597# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000598# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000599# define ARG_STACK 0
600# define ARG_FLAGS 1
601# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000602# define ARG_CTID 3
603# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000604# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000605# define ARG_FLAGS 0
606# define ARG_STACK 1
607# define ARG_PTID 2
608# define ARG_CTID 3
609# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000610# else
611# define ARG_FLAGS 0
612# define ARG_STACK 1
613# define ARG_PTID 2
614# define ARG_TLS 3
615# define ARG_CTID 4
616# endif
617
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000618int
619sys_clone(tcp)
620struct tcb *tcp;
621{
622 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000623 unsigned long flags = tcp->u_arg[ARG_FLAGS];
624 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
625# ifdef ARG_STACKSIZE
626 if (ARG_STACKSIZE != -1)
627 tprintf("stack_size=%#lx, ",
628 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000629# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000630 tprintf("flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000631 printflags(clone_flags, flags &~ CSIGNAL, NULL);
Roland McGrath984154d2003-05-23 01:08:42 +0000632 if ((flags & CSIGNAL) != 0)
633 tprintf("|%s", 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 }
914 if (call_flags & CLONE_DETACHED) {
915 tcpchild->flags |= TCB_CLONE_DETACHED;
916 ++tcp->nclone_detached;
917 }
Wang Chao5a22b312010-08-05 14:58:37 +0800918 if ((call_flags & CLONE_PARENT) &&
919 !(call_flags & CLONE_THREAD)) {
920 --tcp->nchildren;
921 tcpchild->parent = NULL;
922 if (tcp->parent != NULL) {
923 tcp = tcp->parent;
924 tcpchild->parent = tcp;
925 ++tcp->nchildren;
926 }
927 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000928 }
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000929#endif /* TCB_CLONE_THREAD */
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000930 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000931 return 0;
932}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000933
934#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000935
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000936int
937internal_fork(tcp)
938struct tcb *tcp;
939{
940 struct tcb *tcpchild;
941 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700942 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000943
944#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000945 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000946 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000947 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700948 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000949 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000950#endif
951 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700952 if (!followfork || dont_follow)
953 return 0;
954 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000955 if (setbpt(tcp) < 0)
956 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000957 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000958 else {
959 int bpt = tcp->flags & TCB_BPTSET;
960
Roland McGratheb9e2e82009-06-02 16:49:22 -0700961 if (!(tcp->flags & TCB_FOLLOWFORK))
962 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000963 if (bpt)
964 clearbpt(tcp);
965
966 if (syserror(tcp))
967 return 0;
968
969 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700970 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000971 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000972#ifdef SUNOS4
973#ifdef oldway
974 /* The child must have run before it can be attached. */
975 {
976 struct timeval tv;
977 tv.tv_sec = 0;
978 tv.tv_usec = 10000;
979 select(0, NULL, NULL, NULL, &tv);
980 }
981 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
982 perror("PTRACE_ATTACH");
983 fprintf(stderr, "Too late?\n");
984 droptcb(tcpchild);
985 return 0;
986 }
987#else /* !oldway */
988 /* Try to catch the new process as soon as possible. */
989 {
990 int i;
991 for (i = 0; i < 1024; i++)
992 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
993 break;
994 if (i == 1024) {
995 perror("PTRACE_ATTACH");
996 fprintf(stderr, "Too late?\n");
997 droptcb(tcpchild);
998 return 0;
999 }
1000 }
1001#endif /* !oldway */
1002#endif /* SUNOS4 */
1003 tcpchild->flags |= TCB_ATTACHED;
1004 /* Child has BPT too, must be removed on first occasion */
1005 if (bpt) {
1006 tcpchild->flags |= TCB_BPTSET;
1007 tcpchild->baddr = tcp->baddr;
1008 memcpy(tcpchild->inst, tcp->inst,
1009 sizeof tcpchild->inst);
1010 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001011 tcpchild->parent = tcp;
1012 tcp->nchildren++;
1013 if (!qflag)
1014 fprintf(stderr, "Process %d attached\n", pid);
1015 }
1016 return 0;
1017}
1018
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001019#endif /* !LINUX */
1020
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001021#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001022
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001023#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001024
1025int
1026sys_vfork(tcp)
1027struct tcb *tcp;
1028{
1029 if (exiting(tcp))
1030 return RVAL_UDECIMAL;
1031 return 0;
1032}
1033
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001034#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001035
1036#ifndef LINUX
1037
1038static char idstr[16];
1039
1040int
1041sys_getpid(tcp)
1042struct tcb *tcp;
1043{
1044 if (exiting(tcp)) {
1045 sprintf(idstr, "ppid %lu", getrval2(tcp));
1046 tcp->auxstr = idstr;
1047 return RVAL_STR;
1048 }
1049 return 0;
1050}
1051
1052int
1053sys_getuid(tcp)
1054struct tcb *tcp;
1055{
1056 if (exiting(tcp)) {
1057 sprintf(idstr, "euid %lu", getrval2(tcp));
1058 tcp->auxstr = idstr;
1059 return RVAL_STR;
1060 }
1061 return 0;
1062}
1063
1064int
1065sys_getgid(tcp)
1066struct tcb *tcp;
1067{
1068 if (exiting(tcp)) {
1069 sprintf(idstr, "egid %lu", getrval2(tcp));
1070 tcp->auxstr = idstr;
1071 return RVAL_STR;
1072 }
1073 return 0;
1074}
1075
1076#endif /* !LINUX */
1077
1078#ifdef LINUX
1079
1080int
1081sys_setuid(tcp)
1082struct tcb *tcp;
1083{
1084 if (entering(tcp)) {
1085 tprintf("%u", (uid_t) tcp->u_arg[0]);
1086 }
1087 return 0;
1088}
1089
1090int
1091sys_setgid(tcp)
1092struct tcb *tcp;
1093{
1094 if (entering(tcp)) {
1095 tprintf("%u", (gid_t) tcp->u_arg[0]);
1096 }
1097 return 0;
1098}
1099
1100int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001101sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001102{
1103 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001104 __kernel_uid_t uid;
1105 if (syserror(tcp))
1106 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1107 tcp->u_arg[1], tcp->u_arg[2]);
1108 else {
1109 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1110 tprintf("%#lx, ", tcp->u_arg[0]);
1111 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[1], &uid) < 0)
1114 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001115 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001116 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001117 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1118 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001119 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001120 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001121 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001122 }
1123 return 0;
1124}
1125
1126int
1127sys_getresgid(tcp)
1128struct tcb *tcp;
1129{
1130 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001131 __kernel_gid_t gid;
1132 if (syserror(tcp))
1133 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1134 tcp->u_arg[1], tcp->u_arg[2]);
1135 else {
1136 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1137 tprintf("%#lx, ", tcp->u_arg[0]);
1138 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[1], &gid) < 0)
1141 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001142 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001143 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001144 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1145 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001146 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001147 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001148 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001149 }
1150 return 0;
1151}
1152
1153#endif /* LINUX */
1154
1155int
1156sys_setreuid(tcp)
1157struct tcb *tcp;
1158{
1159 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001160 printuid("", tcp->u_arg[0]);
1161 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001162 }
1163 return 0;
1164}
1165
1166int
1167sys_setregid(tcp)
1168struct tcb *tcp;
1169{
1170 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001171 printuid("", tcp->u_arg[0]);
1172 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001173 }
1174 return 0;
1175}
1176
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001177#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001178int
1179sys_setresuid(tcp)
1180 struct tcb *tcp;
1181{
1182 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001183 printuid("", tcp->u_arg[0]);
1184 printuid(", ", tcp->u_arg[1]);
1185 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001186 }
1187 return 0;
1188}
1189int
1190sys_setresgid(tcp)
1191 struct tcb *tcp;
1192{
1193 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001194 printuid("", tcp->u_arg[0]);
1195 printuid(", ", tcp->u_arg[1]);
1196 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001197 }
1198 return 0;
1199}
1200
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001201#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001202
1203int
1204sys_setgroups(tcp)
1205struct tcb *tcp;
1206{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001207 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001208 unsigned long len, size, start, cur, end, abbrev_end;
1209 GETGROUPS_T gid;
1210 int failed = 0;
1211
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001212 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001213 tprintf("%lu, ", len);
1214 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001215 tprintf("[]");
1216 return 0;
1217 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001218 start = tcp->u_arg[1];
1219 if (start == 0) {
1220 tprintf("NULL");
1221 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001222 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001223 size = len * sizeof(gid);
1224 end = start + size;
1225 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1226 tprintf("%#lx", start);
1227 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001228 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001229 if (abbrev(tcp)) {
1230 abbrev_end = start + max_strlen * sizeof(gid);
1231 if (abbrev_end < start)
1232 abbrev_end = end;
1233 } else {
1234 abbrev_end = end;
1235 }
1236 tprintf("[");
1237 for (cur = start; cur < end; cur += sizeof(gid)) {
1238 if (cur > start)
1239 tprintf(", ");
1240 if (cur >= abbrev_end) {
1241 tprintf("...");
1242 break;
1243 }
1244 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1245 tprintf("?");
1246 failed = 1;
1247 break;
1248 }
1249 tprintf("%lu", (unsigned long) gid);
1250 }
1251 tprintf("]");
1252 if (failed)
1253 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001254 }
1255 return 0;
1256}
1257
1258int
1259sys_getgroups(tcp)
1260struct tcb *tcp;
1261{
Roland McGrathaa524c82005-06-01 19:22:06 +00001262 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001263
1264 if (entering(tcp)) {
1265 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001266 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001267 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001268 unsigned long size, start, cur, end, abbrev_end;
1269 GETGROUPS_T gid;
1270 int failed = 0;
1271
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001272 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001273 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001274 tprintf("[]");
1275 return 0;
1276 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001277 start = tcp->u_arg[1];
1278 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001279 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001280 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001281 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001282 if (tcp->u_arg[0] == 0) {
1283 tprintf("%#lx", start);
1284 return 0;
1285 }
1286 size = len * sizeof(gid);
1287 end = start + size;
1288 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1289 size / sizeof(gid) != len || end < start) {
1290 tprintf("%#lx", start);
1291 return 0;
1292 }
1293 if (abbrev(tcp)) {
1294 abbrev_end = start + max_strlen * sizeof(gid);
1295 if (abbrev_end < start)
1296 abbrev_end = end;
1297 } else {
1298 abbrev_end = end;
1299 }
1300 tprintf("[");
1301 for (cur = start; cur < end; cur += sizeof(gid)) {
1302 if (cur > start)
1303 tprintf(", ");
1304 if (cur >= abbrev_end) {
1305 tprintf("...");
1306 break;
1307 }
1308 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1309 tprintf("?");
1310 failed = 1;
1311 break;
1312 }
1313 tprintf("%lu", (unsigned long) gid);
1314 }
1315 tprintf("]");
1316 if (failed)
1317 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001318 }
1319 return 0;
1320}
1321
Roland McGrath83bd47a2003-11-13 22:32:26 +00001322#ifdef LINUX
1323int
1324sys_setgroups32(tcp)
1325struct tcb *tcp;
1326{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001327 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001328 unsigned long len, size, start, cur, end, abbrev_end;
1329 GETGROUPS32_T gid;
1330 int failed = 0;
1331
Roland McGrath83bd47a2003-11-13 22:32:26 +00001332 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001333 tprintf("%lu, ", len);
1334 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001335 tprintf("[]");
1336 return 0;
1337 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001338 start = tcp->u_arg[1];
1339 if (start == 0) {
1340 tprintf("NULL");
1341 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001342 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001343 size = len * sizeof(gid);
1344 end = start + size;
1345 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1346 tprintf("%#lx", start);
1347 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001348 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001349 if (abbrev(tcp)) {
1350 abbrev_end = start + max_strlen * sizeof(gid);
1351 if (abbrev_end < start)
1352 abbrev_end = end;
1353 } else {
1354 abbrev_end = end;
1355 }
1356 tprintf("[");
1357 for (cur = start; cur < end; cur += sizeof(gid)) {
1358 if (cur > start)
1359 tprintf(", ");
1360 if (cur >= abbrev_end) {
1361 tprintf("...");
1362 break;
1363 }
1364 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1365 tprintf("?");
1366 failed = 1;
1367 break;
1368 }
1369 tprintf("%lu", (unsigned long) gid);
1370 }
1371 tprintf("]");
1372 if (failed)
1373 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001374 }
1375 return 0;
1376}
1377
1378int
1379sys_getgroups32(tcp)
1380struct tcb *tcp;
1381{
Roland McGrathaa524c82005-06-01 19:22:06 +00001382 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001383
1384 if (entering(tcp)) {
1385 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001386 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001387 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001388 unsigned long size, start, cur, end, abbrev_end;
1389 GETGROUPS32_T gid;
1390 int failed = 0;
1391
Roland McGrath83bd47a2003-11-13 22:32:26 +00001392 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001393 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001394 tprintf("[]");
1395 return 0;
1396 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001397 start = tcp->u_arg[1];
1398 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001399 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001400 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001401 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001402 size = len * sizeof(gid);
1403 end = start + size;
1404 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1405 size / sizeof(gid) != len || end < start) {
1406 tprintf("%#lx", start);
1407 return 0;
1408 }
1409 if (abbrev(tcp)) {
1410 abbrev_end = start + max_strlen * sizeof(gid);
1411 if (abbrev_end < start)
1412 abbrev_end = end;
1413 } else {
1414 abbrev_end = end;
1415 }
1416 tprintf("[");
1417 for (cur = start; cur < end; cur += sizeof(gid)) {
1418 if (cur > start)
1419 tprintf(", ");
1420 if (cur >= abbrev_end) {
1421 tprintf("...");
1422 break;
1423 }
1424 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1425 tprintf("?");
1426 failed = 1;
1427 break;
1428 }
1429 tprintf("%lu", (unsigned long) gid);
1430 }
1431 tprintf("]");
1432 if (failed)
1433 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001434 }
1435 return 0;
1436}
1437#endif /* LINUX */
1438
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001439#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001440int
1441sys_setpgrp(tcp)
1442struct tcb *tcp;
1443{
1444 if (entering(tcp)) {
1445#ifndef SVR4
1446 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1447#endif /* !SVR4 */
1448 }
1449 return 0;
1450}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001451#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001452
1453int
1454sys_getpgrp(tcp)
1455struct tcb *tcp;
1456{
1457 if (entering(tcp)) {
1458#ifndef SVR4
1459 tprintf("%lu", tcp->u_arg[0]);
1460#endif /* !SVR4 */
1461 }
1462 return 0;
1463}
1464
1465int
1466sys_getsid(tcp)
1467struct tcb *tcp;
1468{
1469 if (entering(tcp)) {
1470 tprintf("%lu", tcp->u_arg[0]);
1471 }
1472 return 0;
1473}
1474
1475int
1476sys_setsid(tcp)
1477struct tcb *tcp;
1478{
1479 return 0;
1480}
1481
1482int
1483sys_getpgid(tcp)
1484struct tcb *tcp;
1485{
1486 if (entering(tcp)) {
1487 tprintf("%lu", tcp->u_arg[0]);
1488 }
1489 return 0;
1490}
1491
1492int
1493sys_setpgid(tcp)
1494struct tcb *tcp;
1495{
1496 if (entering(tcp)) {
1497 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1498 }
1499 return 0;
1500}
1501
John Hughesc61eb3d2002-05-17 11:37:50 +00001502#if UNIXWARE >= 2
1503
1504#include <sys/privilege.h>
1505
1506
Roland McGrathd9f816f2004-09-04 03:39:20 +00001507static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001508 { SETPRV, "SETPRV" },
1509 { CLRPRV, "CLRPRV" },
1510 { PUTPRV, "PUTPRV" },
1511 { GETPRV, "GETPRV" },
1512 { CNTPRV, "CNTPRV" },
1513 { 0, NULL },
1514};
1515
1516
Roland McGrathd9f816f2004-09-04 03:39:20 +00001517static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001518 { P_OWNER, "P_OWNER" },
1519 { P_AUDIT, "P_AUDIT" },
1520 { P_COMPAT, "P_COMPAT" },
1521 { P_DACREAD, "P_DACREAD" },
1522 { P_DACWRITE, "P_DACWRITE" },
1523 { P_DEV, "P_DEV" },
1524 { P_FILESYS, "P_FILESYS" },
1525 { P_MACREAD, "P_MACREAD" },
1526 { P_MACWRITE, "P_MACWRITE" },
1527 { P_MOUNT, "P_MOUNT" },
1528 { P_MULTIDIR, "P_MULTIDIR" },
1529 { P_SETPLEVEL, "P_SETPLEVEL" },
1530 { P_SETSPRIV, "P_SETSPRIV" },
1531 { P_SETUID, "P_SETUID" },
1532 { P_SYSOPS, "P_SYSOPS" },
1533 { P_SETUPRIV, "P_SETUPRIV" },
1534 { P_DRIVER, "P_DRIVER" },
1535 { P_RTIME, "P_RTIME" },
1536 { P_MACUPGRADE, "P_MACUPGRADE" },
1537 { P_FSYSRANGE, "P_FSYSRANGE" },
1538 { P_SETFLEVEL, "P_SETFLEVEL" },
1539 { P_AUDITWR, "P_AUDITWR" },
1540 { P_TSHAR, "P_TSHAR" },
1541 { P_PLOCK, "P_PLOCK" },
1542 { P_CORE, "P_CORE" },
1543 { P_LOADMOD, "P_LOADMOD" },
1544 { P_BIND, "P_BIND" },
1545 { P_ALLPRIVS, "P_ALLPRIVS" },
1546 { 0, NULL },
1547};
1548
1549
Roland McGrathd9f816f2004-09-04 03:39:20 +00001550static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001551 { PS_FIX, "PS_FIX" },
1552 { PS_INH, "PS_INH" },
1553 { PS_MAX, "PS_MAX" },
1554 { PS_WKG, "PS_WKG" },
1555 { 0, NULL },
1556};
1557
1558
1559static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001560printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001561{
1562 priv_t buf [128];
1563 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1564 int dots = len > max;
1565 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001566
John Hughesc61eb3d2002-05-17 11:37:50 +00001567 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001568
John Hughesc61eb3d2002-05-17 11:37:50 +00001569 if (len <= 0 ||
1570 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1571 {
1572 tprintf ("%#lx", addr);
1573 return;
1574 }
1575
1576 tprintf ("[");
1577
1578 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001579 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001580
1581 if (i) tprintf (", ");
1582
1583 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1584 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1585 {
1586 tprintf ("%s|%s", t, p);
1587 }
1588 else {
1589 tprintf ("%#lx", buf [i]);
1590 }
1591 }
1592
1593 if (dots) tprintf (" ...");
1594
1595 tprintf ("]");
1596}
1597
1598
1599int
1600sys_procpriv(tcp)
1601struct tcb *tcp;
1602{
1603 if (entering(tcp)) {
1604 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1605 switch (tcp->u_arg[0]) {
1606 case CNTPRV:
1607 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1608 break;
1609
1610 case GETPRV:
1611 break;
1612
1613 default:
1614 tprintf (", ");
1615 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1616 tprintf (", %ld", tcp->u_arg[2]);
1617 }
1618 }
1619 else if (tcp->u_arg[0] == GETPRV) {
1620 if (syserror (tcp)) {
1621 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1622 }
1623 else {
1624 tprintf (", ");
1625 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1626 tprintf (", %ld", tcp->u_arg[2]);
1627 }
1628 }
Roland McGrath5a223472002-12-15 23:58:26 +00001629
John Hughesc61eb3d2002-05-17 11:37:50 +00001630 return 0;
1631}
1632
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001633#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001634
1635
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001636static void
1637printargv(tcp, addr)
1638struct tcb *tcp;
1639long addr;
1640{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001641 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001642 unsigned int p32;
1643 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001644 char data[sizeof(long)];
1645 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001646 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001647 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001648
Roland McGrath85a3bc42007-08-02 02:13:05 +00001649 cp.p64 = 1;
1650 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1651 if (umoven(tcp, addr, personality_wordsize[current_personality],
1652 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001653 tprintf("%#lx", addr);
1654 return;
1655 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001656 if (personality_wordsize[current_personality] == 4)
1657 cp.p64 = cp.p32;
1658 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001659 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001660 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001661 printstr(tcp, cp.p64, -1);
1662 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001663 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001664 if (cp.p64)
1665 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001666}
1667
1668static void
1669printargc(fmt, tcp, addr)
1670char *fmt;
1671struct tcb *tcp;
1672long addr;
1673{
1674 int count;
1675 char *cp;
1676
1677 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1678 addr += sizeof(char *);
1679 }
1680 tprintf(fmt, count, count == 1 ? "" : "s");
1681}
1682
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001683#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001684int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001685sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001686{
1687 if (entering(tcp)) {
1688 printpath(tcp, tcp->u_arg[0]);
1689 if (!verbose(tcp))
1690 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001691 else {
1692 tprintf(", [");
1693 printargv(tcp, tcp->u_arg[1]);
1694 tprintf("]");
1695 }
1696 }
1697 return 0;
1698}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001699#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001700
1701int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001702sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001703{
1704 if (entering(tcp)) {
1705 printpath(tcp, tcp->u_arg[0]);
1706 if (!verbose(tcp))
1707 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001708 else {
1709 tprintf(", [");
1710 printargv(tcp, tcp->u_arg[1]);
1711 tprintf("]");
1712 }
1713 if (!verbose(tcp))
1714 tprintf(", %#lx", tcp->u_arg[2]);
1715 else if (abbrev(tcp))
1716 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1717 else {
1718 tprintf(", [");
1719 printargv(tcp, tcp->u_arg[2]);
1720 tprintf("]");
1721 }
1722 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001723 return 0;
1724}
1725
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001726#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001727
1728int sys_rexecve(tcp)
1729struct tcb *tcp;
1730{
1731 if (entering (tcp)) {
1732 sys_execve (tcp);
1733 tprintf (", %ld", tcp->u_arg[3]);
1734 }
1735 return 0;
1736}
1737
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001738#endif
John Hughes4e36a812001-04-18 15:11:51 +00001739
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001740int
1741internal_exec(tcp)
1742struct tcb *tcp;
1743{
1744#ifdef SUNOS4
1745 if (exiting(tcp) && !syserror(tcp) && followfork)
1746 fixvfork(tcp);
1747#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001748#if defined LINUX && defined TCB_WAITEXECVE
1749 if (exiting(tcp) && syserror(tcp))
1750 tcp->flags &= ~TCB_WAITEXECVE;
1751 else
1752 tcp->flags |= TCB_WAITEXECVE;
1753#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001754 return 0;
1755}
1756
1757#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001758#ifndef __WNOTHREAD
1759#define __WNOTHREAD 0x20000000
1760#endif
1761#ifndef __WALL
1762#define __WALL 0x40000000
1763#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001764#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001765#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001766#endif
1767#endif /* LINUX */
1768
Roland McGrathd9f816f2004-09-04 03:39:20 +00001769static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001770 { WNOHANG, "WNOHANG" },
1771#ifndef WSTOPPED
1772 { WUNTRACED, "WUNTRACED" },
1773#endif
1774#ifdef WEXITED
1775 { WEXITED, "WEXITED" },
1776#endif
1777#ifdef WTRAPPED
1778 { WTRAPPED, "WTRAPPED" },
1779#endif
1780#ifdef WSTOPPED
1781 { WSTOPPED, "WSTOPPED" },
1782#endif
1783#ifdef WCONTINUED
1784 { WCONTINUED, "WCONTINUED" },
1785#endif
1786#ifdef WNOWAIT
1787 { WNOWAIT, "WNOWAIT" },
1788#endif
1789#ifdef __WCLONE
1790 { __WCLONE, "__WCLONE" },
1791#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001792#ifdef __WALL
1793 { __WALL, "__WALL" },
1794#endif
1795#ifdef __WNOTHREAD
1796 { __WNOTHREAD, "__WNOTHREAD" },
1797#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001798 { 0, NULL },
1799};
1800
Roland McGrath5e02a572004-10-19 23:33:47 +00001801#if !defined WCOREFLAG && defined WCOREFLG
1802# define WCOREFLAG WCOREFLG
1803#endif
1804#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001805# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001806#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001807#ifndef WCOREDUMP
1808# define WCOREDUMP(status) ((status) & 0200)
1809#endif
1810
Roland McGrath5e02a572004-10-19 23:33:47 +00001811
1812#ifndef W_STOPCODE
1813#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1814#endif
1815#ifndef W_EXITCODE
1816#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1817#endif
1818
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001819static int
1820printstatus(status)
1821int status;
1822{
1823 int exited = 0;
1824
1825 /*
1826 * Here is a tricky presentation problem. This solution
1827 * is still not entirely satisfactory but since there
1828 * are no wait status constructors it will have to do.
1829 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001830 if (WIFSTOPPED(status)) {
1831 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001832 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001833 status &= ~W_STOPCODE(WSTOPSIG(status));
1834 }
1835 else if (WIFSIGNALED(status)) {
1836 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001837 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001838 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001839 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1840 }
1841 else if (WIFEXITED(status)) {
1842 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001843 WEXITSTATUS(status));
1844 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001845 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001846 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001847 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001848 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001849 return 0;
1850 }
1851
1852 if (status == 0)
1853 tprintf("]");
1854 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001855 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001856
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001857 return exited;
1858}
1859
1860static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001861printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001862{
1863 int status;
1864 int exited = 0;
1865
1866 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001867#ifdef LINUX
1868 /* On Linux, kernel-side pid_t is typedef'ed to int
1869 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001870 * pid argument to int on 64bit arches, producing,
1871 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001872 * in strace. We have to use int here, not long.
1873 */
1874 int pid = tcp->u_arg[0];
1875 tprintf("%d, ", pid);
1876#else
1877 /*
1878 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001879 */
1880 long pid = tcp->u_arg[0];
1881 if (personality_wordsize[current_personality] < sizeof pid)
1882 pid = (long) (int) pid;
1883 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001884#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001885 } else {
1886 /* status */
1887 if (!tcp->u_arg[1])
1888 tprintf("NULL");
1889 else if (syserror(tcp) || tcp->u_rval == 0)
1890 tprintf("%#lx", tcp->u_arg[1]);
1891 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1892 tprintf("[?]");
1893 else
1894 exited = printstatus(status);
1895 /* options */
1896 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001897 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001898 if (n == 4) {
1899 tprintf(", ");
1900 /* usage */
1901 if (!tcp->u_arg[3])
1902 tprintf("NULL");
1903#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001904 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001905#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001906 if (bitness)
1907 printrusage32(tcp, tcp->u_arg[3]);
1908 else
1909#endif
1910 printrusage(tcp, tcp->u_arg[3]);
1911 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001912#endif /* LINUX */
1913#ifdef SUNOS4
1914 else if (tcp->u_rval > 0 && exited)
1915 printrusage(tcp, tcp->u_arg[3]);
1916#endif /* SUNOS4 */
1917 else
1918 tprintf("%#lx", tcp->u_arg[3]);
1919 }
1920 }
1921 return 0;
1922}
1923
1924int
Roland McGrathc74c0b72004-09-01 19:39:46 +00001925internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001926struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00001927int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001928{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001929 int got_kids;
1930
1931#ifdef TCB_CLONE_THREAD
1932 if (tcp->flags & TCB_CLONE_THREAD)
1933 /* The children we wait for are our parent's children. */
1934 got_kids = (tcp->parent->nchildren
Wang Chao304ea5f2010-08-05 14:40:45 +08001935 > (tcp->parent->nclone_detached + tcp->parent->nclone_threads));
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001936 else
Wang Chao304ea5f2010-08-05 14:40:45 +08001937 got_kids = (tcp->nchildren > (tcp->nclone_detached + tcp->nclone_threads));
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001938#else
1939 got_kids = tcp->nchildren > 0;
1940#endif
1941
1942 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001943 /* There are children that this parent should block for.
1944 But ptrace made us the parent of the traced children
1945 and the real parent will get ECHILD from the wait call.
1946
1947 XXX If we attached with strace -f -p PID, then there
1948 may be untraced dead children the parent could be reaping
1949 now, but we make him block. */
1950
1951 /* ??? WTA: fix bug with hanging children */
1952
Roland McGrathc74c0b72004-09-01 19:39:46 +00001953 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001954 /*
1955 * There are traced children. We'll make the parent
1956 * block to avoid a false ECHILD error due to our
1957 * ptrace having stolen the children. However,
1958 * we shouldn't block if there are zombies to reap.
1959 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1960 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001961 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001962 if (tcp->nzombies > 0 &&
1963 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001964 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001965 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001966 if (tcp->u_arg[0] > 0) {
1967 /*
1968 * If the parent waits for a specified child
1969 * PID, then it must get ECHILD right away
1970 * if that PID is not one of its children.
1971 * Make sure that the requested PID matches
1972 * one of the parent's children that we are
1973 * tracing, and don't suspend it otherwise.
1974 */
1975 if (child == NULL)
1976 child = pid2tcb(tcp->u_arg[0]);
1977 if (child == NULL || child->parent != (
1978#ifdef TCB_CLONE_THREAD
1979 (tcp->flags & TCB_CLONE_THREAD)
1980 ? tcp->parent :
1981#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00001982 tcp) ||
1983 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00001984 return 0;
1985 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001986 tcp->flags |= TCB_SUSPENDED;
1987 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001988#ifdef TCB_CLONE_THREAD
1989 if (tcp->flags & TCB_CLONE_THREAD)
1990 tcp->parent->nclone_waiting++;
1991#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001992 }
1993 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001994 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00001995 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001996 /* We must force a fake result of 0 instead of
1997 the ECHILD error. */
Roland McGrathb69f81b2002-12-21 23:25:18 +00001998 return force_result(tcp, 0, 0);
1999 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002000 }
Roland McGrath09623452003-05-23 02:27:13 +00002001 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2002 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2003 /*
2004 * We just reaped a child we don't know about,
2005 * presumably a zombie we already droptcb'd.
2006 */
2007 tcp->nzombies--;
2008 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002009 return 0;
2010}
2011
2012#ifdef SVR4
2013
2014int
2015sys_wait(tcp)
2016struct tcb *tcp;
2017{
2018 if (exiting(tcp)) {
2019 /* The library wrapper stuffs this into the user variable. */
2020 if (!syserror(tcp))
2021 printstatus(getrval2(tcp));
2022 }
2023 return 0;
2024}
2025
2026#endif /* SVR4 */
2027
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002028#ifdef FREEBSD
2029int
2030sys_wait(tcp)
2031struct tcb *tcp;
2032{
2033 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002034
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002035 if (exiting(tcp)) {
2036 if (!syserror(tcp)) {
2037 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2038 tprintf("%#lx", tcp->u_arg[0]);
2039 else
2040 printstatus(status);
2041 }
2042 }
2043 return 0;
2044}
2045#endif
2046
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002047int
2048sys_waitpid(tcp)
2049struct tcb *tcp;
2050{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002051 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002052}
2053
2054int
2055sys_wait4(tcp)
2056struct tcb *tcp;
2057{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002058 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002059}
2060
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002061#ifdef ALPHA
2062int
2063sys_osf_wait4(tcp)
2064struct tcb *tcp;
2065{
2066 return printwaitn(tcp, 4, 1);
2067}
2068#endif
2069
Roland McGrathc74c0b72004-09-01 19:39:46 +00002070#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002071
Roland McGrathd9f816f2004-09-04 03:39:20 +00002072static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002073 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002074#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002075 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002076#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002077 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002078#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002079 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002080#endif
2081#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002082 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002083#endif
2084#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002085 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002086#endif
2087#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002088 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002089#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002090 { P_ALL, "P_ALL" },
2091#ifdef P_LWPID
2092 { P_LWPID, "P_LWPID" },
2093#endif
2094 { 0, NULL },
2095};
2096
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002097int
2098sys_waitid(tcp)
2099struct tcb *tcp;
2100{
2101 siginfo_t si;
2102 int exited;
2103
2104 if (entering(tcp)) {
2105 printxval(waitid_types, tcp->u_arg[0], "P_???");
2106 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002107 }
2108 else {
2109 /* siginfo */
2110 exited = 0;
2111 if (!tcp->u_arg[2])
2112 tprintf("NULL");
2113 else if (syserror(tcp))
2114 tprintf("%#lx", tcp->u_arg[2]);
2115 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2116 tprintf("{???}");
2117 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002118 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002119 /* options */
2120 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002121 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002122 if (tcp->u_nargs > 4) {
2123 /* usage */
2124 tprintf(", ");
2125 if (!tcp->u_arg[4])
2126 tprintf("NULL");
2127 else if (tcp->u_error)
2128 tprintf("%#lx", tcp->u_arg[4]);
2129 else
2130 printrusage(tcp, tcp->u_arg[4]);
2131 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002132 }
2133 return 0;
2134}
2135
Roland McGrathc74c0b72004-09-01 19:39:46 +00002136#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002137
2138int
2139sys_alarm(tcp)
2140struct tcb *tcp;
2141{
2142 if (entering(tcp))
2143 tprintf("%lu", tcp->u_arg[0]);
2144 return 0;
2145}
2146
2147int
2148sys_uname(tcp)
2149struct tcb *tcp;
2150{
2151 struct utsname uname;
2152
2153 if (exiting(tcp)) {
2154 if (syserror(tcp) || !verbose(tcp))
2155 tprintf("%#lx", tcp->u_arg[0]);
2156 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2157 tprintf("{...}");
2158 else if (!abbrev(tcp)) {
2159
2160 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2161 uname.sysname, uname.nodename);
2162 tprintf("release=\"%s\", version=\"%s\", ",
2163 uname.release, uname.version);
2164 tprintf("machine=\"%s\"", uname.machine);
2165#ifdef LINUX
2166#ifndef __GLIBC__
2167 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002168#endif
2169#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002170 tprintf("}");
2171 }
2172 else
2173 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2174 uname.sysname, uname.nodename);
2175 }
2176 return 0;
2177}
2178
2179#ifndef SVR4
2180
Roland McGratheb9e2e82009-06-02 16:49:22 -07002181static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002182# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002183 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2184 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2185 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2186 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2187 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2188 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2189 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2190 { PTRACE_CONT, "PTRACE_CONT" },
2191 { PTRACE_KILL, "PTRACE_KILL" },
2192 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2193 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2194 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002195# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002196 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002197# endif
2198# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002199 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002200# endif
2201# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002202 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002203# endif
2204# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002205 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002206# endif
2207# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002208 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002209# endif
2210# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002211 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002212# endif
2213# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002214 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002215# endif
2216# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002217 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002218# endif
2219# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002220 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002221# endif
2222# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002223 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002224# endif
2225# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002226 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002227# endif
2228# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002229 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002230# endif
2231# ifdef PTRACE_SET_SYSCALL
2232 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2233# endif
2234# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002235 { PTRACE_READDATA, "PTRACE_READDATA" },
2236 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2237 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2238 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2239 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2240 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002241# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002242 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2243 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002244# else /* !SPARC */
2245 { PTRACE_22, "PTRACE_22" },
2246 { PTRACE_23, "PTRACE_3" },
2247# endif /* !SPARC */
2248# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002249 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002250# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002251 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002252# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002253 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2254 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2255 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002256# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002257 { PTRACE_26, "PTRACE_26" },
2258 { PTRACE_27, "PTRACE_27" },
2259 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002260# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002261 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002262# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002263
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002264# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002265
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002266 { PT_TRACE_ME, "PT_TRACE_ME" },
2267 { PT_READ_I, "PT_READ_I" },
2268 { PT_READ_D, "PT_READ_D" },
2269 { PT_WRITE_I, "PT_WRITE_I" },
2270 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002271# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002272 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002273# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002274 { PT_CONTINUE, "PT_CONTINUE" },
2275 { PT_KILL, "PT_KILL" },
2276 { PT_STEP, "PT_STEP" },
2277 { PT_ATTACH, "PT_ATTACH" },
2278 { PT_DETACH, "PT_DETACH" },
2279 { PT_GETREGS, "PT_GETREGS" },
2280 { PT_SETREGS, "PT_SETREGS" },
2281 { PT_GETFPREGS, "PT_GETFPREGS" },
2282 { PT_SETFPREGS, "PT_SETFPREGS" },
2283 { PT_GETDBREGS, "PT_GETDBREGS" },
2284 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002285# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002286 { 0, NULL },
2287};
2288
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002289# ifndef FREEBSD
2290# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002291static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002292# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002293 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002294# endif
2295# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002296 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002297# endif
2298# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002299 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002300# endif
2301# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002302 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002303# endif
2304# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002305 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002306# endif
2307# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002308 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002309# endif
2310# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002311 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002312# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002313 { 0, NULL },
2314};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002315# endif /* PTRACE_SETOPTIONS */
2316# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002317
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002318# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002319const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002320# ifdef LINUX
2321# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002322 { PT_PSWMASK, "psw_mask" },
2323 { PT_PSWADDR, "psw_addr" },
2324 { PT_GPR0, "gpr0" },
2325 { PT_GPR1, "gpr1" },
2326 { PT_GPR2, "gpr2" },
2327 { PT_GPR3, "gpr3" },
2328 { PT_GPR4, "gpr4" },
2329 { PT_GPR5, "gpr5" },
2330 { PT_GPR6, "gpr6" },
2331 { PT_GPR7, "gpr7" },
2332 { PT_GPR8, "gpr8" },
2333 { PT_GPR9, "gpr9" },
2334 { PT_GPR10, "gpr10" },
2335 { PT_GPR11, "gpr11" },
2336 { PT_GPR12, "gpr12" },
2337 { PT_GPR13, "gpr13" },
2338 { PT_GPR14, "gpr14" },
2339 { PT_GPR15, "gpr15" },
2340 { PT_ACR0, "acr0" },
2341 { PT_ACR1, "acr1" },
2342 { PT_ACR2, "acr2" },
2343 { PT_ACR3, "acr3" },
2344 { PT_ACR4, "acr4" },
2345 { PT_ACR5, "acr5" },
2346 { PT_ACR6, "acr6" },
2347 { PT_ACR7, "acr7" },
2348 { PT_ACR8, "acr8" },
2349 { PT_ACR9, "acr9" },
2350 { PT_ACR10, "acr10" },
2351 { PT_ACR11, "acr11" },
2352 { PT_ACR12, "acr12" },
2353 { PT_ACR13, "acr13" },
2354 { PT_ACR14, "acr14" },
2355 { PT_ACR15, "acr15" },
2356 { PT_ORIGGPR2, "orig_gpr2" },
2357 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002358# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002359 { PT_FPR0_HI, "fpr0.hi" },
2360 { PT_FPR0_LO, "fpr0.lo" },
2361 { PT_FPR1_HI, "fpr1.hi" },
2362 { PT_FPR1_LO, "fpr1.lo" },
2363 { PT_FPR2_HI, "fpr2.hi" },
2364 { PT_FPR2_LO, "fpr2.lo" },
2365 { PT_FPR3_HI, "fpr3.hi" },
2366 { PT_FPR3_LO, "fpr3.lo" },
2367 { PT_FPR4_HI, "fpr4.hi" },
2368 { PT_FPR4_LO, "fpr4.lo" },
2369 { PT_FPR5_HI, "fpr5.hi" },
2370 { PT_FPR5_LO, "fpr5.lo" },
2371 { PT_FPR6_HI, "fpr6.hi" },
2372 { PT_FPR6_LO, "fpr6.lo" },
2373 { PT_FPR7_HI, "fpr7.hi" },
2374 { PT_FPR7_LO, "fpr7.lo" },
2375 { PT_FPR8_HI, "fpr8.hi" },
2376 { PT_FPR8_LO, "fpr8.lo" },
2377 { PT_FPR9_HI, "fpr9.hi" },
2378 { PT_FPR9_LO, "fpr9.lo" },
2379 { PT_FPR10_HI, "fpr10.hi" },
2380 { PT_FPR10_LO, "fpr10.lo" },
2381 { PT_FPR11_HI, "fpr11.hi" },
2382 { PT_FPR11_LO, "fpr11.lo" },
2383 { PT_FPR12_HI, "fpr12.hi" },
2384 { PT_FPR12_LO, "fpr12.lo" },
2385 { PT_FPR13_HI, "fpr13.hi" },
2386 { PT_FPR13_LO, "fpr13.lo" },
2387 { PT_FPR14_HI, "fpr14.hi" },
2388 { PT_FPR14_LO, "fpr14.lo" },
2389 { PT_FPR15_HI, "fpr15.hi" },
2390 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002391# endif
2392# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002393 { PT_FPR0, "fpr0" },
2394 { PT_FPR1, "fpr1" },
2395 { PT_FPR2, "fpr2" },
2396 { PT_FPR3, "fpr3" },
2397 { PT_FPR4, "fpr4" },
2398 { PT_FPR5, "fpr5" },
2399 { PT_FPR6, "fpr6" },
2400 { PT_FPR7, "fpr7" },
2401 { PT_FPR8, "fpr8" },
2402 { PT_FPR9, "fpr9" },
2403 { PT_FPR10, "fpr10" },
2404 { PT_FPR11, "fpr11" },
2405 { PT_FPR12, "fpr12" },
2406 { PT_FPR13, "fpr13" },
2407 { PT_FPR14, "fpr14" },
2408 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002409# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002410 { PT_CR_9, "cr9" },
2411 { PT_CR_10, "cr10" },
2412 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002413 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002414# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002415 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002416# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002417 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002418# elif defined(POWERPC)
2419# ifndef PT_ORIG_R3
2420# define PT_ORIG_R3 34
2421# endif
2422# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002423 { REGSIZE*PT_R0, "r0" },
2424 { REGSIZE*PT_R1, "r1" },
2425 { REGSIZE*PT_R2, "r2" },
2426 { REGSIZE*PT_R3, "r3" },
2427 { REGSIZE*PT_R4, "r4" },
2428 { REGSIZE*PT_R5, "r5" },
2429 { REGSIZE*PT_R6, "r6" },
2430 { REGSIZE*PT_R7, "r7" },
2431 { REGSIZE*PT_R8, "r8" },
2432 { REGSIZE*PT_R9, "r9" },
2433 { REGSIZE*PT_R10, "r10" },
2434 { REGSIZE*PT_R11, "r11" },
2435 { REGSIZE*PT_R12, "r12" },
2436 { REGSIZE*PT_R13, "r13" },
2437 { REGSIZE*PT_R14, "r14" },
2438 { REGSIZE*PT_R15, "r15" },
2439 { REGSIZE*PT_R16, "r16" },
2440 { REGSIZE*PT_R17, "r17" },
2441 { REGSIZE*PT_R18, "r18" },
2442 { REGSIZE*PT_R19, "r19" },
2443 { REGSIZE*PT_R20, "r20" },
2444 { REGSIZE*PT_R21, "r21" },
2445 { REGSIZE*PT_R22, "r22" },
2446 { REGSIZE*PT_R23, "r23" },
2447 { REGSIZE*PT_R24, "r24" },
2448 { REGSIZE*PT_R25, "r25" },
2449 { REGSIZE*PT_R26, "r26" },
2450 { REGSIZE*PT_R27, "r27" },
2451 { REGSIZE*PT_R28, "r28" },
2452 { REGSIZE*PT_R29, "r29" },
2453 { REGSIZE*PT_R30, "r30" },
2454 { REGSIZE*PT_R31, "r31" },
2455 { REGSIZE*PT_NIP, "NIP" },
2456 { REGSIZE*PT_MSR, "MSR" },
2457 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2458 { REGSIZE*PT_CTR, "CTR" },
2459 { REGSIZE*PT_LNK, "LNK" },
2460 { REGSIZE*PT_XER, "XER" },
2461 { REGSIZE*PT_CCR, "CCR" },
2462 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002463# undef REGSIZE
2464# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002465 { 0, "r0" },
2466 { 1, "r1" },
2467 { 2, "r2" },
2468 { 3, "r3" },
2469 { 4, "r4" },
2470 { 5, "r5" },
2471 { 6, "r6" },
2472 { 7, "r7" },
2473 { 8, "r8" },
2474 { 9, "r9" },
2475 { 10, "r10" },
2476 { 11, "r11" },
2477 { 12, "r12" },
2478 { 13, "r13" },
2479 { 14, "r14" },
2480 { 15, "r15" },
2481 { 16, "r16" },
2482 { 17, "r17" },
2483 { 18, "r18" },
2484 { 19, "r19" },
2485 { 20, "r20" },
2486 { 21, "r21" },
2487 { 22, "r22" },
2488 { 23, "r23" },
2489 { 24, "r24" },
2490 { 25, "r25" },
2491 { 26, "r26" },
2492 { 27, "r27" },
2493 { 28, "r28" },
2494 { 29, "gp" },
2495 { 30, "fp" },
2496 { 31, "zero" },
2497 { 32, "fp0" },
2498 { 33, "fp" },
2499 { 34, "fp2" },
2500 { 35, "fp3" },
2501 { 36, "fp4" },
2502 { 37, "fp5" },
2503 { 38, "fp6" },
2504 { 39, "fp7" },
2505 { 40, "fp8" },
2506 { 41, "fp9" },
2507 { 42, "fp10" },
2508 { 43, "fp11" },
2509 { 44, "fp12" },
2510 { 45, "fp13" },
2511 { 46, "fp14" },
2512 { 47, "fp15" },
2513 { 48, "fp16" },
2514 { 49, "fp17" },
2515 { 50, "fp18" },
2516 { 51, "fp19" },
2517 { 52, "fp20" },
2518 { 53, "fp21" },
2519 { 54, "fp22" },
2520 { 55, "fp23" },
2521 { 56, "fp24" },
2522 { 57, "fp25" },
2523 { 58, "fp26" },
2524 { 59, "fp27" },
2525 { 60, "fp28" },
2526 { 61, "fp29" },
2527 { 62, "fp30" },
2528 { 63, "fp31" },
2529 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002530# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002531 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2532 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2533 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2534 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2535 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2536 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2537 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2538 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2539 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2540 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2541 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2542 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2543 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2544 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2545 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2546 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2547 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2548 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2549 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2550 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2551 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2552 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2553 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2554 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2555 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2556 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2557 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2558 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2559 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2560 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2561 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2562 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2563 /* switch stack: */
2564 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2565 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2566 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2567 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2568 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2569 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2570 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2571 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2572 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2573 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002574 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2575 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002576 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002577 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002578 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2579 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002580 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2581 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2582 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2583 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2584 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2585 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2586 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2587 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2588 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2589 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2590 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2591 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2592 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2593 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2594 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002595# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002596 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002597# endif
2598# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002599 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002600# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002601 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002602# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002603 { 4*EBX, "4*EBX" },
2604 { 4*ECX, "4*ECX" },
2605 { 4*EDX, "4*EDX" },
2606 { 4*ESI, "4*ESI" },
2607 { 4*EDI, "4*EDI" },
2608 { 4*EBP, "4*EBP" },
2609 { 4*EAX, "4*EAX" },
2610 { 4*DS, "4*DS" },
2611 { 4*ES, "4*ES" },
2612 { 4*FS, "4*FS" },
2613 { 4*GS, "4*GS" },
2614 { 4*ORIG_EAX, "4*ORIG_EAX" },
2615 { 4*EIP, "4*EIP" },
2616 { 4*CS, "4*CS" },
2617 { 4*EFL, "4*EFL" },
2618 { 4*UESP, "4*UESP" },
2619 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002620# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002621 { 8*R15, "8*R15" },
2622 { 8*R14, "8*R14" },
2623 { 8*R13, "8*R13" },
2624 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002625 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002626 { 8*RBX, "8*RBX" },
2627 { 8*R11, "8*R11" },
2628 { 8*R10, "8*R10" },
2629 { 8*R9, "8*R9" },
2630 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002631 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002632 { 8*RCX, "8*RCX" },
2633 { 8*RDX, "8*RDX" },
2634 { 8*RSI, "8*RSI" },
2635 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002636 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002637 { 8*RIP, "8*RIP" },
2638 { 8*CS, "8*CS" },
2639 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002640 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002641 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002642# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002643 { 4*PT_D1, "4*PT_D1" },
2644 { 4*PT_D2, "4*PT_D2" },
2645 { 4*PT_D3, "4*PT_D3" },
2646 { 4*PT_D4, "4*PT_D4" },
2647 { 4*PT_D5, "4*PT_D5" },
2648 { 4*PT_D6, "4*PT_D6" },
2649 { 4*PT_D7, "4*PT_D7" },
2650 { 4*PT_A0, "4*PT_A0" },
2651 { 4*PT_A1, "4*PT_A1" },
2652 { 4*PT_A2, "4*PT_A2" },
2653 { 4*PT_A3, "4*PT_A3" },
2654 { 4*PT_A4, "4*PT_A4" },
2655 { 4*PT_A5, "4*PT_A5" },
2656 { 4*PT_A6, "4*PT_A6" },
2657 { 4*PT_D0, "4*PT_D0" },
2658 { 4*PT_USP, "4*PT_USP" },
2659 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2660 { 4*PT_SR, "4*PT_SR" },
2661 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002662# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002663 { 4*REG_REG0, "4*REG_REG0" },
2664 { 4*(REG_REG0+1), "4*REG_REG1" },
2665 { 4*(REG_REG0+2), "4*REG_REG2" },
2666 { 4*(REG_REG0+3), "4*REG_REG3" },
2667 { 4*(REG_REG0+4), "4*REG_REG4" },
2668 { 4*(REG_REG0+5), "4*REG_REG5" },
2669 { 4*(REG_REG0+6), "4*REG_REG6" },
2670 { 4*(REG_REG0+7), "4*REG_REG7" },
2671 { 4*(REG_REG0+8), "4*REG_REG8" },
2672 { 4*(REG_REG0+9), "4*REG_REG9" },
2673 { 4*(REG_REG0+10), "4*REG_REG10" },
2674 { 4*(REG_REG0+11), "4*REG_REG11" },
2675 { 4*(REG_REG0+12), "4*REG_REG12" },
2676 { 4*(REG_REG0+13), "4*REG_REG13" },
2677 { 4*(REG_REG0+14), "4*REG_REG14" },
2678 { 4*REG_REG15, "4*REG_REG15" },
2679 { 4*REG_PC, "4*REG_PC" },
2680 { 4*REG_PR, "4*REG_PR" },
2681 { 4*REG_SR, "4*REG_SR" },
2682 { 4*REG_GBR, "4*REG_GBR" },
2683 { 4*REG_MACH, "4*REG_MACH" },
2684 { 4*REG_MACL, "4*REG_MACL" },
2685 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2686 { 4*REG_FPUL, "4*REG_FPUL" },
2687 { 4*REG_FPREG0, "4*REG_FPREG0" },
2688 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2689 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2690 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2691 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2692 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2693 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2694 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2695 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2696 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2697 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2698 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2699 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2700 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2701 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2702 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002703# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002704 { 4*REG_XDREG0, "4*REG_XDREG0" },
2705 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2706 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2707 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2708 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2709 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2710 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2711 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002712# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002713 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002714# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002715 { 0, "PC(L)" },
2716 { 4, "PC(U)" },
2717 { 8, "SR(L)" },
2718 { 12, "SR(U)" },
2719 { 16, "syscall no.(L)" },
2720 { 20, "syscall_no.(U)" },
2721 { 24, "R0(L)" },
2722 { 28, "R0(U)" },
2723 { 32, "R1(L)" },
2724 { 36, "R1(U)" },
2725 { 40, "R2(L)" },
2726 { 44, "R2(U)" },
2727 { 48, "R3(L)" },
2728 { 52, "R3(U)" },
2729 { 56, "R4(L)" },
2730 { 60, "R4(U)" },
2731 { 64, "R5(L)" },
2732 { 68, "R5(U)" },
2733 { 72, "R6(L)" },
2734 { 76, "R6(U)" },
2735 { 80, "R7(L)" },
2736 { 84, "R7(U)" },
2737 { 88, "R8(L)" },
2738 { 92, "R8(U)" },
2739 { 96, "R9(L)" },
2740 { 100, "R9(U)" },
2741 { 104, "R10(L)" },
2742 { 108, "R10(U)" },
2743 { 112, "R11(L)" },
2744 { 116, "R11(U)" },
2745 { 120, "R12(L)" },
2746 { 124, "R12(U)" },
2747 { 128, "R13(L)" },
2748 { 132, "R13(U)" },
2749 { 136, "R14(L)" },
2750 { 140, "R14(U)" },
2751 { 144, "R15(L)" },
2752 { 148, "R15(U)" },
2753 { 152, "R16(L)" },
2754 { 156, "R16(U)" },
2755 { 160, "R17(L)" },
2756 { 164, "R17(U)" },
2757 { 168, "R18(L)" },
2758 { 172, "R18(U)" },
2759 { 176, "R19(L)" },
2760 { 180, "R19(U)" },
2761 { 184, "R20(L)" },
2762 { 188, "R20(U)" },
2763 { 192, "R21(L)" },
2764 { 196, "R21(U)" },
2765 { 200, "R22(L)" },
2766 { 204, "R22(U)" },
2767 { 208, "R23(L)" },
2768 { 212, "R23(U)" },
2769 { 216, "R24(L)" },
2770 { 220, "R24(U)" },
2771 { 224, "R25(L)" },
2772 { 228, "R25(U)" },
2773 { 232, "R26(L)" },
2774 { 236, "R26(U)" },
2775 { 240, "R27(L)" },
2776 { 244, "R27(U)" },
2777 { 248, "R28(L)" },
2778 { 252, "R28(U)" },
2779 { 256, "R29(L)" },
2780 { 260, "R29(U)" },
2781 { 264, "R30(L)" },
2782 { 268, "R30(U)" },
2783 { 272, "R31(L)" },
2784 { 276, "R31(U)" },
2785 { 280, "R32(L)" },
2786 { 284, "R32(U)" },
2787 { 288, "R33(L)" },
2788 { 292, "R33(U)" },
2789 { 296, "R34(L)" },
2790 { 300, "R34(U)" },
2791 { 304, "R35(L)" },
2792 { 308, "R35(U)" },
2793 { 312, "R36(L)" },
2794 { 316, "R36(U)" },
2795 { 320, "R37(L)" },
2796 { 324, "R37(U)" },
2797 { 328, "R38(L)" },
2798 { 332, "R38(U)" },
2799 { 336, "R39(L)" },
2800 { 340, "R39(U)" },
2801 { 344, "R40(L)" },
2802 { 348, "R40(U)" },
2803 { 352, "R41(L)" },
2804 { 356, "R41(U)" },
2805 { 360, "R42(L)" },
2806 { 364, "R42(U)" },
2807 { 368, "R43(L)" },
2808 { 372, "R43(U)" },
2809 { 376, "R44(L)" },
2810 { 380, "R44(U)" },
2811 { 384, "R45(L)" },
2812 { 388, "R45(U)" },
2813 { 392, "R46(L)" },
2814 { 396, "R46(U)" },
2815 { 400, "R47(L)" },
2816 { 404, "R47(U)" },
2817 { 408, "R48(L)" },
2818 { 412, "R48(U)" },
2819 { 416, "R49(L)" },
2820 { 420, "R49(U)" },
2821 { 424, "R50(L)" },
2822 { 428, "R50(U)" },
2823 { 432, "R51(L)" },
2824 { 436, "R51(U)" },
2825 { 440, "R52(L)" },
2826 { 444, "R52(U)" },
2827 { 448, "R53(L)" },
2828 { 452, "R53(U)" },
2829 { 456, "R54(L)" },
2830 { 460, "R54(U)" },
2831 { 464, "R55(L)" },
2832 { 468, "R55(U)" },
2833 { 472, "R56(L)" },
2834 { 476, "R56(U)" },
2835 { 480, "R57(L)" },
2836 { 484, "R57(U)" },
2837 { 488, "R58(L)" },
2838 { 492, "R58(U)" },
2839 { 496, "R59(L)" },
2840 { 500, "R59(U)" },
2841 { 504, "R60(L)" },
2842 { 508, "R60(U)" },
2843 { 512, "R61(L)" },
2844 { 516, "R61(U)" },
2845 { 520, "R62(L)" },
2846 { 524, "R62(U)" },
2847 { 528, "TR0(L)" },
2848 { 532, "TR0(U)" },
2849 { 536, "TR1(L)" },
2850 { 540, "TR1(U)" },
2851 { 544, "TR2(L)" },
2852 { 548, "TR2(U)" },
2853 { 552, "TR3(L)" },
2854 { 556, "TR3(U)" },
2855 { 560, "TR4(L)" },
2856 { 564, "TR4(U)" },
2857 { 568, "TR5(L)" },
2858 { 572, "TR5(U)" },
2859 { 576, "TR6(L)" },
2860 { 580, "TR6(U)" },
2861 { 584, "TR7(L)" },
2862 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002863 /* This entry is in case pt_regs contains dregs (depends on
2864 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002865 { uoff(regs), "offsetof(struct user, regs)" },
2866 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002867# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002868 { uoff(regs.ARM_r0), "r0" },
2869 { uoff(regs.ARM_r1), "r1" },
2870 { uoff(regs.ARM_r2), "r2" },
2871 { uoff(regs.ARM_r3), "r3" },
2872 { uoff(regs.ARM_r4), "r4" },
2873 { uoff(regs.ARM_r5), "r5" },
2874 { uoff(regs.ARM_r6), "r6" },
2875 { uoff(regs.ARM_r7), "r7" },
2876 { uoff(regs.ARM_r8), "r8" },
2877 { uoff(regs.ARM_r9), "r9" },
2878 { uoff(regs.ARM_r10), "r10" },
2879 { uoff(regs.ARM_fp), "fp" },
2880 { uoff(regs.ARM_ip), "ip" },
2881 { uoff(regs.ARM_sp), "sp" },
2882 { uoff(regs.ARM_lr), "lr" },
2883 { uoff(regs.ARM_pc), "pc" },
2884 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002885# elif defined(AVR32)
2886 { uoff(regs.sr), "sr" },
2887 { uoff(regs.pc), "pc" },
2888 { uoff(regs.lr), "lr" },
2889 { uoff(regs.sp), "sp" },
2890 { uoff(regs.r12), "r12" },
2891 { uoff(regs.r11), "r11" },
2892 { uoff(regs.r10), "r10" },
2893 { uoff(regs.r9), "r9" },
2894 { uoff(regs.r8), "r8" },
2895 { uoff(regs.r7), "r7" },
2896 { uoff(regs.r6), "r6" },
2897 { uoff(regs.r5), "r5" },
2898 { uoff(regs.r4), "r4" },
2899 { uoff(regs.r3), "r3" },
2900 { uoff(regs.r2), "r2" },
2901 { uoff(regs.r1), "r1" },
2902 { uoff(regs.r0), "r0" },
2903 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002904# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002905 { 0, "r0" },
2906 { 1, "r1" },
2907 { 2, "r2" },
2908 { 3, "r3" },
2909 { 4, "r4" },
2910 { 5, "r5" },
2911 { 6, "r6" },
2912 { 7, "r7" },
2913 { 8, "r8" },
2914 { 9, "r9" },
2915 { 10, "r10" },
2916 { 11, "r11" },
2917 { 12, "r12" },
2918 { 13, "r13" },
2919 { 14, "r14" },
2920 { 15, "r15" },
2921 { 16, "r16" },
2922 { 17, "r17" },
2923 { 18, "r18" },
2924 { 19, "r19" },
2925 { 20, "r20" },
2926 { 21, "r21" },
2927 { 22, "r22" },
2928 { 23, "r23" },
2929 { 24, "r24" },
2930 { 25, "r25" },
2931 { 26, "r26" },
2932 { 27, "r27" },
2933 { 28, "r28" },
2934 { 29, "r29" },
2935 { 30, "r30" },
2936 { 31, "r31" },
2937 { 32, "f0" },
2938 { 33, "f1" },
2939 { 34, "f2" },
2940 { 35, "f3" },
2941 { 36, "f4" },
2942 { 37, "f5" },
2943 { 38, "f6" },
2944 { 39, "f7" },
2945 { 40, "f8" },
2946 { 41, "f9" },
2947 { 42, "f10" },
2948 { 43, "f11" },
2949 { 44, "f12" },
2950 { 45, "f13" },
2951 { 46, "f14" },
2952 { 47, "f15" },
2953 { 48, "f16" },
2954 { 49, "f17" },
2955 { 50, "f18" },
2956 { 51, "f19" },
2957 { 52, "f20" },
2958 { 53, "f21" },
2959 { 54, "f22" },
2960 { 55, "f23" },
2961 { 56, "f24" },
2962 { 57, "f25" },
2963 { 58, "f26" },
2964 { 59, "f27" },
2965 { 60, "f28" },
2966 { 61, "f29" },
2967 { 62, "f30" },
2968 { 63, "f31" },
2969 { 64, "pc" },
2970 { 65, "cause" },
2971 { 66, "badvaddr" },
2972 { 67, "mmhi" },
2973 { 68, "mmlo" },
2974 { 69, "fpcsr" },
2975 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002976# elif defined(TILE)
2977 { PTREGS_OFFSET_REG(0), "r0" },
2978 { PTREGS_OFFSET_REG(1), "r1" },
2979 { PTREGS_OFFSET_REG(2), "r2" },
2980 { PTREGS_OFFSET_REG(3), "r3" },
2981 { PTREGS_OFFSET_REG(4), "r4" },
2982 { PTREGS_OFFSET_REG(5), "r5" },
2983 { PTREGS_OFFSET_REG(6), "r6" },
2984 { PTREGS_OFFSET_REG(7), "r7" },
2985 { PTREGS_OFFSET_REG(8), "r8" },
2986 { PTREGS_OFFSET_REG(9), "r9" },
2987 { PTREGS_OFFSET_REG(10), "r10" },
2988 { PTREGS_OFFSET_REG(11), "r11" },
2989 { PTREGS_OFFSET_REG(12), "r12" },
2990 { PTREGS_OFFSET_REG(13), "r13" },
2991 { PTREGS_OFFSET_REG(14), "r14" },
2992 { PTREGS_OFFSET_REG(15), "r15" },
2993 { PTREGS_OFFSET_REG(16), "r16" },
2994 { PTREGS_OFFSET_REG(17), "r17" },
2995 { PTREGS_OFFSET_REG(18), "r18" },
2996 { PTREGS_OFFSET_REG(19), "r19" },
2997 { PTREGS_OFFSET_REG(20), "r20" },
2998 { PTREGS_OFFSET_REG(21), "r21" },
2999 { PTREGS_OFFSET_REG(22), "r22" },
3000 { PTREGS_OFFSET_REG(23), "r23" },
3001 { PTREGS_OFFSET_REG(24), "r24" },
3002 { PTREGS_OFFSET_REG(25), "r25" },
3003 { PTREGS_OFFSET_REG(26), "r26" },
3004 { PTREGS_OFFSET_REG(27), "r27" },
3005 { PTREGS_OFFSET_REG(28), "r28" },
3006 { PTREGS_OFFSET_REG(29), "r29" },
3007 { PTREGS_OFFSET_REG(30), "r30" },
3008 { PTREGS_OFFSET_REG(31), "r31" },
3009 { PTREGS_OFFSET_REG(32), "r32" },
3010 { PTREGS_OFFSET_REG(33), "r33" },
3011 { PTREGS_OFFSET_REG(34), "r34" },
3012 { PTREGS_OFFSET_REG(35), "r35" },
3013 { PTREGS_OFFSET_REG(36), "r36" },
3014 { PTREGS_OFFSET_REG(37), "r37" },
3015 { PTREGS_OFFSET_REG(38), "r38" },
3016 { PTREGS_OFFSET_REG(39), "r39" },
3017 { PTREGS_OFFSET_REG(40), "r40" },
3018 { PTREGS_OFFSET_REG(41), "r41" },
3019 { PTREGS_OFFSET_REG(42), "r42" },
3020 { PTREGS_OFFSET_REG(43), "r43" },
3021 { PTREGS_OFFSET_REG(44), "r44" },
3022 { PTREGS_OFFSET_REG(45), "r45" },
3023 { PTREGS_OFFSET_REG(46), "r46" },
3024 { PTREGS_OFFSET_REG(47), "r47" },
3025 { PTREGS_OFFSET_REG(48), "r48" },
3026 { PTREGS_OFFSET_REG(49), "r49" },
3027 { PTREGS_OFFSET_REG(50), "r50" },
3028 { PTREGS_OFFSET_REG(51), "r51" },
3029 { PTREGS_OFFSET_REG(52), "r52" },
3030 { PTREGS_OFFSET_TP, "tp" },
3031 { PTREGS_OFFSET_SP, "sp" },
3032 { PTREGS_OFFSET_LR, "lr" },
3033 { PTREGS_OFFSET_PC, "pc" },
3034 { PTREGS_OFFSET_EX1, "ex1" },
3035 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
3036 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
3037 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003038# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003039# ifdef CRISV10
3040 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3041 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3042 { 4*PT_R13, "4*PT_R13" },
3043 { 4*PT_R12, "4*PT_R12" },
3044 { 4*PT_R11, "4*PT_R11" },
3045 { 4*PT_R10, "4*PT_R10" },
3046 { 4*PT_R9, "4*PT_R9" },
3047 { 4*PT_R8, "4*PT_R8" },
3048 { 4*PT_R7, "4*PT_R7" },
3049 { 4*PT_R6, "4*PT_R6" },
3050 { 4*PT_R5, "4*PT_R5" },
3051 { 4*PT_R4, "4*PT_R4" },
3052 { 4*PT_R3, "4*PT_R3" },
3053 { 4*PT_R2, "4*PT_R2" },
3054 { 4*PT_R1, "4*PT_R1" },
3055 { 4*PT_R0, "4*PT_R0" },
3056 { 4*PT_MOF, "4*PT_MOF" },
3057 { 4*PT_DCCR, "4*PT_DCCR" },
3058 { 4*PT_SRP, "4*PT_SRP" },
3059 { 4*PT_IRP, "4*PT_IRP" },
3060 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3061 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3062 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3063 { 4*PT_USP, "4*PT_USP" },
3064# endif
3065# ifdef CRISV32
3066 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3067 { 4*PT_R0, "4*PT_R0" },
3068 { 4*PT_R1, "4*PT_R1" },
3069 { 4*PT_R2, "4*PT_R2" },
3070 { 4*PT_R3, "4*PT_R3" },
3071 { 4*PT_R4, "4*PT_R4" },
3072 { 4*PT_R5, "4*PT_R5" },
3073 { 4*PT_R6, "4*PT_R6" },
3074 { 4*PT_R7, "4*PT_R7" },
3075 { 4*PT_R8, "4*PT_R8" },
3076 { 4*PT_R9, "4*PT_R9" },
3077 { 4*PT_R10, "4*PT_R10" },
3078 { 4*PT_R11, "4*PT_R11" },
3079 { 4*PT_R12, "4*PT_R12" },
3080 { 4*PT_R13, "4*PT_R13" },
3081 { 4*PT_ACR, "4*PT_ACR" },
3082 { 4*PT_SRS, "4*PT_SRS" },
3083 { 4*PT_MOF, "4*PT_MOF" },
3084 { 4*PT_SPC, "4*PT_SPC" },
3085 { 4*PT_CCS, "4*PT_CCS" },
3086 { 4*PT_SRP, "4*PT_SRP" },
3087 { 4*PT_ERP, "4*PT_ERP" },
3088 { 4*PT_EXS, "4*PT_EXS" },
3089 { 4*PT_EDA, "4*PT_EDA" },
3090 { 4*PT_USP, "4*PT_USP" },
3091 { 4*PT_PPC, "4*PT_PPC" },
3092 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3093 { 4*PT_BP+4, "4*PT_BP+4" },
3094 { 4*PT_BP+8, "4*PT_BP+8" },
3095 { 4*PT_BP+12, "4*PT_BP+12" },
3096 { 4*PT_BP+16, "4*PT_BP+16" },
3097 { 4*PT_BP+20, "4*PT_BP+20" },
3098 { 4*PT_BP+24, "4*PT_BP+24" },
3099 { 4*PT_BP+28, "4*PT_BP+28" },
3100 { 4*PT_BP+32, "4*PT_BP+32" },
3101 { 4*PT_BP+36, "4*PT_BP+36" },
3102 { 4*PT_BP+40, "4*PT_BP+40" },
3103 { 4*PT_BP+44, "4*PT_BP+44" },
3104 { 4*PT_BP+48, "4*PT_BP+48" },
3105 { 4*PT_BP+52, "4*PT_BP+52" },
3106 { 4*PT_BP+56, "4*PT_BP+56" },
3107# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003108# ifdef MICROBLAZE
3109 { PT_GPR(0), "r0" },
3110 { PT_GPR(1), "r1" },
3111 { PT_GPR(2), "r2" },
3112 { PT_GPR(3), "r3" },
3113 { PT_GPR(4), "r4" },
3114 { PT_GPR(5), "r5" },
3115 { PT_GPR(6), "r6" },
3116 { PT_GPR(7), "r7" },
3117 { PT_GPR(8), "r8" },
3118 { PT_GPR(9), "r9" },
3119 { PT_GPR(10), "r10" },
3120 { PT_GPR(11), "r11" },
3121 { PT_GPR(12), "r12" },
3122 { PT_GPR(13), "r13" },
3123 { PT_GPR(14), "r14" },
3124 { PT_GPR(15), "r15" },
3125 { PT_GPR(16), "r16" },
3126 { PT_GPR(17), "r17" },
3127 { PT_GPR(18), "r18" },
3128 { PT_GPR(19), "r19" },
3129 { PT_GPR(20), "r20" },
3130 { PT_GPR(21), "r21" },
3131 { PT_GPR(22), "r22" },
3132 { PT_GPR(23), "r23" },
3133 { PT_GPR(24), "r24" },
3134 { PT_GPR(25), "r25" },
3135 { PT_GPR(26), "r26" },
3136 { PT_GPR(27), "r27" },
3137 { PT_GPR(28), "r28" },
3138 { PT_GPR(29), "r29" },
3139 { PT_GPR(30), "r30" },
3140 { PT_GPR(31), "r31" },
3141 { PT_PC, "rpc", },
3142 { PT_MSR, "rmsr", },
3143 { PT_EAR, "rear", },
3144 { PT_ESR, "resr", },
3145 { PT_FSR, "rfsr", },
3146 { PT_KERNEL_MODE, "kernel_mode", },
3147# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003148
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003149# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3150 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003151 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003152# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003153 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003154# endif
3155# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003156 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003157# endif
3158# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003159 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003160# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003161 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3162 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3163 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003164# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003165 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003166# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003167# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003168 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003169# endif
3170# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003171 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003172# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003173 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003174# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003175 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003176# endif
3177# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003178 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003179# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003180# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003181 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003182# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003183 { uoff(magic), "offsetof(struct user, magic)" },
3184 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003185# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003186 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003187# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003188# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003189
3190# endif /* LINUX */
3191
3192# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003193 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3194 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3195 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3196 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3197 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3198 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3199 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3200 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3201 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3202 { uoff(u_error), "offsetof(struct user, u_error)" },
3203 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3204 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3205 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3206 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3207 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3208 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3209 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3210 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3211 { uoff(u_code), "offsetof(struct user, u_code)" },
3212 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3213 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3214 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3215 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3216 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3217 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3218 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3219 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3220 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3221 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3222 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3223 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3224 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3225 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3226 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3227 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3228 { uoff(u_start), "offsetof(struct user, u_start)" },
3229 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3230 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3231 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3232 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3233 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3234 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3235 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3236 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3237 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003238# endif /* SUNOS4 */
3239# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003240 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003241# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003242 { 0, NULL },
3243};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003244# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003245
3246int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003247sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003248{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003249 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003250 long addr;
3251
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003252 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003253 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003254# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003255 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003256# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003257 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003258# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003259 );
3260 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003261 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003262# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003263 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3264 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3265 for (x = struct_user_offsets; x->str; x++) {
3266 if (x->val >= addr)
3267 break;
3268 }
3269 if (!x->str)
3270 tprintf("%#lx, ", addr);
3271 else if (x->val > addr && x != struct_user_offsets) {
3272 x--;
3273 tprintf("%s + %ld, ", x->str, addr - x->val);
3274 }
3275 else
3276 tprintf("%s, ", x->str);
3277 }
3278 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003279# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003280 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003281# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003282 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003283# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003284 case PTRACE_PEEKDATA:
3285 case PTRACE_PEEKTEXT:
3286 case PTRACE_PEEKUSER:
3287 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003288# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003289 case PTRACE_CONT:
3290 case PTRACE_SINGLESTEP:
3291 case PTRACE_SYSCALL:
3292 case PTRACE_DETACH:
3293 printsignal(tcp->u_arg[3]);
3294 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003295# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003296 case PTRACE_SETOPTIONS:
3297 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3298 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003299# endif
3300# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003301 case PTRACE_SETSIGINFO: {
3302 siginfo_t si;
3303 if (!tcp->u_arg[3])
3304 tprintf("NULL");
3305 else if (syserror(tcp))
3306 tprintf("%#lx", tcp->u_arg[3]);
3307 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3308 tprintf("{???}");
3309 else
3310 printsiginfo(&si, verbose(tcp));
3311 break;
3312 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003313# endif
3314# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003315 case PTRACE_GETSIGINFO:
3316 /* Don't print anything, do it at syscall return. */
3317 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003318# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003319 default:
3320 tprintf("%#lx", tcp->u_arg[3]);
3321 break;
3322 }
3323 } else {
3324 switch (tcp->u_arg[0]) {
3325 case PTRACE_PEEKDATA:
3326 case PTRACE_PEEKTEXT:
3327 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003328# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003329 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003330# else
Roland McGratheb285352003-01-14 09:59:00 +00003331 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003332 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003333# endif
3334# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003335 case PTRACE_GETSIGINFO: {
3336 siginfo_t si;
3337 if (!tcp->u_arg[3])
3338 tprintf("NULL");
3339 else if (syserror(tcp))
3340 tprintf("%#lx", tcp->u_arg[3]);
3341 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3342 tprintf("{???}");
3343 else
3344 printsiginfo(&si, verbose(tcp));
3345 break;
3346 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003347# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003348 }
3349 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003350# endif /* LINUX */
3351# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003352 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3353 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3354 tprintf("%lu, ", tcp->u_arg[3]);
3355 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3356 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3357 tcp->u_arg[0] != PTRACE_READTEXT) {
3358 tprintf("%#lx", tcp->u_arg[3]);
3359 }
3360 } else {
3361 if (tcp->u_arg[0] == PTRACE_READDATA ||
3362 tcp->u_arg[0] == PTRACE_READTEXT) {
3363 tprintf("%lu, ", tcp->u_arg[3]);
3364 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3365 }
3366 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003367# endif /* SUNOS4 */
3368# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003369 tprintf("%lu", tcp->u_arg[3]);
3370 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003371# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003372 return 0;
3373}
3374
3375#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003376
3377#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003378# ifndef FUTEX_CMP_REQUEUE
3379# define FUTEX_CMP_REQUEUE 4
3380# endif
3381# ifndef FUTEX_WAKE_OP
3382# define FUTEX_WAKE_OP 5
3383# endif
3384# ifndef FUTEX_LOCK_PI
3385# define FUTEX_LOCK_PI 6
3386# define FUTEX_UNLOCK_PI 7
3387# define FUTEX_TRYLOCK_PI 8
3388# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003389# ifndef FUTEX_WAIT_BITSET
3390# define FUTEX_WAIT_BITSET 9
3391# endif
3392# ifndef FUTEX_WAKE_BITSET
3393# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003394# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003395# ifndef FUTEX_WAIT_REQUEUE_PI
3396# define FUTEX_WAIT_REQUEUE_PI 11
3397# endif
3398# ifndef FUTEX_CMP_REQUEUE_PI
3399# define FUTEX_CMP_REQUEUE_PI 12
3400# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003401# ifndef FUTEX_PRIVATE_FLAG
3402# define FUTEX_PRIVATE_FLAG 128
3403# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003404# ifndef FUTEX_CLOCK_REALTIME
3405# define FUTEX_CLOCK_REALTIME 256
3406# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003407static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003408 { FUTEX_WAIT, "FUTEX_WAIT" },
3409 { FUTEX_WAKE, "FUTEX_WAKE" },
3410 { FUTEX_FD, "FUTEX_FD" },
3411 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3412 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3413 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3414 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3415 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3416 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003417 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3418 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003419 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3420 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003421 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3422 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3423 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3424 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3425 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3426 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3427 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3428 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3429 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003430 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3431 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003432 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3433 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3434 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3435 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3436 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3437 { 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 +00003438 { 0, NULL }
3439};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003440# ifndef FUTEX_OP_SET
3441# define FUTEX_OP_SET 0
3442# define FUTEX_OP_ADD 1
3443# define FUTEX_OP_OR 2
3444# define FUTEX_OP_ANDN 3
3445# define FUTEX_OP_XOR 4
3446# define FUTEX_OP_CMP_EQ 0
3447# define FUTEX_OP_CMP_NE 1
3448# define FUTEX_OP_CMP_LT 2
3449# define FUTEX_OP_CMP_LE 3
3450# define FUTEX_OP_CMP_GT 4
3451# define FUTEX_OP_CMP_GE 5
3452# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003453static const struct xlat futexwakeops[] = {
3454 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3455 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3456 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3457 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3458 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3459 { 0, NULL }
3460};
3461static const struct xlat futexwakecmps[] = {
3462 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3463 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3464 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3465 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3466 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3467 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3468 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003469};
3470
3471int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003472sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003473{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003474 if (entering(tcp)) {
3475 long int cmd = tcp->u_arg[1] & 127;
3476 tprintf("%p, ", (void *) tcp->u_arg[0]);
3477 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3478 tprintf(", %ld", tcp->u_arg[2]);
3479 if (cmd == FUTEX_WAKE_BITSET)
3480 tprintf(", %lx", tcp->u_arg[5]);
3481 else if (cmd == FUTEX_WAIT) {
3482 tprintf(", ");
3483 printtv(tcp, tcp->u_arg[3]);
3484 } else if (cmd == FUTEX_WAIT_BITSET) {
3485 tprintf(", ");
3486 printtv(tcp, tcp->u_arg[3]);
3487 tprintf(", %lx", tcp->u_arg[5]);
3488 } else if (cmd == FUTEX_REQUEUE)
3489 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003490 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003491 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3492 else if (cmd == FUTEX_WAKE_OP) {
3493 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3494 if ((tcp->u_arg[5] >> 28) & 8)
3495 tprintf("FUTEX_OP_OPARG_SHIFT|");
3496 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3497 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3498 if ((tcp->u_arg[5] >> 24) & 8)
3499 tprintf("FUTEX_OP_OPARG_SHIFT|");
3500 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3501 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003502 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3503 tprintf(", ");
3504 printtv(tcp, tcp->u_arg[3]);
3505 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003506 }
Roland McGrath51942a92007-07-05 18:59:11 +00003507 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003508 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003509}
3510
3511static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003512print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003513{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003514 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003515 unsigned long w, min_len;
3516
3517 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3518 min_len = len - max_strlen * sizeof(w);
3519 else
3520 min_len = 0;
3521 for (; len >= sizeof(w) && len > min_len;
3522 len -= sizeof(w), list += sizeof(w)) {
3523 if (umove(tcp, list, &w) < 0)
3524 break;
3525 if (first)
3526 tprintf("{");
3527 else
3528 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003529 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003530 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003531 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003532 if (len) {
3533 if (first)
3534 tprintf("%#lx", list);
3535 else
3536 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3537 "???" : "..."));
3538 } else {
3539 tprintf(first ? "{}" : "}");
3540 }
Roland McGrath5a223472002-12-15 23:58:26 +00003541}
3542
3543int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003544sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003545{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003546 if (entering(tcp)) {
3547 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3548 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3549 }
3550 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003551}
3552
3553int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003554sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003555{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003556 if (entering(tcp)) {
3557 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3558 } else {
3559 if (tcp->u_rval == -1)
3560 tprintf("%#lx", tcp->u_arg[2]);
3561 else
3562 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3563 }
3564 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003565}
Roland McGrath279d3782004-03-01 20:27:37 +00003566
Roland McGrathd9f816f2004-09-04 03:39:20 +00003567static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003568 { SCHED_OTHER, "SCHED_OTHER" },
3569 { SCHED_RR, "SCHED_RR" },
3570 { SCHED_FIFO, "SCHED_FIFO" },
3571 { 0, NULL }
3572};
3573
3574int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003575sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003576{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003577 if (entering(tcp)) {
3578 tprintf("%d", (int) tcp->u_arg[0]);
3579 } else if (! syserror(tcp)) {
3580 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3581 if (tcp->auxstr != NULL)
3582 return RVAL_STR;
3583 }
3584 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003585}
3586
3587int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003588sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003589{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003590 if (entering(tcp)) {
3591 struct sched_param p;
3592 tprintf("%d, ", (int) tcp->u_arg[0]);
3593 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3594 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3595 tprintf(", %#lx", tcp->u_arg[2]);
3596 else
3597 tprintf(", { %d }", p.__sched_priority);
3598 }
3599 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003600}
3601
3602int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003603sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003604{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003605 if (entering(tcp)) {
3606 tprintf("%d, ", (int) tcp->u_arg[0]);
3607 } else {
3608 struct sched_param p;
3609 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3610 tprintf("%#lx", tcp->u_arg[1]);
3611 else
3612 tprintf("{ %d }", p.__sched_priority);
3613 }
3614 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003615}
3616
3617int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003618sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003619{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003620 if (entering(tcp)) {
3621 struct sched_param p;
3622 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3623 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3624 else
3625 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3626 }
3627 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003628}
3629
3630int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003631sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003632{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003633 if (entering(tcp)) {
3634 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3635 }
3636 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003637}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003638
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003639# ifdef X86_64
3640# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003641
3642static const struct xlat archvals[] = {
3643 { ARCH_SET_GS, "ARCH_SET_GS" },
3644 { ARCH_SET_FS, "ARCH_SET_FS" },
3645 { ARCH_GET_FS, "ARCH_GET_FS" },
3646 { ARCH_GET_GS, "ARCH_GET_GS" },
3647 { 0, NULL },
3648};
3649
3650int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003651sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003652{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003653 if (entering(tcp)) {
3654 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3655 if (tcp->u_arg[0] == ARCH_SET_GS
3656 || tcp->u_arg[0] == ARCH_SET_FS
3657 ) {
3658 tprintf(", %#lx", tcp->u_arg[1]);
3659 }
3660 } else {
3661 if (tcp->u_arg[0] == ARCH_GET_GS
3662 || tcp->u_arg[0] == ARCH_GET_FS
3663 ) {
3664 long int v;
3665 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3666 tprintf(", [%#lx]", v);
3667 else
3668 tprintf(", %#lx", tcp->u_arg[1]);
3669 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003670 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003671 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003672}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003673# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003674
Roland McGrathdb8319f2007-08-02 01:37:55 +00003675
3676int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003677sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003678{
3679 if (exiting(tcp)) {
3680 unsigned u;
3681 if (tcp->u_arg[0] == 0)
3682 tprintf("NULL, ");
3683 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3684 tprintf("%#lx, ", tcp->u_arg[0]);
3685 else
3686 tprintf("[%u], ", u);
3687 if (tcp->u_arg[1] == 0)
3688 tprintf("NULL, ");
3689 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3690 tprintf("%#lx, ", tcp->u_arg[1]);
3691 else
3692 tprintf("[%u], ", u);
3693 tprintf("%#lx", tcp->u_arg[2]);
3694 }
3695 return 0;
3696}
3697
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003698#endif /* LINUX */