blob: 8999fc67d052b26f97d3f83179138265acc3198b [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
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00002089sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002090{
2091 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002092
2093 if (entering(tcp)) {
2094 printxval(waitid_types, tcp->u_arg[0], "P_???");
2095 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002096 }
2097 else {
2098 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002099 if (!tcp->u_arg[2])
2100 tprintf("NULL");
2101 else if (syserror(tcp))
2102 tprintf("%#lx", tcp->u_arg[2]);
2103 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2104 tprintf("{???}");
2105 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002106 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002107 /* options */
2108 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002109 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002110 if (tcp->u_nargs > 4) {
2111 /* usage */
2112 tprintf(", ");
2113 if (!tcp->u_arg[4])
2114 tprintf("NULL");
2115 else if (tcp->u_error)
2116 tprintf("%#lx", tcp->u_arg[4]);
2117 else
2118 printrusage(tcp, tcp->u_arg[4]);
2119 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002120 }
2121 return 0;
2122}
2123
Roland McGrathc74c0b72004-09-01 19:39:46 +00002124#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002125
2126int
2127sys_alarm(tcp)
2128struct tcb *tcp;
2129{
2130 if (entering(tcp))
2131 tprintf("%lu", tcp->u_arg[0]);
2132 return 0;
2133}
2134
2135int
2136sys_uname(tcp)
2137struct tcb *tcp;
2138{
2139 struct utsname uname;
2140
2141 if (exiting(tcp)) {
2142 if (syserror(tcp) || !verbose(tcp))
2143 tprintf("%#lx", tcp->u_arg[0]);
2144 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2145 tprintf("{...}");
2146 else if (!abbrev(tcp)) {
2147
2148 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2149 uname.sysname, uname.nodename);
2150 tprintf("release=\"%s\", version=\"%s\", ",
2151 uname.release, uname.version);
2152 tprintf("machine=\"%s\"", uname.machine);
2153#ifdef LINUX
2154#ifndef __GLIBC__
2155 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002156#endif
2157#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002158 tprintf("}");
2159 }
2160 else
2161 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2162 uname.sysname, uname.nodename);
2163 }
2164 return 0;
2165}
2166
2167#ifndef SVR4
2168
Roland McGratheb9e2e82009-06-02 16:49:22 -07002169static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002170# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002171 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2172 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2173 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2174 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2175 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2176 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2177 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2178 { PTRACE_CONT, "PTRACE_CONT" },
2179 { PTRACE_KILL, "PTRACE_KILL" },
2180 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2181 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2182 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002183# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002184 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002185# endif
2186# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002187 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002188# endif
2189# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002190 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002191# endif
2192# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002193 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002194# endif
2195# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002196 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002197# endif
2198# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002199 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002200# endif
2201# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002202 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002203# endif
2204# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002205 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002206# endif
2207# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002208 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002209# endif
2210# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002211 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002212# endif
2213# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002214 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002215# endif
2216# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002217 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002218# endif
2219# ifdef PTRACE_SET_SYSCALL
2220 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2221# endif
2222# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002223 { PTRACE_READDATA, "PTRACE_READDATA" },
2224 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2225 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2226 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2227 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2228 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002229# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002230 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2231 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002232# else /* !SPARC */
2233 { PTRACE_22, "PTRACE_22" },
2234 { PTRACE_23, "PTRACE_3" },
2235# endif /* !SPARC */
2236# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002237 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002238# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002239 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002240# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002241 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2242 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2243 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002244# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002245 { PTRACE_26, "PTRACE_26" },
2246 { PTRACE_27, "PTRACE_27" },
2247 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002248# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002249 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002250# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002251
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002252# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002253
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002254 { PT_TRACE_ME, "PT_TRACE_ME" },
2255 { PT_READ_I, "PT_READ_I" },
2256 { PT_READ_D, "PT_READ_D" },
2257 { PT_WRITE_I, "PT_WRITE_I" },
2258 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002259# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002260 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002261# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002262 { PT_CONTINUE, "PT_CONTINUE" },
2263 { PT_KILL, "PT_KILL" },
2264 { PT_STEP, "PT_STEP" },
2265 { PT_ATTACH, "PT_ATTACH" },
2266 { PT_DETACH, "PT_DETACH" },
2267 { PT_GETREGS, "PT_GETREGS" },
2268 { PT_SETREGS, "PT_SETREGS" },
2269 { PT_GETFPREGS, "PT_GETFPREGS" },
2270 { PT_SETFPREGS, "PT_SETFPREGS" },
2271 { PT_GETDBREGS, "PT_GETDBREGS" },
2272 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002273# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002274 { 0, NULL },
2275};
2276
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002277# ifndef FREEBSD
2278# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002279static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002280# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002281 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002282# endif
2283# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002284 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002285# endif
2286# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002287 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002288# endif
2289# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002290 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002291# endif
2292# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002293 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002294# endif
2295# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002296 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002297# endif
2298# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002299 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002300# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002301 { 0, NULL },
2302};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002303# endif /* PTRACE_SETOPTIONS */
2304# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002305
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002306# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002307const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002308# ifdef LINUX
2309# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002310 { PT_PSWMASK, "psw_mask" },
2311 { PT_PSWADDR, "psw_addr" },
2312 { PT_GPR0, "gpr0" },
2313 { PT_GPR1, "gpr1" },
2314 { PT_GPR2, "gpr2" },
2315 { PT_GPR3, "gpr3" },
2316 { PT_GPR4, "gpr4" },
2317 { PT_GPR5, "gpr5" },
2318 { PT_GPR6, "gpr6" },
2319 { PT_GPR7, "gpr7" },
2320 { PT_GPR8, "gpr8" },
2321 { PT_GPR9, "gpr9" },
2322 { PT_GPR10, "gpr10" },
2323 { PT_GPR11, "gpr11" },
2324 { PT_GPR12, "gpr12" },
2325 { PT_GPR13, "gpr13" },
2326 { PT_GPR14, "gpr14" },
2327 { PT_GPR15, "gpr15" },
2328 { PT_ACR0, "acr0" },
2329 { PT_ACR1, "acr1" },
2330 { PT_ACR2, "acr2" },
2331 { PT_ACR3, "acr3" },
2332 { PT_ACR4, "acr4" },
2333 { PT_ACR5, "acr5" },
2334 { PT_ACR6, "acr6" },
2335 { PT_ACR7, "acr7" },
2336 { PT_ACR8, "acr8" },
2337 { PT_ACR9, "acr9" },
2338 { PT_ACR10, "acr10" },
2339 { PT_ACR11, "acr11" },
2340 { PT_ACR12, "acr12" },
2341 { PT_ACR13, "acr13" },
2342 { PT_ACR14, "acr14" },
2343 { PT_ACR15, "acr15" },
2344 { PT_ORIGGPR2, "orig_gpr2" },
2345 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002346# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002347 { PT_FPR0_HI, "fpr0.hi" },
2348 { PT_FPR0_LO, "fpr0.lo" },
2349 { PT_FPR1_HI, "fpr1.hi" },
2350 { PT_FPR1_LO, "fpr1.lo" },
2351 { PT_FPR2_HI, "fpr2.hi" },
2352 { PT_FPR2_LO, "fpr2.lo" },
2353 { PT_FPR3_HI, "fpr3.hi" },
2354 { PT_FPR3_LO, "fpr3.lo" },
2355 { PT_FPR4_HI, "fpr4.hi" },
2356 { PT_FPR4_LO, "fpr4.lo" },
2357 { PT_FPR5_HI, "fpr5.hi" },
2358 { PT_FPR5_LO, "fpr5.lo" },
2359 { PT_FPR6_HI, "fpr6.hi" },
2360 { PT_FPR6_LO, "fpr6.lo" },
2361 { PT_FPR7_HI, "fpr7.hi" },
2362 { PT_FPR7_LO, "fpr7.lo" },
2363 { PT_FPR8_HI, "fpr8.hi" },
2364 { PT_FPR8_LO, "fpr8.lo" },
2365 { PT_FPR9_HI, "fpr9.hi" },
2366 { PT_FPR9_LO, "fpr9.lo" },
2367 { PT_FPR10_HI, "fpr10.hi" },
2368 { PT_FPR10_LO, "fpr10.lo" },
2369 { PT_FPR11_HI, "fpr11.hi" },
2370 { PT_FPR11_LO, "fpr11.lo" },
2371 { PT_FPR12_HI, "fpr12.hi" },
2372 { PT_FPR12_LO, "fpr12.lo" },
2373 { PT_FPR13_HI, "fpr13.hi" },
2374 { PT_FPR13_LO, "fpr13.lo" },
2375 { PT_FPR14_HI, "fpr14.hi" },
2376 { PT_FPR14_LO, "fpr14.lo" },
2377 { PT_FPR15_HI, "fpr15.hi" },
2378 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002379# endif
2380# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002381 { PT_FPR0, "fpr0" },
2382 { PT_FPR1, "fpr1" },
2383 { PT_FPR2, "fpr2" },
2384 { PT_FPR3, "fpr3" },
2385 { PT_FPR4, "fpr4" },
2386 { PT_FPR5, "fpr5" },
2387 { PT_FPR6, "fpr6" },
2388 { PT_FPR7, "fpr7" },
2389 { PT_FPR8, "fpr8" },
2390 { PT_FPR9, "fpr9" },
2391 { PT_FPR10, "fpr10" },
2392 { PT_FPR11, "fpr11" },
2393 { PT_FPR12, "fpr12" },
2394 { PT_FPR13, "fpr13" },
2395 { PT_FPR14, "fpr14" },
2396 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002397# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002398 { PT_CR_9, "cr9" },
2399 { PT_CR_10, "cr10" },
2400 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002401 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002402# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002403 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002404# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002405 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002406# elif defined(POWERPC)
2407# ifndef PT_ORIG_R3
2408# define PT_ORIG_R3 34
2409# endif
2410# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002411 { REGSIZE*PT_R0, "r0" },
2412 { REGSIZE*PT_R1, "r1" },
2413 { REGSIZE*PT_R2, "r2" },
2414 { REGSIZE*PT_R3, "r3" },
2415 { REGSIZE*PT_R4, "r4" },
2416 { REGSIZE*PT_R5, "r5" },
2417 { REGSIZE*PT_R6, "r6" },
2418 { REGSIZE*PT_R7, "r7" },
2419 { REGSIZE*PT_R8, "r8" },
2420 { REGSIZE*PT_R9, "r9" },
2421 { REGSIZE*PT_R10, "r10" },
2422 { REGSIZE*PT_R11, "r11" },
2423 { REGSIZE*PT_R12, "r12" },
2424 { REGSIZE*PT_R13, "r13" },
2425 { REGSIZE*PT_R14, "r14" },
2426 { REGSIZE*PT_R15, "r15" },
2427 { REGSIZE*PT_R16, "r16" },
2428 { REGSIZE*PT_R17, "r17" },
2429 { REGSIZE*PT_R18, "r18" },
2430 { REGSIZE*PT_R19, "r19" },
2431 { REGSIZE*PT_R20, "r20" },
2432 { REGSIZE*PT_R21, "r21" },
2433 { REGSIZE*PT_R22, "r22" },
2434 { REGSIZE*PT_R23, "r23" },
2435 { REGSIZE*PT_R24, "r24" },
2436 { REGSIZE*PT_R25, "r25" },
2437 { REGSIZE*PT_R26, "r26" },
2438 { REGSIZE*PT_R27, "r27" },
2439 { REGSIZE*PT_R28, "r28" },
2440 { REGSIZE*PT_R29, "r29" },
2441 { REGSIZE*PT_R30, "r30" },
2442 { REGSIZE*PT_R31, "r31" },
2443 { REGSIZE*PT_NIP, "NIP" },
2444 { REGSIZE*PT_MSR, "MSR" },
2445 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2446 { REGSIZE*PT_CTR, "CTR" },
2447 { REGSIZE*PT_LNK, "LNK" },
2448 { REGSIZE*PT_XER, "XER" },
2449 { REGSIZE*PT_CCR, "CCR" },
2450 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002451# undef REGSIZE
2452# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002453 { 0, "r0" },
2454 { 1, "r1" },
2455 { 2, "r2" },
2456 { 3, "r3" },
2457 { 4, "r4" },
2458 { 5, "r5" },
2459 { 6, "r6" },
2460 { 7, "r7" },
2461 { 8, "r8" },
2462 { 9, "r9" },
2463 { 10, "r10" },
2464 { 11, "r11" },
2465 { 12, "r12" },
2466 { 13, "r13" },
2467 { 14, "r14" },
2468 { 15, "r15" },
2469 { 16, "r16" },
2470 { 17, "r17" },
2471 { 18, "r18" },
2472 { 19, "r19" },
2473 { 20, "r20" },
2474 { 21, "r21" },
2475 { 22, "r22" },
2476 { 23, "r23" },
2477 { 24, "r24" },
2478 { 25, "r25" },
2479 { 26, "r26" },
2480 { 27, "r27" },
2481 { 28, "r28" },
2482 { 29, "gp" },
2483 { 30, "fp" },
2484 { 31, "zero" },
2485 { 32, "fp0" },
2486 { 33, "fp" },
2487 { 34, "fp2" },
2488 { 35, "fp3" },
2489 { 36, "fp4" },
2490 { 37, "fp5" },
2491 { 38, "fp6" },
2492 { 39, "fp7" },
2493 { 40, "fp8" },
2494 { 41, "fp9" },
2495 { 42, "fp10" },
2496 { 43, "fp11" },
2497 { 44, "fp12" },
2498 { 45, "fp13" },
2499 { 46, "fp14" },
2500 { 47, "fp15" },
2501 { 48, "fp16" },
2502 { 49, "fp17" },
2503 { 50, "fp18" },
2504 { 51, "fp19" },
2505 { 52, "fp20" },
2506 { 53, "fp21" },
2507 { 54, "fp22" },
2508 { 55, "fp23" },
2509 { 56, "fp24" },
2510 { 57, "fp25" },
2511 { 58, "fp26" },
2512 { 59, "fp27" },
2513 { 60, "fp28" },
2514 { 61, "fp29" },
2515 { 62, "fp30" },
2516 { 63, "fp31" },
2517 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002518# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002519 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2520 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2521 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2522 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2523 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2524 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2525 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2526 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2527 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2528 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2529 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2530 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2531 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2532 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2533 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2534 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2535 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2536 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2537 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2538 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2539 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2540 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2541 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2542 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2543 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2544 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2545 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2546 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2547 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2548 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2549 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2550 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2551 /* switch stack: */
2552 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2553 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2554 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2555 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2556 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2557 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2558 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2559 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2560 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2561 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002562 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2563 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002564 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002565 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002566 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2567 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002568 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2569 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2570 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2571 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2572 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2573 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2574 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2575 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2576 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2577 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2578 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2579 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2580 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2581 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2582 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002583# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002584 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002585# endif
2586# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002587 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002588# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002589 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002590# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002591 { 4*EBX, "4*EBX" },
2592 { 4*ECX, "4*ECX" },
2593 { 4*EDX, "4*EDX" },
2594 { 4*ESI, "4*ESI" },
2595 { 4*EDI, "4*EDI" },
2596 { 4*EBP, "4*EBP" },
2597 { 4*EAX, "4*EAX" },
2598 { 4*DS, "4*DS" },
2599 { 4*ES, "4*ES" },
2600 { 4*FS, "4*FS" },
2601 { 4*GS, "4*GS" },
2602 { 4*ORIG_EAX, "4*ORIG_EAX" },
2603 { 4*EIP, "4*EIP" },
2604 { 4*CS, "4*CS" },
2605 { 4*EFL, "4*EFL" },
2606 { 4*UESP, "4*UESP" },
2607 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002608# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002609 { 8*R15, "8*R15" },
2610 { 8*R14, "8*R14" },
2611 { 8*R13, "8*R13" },
2612 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002613 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002614 { 8*RBX, "8*RBX" },
2615 { 8*R11, "8*R11" },
2616 { 8*R10, "8*R10" },
2617 { 8*R9, "8*R9" },
2618 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002619 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002620 { 8*RCX, "8*RCX" },
2621 { 8*RDX, "8*RDX" },
2622 { 8*RSI, "8*RSI" },
2623 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002624 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002625 { 8*RIP, "8*RIP" },
2626 { 8*CS, "8*CS" },
2627 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002628 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002629 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002630# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002631 { 4*PT_D1, "4*PT_D1" },
2632 { 4*PT_D2, "4*PT_D2" },
2633 { 4*PT_D3, "4*PT_D3" },
2634 { 4*PT_D4, "4*PT_D4" },
2635 { 4*PT_D5, "4*PT_D5" },
2636 { 4*PT_D6, "4*PT_D6" },
2637 { 4*PT_D7, "4*PT_D7" },
2638 { 4*PT_A0, "4*PT_A0" },
2639 { 4*PT_A1, "4*PT_A1" },
2640 { 4*PT_A2, "4*PT_A2" },
2641 { 4*PT_A3, "4*PT_A3" },
2642 { 4*PT_A4, "4*PT_A4" },
2643 { 4*PT_A5, "4*PT_A5" },
2644 { 4*PT_A6, "4*PT_A6" },
2645 { 4*PT_D0, "4*PT_D0" },
2646 { 4*PT_USP, "4*PT_USP" },
2647 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2648 { 4*PT_SR, "4*PT_SR" },
2649 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002650# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002651 { 4*REG_REG0, "4*REG_REG0" },
2652 { 4*(REG_REG0+1), "4*REG_REG1" },
2653 { 4*(REG_REG0+2), "4*REG_REG2" },
2654 { 4*(REG_REG0+3), "4*REG_REG3" },
2655 { 4*(REG_REG0+4), "4*REG_REG4" },
2656 { 4*(REG_REG0+5), "4*REG_REG5" },
2657 { 4*(REG_REG0+6), "4*REG_REG6" },
2658 { 4*(REG_REG0+7), "4*REG_REG7" },
2659 { 4*(REG_REG0+8), "4*REG_REG8" },
2660 { 4*(REG_REG0+9), "4*REG_REG9" },
2661 { 4*(REG_REG0+10), "4*REG_REG10" },
2662 { 4*(REG_REG0+11), "4*REG_REG11" },
2663 { 4*(REG_REG0+12), "4*REG_REG12" },
2664 { 4*(REG_REG0+13), "4*REG_REG13" },
2665 { 4*(REG_REG0+14), "4*REG_REG14" },
2666 { 4*REG_REG15, "4*REG_REG15" },
2667 { 4*REG_PC, "4*REG_PC" },
2668 { 4*REG_PR, "4*REG_PR" },
2669 { 4*REG_SR, "4*REG_SR" },
2670 { 4*REG_GBR, "4*REG_GBR" },
2671 { 4*REG_MACH, "4*REG_MACH" },
2672 { 4*REG_MACL, "4*REG_MACL" },
2673 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2674 { 4*REG_FPUL, "4*REG_FPUL" },
2675 { 4*REG_FPREG0, "4*REG_FPREG0" },
2676 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2677 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2678 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2679 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2680 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2681 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2682 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2683 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2684 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2685 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2686 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2687 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2688 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2689 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2690 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002691# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002692 { 4*REG_XDREG0, "4*REG_XDREG0" },
2693 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2694 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2695 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2696 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2697 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2698 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2699 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002700# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002701 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002702# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002703 { 0, "PC(L)" },
2704 { 4, "PC(U)" },
2705 { 8, "SR(L)" },
2706 { 12, "SR(U)" },
2707 { 16, "syscall no.(L)" },
2708 { 20, "syscall_no.(U)" },
2709 { 24, "R0(L)" },
2710 { 28, "R0(U)" },
2711 { 32, "R1(L)" },
2712 { 36, "R1(U)" },
2713 { 40, "R2(L)" },
2714 { 44, "R2(U)" },
2715 { 48, "R3(L)" },
2716 { 52, "R3(U)" },
2717 { 56, "R4(L)" },
2718 { 60, "R4(U)" },
2719 { 64, "R5(L)" },
2720 { 68, "R5(U)" },
2721 { 72, "R6(L)" },
2722 { 76, "R6(U)" },
2723 { 80, "R7(L)" },
2724 { 84, "R7(U)" },
2725 { 88, "R8(L)" },
2726 { 92, "R8(U)" },
2727 { 96, "R9(L)" },
2728 { 100, "R9(U)" },
2729 { 104, "R10(L)" },
2730 { 108, "R10(U)" },
2731 { 112, "R11(L)" },
2732 { 116, "R11(U)" },
2733 { 120, "R12(L)" },
2734 { 124, "R12(U)" },
2735 { 128, "R13(L)" },
2736 { 132, "R13(U)" },
2737 { 136, "R14(L)" },
2738 { 140, "R14(U)" },
2739 { 144, "R15(L)" },
2740 { 148, "R15(U)" },
2741 { 152, "R16(L)" },
2742 { 156, "R16(U)" },
2743 { 160, "R17(L)" },
2744 { 164, "R17(U)" },
2745 { 168, "R18(L)" },
2746 { 172, "R18(U)" },
2747 { 176, "R19(L)" },
2748 { 180, "R19(U)" },
2749 { 184, "R20(L)" },
2750 { 188, "R20(U)" },
2751 { 192, "R21(L)" },
2752 { 196, "R21(U)" },
2753 { 200, "R22(L)" },
2754 { 204, "R22(U)" },
2755 { 208, "R23(L)" },
2756 { 212, "R23(U)" },
2757 { 216, "R24(L)" },
2758 { 220, "R24(U)" },
2759 { 224, "R25(L)" },
2760 { 228, "R25(U)" },
2761 { 232, "R26(L)" },
2762 { 236, "R26(U)" },
2763 { 240, "R27(L)" },
2764 { 244, "R27(U)" },
2765 { 248, "R28(L)" },
2766 { 252, "R28(U)" },
2767 { 256, "R29(L)" },
2768 { 260, "R29(U)" },
2769 { 264, "R30(L)" },
2770 { 268, "R30(U)" },
2771 { 272, "R31(L)" },
2772 { 276, "R31(U)" },
2773 { 280, "R32(L)" },
2774 { 284, "R32(U)" },
2775 { 288, "R33(L)" },
2776 { 292, "R33(U)" },
2777 { 296, "R34(L)" },
2778 { 300, "R34(U)" },
2779 { 304, "R35(L)" },
2780 { 308, "R35(U)" },
2781 { 312, "R36(L)" },
2782 { 316, "R36(U)" },
2783 { 320, "R37(L)" },
2784 { 324, "R37(U)" },
2785 { 328, "R38(L)" },
2786 { 332, "R38(U)" },
2787 { 336, "R39(L)" },
2788 { 340, "R39(U)" },
2789 { 344, "R40(L)" },
2790 { 348, "R40(U)" },
2791 { 352, "R41(L)" },
2792 { 356, "R41(U)" },
2793 { 360, "R42(L)" },
2794 { 364, "R42(U)" },
2795 { 368, "R43(L)" },
2796 { 372, "R43(U)" },
2797 { 376, "R44(L)" },
2798 { 380, "R44(U)" },
2799 { 384, "R45(L)" },
2800 { 388, "R45(U)" },
2801 { 392, "R46(L)" },
2802 { 396, "R46(U)" },
2803 { 400, "R47(L)" },
2804 { 404, "R47(U)" },
2805 { 408, "R48(L)" },
2806 { 412, "R48(U)" },
2807 { 416, "R49(L)" },
2808 { 420, "R49(U)" },
2809 { 424, "R50(L)" },
2810 { 428, "R50(U)" },
2811 { 432, "R51(L)" },
2812 { 436, "R51(U)" },
2813 { 440, "R52(L)" },
2814 { 444, "R52(U)" },
2815 { 448, "R53(L)" },
2816 { 452, "R53(U)" },
2817 { 456, "R54(L)" },
2818 { 460, "R54(U)" },
2819 { 464, "R55(L)" },
2820 { 468, "R55(U)" },
2821 { 472, "R56(L)" },
2822 { 476, "R56(U)" },
2823 { 480, "R57(L)" },
2824 { 484, "R57(U)" },
2825 { 488, "R58(L)" },
2826 { 492, "R58(U)" },
2827 { 496, "R59(L)" },
2828 { 500, "R59(U)" },
2829 { 504, "R60(L)" },
2830 { 508, "R60(U)" },
2831 { 512, "R61(L)" },
2832 { 516, "R61(U)" },
2833 { 520, "R62(L)" },
2834 { 524, "R62(U)" },
2835 { 528, "TR0(L)" },
2836 { 532, "TR0(U)" },
2837 { 536, "TR1(L)" },
2838 { 540, "TR1(U)" },
2839 { 544, "TR2(L)" },
2840 { 548, "TR2(U)" },
2841 { 552, "TR3(L)" },
2842 { 556, "TR3(U)" },
2843 { 560, "TR4(L)" },
2844 { 564, "TR4(U)" },
2845 { 568, "TR5(L)" },
2846 { 572, "TR5(U)" },
2847 { 576, "TR6(L)" },
2848 { 580, "TR6(U)" },
2849 { 584, "TR7(L)" },
2850 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002851 /* This entry is in case pt_regs contains dregs (depends on
2852 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002853 { uoff(regs), "offsetof(struct user, regs)" },
2854 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002855# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002856 { uoff(regs.ARM_r0), "r0" },
2857 { uoff(regs.ARM_r1), "r1" },
2858 { uoff(regs.ARM_r2), "r2" },
2859 { uoff(regs.ARM_r3), "r3" },
2860 { uoff(regs.ARM_r4), "r4" },
2861 { uoff(regs.ARM_r5), "r5" },
2862 { uoff(regs.ARM_r6), "r6" },
2863 { uoff(regs.ARM_r7), "r7" },
2864 { uoff(regs.ARM_r8), "r8" },
2865 { uoff(regs.ARM_r9), "r9" },
2866 { uoff(regs.ARM_r10), "r10" },
2867 { uoff(regs.ARM_fp), "fp" },
2868 { uoff(regs.ARM_ip), "ip" },
2869 { uoff(regs.ARM_sp), "sp" },
2870 { uoff(regs.ARM_lr), "lr" },
2871 { uoff(regs.ARM_pc), "pc" },
2872 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002873# elif defined(AVR32)
2874 { uoff(regs.sr), "sr" },
2875 { uoff(regs.pc), "pc" },
2876 { uoff(regs.lr), "lr" },
2877 { uoff(regs.sp), "sp" },
2878 { uoff(regs.r12), "r12" },
2879 { uoff(regs.r11), "r11" },
2880 { uoff(regs.r10), "r10" },
2881 { uoff(regs.r9), "r9" },
2882 { uoff(regs.r8), "r8" },
2883 { uoff(regs.r7), "r7" },
2884 { uoff(regs.r6), "r6" },
2885 { uoff(regs.r5), "r5" },
2886 { uoff(regs.r4), "r4" },
2887 { uoff(regs.r3), "r3" },
2888 { uoff(regs.r2), "r2" },
2889 { uoff(regs.r1), "r1" },
2890 { uoff(regs.r0), "r0" },
2891 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002892# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002893 { 0, "r0" },
2894 { 1, "r1" },
2895 { 2, "r2" },
2896 { 3, "r3" },
2897 { 4, "r4" },
2898 { 5, "r5" },
2899 { 6, "r6" },
2900 { 7, "r7" },
2901 { 8, "r8" },
2902 { 9, "r9" },
2903 { 10, "r10" },
2904 { 11, "r11" },
2905 { 12, "r12" },
2906 { 13, "r13" },
2907 { 14, "r14" },
2908 { 15, "r15" },
2909 { 16, "r16" },
2910 { 17, "r17" },
2911 { 18, "r18" },
2912 { 19, "r19" },
2913 { 20, "r20" },
2914 { 21, "r21" },
2915 { 22, "r22" },
2916 { 23, "r23" },
2917 { 24, "r24" },
2918 { 25, "r25" },
2919 { 26, "r26" },
2920 { 27, "r27" },
2921 { 28, "r28" },
2922 { 29, "r29" },
2923 { 30, "r30" },
2924 { 31, "r31" },
2925 { 32, "f0" },
2926 { 33, "f1" },
2927 { 34, "f2" },
2928 { 35, "f3" },
2929 { 36, "f4" },
2930 { 37, "f5" },
2931 { 38, "f6" },
2932 { 39, "f7" },
2933 { 40, "f8" },
2934 { 41, "f9" },
2935 { 42, "f10" },
2936 { 43, "f11" },
2937 { 44, "f12" },
2938 { 45, "f13" },
2939 { 46, "f14" },
2940 { 47, "f15" },
2941 { 48, "f16" },
2942 { 49, "f17" },
2943 { 50, "f18" },
2944 { 51, "f19" },
2945 { 52, "f20" },
2946 { 53, "f21" },
2947 { 54, "f22" },
2948 { 55, "f23" },
2949 { 56, "f24" },
2950 { 57, "f25" },
2951 { 58, "f26" },
2952 { 59, "f27" },
2953 { 60, "f28" },
2954 { 61, "f29" },
2955 { 62, "f30" },
2956 { 63, "f31" },
2957 { 64, "pc" },
2958 { 65, "cause" },
2959 { 66, "badvaddr" },
2960 { 67, "mmhi" },
2961 { 68, "mmlo" },
2962 { 69, "fpcsr" },
2963 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002964# elif defined(TILE)
2965 { PTREGS_OFFSET_REG(0), "r0" },
2966 { PTREGS_OFFSET_REG(1), "r1" },
2967 { PTREGS_OFFSET_REG(2), "r2" },
2968 { PTREGS_OFFSET_REG(3), "r3" },
2969 { PTREGS_OFFSET_REG(4), "r4" },
2970 { PTREGS_OFFSET_REG(5), "r5" },
2971 { PTREGS_OFFSET_REG(6), "r6" },
2972 { PTREGS_OFFSET_REG(7), "r7" },
2973 { PTREGS_OFFSET_REG(8), "r8" },
2974 { PTREGS_OFFSET_REG(9), "r9" },
2975 { PTREGS_OFFSET_REG(10), "r10" },
2976 { PTREGS_OFFSET_REG(11), "r11" },
2977 { PTREGS_OFFSET_REG(12), "r12" },
2978 { PTREGS_OFFSET_REG(13), "r13" },
2979 { PTREGS_OFFSET_REG(14), "r14" },
2980 { PTREGS_OFFSET_REG(15), "r15" },
2981 { PTREGS_OFFSET_REG(16), "r16" },
2982 { PTREGS_OFFSET_REG(17), "r17" },
2983 { PTREGS_OFFSET_REG(18), "r18" },
2984 { PTREGS_OFFSET_REG(19), "r19" },
2985 { PTREGS_OFFSET_REG(20), "r20" },
2986 { PTREGS_OFFSET_REG(21), "r21" },
2987 { PTREGS_OFFSET_REG(22), "r22" },
2988 { PTREGS_OFFSET_REG(23), "r23" },
2989 { PTREGS_OFFSET_REG(24), "r24" },
2990 { PTREGS_OFFSET_REG(25), "r25" },
2991 { PTREGS_OFFSET_REG(26), "r26" },
2992 { PTREGS_OFFSET_REG(27), "r27" },
2993 { PTREGS_OFFSET_REG(28), "r28" },
2994 { PTREGS_OFFSET_REG(29), "r29" },
2995 { PTREGS_OFFSET_REG(30), "r30" },
2996 { PTREGS_OFFSET_REG(31), "r31" },
2997 { PTREGS_OFFSET_REG(32), "r32" },
2998 { PTREGS_OFFSET_REG(33), "r33" },
2999 { PTREGS_OFFSET_REG(34), "r34" },
3000 { PTREGS_OFFSET_REG(35), "r35" },
3001 { PTREGS_OFFSET_REG(36), "r36" },
3002 { PTREGS_OFFSET_REG(37), "r37" },
3003 { PTREGS_OFFSET_REG(38), "r38" },
3004 { PTREGS_OFFSET_REG(39), "r39" },
3005 { PTREGS_OFFSET_REG(40), "r40" },
3006 { PTREGS_OFFSET_REG(41), "r41" },
3007 { PTREGS_OFFSET_REG(42), "r42" },
3008 { PTREGS_OFFSET_REG(43), "r43" },
3009 { PTREGS_OFFSET_REG(44), "r44" },
3010 { PTREGS_OFFSET_REG(45), "r45" },
3011 { PTREGS_OFFSET_REG(46), "r46" },
3012 { PTREGS_OFFSET_REG(47), "r47" },
3013 { PTREGS_OFFSET_REG(48), "r48" },
3014 { PTREGS_OFFSET_REG(49), "r49" },
3015 { PTREGS_OFFSET_REG(50), "r50" },
3016 { PTREGS_OFFSET_REG(51), "r51" },
3017 { PTREGS_OFFSET_REG(52), "r52" },
3018 { PTREGS_OFFSET_TP, "tp" },
3019 { PTREGS_OFFSET_SP, "sp" },
3020 { PTREGS_OFFSET_LR, "lr" },
3021 { PTREGS_OFFSET_PC, "pc" },
3022 { PTREGS_OFFSET_EX1, "ex1" },
3023 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
3024 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
3025 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003026# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003027# ifdef CRISV10
3028 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3029 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3030 { 4*PT_R13, "4*PT_R13" },
3031 { 4*PT_R12, "4*PT_R12" },
3032 { 4*PT_R11, "4*PT_R11" },
3033 { 4*PT_R10, "4*PT_R10" },
3034 { 4*PT_R9, "4*PT_R9" },
3035 { 4*PT_R8, "4*PT_R8" },
3036 { 4*PT_R7, "4*PT_R7" },
3037 { 4*PT_R6, "4*PT_R6" },
3038 { 4*PT_R5, "4*PT_R5" },
3039 { 4*PT_R4, "4*PT_R4" },
3040 { 4*PT_R3, "4*PT_R3" },
3041 { 4*PT_R2, "4*PT_R2" },
3042 { 4*PT_R1, "4*PT_R1" },
3043 { 4*PT_R0, "4*PT_R0" },
3044 { 4*PT_MOF, "4*PT_MOF" },
3045 { 4*PT_DCCR, "4*PT_DCCR" },
3046 { 4*PT_SRP, "4*PT_SRP" },
3047 { 4*PT_IRP, "4*PT_IRP" },
3048 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3049 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3050 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3051 { 4*PT_USP, "4*PT_USP" },
3052# endif
3053# ifdef CRISV32
3054 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3055 { 4*PT_R0, "4*PT_R0" },
3056 { 4*PT_R1, "4*PT_R1" },
3057 { 4*PT_R2, "4*PT_R2" },
3058 { 4*PT_R3, "4*PT_R3" },
3059 { 4*PT_R4, "4*PT_R4" },
3060 { 4*PT_R5, "4*PT_R5" },
3061 { 4*PT_R6, "4*PT_R6" },
3062 { 4*PT_R7, "4*PT_R7" },
3063 { 4*PT_R8, "4*PT_R8" },
3064 { 4*PT_R9, "4*PT_R9" },
3065 { 4*PT_R10, "4*PT_R10" },
3066 { 4*PT_R11, "4*PT_R11" },
3067 { 4*PT_R12, "4*PT_R12" },
3068 { 4*PT_R13, "4*PT_R13" },
3069 { 4*PT_ACR, "4*PT_ACR" },
3070 { 4*PT_SRS, "4*PT_SRS" },
3071 { 4*PT_MOF, "4*PT_MOF" },
3072 { 4*PT_SPC, "4*PT_SPC" },
3073 { 4*PT_CCS, "4*PT_CCS" },
3074 { 4*PT_SRP, "4*PT_SRP" },
3075 { 4*PT_ERP, "4*PT_ERP" },
3076 { 4*PT_EXS, "4*PT_EXS" },
3077 { 4*PT_EDA, "4*PT_EDA" },
3078 { 4*PT_USP, "4*PT_USP" },
3079 { 4*PT_PPC, "4*PT_PPC" },
3080 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3081 { 4*PT_BP+4, "4*PT_BP+4" },
3082 { 4*PT_BP+8, "4*PT_BP+8" },
3083 { 4*PT_BP+12, "4*PT_BP+12" },
3084 { 4*PT_BP+16, "4*PT_BP+16" },
3085 { 4*PT_BP+20, "4*PT_BP+20" },
3086 { 4*PT_BP+24, "4*PT_BP+24" },
3087 { 4*PT_BP+28, "4*PT_BP+28" },
3088 { 4*PT_BP+32, "4*PT_BP+32" },
3089 { 4*PT_BP+36, "4*PT_BP+36" },
3090 { 4*PT_BP+40, "4*PT_BP+40" },
3091 { 4*PT_BP+44, "4*PT_BP+44" },
3092 { 4*PT_BP+48, "4*PT_BP+48" },
3093 { 4*PT_BP+52, "4*PT_BP+52" },
3094 { 4*PT_BP+56, "4*PT_BP+56" },
3095# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003096# ifdef MICROBLAZE
3097 { PT_GPR(0), "r0" },
3098 { PT_GPR(1), "r1" },
3099 { PT_GPR(2), "r2" },
3100 { PT_GPR(3), "r3" },
3101 { PT_GPR(4), "r4" },
3102 { PT_GPR(5), "r5" },
3103 { PT_GPR(6), "r6" },
3104 { PT_GPR(7), "r7" },
3105 { PT_GPR(8), "r8" },
3106 { PT_GPR(9), "r9" },
3107 { PT_GPR(10), "r10" },
3108 { PT_GPR(11), "r11" },
3109 { PT_GPR(12), "r12" },
3110 { PT_GPR(13), "r13" },
3111 { PT_GPR(14), "r14" },
3112 { PT_GPR(15), "r15" },
3113 { PT_GPR(16), "r16" },
3114 { PT_GPR(17), "r17" },
3115 { PT_GPR(18), "r18" },
3116 { PT_GPR(19), "r19" },
3117 { PT_GPR(20), "r20" },
3118 { PT_GPR(21), "r21" },
3119 { PT_GPR(22), "r22" },
3120 { PT_GPR(23), "r23" },
3121 { PT_GPR(24), "r24" },
3122 { PT_GPR(25), "r25" },
3123 { PT_GPR(26), "r26" },
3124 { PT_GPR(27), "r27" },
3125 { PT_GPR(28), "r28" },
3126 { PT_GPR(29), "r29" },
3127 { PT_GPR(30), "r30" },
3128 { PT_GPR(31), "r31" },
3129 { PT_PC, "rpc", },
3130 { PT_MSR, "rmsr", },
3131 { PT_EAR, "rear", },
3132 { PT_ESR, "resr", },
3133 { PT_FSR, "rfsr", },
3134 { PT_KERNEL_MODE, "kernel_mode", },
3135# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003136
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003137# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3138 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003139 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003140# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003141 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003142# endif
3143# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003144 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003145# endif
3146# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003147 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003148# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003149 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3150 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3151 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003152# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003153 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003154# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003155# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003156 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003157# endif
3158# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003159 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003160# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003161 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003162# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003163 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003164# endif
3165# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003166 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003167# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003168# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003169 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003170# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003171 { uoff(magic), "offsetof(struct user, magic)" },
3172 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003173# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003174 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003175# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003176# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003177
3178# endif /* LINUX */
3179
3180# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003181 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3182 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3183 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3184 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3185 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3186 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3187 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3188 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3189 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3190 { uoff(u_error), "offsetof(struct user, u_error)" },
3191 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3192 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3193 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3194 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3195 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3196 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3197 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3198 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3199 { uoff(u_code), "offsetof(struct user, u_code)" },
3200 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3201 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3202 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3203 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3204 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3205 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3206 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3207 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3208 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3209 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3210 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3211 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3212 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3213 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3214 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3215 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3216 { uoff(u_start), "offsetof(struct user, u_start)" },
3217 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3218 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3219 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3220 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3221 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3222 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3223 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3224 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3225 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003226# endif /* SUNOS4 */
3227# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003228 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003229# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003230 { 0, NULL },
3231};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003232# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003233
3234int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003235sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003236{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003237 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003238 long addr;
3239
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003240 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003241 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003242# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003243 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003244# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003245 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003246# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003247 );
3248 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003249 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003250# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003251 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3252 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3253 for (x = struct_user_offsets; x->str; x++) {
3254 if (x->val >= addr)
3255 break;
3256 }
3257 if (!x->str)
3258 tprintf("%#lx, ", addr);
3259 else if (x->val > addr && x != struct_user_offsets) {
3260 x--;
3261 tprintf("%s + %ld, ", x->str, addr - x->val);
3262 }
3263 else
3264 tprintf("%s, ", x->str);
3265 }
3266 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003267# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003268 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003269# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003270 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003271# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003272 case PTRACE_PEEKDATA:
3273 case PTRACE_PEEKTEXT:
3274 case PTRACE_PEEKUSER:
3275 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003276# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003277 case PTRACE_CONT:
3278 case PTRACE_SINGLESTEP:
3279 case PTRACE_SYSCALL:
3280 case PTRACE_DETACH:
3281 printsignal(tcp->u_arg[3]);
3282 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003283# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003284 case PTRACE_SETOPTIONS:
3285 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3286 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003287# endif
3288# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003289 case PTRACE_SETSIGINFO: {
3290 siginfo_t si;
3291 if (!tcp->u_arg[3])
3292 tprintf("NULL");
3293 else if (syserror(tcp))
3294 tprintf("%#lx", tcp->u_arg[3]);
3295 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3296 tprintf("{???}");
3297 else
3298 printsiginfo(&si, verbose(tcp));
3299 break;
3300 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003301# endif
3302# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003303 case PTRACE_GETSIGINFO:
3304 /* Don't print anything, do it at syscall return. */
3305 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003306# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003307 default:
3308 tprintf("%#lx", tcp->u_arg[3]);
3309 break;
3310 }
3311 } else {
3312 switch (tcp->u_arg[0]) {
3313 case PTRACE_PEEKDATA:
3314 case PTRACE_PEEKTEXT:
3315 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003316# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003317 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003318# else
Roland McGratheb285352003-01-14 09:59:00 +00003319 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003320 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003321# endif
3322# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003323 case PTRACE_GETSIGINFO: {
3324 siginfo_t si;
3325 if (!tcp->u_arg[3])
3326 tprintf("NULL");
3327 else if (syserror(tcp))
3328 tprintf("%#lx", tcp->u_arg[3]);
3329 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3330 tprintf("{???}");
3331 else
3332 printsiginfo(&si, verbose(tcp));
3333 break;
3334 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003335# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003336 }
3337 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003338# endif /* LINUX */
3339# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003340 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3341 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3342 tprintf("%lu, ", tcp->u_arg[3]);
3343 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3344 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3345 tcp->u_arg[0] != PTRACE_READTEXT) {
3346 tprintf("%#lx", tcp->u_arg[3]);
3347 }
3348 } else {
3349 if (tcp->u_arg[0] == PTRACE_READDATA ||
3350 tcp->u_arg[0] == PTRACE_READTEXT) {
3351 tprintf("%lu, ", tcp->u_arg[3]);
3352 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3353 }
3354 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003355# endif /* SUNOS4 */
3356# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003357 tprintf("%lu", tcp->u_arg[3]);
3358 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003359# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003360 return 0;
3361}
3362
3363#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003364
3365#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003366# ifndef FUTEX_CMP_REQUEUE
3367# define FUTEX_CMP_REQUEUE 4
3368# endif
3369# ifndef FUTEX_WAKE_OP
3370# define FUTEX_WAKE_OP 5
3371# endif
3372# ifndef FUTEX_LOCK_PI
3373# define FUTEX_LOCK_PI 6
3374# define FUTEX_UNLOCK_PI 7
3375# define FUTEX_TRYLOCK_PI 8
3376# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003377# ifndef FUTEX_WAIT_BITSET
3378# define FUTEX_WAIT_BITSET 9
3379# endif
3380# ifndef FUTEX_WAKE_BITSET
3381# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003382# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003383# ifndef FUTEX_WAIT_REQUEUE_PI
3384# define FUTEX_WAIT_REQUEUE_PI 11
3385# endif
3386# ifndef FUTEX_CMP_REQUEUE_PI
3387# define FUTEX_CMP_REQUEUE_PI 12
3388# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003389# ifndef FUTEX_PRIVATE_FLAG
3390# define FUTEX_PRIVATE_FLAG 128
3391# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003392# ifndef FUTEX_CLOCK_REALTIME
3393# define FUTEX_CLOCK_REALTIME 256
3394# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003395static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003396 { FUTEX_WAIT, "FUTEX_WAIT" },
3397 { FUTEX_WAKE, "FUTEX_WAKE" },
3398 { FUTEX_FD, "FUTEX_FD" },
3399 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3400 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3401 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3402 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3403 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3404 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003405 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3406 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003407 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3408 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003409 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3410 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3411 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3412 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3413 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3414 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3415 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3416 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3417 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003418 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3419 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003420 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3421 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3422 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3423 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3424 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3425 { 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 +00003426 { 0, NULL }
3427};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003428# ifndef FUTEX_OP_SET
3429# define FUTEX_OP_SET 0
3430# define FUTEX_OP_ADD 1
3431# define FUTEX_OP_OR 2
3432# define FUTEX_OP_ANDN 3
3433# define FUTEX_OP_XOR 4
3434# define FUTEX_OP_CMP_EQ 0
3435# define FUTEX_OP_CMP_NE 1
3436# define FUTEX_OP_CMP_LT 2
3437# define FUTEX_OP_CMP_LE 3
3438# define FUTEX_OP_CMP_GT 4
3439# define FUTEX_OP_CMP_GE 5
3440# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003441static const struct xlat futexwakeops[] = {
3442 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3443 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3444 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3445 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3446 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3447 { 0, NULL }
3448};
3449static const struct xlat futexwakecmps[] = {
3450 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3451 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3452 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3453 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3454 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3455 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3456 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003457};
3458
3459int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003460sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003461{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003462 if (entering(tcp)) {
3463 long int cmd = tcp->u_arg[1] & 127;
3464 tprintf("%p, ", (void *) tcp->u_arg[0]);
3465 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3466 tprintf(", %ld", tcp->u_arg[2]);
3467 if (cmd == FUTEX_WAKE_BITSET)
3468 tprintf(", %lx", tcp->u_arg[5]);
3469 else if (cmd == FUTEX_WAIT) {
3470 tprintf(", ");
3471 printtv(tcp, tcp->u_arg[3]);
3472 } else if (cmd == FUTEX_WAIT_BITSET) {
3473 tprintf(", ");
3474 printtv(tcp, tcp->u_arg[3]);
3475 tprintf(", %lx", tcp->u_arg[5]);
3476 } else if (cmd == FUTEX_REQUEUE)
3477 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003478 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003479 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3480 else if (cmd == FUTEX_WAKE_OP) {
3481 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3482 if ((tcp->u_arg[5] >> 28) & 8)
3483 tprintf("FUTEX_OP_OPARG_SHIFT|");
3484 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3485 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3486 if ((tcp->u_arg[5] >> 24) & 8)
3487 tprintf("FUTEX_OP_OPARG_SHIFT|");
3488 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3489 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003490 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3491 tprintf(", ");
3492 printtv(tcp, tcp->u_arg[3]);
3493 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003494 }
Roland McGrath51942a92007-07-05 18:59:11 +00003495 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003496 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003497}
3498
3499static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003500print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003501{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003502 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003503 unsigned long w, min_len;
3504
3505 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3506 min_len = len - max_strlen * sizeof(w);
3507 else
3508 min_len = 0;
3509 for (; len >= sizeof(w) && len > min_len;
3510 len -= sizeof(w), list += sizeof(w)) {
3511 if (umove(tcp, list, &w) < 0)
3512 break;
3513 if (first)
3514 tprintf("{");
3515 else
3516 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003517 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003518 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003519 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003520 if (len) {
3521 if (first)
3522 tprintf("%#lx", list);
3523 else
3524 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3525 "???" : "..."));
3526 } else {
3527 tprintf(first ? "{}" : "}");
3528 }
Roland McGrath5a223472002-12-15 23:58:26 +00003529}
3530
3531int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003532sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003533{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003534 if (entering(tcp)) {
3535 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3536 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3537 }
3538 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003539}
3540
3541int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003542sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003543{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003544 if (entering(tcp)) {
3545 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3546 } else {
3547 if (tcp->u_rval == -1)
3548 tprintf("%#lx", tcp->u_arg[2]);
3549 else
3550 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3551 }
3552 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003553}
Roland McGrath279d3782004-03-01 20:27:37 +00003554
Roland McGrathd9f816f2004-09-04 03:39:20 +00003555static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003556 { SCHED_OTHER, "SCHED_OTHER" },
3557 { SCHED_RR, "SCHED_RR" },
3558 { SCHED_FIFO, "SCHED_FIFO" },
3559 { 0, NULL }
3560};
3561
3562int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003563sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003564{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003565 if (entering(tcp)) {
3566 tprintf("%d", (int) tcp->u_arg[0]);
3567 } else if (! syserror(tcp)) {
3568 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3569 if (tcp->auxstr != NULL)
3570 return RVAL_STR;
3571 }
3572 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003573}
3574
3575int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003576sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003577{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003578 if (entering(tcp)) {
3579 struct sched_param p;
3580 tprintf("%d, ", (int) tcp->u_arg[0]);
3581 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3582 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3583 tprintf(", %#lx", tcp->u_arg[2]);
3584 else
3585 tprintf(", { %d }", p.__sched_priority);
3586 }
3587 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003588}
3589
3590int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003591sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003592{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003593 if (entering(tcp)) {
3594 tprintf("%d, ", (int) tcp->u_arg[0]);
3595 } else {
3596 struct sched_param p;
3597 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3598 tprintf("%#lx", tcp->u_arg[1]);
3599 else
3600 tprintf("{ %d }", p.__sched_priority);
3601 }
3602 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003603}
3604
3605int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003606sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003607{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003608 if (entering(tcp)) {
3609 struct sched_param p;
3610 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3611 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3612 else
3613 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3614 }
3615 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003616}
3617
3618int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003619sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003620{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003621 if (entering(tcp)) {
3622 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3623 }
3624 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003625}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003626
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003627# ifdef X86_64
3628# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003629
3630static const struct xlat archvals[] = {
3631 { ARCH_SET_GS, "ARCH_SET_GS" },
3632 { ARCH_SET_FS, "ARCH_SET_FS" },
3633 { ARCH_GET_FS, "ARCH_GET_FS" },
3634 { ARCH_GET_GS, "ARCH_GET_GS" },
3635 { 0, NULL },
3636};
3637
3638int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003639sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003640{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003641 if (entering(tcp)) {
3642 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3643 if (tcp->u_arg[0] == ARCH_SET_GS
3644 || tcp->u_arg[0] == ARCH_SET_FS
3645 ) {
3646 tprintf(", %#lx", tcp->u_arg[1]);
3647 }
3648 } else {
3649 if (tcp->u_arg[0] == ARCH_GET_GS
3650 || tcp->u_arg[0] == ARCH_GET_FS
3651 ) {
3652 long int v;
3653 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3654 tprintf(", [%#lx]", v);
3655 else
3656 tprintf(", %#lx", tcp->u_arg[1]);
3657 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003658 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003659 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003660}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003661# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003662
Roland McGrathdb8319f2007-08-02 01:37:55 +00003663
3664int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003665sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003666{
3667 if (exiting(tcp)) {
3668 unsigned u;
3669 if (tcp->u_arg[0] == 0)
3670 tprintf("NULL, ");
3671 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3672 tprintf("%#lx, ", tcp->u_arg[0]);
3673 else
3674 tprintf("[%u], ", u);
3675 if (tcp->u_arg[1] == 0)
3676 tprintf("NULL, ");
3677 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3678 tprintf("%#lx, ", tcp->u_arg[1]);
3679 else
3680 tprintf("[%u], ", u);
3681 tprintf("%#lx", tcp->u_arg[2]);
3682 }
3683 return 0;
3684}
3685
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003686#endif /* LINUX */