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