blob: 551e1bbfb6f1e0241cf4c2c86e23d1b34a3a2738 [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
91#include <linux/futex.h>
92#endif
93#if defined LINUX
94# 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
Roland McGrath5a223472002-12-15 23:58:26 +0000106#endif
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
123#include <sys/prctl.h>
124#endif
125
126#ifndef WCOREDUMP
127#define WCOREDUMP(status) ((status) & 0200)
128#endif
129
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000130/* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000131#if defined(HAVE_PRCTL)
Roland McGrathd9f816f2004-09-04 03:39:20 +0000132static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000133#ifdef PR_MAXPROCS
134 { PR_MAXPROCS, "PR_MAXPROCS" },
135#endif
136#ifdef PR_ISBLOCKED
137 { PR_ISBLOCKED, "PR_ISBLOCKED" },
138#endif
139#ifdef PR_SETSTACKSIZE
140 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
141#endif
142#ifdef PR_GETSTACKSIZE
143 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
144#endif
145#ifdef PR_MAXPPROCS
146 { PR_MAXPPROCS, "PR_MAXPPROCS" },
147#endif
148#ifdef PR_UNBLKONEXEC
149 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
150#endif
151#ifdef PR_ATOMICSIM
152 { PR_ATOMICSIM, "PR_ATOMICSIM" },
153#endif
154#ifdef PR_SETEXITSIG
155 { PR_SETEXITSIG, "PR_SETEXITSIG" },
156#endif
157#ifdef PR_RESIDENT
158 { PR_RESIDENT, "PR_RESIDENT" },
159#endif
160#ifdef PR_ATTACHADDR
161 { PR_ATTACHADDR, "PR_ATTACHADDR" },
162#endif
163#ifdef PR_DETACHADDR
164 { PR_DETACHADDR, "PR_DETACHADDR" },
165#endif
166#ifdef PR_TERMCHILD
167 { PR_TERMCHILD, "PR_TERMCHILD" },
168#endif
169#ifdef PR_GETSHMASK
170 { PR_GETSHMASK, "PR_GETSHMASK" },
171#endif
172#ifdef PR_GETNSHARE
173 { PR_GETNSHARE, "PR_GETNSHARE" },
174#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000175#ifdef PR_COREPID
176 { PR_COREPID, "PR_COREPID" },
177#endif
178#ifdef PR_ATTACHADDRPERM
179 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
180#endif
181#ifdef PR_PTHREADEXIT
182 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
183#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000184#ifdef PR_SET_PDEATHSIG
185 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
186#endif
187#ifdef PR_GET_PDEATHSIG
188 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
189#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000190#ifdef PR_GET_DUMPABLE
191 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
192#endif
193#ifdef PR_SET_DUMPABLE
194 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
195#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000196#ifdef PR_GET_UNALIGN
197 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
198#endif
199#ifdef PR_SET_UNALIGN
200 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
201#endif
202#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000203 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000204#endif
205#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000206 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000207#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000208#ifdef PR_GET_FPEMU
209 { PR_GET_FPEMU, "PR_GET_FPEMU" },
210#endif
211#ifdef PR_SET_FPEMU
212 { PR_SET_FPEMU, "PR_SET_FPEMU" },
213#endif
214#ifdef PR_GET_FPEXC
215 { PR_GET_FPEXC, "PR_GET_FPEXC" },
216#endif
217#ifdef PR_SET_FPEXC
218 { PR_SET_FPEXC, "PR_SET_FPEXC" },
219#endif
220#ifdef PR_GET_TIMING
221 { PR_GET_TIMING, "PR_GET_TIMING" },
222#endif
223#ifdef PR_SET_TIMING
224 { PR_SET_TIMING, "PR_SET_TIMING" },
225#endif
226#ifdef PR_SET_NAME
227 { PR_SET_NAME, "PR_SET_NAME" },
228#endif
229#ifdef PR_GET_NAME
230 { PR_GET_NAME, "PR_GET_NAME" },
231#endif
232#ifdef PR_GET_ENDIAN
233 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
234#endif
235#ifdef PR_SET_ENDIAN
236 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
237#endif
238#ifdef PR_GET_SECCOMP
239 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
240#endif
241#ifdef PR_SET_SECCOMP
242 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
243#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000244#ifdef PR_GET_TSC
245 { PR_GET_TSC, "PR_GET_TSC" },
246#endif
247#ifdef PR_SET_TSC
248 { PR_SET_TSC, "PR_SET_TSC" },
249#endif
250#ifdef PR_GET_SECUREBITS
251 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
252#endif
253#ifdef PR_SET_SECUREBITS
254 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
255#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000256 { 0, NULL },
257};
258
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000259
Roland McGratha4d48532005-06-08 20:45:28 +0000260static const char *
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000261unalignctl_string (unsigned int ctl)
262{
263 static char buf[16];
264
265 switch (ctl) {
266#ifdef PR_UNALIGN_NOPRINT
267 case PR_UNALIGN_NOPRINT:
268 return "NOPRINT";
269#endif
270#ifdef PR_UNALIGN_SIGBUS
271 case PR_UNALIGN_SIGBUS:
272 return "SIGBUS";
273#endif
274 default:
275 break;
276 }
277 sprintf(buf, "%x", ctl);
278 return buf;
279}
280
281
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000282int
283sys_prctl(tcp)
284struct tcb *tcp;
285{
286 int i;
287
288 if (entering(tcp)) {
289 printxval(prctl_options, tcp->u_arg[0], "PR_???");
290 switch (tcp->u_arg[0]) {
291#ifdef PR_GETNSHARE
292 case PR_GETNSHARE:
293 break;
294#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000295#ifdef PR_SET_PDEATHSIG
296 case PR_SET_PDEATHSIG:
297 tprintf(", %lu", tcp->u_arg[1]);
298 break;
299#endif
300#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000301 case PR_GET_PDEATHSIG:
302 break;
303#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000304#ifdef PR_SET_DUMPABLE
305 case PR_SET_DUMPABLE:
306 tprintf(", %lu", tcp->u_arg[1]);
307 break;
308#endif
309#ifdef PR_GET_DUMPABLE
310 case PR_GET_DUMPABLE:
311 break;
312#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000313#ifdef PR_SET_UNALIGN
314 case PR_SET_UNALIGN:
315 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
316 break;
317#endif
318#ifdef PR_GET_UNALIGN
319 case PR_GET_UNALIGN:
320 tprintf(", %#lx", tcp->u_arg[1]);
321 break;
322#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000323#ifdef PR_SET_KEEPCAPS
324 case PR_SET_KEEPCAPS:
325 tprintf(", %lu", tcp->u_arg[1]);
326 break;
327#endif
328#ifdef PR_GET_KEEPCAPS
329 case PR_GET_KEEPCAPS:
330 break;
331#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000332 default:
333 for (i = 1; i < tcp->u_nargs; i++)
334 tprintf(", %#lx", tcp->u_arg[i]);
335 break;
336 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000337 } else {
338 switch (tcp->u_arg[0]) {
339#ifdef PR_GET_PDEATHSIG
340 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000341 if (umove(tcp, tcp->u_arg[1], &i) < 0)
342 tprintf(", %#lx", tcp->u_arg[1]);
343 else
344 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000345 break;
346#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000347#ifdef PR_GET_DUMPABLE
348 case PR_GET_DUMPABLE:
349 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000350#endif
351#ifdef PR_GET_UNALIGN
352 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000353 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
354 break;
355 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000356 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000357#endif
358#ifdef PR_GET_KEEPCAPS
359 case PR_GET_KEEPCAPS:
360 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000361#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000362 default:
363 break;
364 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000365 }
366 return 0;
367}
368
369#endif /* HAVE_PRCTL */
370
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000371#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000372int
373sys_gethostid(tcp)
374struct tcb *tcp;
375{
376 if (exiting(tcp))
377 return RVAL_HEX;
378 return 0;
379}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000380#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000381
382int
383sys_sethostname(tcp)
384struct tcb *tcp;
385{
386 if (entering(tcp)) {
387 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
388 tprintf(", %lu", tcp->u_arg[1]);
389 }
390 return 0;
391}
392
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000393#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000394int
395sys_gethostname(tcp)
396struct tcb *tcp;
397{
398 if (exiting(tcp)) {
399 if (syserror(tcp))
400 tprintf("%#lx", tcp->u_arg[0]);
401 else
402 printpath(tcp, tcp->u_arg[0]);
403 tprintf(", %lu", tcp->u_arg[1]);
404 }
405 return 0;
406}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000407#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000408
409int
410sys_setdomainname(tcp)
411struct tcb *tcp;
412{
413 if (entering(tcp)) {
414 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
415 tprintf(", %lu", tcp->u_arg[1]);
416 }
417 return 0;
418}
419
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000420#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000421
422int
423sys_getdomainname(tcp)
424struct tcb *tcp;
425{
426 if (exiting(tcp)) {
427 if (syserror(tcp))
428 tprintf("%#lx", tcp->u_arg[0]);
429 else
430 printpath(tcp, tcp->u_arg[0]);
431 tprintf(", %lu", tcp->u_arg[1]);
432 }
433 return 0;
434}
435#endif /* !LINUX */
436
437int
438sys_exit(tcp)
439struct tcb *tcp;
440{
441 if (exiting(tcp)) {
442 fprintf(stderr, "_exit returned!\n");
443 return -1;
444 }
445 /* special case: we stop tracing this process, finish line now */
446 tprintf("%ld) ", tcp->u_arg[0]);
447 tabto(acolumn);
448 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000449 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000450 return 0;
451}
452
453int
454internal_exit(tcp)
455struct tcb *tcp;
456{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000457 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000458 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000459#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000460# ifdef IA64
461 if (ia32) {
462 if (tcp->scno == 252)
463 tcp->flags |= TCB_GROUP_EXITING;
464 } else
465# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000466 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000467 tcp->flags |= TCB_GROUP_EXITING;
468#endif
469 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000470 return 0;
471}
472
Roland McGratheb9e2e82009-06-02 16:49:22 -0700473/* TCP is creating a child we want to follow.
474 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
475 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
476static void
477fork_tcb(struct tcb *tcp)
478{
479 if (nprocs == tcbtabsize)
480 expand_tcbtab();
481
482 tcp->flags |= TCB_FOLLOWFORK;
483}
484
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000485#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000486
487int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000488sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000489{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000490 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000491 if (getrval2(tcp)) {
492 tcp->auxstr = "child process";
493 return RVAL_UDECIMAL | RVAL_STR;
494 }
495 }
496 return 0;
497}
498
John Hughes4e36a812001-04-18 15:11:51 +0000499#if UNIXWARE > 2
500
501int
502sys_rfork(tcp)
503struct tcb *tcp;
504{
505 if (entering(tcp)) {
506 tprintf ("%ld", tcp->u_arg[0]);
507 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000508 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000509 if (getrval2(tcp)) {
510 tcp->auxstr = "child process";
511 return RVAL_UDECIMAL | RVAL_STR;
512 }
513 }
514 return 0;
515}
516
517#endif
518
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000519int
520internal_fork(tcp)
521struct tcb *tcp;
522{
523 struct tcb *tcpchild;
524
525 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000526#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000527 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000528 return 0;
529#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000530 if (getrval2(tcp))
531 return 0;
532 if (!followfork)
533 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700534 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000535 if (syserror(tcp))
536 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000537 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000538 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000539 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000540 }
541 return 0;
542}
543
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000544#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000545
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000546#ifdef LINUX
547
548/* defines copied from linux/sched.h since we can't include that
549 * ourselves (it conflicts with *lots* of libc includes)
550 */
551#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
552#define CLONE_VM 0x00000100 /* set if VM shared between processes */
553#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
554#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
555#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000556#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000557#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
558#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
559#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000560#define CLONE_THREAD 0x00010000 /* Same thread group? */
561#define CLONE_NEWNS 0x00020000 /* New namespace group? */
562#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
563#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
564#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
565#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
566#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
567#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
568#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000569
Roland McGrathd9f816f2004-09-04 03:39:20 +0000570static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000571 { CLONE_VM, "CLONE_VM" },
572 { CLONE_FS, "CLONE_FS" },
573 { CLONE_FILES, "CLONE_FILES" },
574 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000575 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000576 { CLONE_PTRACE, "CLONE_PTRACE" },
577 { CLONE_VFORK, "CLONE_VFORK" },
578 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000579 { CLONE_THREAD, "CLONE_THREAD" },
580 { CLONE_NEWNS, "CLONE_NEWNS" },
581 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
582 { CLONE_SETTLS, "CLONE_SETTLS" },
583 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
584 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
585 { CLONE_DETACHED, "CLONE_DETACHED" },
586 { CLONE_UNTRACED, "CLONE_UNTRACED" },
587 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000588 { 0, NULL },
589};
590
Roland McGrath909875b2002-12-22 03:34:36 +0000591# ifdef I386
592# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000593# ifdef HAVE_STRUCT_USER_DESC
594# define modify_ldt_ldt_s user_desc
595# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000596extern void print_ldt_entry();
597# endif
598
Roland McGrath9677b3a2003-03-12 09:54:36 +0000599# if defined IA64
600# define ARG_FLAGS 0
601# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000602# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
603# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
604# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
605# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000606# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000607# define ARG_STACK 0
608# define ARG_FLAGS 1
609# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000610# define ARG_CTID 3
611# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000612# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000613# define ARG_FLAGS 0
614# define ARG_STACK 1
615# define ARG_PTID 2
616# define ARG_CTID 3
617# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000618# else
619# define ARG_FLAGS 0
620# define ARG_STACK 1
621# define ARG_PTID 2
622# define ARG_TLS 3
623# define ARG_CTID 4
624# endif
625
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000626int
627sys_clone(tcp)
628struct tcb *tcp;
629{
630 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000631 unsigned long flags = tcp->u_arg[ARG_FLAGS];
632 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
633# ifdef ARG_STACKSIZE
634 if (ARG_STACKSIZE != -1)
635 tprintf("stack_size=%#lx, ",
636 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000637# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000638 tprintf("flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000639 printflags(clone_flags, flags &~ CSIGNAL, NULL);
Roland McGrath984154d2003-05-23 01:08:42 +0000640 if ((flags & CSIGNAL) != 0)
641 tprintf("|%s", signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000642 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000643 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000644 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000645 if (flags & CLONE_PARENT_SETTID)
646 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000647 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000648# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000649 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000650 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000651 tprintf(", {entry_number:%d, ",
652 copy.entry_number);
653 if (!verbose(tcp))
654 tprintf("...}");
655 else
656 print_ldt_entry(&copy);
657 }
658 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000659# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000660 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000661 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000662 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
663 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000664 }
665 return 0;
666}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000667
668int
669sys_unshare(struct tcb *tcp)
670{
671 if (entering(tcp))
672 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
673 return 0;
674}
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000675#endif
676
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000677int
678sys_fork(tcp)
679struct tcb *tcp;
680{
681 if (exiting(tcp))
682 return RVAL_UDECIMAL;
683 return 0;
684}
685
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000686int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000687change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000688{
689#if defined(LINUX)
690#if defined(I386)
691 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000692 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000693 return -1;
694 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000695#elif defined(X86_64)
696 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000697 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000698 return -1;
699 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000700#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000701 if (ptrace(PTRACE_POKEUSER, tcp->pid,
702 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000703 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000704 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000705#elif defined(S390) || defined(S390X)
706 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
707 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000708 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000709 return 0;
710#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000711 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000712 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000713 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000714#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400715 struct pt_regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000716 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
717 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400718 regs.u_regs[U_REG_G1] = new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000719 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000720 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000721 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000722#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000723 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000724 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000725 return 0;
726#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000727 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000728 return -1;
729 return 0;
730#elif defined(AVR32)
731 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
732 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000733 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000734#elif defined(BFIN)
735 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
736 return -1;
737 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000738#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000739 if (ia32) {
740 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000741 case 2:
742 break; /* x86 SYS_fork */
743 case SYS_clone:
744 new = 120;
745 break;
746 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000747 fprintf(stderr, "%s: unexpected syscall %d\n",
748 __FUNCTION__, new);
749 return -1;
750 }
751 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
752 return -1;
753 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000754 return -1;
755 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000756#elif defined(HPPA)
757 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000758 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000759 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000760#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000761 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
762 return -1;
763 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000764#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000765 /* Top half of reg encodes the no. of args n as 0x1n.
766 Assume 0 args as kernel never actually checks... */
767 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
768 0x100000 | new) < 0)
769 return -1;
770 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000771#elif defined(CRISV10) || defined(CRISV32)
772 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
773 return -1;
774 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000775#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000776 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000777# ifndef PTRACE_SET_SYSCALL
778# define PTRACE_SET_SYSCALL 23
779# endif
780
Dmitry V. Levin76740062009-09-18 11:30:14 +0000781 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000782 return -1;
783
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000784 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000785#else
786#warning Do not know how to handle change_syscall for this architecture
787#endif /* architecture */
788#endif /* LINUX */
789 return -1;
790}
791
Roland McGratha4d48532005-06-08 20:45:28 +0000792#if 0
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000793int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000794setarg(tcp, argnum)
795 struct tcb *tcp;
796 int argnum;
797{
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000798#if defined(AVR32)
799 {
800 errno = 0;
801 if (argnum == 0)
802 ptrace(PTRACE_POKEUSER, tcp->pid,
803 (char *)(REG_R12_ORIG),
804 tcp->u_arg[argnum]);
805 else if (argnum < 4)
806 /* r11 .. r9 */
807 ptrace(PTRACE_POKEUSER, tcp->pid,
808 (char *)(REG_R12 - 4 * argnum),
809 tcp->u_arg[argnum]);
810 else if (argnum < 5)
811 /* r5 */
812 ptrace(PTRACE_POKEUSER, tcp->pid,
813 (char *)(REG_R5),
814 tcp->u_arg[argnum]);
815 else if (argnum < 6)
816 /* r3 */
817 ptrace(PTRACE_POKEUSER, tcp->pid,
818 (char *)(REG_R3),
819 tcp->u_arg[argnum]);
820 else
821 return -E2BIG;
822 if (errno)
823 return -1;
824 }
825#elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000826 {
827 unsigned long *bsp, *ap;
828
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000829 if (upeek(tcp, PT_AR_BSP, (long *) &bsp) , 0)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000830 return -1;
831
832 ap = ia64_rse_skip_regs(bsp, argnum);
833 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000834 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000835 if (errno)
836 return -1;
837
838 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000839#elif defined(I386)
840 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000841 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000842 if (errno)
843 return -1;
844 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000845#elif defined(X86_64)
846 {
847 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
848 if (errno)
849 return -1;
850 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000851#elif defined(POWERPC)
852#ifndef PT_ORIG_R3
853#define PT_ORIG_R3 34
854#endif
855 {
856 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000857 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000858 tcp->u_arg[argnum]);
859 if (errno)
860 return -1;
861 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000862#elif defined(MIPS)
863 {
864 errno = 0;
865 if (argnum < 4)
866 ptrace(PTRACE_POKEUSER, tcp->pid,
867 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
868 else {
869 unsigned long *sp;
870
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000871 if (upeek(tcp, REG_SP, (long *) &sp) , 0)
Ralf Baechlee3816102000-08-01 00:06:06 +0000872 return -1;
873
874 ptrace(PTRACE_POKEDATA, tcp->pid,
875 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
876 }
877 if (errno)
878 return -1;
879 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000880#elif defined(S390) || defined(S390X)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000881 {
Michal Ludvig10a88d02002-10-07 14:31:00 +0000882 if(argnum <= 5)
883 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000884 (char *) (argnum==0 ? PT_ORIGGPR2 :
885 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000886 tcp->u_arg[argnum]);
887 else
888 return -E2BIG;
889 if (errno)
890 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000891 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000892#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000893# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000894#endif
895 return 0;
896}
Roland McGratha4d48532005-06-08 20:45:28 +0000897#endif
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000898
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000899#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000900int
Roland McGratheb9e2e82009-06-02 16:49:22 -0700901internal_clone(tcp)
902struct tcb *tcp;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000903{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000904 struct tcb *tcpchild;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700905 int pid;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000906 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700907 if (!followfork)
908 return 0;
909 fork_tcb(tcp);
910 if (setbpt(tcp) < 0)
911 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000912 } else {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700913 int bpt = tcp->flags & TCB_BPTSET;
914
915 if (!(tcp->flags & TCB_FOLLOWFORK))
916 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000917
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000918 if (syserror(tcp)) {
919 if (bpt)
920 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000921 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000922 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000923
924 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000925
926#ifdef CLONE_PTRACE /* See new setbpt code. */
927 tcpchild = pid2tcb(pid);
928 if (tcpchild != NULL) {
929 /* The child already reported its startup trap
930 before the parent reported its syscall return. */
931 if ((tcpchild->flags
932 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
933 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
934 fprintf(stderr, "\
935[preattached child %d of %d in weird state!]\n",
936 pid, tcp->pid);
937 }
938 else
939#endif
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000940 {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700941 fork_tcb(tcp);
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000942 tcpchild = alloctcb(pid);
943 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000944
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000945#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000946 /* Attach to the new child */
947 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000948 if (bpt)
949 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000950 perror("PTRACE_ATTACH");
951 fprintf(stderr, "Too late?\n");
952 droptcb(tcpchild);
953 return 0;
954 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000955#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000956
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000957 if (bpt)
958 clearbpt(tcp);
959
Ulrich Drepper90512f01999-12-24 07:22:25 +0000960 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000961 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000962 if (bpt) {
963 tcpchild->flags |= TCB_BPTSET;
964 tcpchild->baddr = tcp->baddr;
965 memcpy(tcpchild->inst, tcp->inst,
966 sizeof tcpchild->inst);
967 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000968 tcpchild->parent = tcp;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000969 tcp->nchildren++;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000970 if (tcpchild->flags & TCB_SUSPENDED) {
971 /* The child was born suspended, due to our having
972 forced CLONE_PTRACE. */
973 if (bpt)
974 clearbpt(tcpchild);
975
976 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000977 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000978 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000979
980 if (!qflag)
981 fprintf(stderr, "\
982Process %u resumed (parent %d ready)\n",
983 pid, tcp->pid);
984 }
985 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000986 if (!qflag)
987 fprintf(stderr, "Process %d attached\n", pid);
988 }
989
990#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000991 {
992 /*
993 * Save the flags used in this call,
994 * in case we point TCP to our parent below.
995 */
996 int call_flags = tcp->u_arg[ARG_FLAGS];
997 if ((tcp->flags & TCB_CLONE_THREAD) &&
998 tcp->parent != NULL) {
999 /* The parent in this clone is itself a
1000 thread belonging to another process.
1001 There is no meaning to the parentage
1002 relationship of the new child with the
1003 thread, only with the process. We
1004 associate the new thread with our
1005 parent. Since this is done for every
1006 new thread, there will never be a
1007 TCB_CLONE_THREAD process that has
1008 children. */
1009 --tcp->nchildren;
1010 tcp = tcp->parent;
1011 tcpchild->parent = tcp;
1012 ++tcp->nchildren;
1013 }
1014 if (call_flags & CLONE_THREAD) {
1015 tcpchild->flags |= TCB_CLONE_THREAD;
1016 ++tcp->nclone_threads;
1017 }
1018 if (call_flags & CLONE_DETACHED) {
1019 tcpchild->flags |= TCB_CLONE_DETACHED;
1020 ++tcp->nclone_detached;
1021 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001022 }
1023#endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00001024 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001025 return 0;
1026}
1027#endif
1028
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001029int
1030internal_fork(tcp)
1031struct tcb *tcp;
1032{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001033#ifdef LINUX
1034 /* We do special magic with clone for any clone or fork. */
1035 return internal_clone(tcp);
1036#else
1037
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001038 struct tcb *tcpchild;
1039 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -07001040 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001041
1042#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +00001043 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +00001044 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +00001045 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -07001046 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +00001047 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001048#endif
1049 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -07001050 if (!followfork || dont_follow)
1051 return 0;
1052 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001053 if (setbpt(tcp) < 0)
1054 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00001055 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001056 else {
1057 int bpt = tcp->flags & TCB_BPTSET;
1058
Roland McGratheb9e2e82009-06-02 16:49:22 -07001059 if (!(tcp->flags & TCB_FOLLOWFORK))
1060 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001061 if (bpt)
1062 clearbpt(tcp);
1063
1064 if (syserror(tcp))
1065 return 0;
1066
1067 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -07001068 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +00001069 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001070#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +00001071#ifdef HPPA
1072 /* The child must have run before it can be attached. */
1073 /* This must be a bug in the parisc kernel, but I havn't
1074 * identified it yet. Seems to be an issue associated
1075 * with attaching to a process (which sends it a signal)
1076 * before that process has ever been scheduled. When
1077 * debugging, I started seeing crashes in
1078 * arch/parisc/kernel/signal.c:do_signal(), apparently
1079 * caused by r8 getting corrupt over the dequeue_signal()
1080 * call. Didn't make much sense though...
1081 */
1082 {
1083 struct timeval tv;
1084 tv.tv_sec = 0;
1085 tv.tv_usec = 10000;
1086 select(0, NULL, NULL, NULL, &tv);
1087 }
1088#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001089 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
1090 perror("PTRACE_ATTACH");
1091 fprintf(stderr, "Too late?\n");
1092 droptcb(tcpchild);
1093 return 0;
1094 }
1095#endif /* LINUX */
1096#ifdef SUNOS4
1097#ifdef oldway
1098 /* The child must have run before it can be attached. */
1099 {
1100 struct timeval tv;
1101 tv.tv_sec = 0;
1102 tv.tv_usec = 10000;
1103 select(0, NULL, NULL, NULL, &tv);
1104 }
1105 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1106 perror("PTRACE_ATTACH");
1107 fprintf(stderr, "Too late?\n");
1108 droptcb(tcpchild);
1109 return 0;
1110 }
1111#else /* !oldway */
1112 /* Try to catch the new process as soon as possible. */
1113 {
1114 int i;
1115 for (i = 0; i < 1024; i++)
1116 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1117 break;
1118 if (i == 1024) {
1119 perror("PTRACE_ATTACH");
1120 fprintf(stderr, "Too late?\n");
1121 droptcb(tcpchild);
1122 return 0;
1123 }
1124 }
1125#endif /* !oldway */
1126#endif /* SUNOS4 */
1127 tcpchild->flags |= TCB_ATTACHED;
1128 /* Child has BPT too, must be removed on first occasion */
1129 if (bpt) {
1130 tcpchild->flags |= TCB_BPTSET;
1131 tcpchild->baddr = tcp->baddr;
1132 memcpy(tcpchild->inst, tcp->inst,
1133 sizeof tcpchild->inst);
1134 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001135 tcpchild->parent = tcp;
1136 tcp->nchildren++;
1137 if (!qflag)
1138 fprintf(stderr, "Process %d attached\n", pid);
1139 }
1140 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001141#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001142}
1143
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001144#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001145
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001146#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001147
1148int
1149sys_vfork(tcp)
1150struct tcb *tcp;
1151{
1152 if (exiting(tcp))
1153 return RVAL_UDECIMAL;
1154 return 0;
1155}
1156
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001157#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001158
1159#ifndef LINUX
1160
1161static char idstr[16];
1162
1163int
1164sys_getpid(tcp)
1165struct tcb *tcp;
1166{
1167 if (exiting(tcp)) {
1168 sprintf(idstr, "ppid %lu", getrval2(tcp));
1169 tcp->auxstr = idstr;
1170 return RVAL_STR;
1171 }
1172 return 0;
1173}
1174
1175int
1176sys_getuid(tcp)
1177struct tcb *tcp;
1178{
1179 if (exiting(tcp)) {
1180 sprintf(idstr, "euid %lu", getrval2(tcp));
1181 tcp->auxstr = idstr;
1182 return RVAL_STR;
1183 }
1184 return 0;
1185}
1186
1187int
1188sys_getgid(tcp)
1189struct tcb *tcp;
1190{
1191 if (exiting(tcp)) {
1192 sprintf(idstr, "egid %lu", getrval2(tcp));
1193 tcp->auxstr = idstr;
1194 return RVAL_STR;
1195 }
1196 return 0;
1197}
1198
1199#endif /* !LINUX */
1200
1201#ifdef LINUX
1202
1203int
1204sys_setuid(tcp)
1205struct tcb *tcp;
1206{
1207 if (entering(tcp)) {
1208 tprintf("%u", (uid_t) tcp->u_arg[0]);
1209 }
1210 return 0;
1211}
1212
1213int
1214sys_setgid(tcp)
1215struct tcb *tcp;
1216{
1217 if (entering(tcp)) {
1218 tprintf("%u", (gid_t) tcp->u_arg[0]);
1219 }
1220 return 0;
1221}
1222
1223int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001224sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001225{
1226 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001227 __kernel_uid_t uid;
1228 if (syserror(tcp))
1229 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1230 tcp->u_arg[1], tcp->u_arg[2]);
1231 else {
1232 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1233 tprintf("%#lx, ", tcp->u_arg[0]);
1234 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001235 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001236 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1237 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001238 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001239 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001240 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1241 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001242 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001243 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001244 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001245 }
1246 return 0;
1247}
1248
1249int
1250sys_getresgid(tcp)
1251struct tcb *tcp;
1252{
1253 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001254 __kernel_gid_t gid;
1255 if (syserror(tcp))
1256 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1257 tcp->u_arg[1], tcp->u_arg[2]);
1258 else {
1259 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1260 tprintf("%#lx, ", tcp->u_arg[0]);
1261 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001262 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001263 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1264 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001265 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001266 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001267 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1268 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001269 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001270 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001271 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001272 }
1273 return 0;
1274}
1275
1276#endif /* LINUX */
1277
1278int
1279sys_setreuid(tcp)
1280struct tcb *tcp;
1281{
1282 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001283 printuid("", tcp->u_arg[0]);
1284 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001285 }
1286 return 0;
1287}
1288
1289int
1290sys_setregid(tcp)
1291struct tcb *tcp;
1292{
1293 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001294 printuid("", tcp->u_arg[0]);
1295 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001296 }
1297 return 0;
1298}
1299
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001300#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001301int
1302sys_setresuid(tcp)
1303 struct tcb *tcp;
1304{
1305 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001306 printuid("", tcp->u_arg[0]);
1307 printuid(", ", tcp->u_arg[1]);
1308 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001309 }
1310 return 0;
1311}
1312int
1313sys_setresgid(tcp)
1314 struct tcb *tcp;
1315{
1316 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001317 printuid("", tcp->u_arg[0]);
1318 printuid(", ", tcp->u_arg[1]);
1319 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001320 }
1321 return 0;
1322}
1323
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001324#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001325
1326int
1327sys_setgroups(tcp)
1328struct tcb *tcp;
1329{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001330 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001331 unsigned long len, size, start, cur, end, abbrev_end;
1332 GETGROUPS_T gid;
1333 int failed = 0;
1334
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001335 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001336 tprintf("%lu, ", len);
1337 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001338 tprintf("[]");
1339 return 0;
1340 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001341 start = tcp->u_arg[1];
1342 if (start == 0) {
1343 tprintf("NULL");
1344 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001345 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001346 size = len * sizeof(gid);
1347 end = start + size;
1348 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1349 tprintf("%#lx", start);
1350 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001351 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001352 if (abbrev(tcp)) {
1353 abbrev_end = start + max_strlen * sizeof(gid);
1354 if (abbrev_end < start)
1355 abbrev_end = end;
1356 } else {
1357 abbrev_end = end;
1358 }
1359 tprintf("[");
1360 for (cur = start; cur < end; cur += sizeof(gid)) {
1361 if (cur > start)
1362 tprintf(", ");
1363 if (cur >= abbrev_end) {
1364 tprintf("...");
1365 break;
1366 }
1367 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1368 tprintf("?");
1369 failed = 1;
1370 break;
1371 }
1372 tprintf("%lu", (unsigned long) gid);
1373 }
1374 tprintf("]");
1375 if (failed)
1376 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001377 }
1378 return 0;
1379}
1380
1381int
1382sys_getgroups(tcp)
1383struct tcb *tcp;
1384{
Roland McGrathaa524c82005-06-01 19:22:06 +00001385 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001386
1387 if (entering(tcp)) {
1388 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001389 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001390 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001391 unsigned long size, start, cur, end, abbrev_end;
1392 GETGROUPS_T gid;
1393 int failed = 0;
1394
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001395 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001396 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001397 tprintf("[]");
1398 return 0;
1399 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001400 start = tcp->u_arg[1];
1401 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001402 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001403 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001404 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001405 if (tcp->u_arg[0] == 0) {
1406 tprintf("%#lx", start);
1407 return 0;
1408 }
1409 size = len * sizeof(gid);
1410 end = start + size;
1411 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1412 size / sizeof(gid) != len || end < start) {
1413 tprintf("%#lx", start);
1414 return 0;
1415 }
1416 if (abbrev(tcp)) {
1417 abbrev_end = start + max_strlen * sizeof(gid);
1418 if (abbrev_end < start)
1419 abbrev_end = end;
1420 } else {
1421 abbrev_end = end;
1422 }
1423 tprintf("[");
1424 for (cur = start; cur < end; cur += sizeof(gid)) {
1425 if (cur > start)
1426 tprintf(", ");
1427 if (cur >= abbrev_end) {
1428 tprintf("...");
1429 break;
1430 }
1431 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1432 tprintf("?");
1433 failed = 1;
1434 break;
1435 }
1436 tprintf("%lu", (unsigned long) gid);
1437 }
1438 tprintf("]");
1439 if (failed)
1440 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001441 }
1442 return 0;
1443}
1444
Roland McGrath83bd47a2003-11-13 22:32:26 +00001445#ifdef LINUX
1446int
1447sys_setgroups32(tcp)
1448struct tcb *tcp;
1449{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001450 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001451 unsigned long len, size, start, cur, end, abbrev_end;
1452 GETGROUPS32_T gid;
1453 int failed = 0;
1454
Roland McGrath83bd47a2003-11-13 22:32:26 +00001455 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001456 tprintf("%lu, ", len);
1457 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001458 tprintf("[]");
1459 return 0;
1460 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001461 start = tcp->u_arg[1];
1462 if (start == 0) {
1463 tprintf("NULL");
1464 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001465 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001466 size = len * sizeof(gid);
1467 end = start + size;
1468 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1469 tprintf("%#lx", start);
1470 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001471 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001472 if (abbrev(tcp)) {
1473 abbrev_end = start + max_strlen * sizeof(gid);
1474 if (abbrev_end < start)
1475 abbrev_end = end;
1476 } else {
1477 abbrev_end = end;
1478 }
1479 tprintf("[");
1480 for (cur = start; cur < end; cur += sizeof(gid)) {
1481 if (cur > start)
1482 tprintf(", ");
1483 if (cur >= abbrev_end) {
1484 tprintf("...");
1485 break;
1486 }
1487 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1488 tprintf("?");
1489 failed = 1;
1490 break;
1491 }
1492 tprintf("%lu", (unsigned long) gid);
1493 }
1494 tprintf("]");
1495 if (failed)
1496 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001497 }
1498 return 0;
1499}
1500
1501int
1502sys_getgroups32(tcp)
1503struct tcb *tcp;
1504{
Roland McGrathaa524c82005-06-01 19:22:06 +00001505 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001506
1507 if (entering(tcp)) {
1508 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001509 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001510 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001511 unsigned long size, start, cur, end, abbrev_end;
1512 GETGROUPS32_T gid;
1513 int failed = 0;
1514
Roland McGrath83bd47a2003-11-13 22:32:26 +00001515 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001516 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001517 tprintf("[]");
1518 return 0;
1519 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001520 start = tcp->u_arg[1];
1521 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001522 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001523 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001524 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001525 size = len * sizeof(gid);
1526 end = start + size;
1527 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1528 size / sizeof(gid) != len || end < start) {
1529 tprintf("%#lx", start);
1530 return 0;
1531 }
1532 if (abbrev(tcp)) {
1533 abbrev_end = start + max_strlen * sizeof(gid);
1534 if (abbrev_end < start)
1535 abbrev_end = end;
1536 } else {
1537 abbrev_end = end;
1538 }
1539 tprintf("[");
1540 for (cur = start; cur < end; cur += sizeof(gid)) {
1541 if (cur > start)
1542 tprintf(", ");
1543 if (cur >= abbrev_end) {
1544 tprintf("...");
1545 break;
1546 }
1547 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1548 tprintf("?");
1549 failed = 1;
1550 break;
1551 }
1552 tprintf("%lu", (unsigned long) gid);
1553 }
1554 tprintf("]");
1555 if (failed)
1556 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001557 }
1558 return 0;
1559}
1560#endif /* LINUX */
1561
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001562#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001563int
1564sys_setpgrp(tcp)
1565struct tcb *tcp;
1566{
1567 if (entering(tcp)) {
1568#ifndef SVR4
1569 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1570#endif /* !SVR4 */
1571 }
1572 return 0;
1573}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001574#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001575
1576int
1577sys_getpgrp(tcp)
1578struct tcb *tcp;
1579{
1580 if (entering(tcp)) {
1581#ifndef SVR4
1582 tprintf("%lu", tcp->u_arg[0]);
1583#endif /* !SVR4 */
1584 }
1585 return 0;
1586}
1587
1588int
1589sys_getsid(tcp)
1590struct tcb *tcp;
1591{
1592 if (entering(tcp)) {
1593 tprintf("%lu", tcp->u_arg[0]);
1594 }
1595 return 0;
1596}
1597
1598int
1599sys_setsid(tcp)
1600struct tcb *tcp;
1601{
1602 return 0;
1603}
1604
1605int
1606sys_getpgid(tcp)
1607struct tcb *tcp;
1608{
1609 if (entering(tcp)) {
1610 tprintf("%lu", tcp->u_arg[0]);
1611 }
1612 return 0;
1613}
1614
1615int
1616sys_setpgid(tcp)
1617struct tcb *tcp;
1618{
1619 if (entering(tcp)) {
1620 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1621 }
1622 return 0;
1623}
1624
John Hughesc61eb3d2002-05-17 11:37:50 +00001625#if UNIXWARE >= 2
1626
1627#include <sys/privilege.h>
1628
1629
Roland McGrathd9f816f2004-09-04 03:39:20 +00001630static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001631 { SETPRV, "SETPRV" },
1632 { CLRPRV, "CLRPRV" },
1633 { PUTPRV, "PUTPRV" },
1634 { GETPRV, "GETPRV" },
1635 { CNTPRV, "CNTPRV" },
1636 { 0, NULL },
1637};
1638
1639
Roland McGrathd9f816f2004-09-04 03:39:20 +00001640static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001641 { P_OWNER, "P_OWNER" },
1642 { P_AUDIT, "P_AUDIT" },
1643 { P_COMPAT, "P_COMPAT" },
1644 { P_DACREAD, "P_DACREAD" },
1645 { P_DACWRITE, "P_DACWRITE" },
1646 { P_DEV, "P_DEV" },
1647 { P_FILESYS, "P_FILESYS" },
1648 { P_MACREAD, "P_MACREAD" },
1649 { P_MACWRITE, "P_MACWRITE" },
1650 { P_MOUNT, "P_MOUNT" },
1651 { P_MULTIDIR, "P_MULTIDIR" },
1652 { P_SETPLEVEL, "P_SETPLEVEL" },
1653 { P_SETSPRIV, "P_SETSPRIV" },
1654 { P_SETUID, "P_SETUID" },
1655 { P_SYSOPS, "P_SYSOPS" },
1656 { P_SETUPRIV, "P_SETUPRIV" },
1657 { P_DRIVER, "P_DRIVER" },
1658 { P_RTIME, "P_RTIME" },
1659 { P_MACUPGRADE, "P_MACUPGRADE" },
1660 { P_FSYSRANGE, "P_FSYSRANGE" },
1661 { P_SETFLEVEL, "P_SETFLEVEL" },
1662 { P_AUDITWR, "P_AUDITWR" },
1663 { P_TSHAR, "P_TSHAR" },
1664 { P_PLOCK, "P_PLOCK" },
1665 { P_CORE, "P_CORE" },
1666 { P_LOADMOD, "P_LOADMOD" },
1667 { P_BIND, "P_BIND" },
1668 { P_ALLPRIVS, "P_ALLPRIVS" },
1669 { 0, NULL },
1670};
1671
1672
Roland McGrathd9f816f2004-09-04 03:39:20 +00001673static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001674 { PS_FIX, "PS_FIX" },
1675 { PS_INH, "PS_INH" },
1676 { PS_MAX, "PS_MAX" },
1677 { PS_WKG, "PS_WKG" },
1678 { 0, NULL },
1679};
1680
1681
1682static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001683printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001684{
1685 priv_t buf [128];
1686 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1687 int dots = len > max;
1688 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001689
John Hughesc61eb3d2002-05-17 11:37:50 +00001690 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001691
John Hughesc61eb3d2002-05-17 11:37:50 +00001692 if (len <= 0 ||
1693 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1694 {
1695 tprintf ("%#lx", addr);
1696 return;
1697 }
1698
1699 tprintf ("[");
1700
1701 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001702 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001703
1704 if (i) tprintf (", ");
1705
1706 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1707 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1708 {
1709 tprintf ("%s|%s", t, p);
1710 }
1711 else {
1712 tprintf ("%#lx", buf [i]);
1713 }
1714 }
1715
1716 if (dots) tprintf (" ...");
1717
1718 tprintf ("]");
1719}
1720
1721
1722int
1723sys_procpriv(tcp)
1724struct tcb *tcp;
1725{
1726 if (entering(tcp)) {
1727 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1728 switch (tcp->u_arg[0]) {
1729 case CNTPRV:
1730 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1731 break;
1732
1733 case GETPRV:
1734 break;
1735
1736 default:
1737 tprintf (", ");
1738 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1739 tprintf (", %ld", tcp->u_arg[2]);
1740 }
1741 }
1742 else if (tcp->u_arg[0] == GETPRV) {
1743 if (syserror (tcp)) {
1744 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1745 }
1746 else {
1747 tprintf (", ");
1748 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1749 tprintf (", %ld", tcp->u_arg[2]);
1750 }
1751 }
Roland McGrath5a223472002-12-15 23:58:26 +00001752
John Hughesc61eb3d2002-05-17 11:37:50 +00001753 return 0;
1754}
1755
1756#endif
1757
1758
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001759static void
1760printargv(tcp, addr)
1761struct tcb *tcp;
1762long addr;
1763{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001764 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001765 unsigned int p32;
1766 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001767 char data[sizeof(long)];
1768 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001769 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001770 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001771
Roland McGrath85a3bc42007-08-02 02:13:05 +00001772 cp.p64 = 1;
1773 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1774 if (umoven(tcp, addr, personality_wordsize[current_personality],
1775 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001776 tprintf("%#lx", addr);
1777 return;
1778 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001779 if (personality_wordsize[current_personality] == 4)
1780 cp.p64 = cp.p32;
1781 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001782 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001783 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001784 printstr(tcp, cp.p64, -1);
1785 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001786 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001787 if (cp.p64)
1788 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001789}
1790
1791static void
1792printargc(fmt, tcp, addr)
1793char *fmt;
1794struct tcb *tcp;
1795long addr;
1796{
1797 int count;
1798 char *cp;
1799
1800 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1801 addr += sizeof(char *);
1802 }
1803 tprintf(fmt, count, count == 1 ? "" : "s");
1804}
1805
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001806#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001807int
1808sys_execv(tcp)
1809struct tcb *tcp;
1810{
1811 if (entering(tcp)) {
1812 printpath(tcp, tcp->u_arg[0]);
1813 if (!verbose(tcp))
1814 tprintf(", %#lx", tcp->u_arg[1]);
1815#if 0
1816 else if (abbrev(tcp))
1817 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1818#endif
1819 else {
1820 tprintf(", [");
1821 printargv(tcp, tcp->u_arg[1]);
1822 tprintf("]");
1823 }
1824 }
1825 return 0;
1826}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001827#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001828
1829int
1830sys_execve(tcp)
1831struct tcb *tcp;
1832{
1833 if (entering(tcp)) {
1834 printpath(tcp, tcp->u_arg[0]);
1835 if (!verbose(tcp))
1836 tprintf(", %#lx", tcp->u_arg[1]);
1837#if 0
1838 else if (abbrev(tcp))
1839 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1840#endif
1841 else {
1842 tprintf(", [");
1843 printargv(tcp, tcp->u_arg[1]);
1844 tprintf("]");
1845 }
1846 if (!verbose(tcp))
1847 tprintf(", %#lx", tcp->u_arg[2]);
1848 else if (abbrev(tcp))
1849 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1850 else {
1851 tprintf(", [");
1852 printargv(tcp, tcp->u_arg[2]);
1853 tprintf("]");
1854 }
1855 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001856 return 0;
1857}
1858
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001859#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001860
1861int sys_rexecve(tcp)
1862struct tcb *tcp;
1863{
1864 if (entering (tcp)) {
1865 sys_execve (tcp);
1866 tprintf (", %ld", tcp->u_arg[3]);
1867 }
1868 return 0;
1869}
1870
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001871#endif
John Hughes4e36a812001-04-18 15:11:51 +00001872
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001873int
1874internal_exec(tcp)
1875struct tcb *tcp;
1876{
1877#ifdef SUNOS4
1878 if (exiting(tcp) && !syserror(tcp) && followfork)
1879 fixvfork(tcp);
1880#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001881#if defined LINUX && defined TCB_WAITEXECVE
1882 if (exiting(tcp) && syserror(tcp))
1883 tcp->flags &= ~TCB_WAITEXECVE;
1884 else
1885 tcp->flags |= TCB_WAITEXECVE;
1886#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001887 return 0;
1888}
1889
1890#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001891#ifndef __WNOTHREAD
1892#define __WNOTHREAD 0x20000000
1893#endif
1894#ifndef __WALL
1895#define __WALL 0x40000000
1896#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001897#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001898#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001899#endif
1900#endif /* LINUX */
1901
Roland McGrathd9f816f2004-09-04 03:39:20 +00001902static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001903 { WNOHANG, "WNOHANG" },
1904#ifndef WSTOPPED
1905 { WUNTRACED, "WUNTRACED" },
1906#endif
1907#ifdef WEXITED
1908 { WEXITED, "WEXITED" },
1909#endif
1910#ifdef WTRAPPED
1911 { WTRAPPED, "WTRAPPED" },
1912#endif
1913#ifdef WSTOPPED
1914 { WSTOPPED, "WSTOPPED" },
1915#endif
1916#ifdef WCONTINUED
1917 { WCONTINUED, "WCONTINUED" },
1918#endif
1919#ifdef WNOWAIT
1920 { WNOWAIT, "WNOWAIT" },
1921#endif
1922#ifdef __WCLONE
1923 { __WCLONE, "__WCLONE" },
1924#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001925#ifdef __WALL
1926 { __WALL, "__WALL" },
1927#endif
1928#ifdef __WNOTHREAD
1929 { __WNOTHREAD, "__WNOTHREAD" },
1930#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001931 { 0, NULL },
1932};
1933
Roland McGrath5e02a572004-10-19 23:33:47 +00001934#if !defined WCOREFLAG && defined WCOREFLG
1935# define WCOREFLAG WCOREFLG
1936#endif
1937#ifndef WCOREFLAG
1938#define WCOREFLAG 0x80
1939#endif
1940
1941#ifndef W_STOPCODE
1942#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1943#endif
1944#ifndef W_EXITCODE
1945#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1946#endif
1947
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001948static int
1949printstatus(status)
1950int status;
1951{
1952 int exited = 0;
1953
1954 /*
1955 * Here is a tricky presentation problem. This solution
1956 * is still not entirely satisfactory but since there
1957 * are no wait status constructors it will have to do.
1958 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001959 if (WIFSTOPPED(status)) {
1960 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001961 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001962 status &= ~W_STOPCODE(WSTOPSIG(status));
1963 }
1964 else if (WIFSIGNALED(status)) {
1965 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001966 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001967 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001968 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1969 }
1970 else if (WIFEXITED(status)) {
1971 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001972 WEXITSTATUS(status));
1973 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001974 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001975 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001976 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001977 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001978 return 0;
1979 }
1980
1981 if (status == 0)
1982 tprintf("]");
1983 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001984 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001985
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001986 return exited;
1987}
1988
1989static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001990printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001991{
1992 int status;
1993 int exited = 0;
1994
1995 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001996#ifdef LINUX
1997 /* On Linux, kernel-side pid_t is typedef'ed to int
1998 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001999 * pid argument to int on 64bit arches, producing,
2000 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00002001 * in strace. We have to use int here, not long.
2002 */
2003 int pid = tcp->u_arg[0];
2004 tprintf("%d, ", pid);
2005#else
2006 /*
2007 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00002008 */
2009 long pid = tcp->u_arg[0];
2010 if (personality_wordsize[current_personality] < sizeof pid)
2011 pid = (long) (int) pid;
2012 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00002013#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002014 } else {
2015 /* status */
2016 if (!tcp->u_arg[1])
2017 tprintf("NULL");
2018 else if (syserror(tcp) || tcp->u_rval == 0)
2019 tprintf("%#lx", tcp->u_arg[1]);
2020 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
2021 tprintf("[?]");
2022 else
2023 exited = printstatus(status);
2024 /* options */
2025 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002026 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002027 if (n == 4) {
2028 tprintf(", ");
2029 /* usage */
2030 if (!tcp->u_arg[3])
2031 tprintf("NULL");
2032#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002033 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00002034#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002035 if (bitness)
2036 printrusage32(tcp, tcp->u_arg[3]);
2037 else
2038#endif
2039 printrusage(tcp, tcp->u_arg[3]);
2040 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002041#endif /* LINUX */
2042#ifdef SUNOS4
2043 else if (tcp->u_rval > 0 && exited)
2044 printrusage(tcp, tcp->u_arg[3]);
2045#endif /* SUNOS4 */
2046 else
2047 tprintf("%#lx", tcp->u_arg[3]);
2048 }
2049 }
2050 return 0;
2051}
2052
2053int
Roland McGrathc74c0b72004-09-01 19:39:46 +00002054internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002055struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00002056int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002057{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002058 int got_kids;
2059
2060#ifdef TCB_CLONE_THREAD
2061 if (tcp->flags & TCB_CLONE_THREAD)
2062 /* The children we wait for are our parent's children. */
2063 got_kids = (tcp->parent->nchildren
2064 > tcp->parent->nclone_detached);
2065 else
2066 got_kids = (tcp->nchildren > tcp->nclone_detached);
2067#else
2068 got_kids = tcp->nchildren > 0;
2069#endif
2070
2071 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002072 /* There are children that this parent should block for.
2073 But ptrace made us the parent of the traced children
2074 and the real parent will get ECHILD from the wait call.
2075
2076 XXX If we attached with strace -f -p PID, then there
2077 may be untraced dead children the parent could be reaping
2078 now, but we make him block. */
2079
2080 /* ??? WTA: fix bug with hanging children */
2081
Roland McGrathc74c0b72004-09-01 19:39:46 +00002082 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00002083 /*
2084 * There are traced children. We'll make the parent
2085 * block to avoid a false ECHILD error due to our
2086 * ptrace having stolen the children. However,
2087 * we shouldn't block if there are zombies to reap.
2088 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
2089 */
Roland McGrathfccfb942003-10-01 21:59:44 +00002090 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00002091 if (tcp->nzombies > 0 &&
2092 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00002093 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00002094 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00002095 if (tcp->u_arg[0] > 0) {
2096 /*
2097 * If the parent waits for a specified child
2098 * PID, then it must get ECHILD right away
2099 * if that PID is not one of its children.
2100 * Make sure that the requested PID matches
2101 * one of the parent's children that we are
2102 * tracing, and don't suspend it otherwise.
2103 */
2104 if (child == NULL)
2105 child = pid2tcb(tcp->u_arg[0]);
2106 if (child == NULL || child->parent != (
2107#ifdef TCB_CLONE_THREAD
2108 (tcp->flags & TCB_CLONE_THREAD)
2109 ? tcp->parent :
2110#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002111 tcp) ||
2112 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002113 return 0;
2114 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002115 tcp->flags |= TCB_SUSPENDED;
2116 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002117#ifdef TCB_CLONE_THREAD
2118 if (tcp->flags & TCB_CLONE_THREAD)
2119 tcp->parent->nclone_waiting++;
2120#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002121 }
2122 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002123 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002124 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002125 /* We must force a fake result of 0 instead of
2126 the ECHILD error. */
2127 extern int force_result();
2128 return force_result(tcp, 0, 0);
2129 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002130 }
Roland McGrath09623452003-05-23 02:27:13 +00002131 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2132 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2133 /*
2134 * We just reaped a child we don't know about,
2135 * presumably a zombie we already droptcb'd.
2136 */
2137 tcp->nzombies--;
2138 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002139 return 0;
2140}
2141
2142#ifdef SVR4
2143
2144int
2145sys_wait(tcp)
2146struct tcb *tcp;
2147{
2148 if (exiting(tcp)) {
2149 /* The library wrapper stuffs this into the user variable. */
2150 if (!syserror(tcp))
2151 printstatus(getrval2(tcp));
2152 }
2153 return 0;
2154}
2155
2156#endif /* SVR4 */
2157
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002158#ifdef FREEBSD
2159int
2160sys_wait(tcp)
2161struct tcb *tcp;
2162{
2163 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002164
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002165 if (exiting(tcp)) {
2166 if (!syserror(tcp)) {
2167 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2168 tprintf("%#lx", tcp->u_arg[0]);
2169 else
2170 printstatus(status);
2171 }
2172 }
2173 return 0;
2174}
2175#endif
2176
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002177int
2178sys_waitpid(tcp)
2179struct tcb *tcp;
2180{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002181 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002182}
2183
2184int
2185sys_wait4(tcp)
2186struct tcb *tcp;
2187{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002188 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002189}
2190
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002191#ifdef ALPHA
2192int
2193sys_osf_wait4(tcp)
2194struct tcb *tcp;
2195{
2196 return printwaitn(tcp, 4, 1);
2197}
2198#endif
2199
Roland McGrathc74c0b72004-09-01 19:39:46 +00002200#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002201
Roland McGrathd9f816f2004-09-04 03:39:20 +00002202static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002203 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002204#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002205 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002206#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002207 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002208#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002209 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002210#endif
2211#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002212 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002213#endif
2214#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002215 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002216#endif
2217#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002218 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002219#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002220 { P_ALL, "P_ALL" },
2221#ifdef P_LWPID
2222 { P_LWPID, "P_LWPID" },
2223#endif
2224 { 0, NULL },
2225};
2226
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002227int
2228sys_waitid(tcp)
2229struct tcb *tcp;
2230{
2231 siginfo_t si;
2232 int exited;
2233
2234 if (entering(tcp)) {
2235 printxval(waitid_types, tcp->u_arg[0], "P_???");
2236 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002237 }
2238 else {
2239 /* siginfo */
2240 exited = 0;
2241 if (!tcp->u_arg[2])
2242 tprintf("NULL");
2243 else if (syserror(tcp))
2244 tprintf("%#lx", tcp->u_arg[2]);
2245 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2246 tprintf("{???}");
2247 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002248 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002249 /* options */
2250 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002251 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002252 if (tcp->u_nargs > 4) {
2253 /* usage */
2254 tprintf(", ");
2255 if (!tcp->u_arg[4])
2256 tprintf("NULL");
2257 else if (tcp->u_error)
2258 tprintf("%#lx", tcp->u_arg[4]);
2259 else
2260 printrusage(tcp, tcp->u_arg[4]);
2261 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002262 }
2263 return 0;
2264}
2265
Roland McGrathc74c0b72004-09-01 19:39:46 +00002266#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002267
2268int
2269sys_alarm(tcp)
2270struct tcb *tcp;
2271{
2272 if (entering(tcp))
2273 tprintf("%lu", tcp->u_arg[0]);
2274 return 0;
2275}
2276
2277int
2278sys_uname(tcp)
2279struct tcb *tcp;
2280{
2281 struct utsname uname;
2282
2283 if (exiting(tcp)) {
2284 if (syserror(tcp) || !verbose(tcp))
2285 tprintf("%#lx", tcp->u_arg[0]);
2286 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2287 tprintf("{...}");
2288 else if (!abbrev(tcp)) {
2289
2290 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2291 uname.sysname, uname.nodename);
2292 tprintf("release=\"%s\", version=\"%s\", ",
2293 uname.release, uname.version);
2294 tprintf("machine=\"%s\"", uname.machine);
2295#ifdef LINUX
2296#ifndef __GLIBC__
2297 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002298#endif
2299#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002300 tprintf("}");
2301 }
2302 else
2303 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2304 uname.sysname, uname.nodename);
2305 }
2306 return 0;
2307}
2308
2309#ifndef SVR4
2310
Roland McGratheb9e2e82009-06-02 16:49:22 -07002311static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002312# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002313 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2314 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2315 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2316 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2317 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2318 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2319 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2320 { PTRACE_CONT, "PTRACE_CONT" },
2321 { PTRACE_KILL, "PTRACE_KILL" },
2322 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2323 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2324 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002325# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002326 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002327# endif
2328# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002329 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002330# endif
2331# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002332 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002333# endif
2334# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002335 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002336# endif
2337# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002338 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002339# endif
2340# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002341 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002342# endif
2343# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002344 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002345# endif
2346# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002347 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002348# endif
2349# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002350 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002351# endif
2352# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002353 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002354# endif
2355# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002356 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002357# endif
2358# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002359 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002360# endif
2361# ifdef PTRACE_SET_SYSCALL
2362 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2363# endif
2364# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002365 { PTRACE_READDATA, "PTRACE_READDATA" },
2366 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2367 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2368 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2369 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2370 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002371# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002372 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2373 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002374# else /* !SPARC */
2375 { PTRACE_22, "PTRACE_22" },
2376 { PTRACE_23, "PTRACE_3" },
2377# endif /* !SPARC */
2378# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002379 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002380# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002381 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002382# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002383 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2384 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2385 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002386# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002387 { PTRACE_26, "PTRACE_26" },
2388 { PTRACE_27, "PTRACE_27" },
2389 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002390# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002391 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002392# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002393
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002394# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002395
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002396 { PT_TRACE_ME, "PT_TRACE_ME" },
2397 { PT_READ_I, "PT_READ_I" },
2398 { PT_READ_D, "PT_READ_D" },
2399 { PT_WRITE_I, "PT_WRITE_I" },
2400 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002401# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002402 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002403# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002404 { PT_CONTINUE, "PT_CONTINUE" },
2405 { PT_KILL, "PT_KILL" },
2406 { PT_STEP, "PT_STEP" },
2407 { PT_ATTACH, "PT_ATTACH" },
2408 { PT_DETACH, "PT_DETACH" },
2409 { PT_GETREGS, "PT_GETREGS" },
2410 { PT_SETREGS, "PT_SETREGS" },
2411 { PT_GETFPREGS, "PT_GETFPREGS" },
2412 { PT_SETFPREGS, "PT_SETFPREGS" },
2413 { PT_GETDBREGS, "PT_GETDBREGS" },
2414 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002415# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002416 { 0, NULL },
2417};
2418
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002419# ifndef FREEBSD
2420# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002421static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002422# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002423 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002424# endif
2425# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002426 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002427# endif
2428# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002429 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002430# endif
2431# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002432 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002433# endif
2434# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002435 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002436# endif
2437# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002438 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002439# endif
2440# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002441 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002442# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002443 { 0, NULL },
2444};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002445# endif /* PTRACE_SETOPTIONS */
2446# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002447
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002448# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002449const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002450# ifdef LINUX
2451# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002452 { PT_PSWMASK, "psw_mask" },
2453 { PT_PSWADDR, "psw_addr" },
2454 { PT_GPR0, "gpr0" },
2455 { PT_GPR1, "gpr1" },
2456 { PT_GPR2, "gpr2" },
2457 { PT_GPR3, "gpr3" },
2458 { PT_GPR4, "gpr4" },
2459 { PT_GPR5, "gpr5" },
2460 { PT_GPR6, "gpr6" },
2461 { PT_GPR7, "gpr7" },
2462 { PT_GPR8, "gpr8" },
2463 { PT_GPR9, "gpr9" },
2464 { PT_GPR10, "gpr10" },
2465 { PT_GPR11, "gpr11" },
2466 { PT_GPR12, "gpr12" },
2467 { PT_GPR13, "gpr13" },
2468 { PT_GPR14, "gpr14" },
2469 { PT_GPR15, "gpr15" },
2470 { PT_ACR0, "acr0" },
2471 { PT_ACR1, "acr1" },
2472 { PT_ACR2, "acr2" },
2473 { PT_ACR3, "acr3" },
2474 { PT_ACR4, "acr4" },
2475 { PT_ACR5, "acr5" },
2476 { PT_ACR6, "acr6" },
2477 { PT_ACR7, "acr7" },
2478 { PT_ACR8, "acr8" },
2479 { PT_ACR9, "acr9" },
2480 { PT_ACR10, "acr10" },
2481 { PT_ACR11, "acr11" },
2482 { PT_ACR12, "acr12" },
2483 { PT_ACR13, "acr13" },
2484 { PT_ACR14, "acr14" },
2485 { PT_ACR15, "acr15" },
2486 { PT_ORIGGPR2, "orig_gpr2" },
2487 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002488# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002489 { PT_FPR0_HI, "fpr0.hi" },
2490 { PT_FPR0_LO, "fpr0.lo" },
2491 { PT_FPR1_HI, "fpr1.hi" },
2492 { PT_FPR1_LO, "fpr1.lo" },
2493 { PT_FPR2_HI, "fpr2.hi" },
2494 { PT_FPR2_LO, "fpr2.lo" },
2495 { PT_FPR3_HI, "fpr3.hi" },
2496 { PT_FPR3_LO, "fpr3.lo" },
2497 { PT_FPR4_HI, "fpr4.hi" },
2498 { PT_FPR4_LO, "fpr4.lo" },
2499 { PT_FPR5_HI, "fpr5.hi" },
2500 { PT_FPR5_LO, "fpr5.lo" },
2501 { PT_FPR6_HI, "fpr6.hi" },
2502 { PT_FPR6_LO, "fpr6.lo" },
2503 { PT_FPR7_HI, "fpr7.hi" },
2504 { PT_FPR7_LO, "fpr7.lo" },
2505 { PT_FPR8_HI, "fpr8.hi" },
2506 { PT_FPR8_LO, "fpr8.lo" },
2507 { PT_FPR9_HI, "fpr9.hi" },
2508 { PT_FPR9_LO, "fpr9.lo" },
2509 { PT_FPR10_HI, "fpr10.hi" },
2510 { PT_FPR10_LO, "fpr10.lo" },
2511 { PT_FPR11_HI, "fpr11.hi" },
2512 { PT_FPR11_LO, "fpr11.lo" },
2513 { PT_FPR12_HI, "fpr12.hi" },
2514 { PT_FPR12_LO, "fpr12.lo" },
2515 { PT_FPR13_HI, "fpr13.hi" },
2516 { PT_FPR13_LO, "fpr13.lo" },
2517 { PT_FPR14_HI, "fpr14.hi" },
2518 { PT_FPR14_LO, "fpr14.lo" },
2519 { PT_FPR15_HI, "fpr15.hi" },
2520 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002521# endif
2522# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002523 { PT_FPR0, "fpr0" },
2524 { PT_FPR1, "fpr1" },
2525 { PT_FPR2, "fpr2" },
2526 { PT_FPR3, "fpr3" },
2527 { PT_FPR4, "fpr4" },
2528 { PT_FPR5, "fpr5" },
2529 { PT_FPR6, "fpr6" },
2530 { PT_FPR7, "fpr7" },
2531 { PT_FPR8, "fpr8" },
2532 { PT_FPR9, "fpr9" },
2533 { PT_FPR10, "fpr10" },
2534 { PT_FPR11, "fpr11" },
2535 { PT_FPR12, "fpr12" },
2536 { PT_FPR13, "fpr13" },
2537 { PT_FPR14, "fpr14" },
2538 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002539# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002540 { PT_CR_9, "cr9" },
2541 { PT_CR_10, "cr10" },
2542 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002543 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002544# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002545 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002546# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002547 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002548# elif defined(POWERPC)
2549# ifndef PT_ORIG_R3
2550# define PT_ORIG_R3 34
2551# endif
2552# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002553 { REGSIZE*PT_R0, "r0" },
2554 { REGSIZE*PT_R1, "r1" },
2555 { REGSIZE*PT_R2, "r2" },
2556 { REGSIZE*PT_R3, "r3" },
2557 { REGSIZE*PT_R4, "r4" },
2558 { REGSIZE*PT_R5, "r5" },
2559 { REGSIZE*PT_R6, "r6" },
2560 { REGSIZE*PT_R7, "r7" },
2561 { REGSIZE*PT_R8, "r8" },
2562 { REGSIZE*PT_R9, "r9" },
2563 { REGSIZE*PT_R10, "r10" },
2564 { REGSIZE*PT_R11, "r11" },
2565 { REGSIZE*PT_R12, "r12" },
2566 { REGSIZE*PT_R13, "r13" },
2567 { REGSIZE*PT_R14, "r14" },
2568 { REGSIZE*PT_R15, "r15" },
2569 { REGSIZE*PT_R16, "r16" },
2570 { REGSIZE*PT_R17, "r17" },
2571 { REGSIZE*PT_R18, "r18" },
2572 { REGSIZE*PT_R19, "r19" },
2573 { REGSIZE*PT_R20, "r20" },
2574 { REGSIZE*PT_R21, "r21" },
2575 { REGSIZE*PT_R22, "r22" },
2576 { REGSIZE*PT_R23, "r23" },
2577 { REGSIZE*PT_R24, "r24" },
2578 { REGSIZE*PT_R25, "r25" },
2579 { REGSIZE*PT_R26, "r26" },
2580 { REGSIZE*PT_R27, "r27" },
2581 { REGSIZE*PT_R28, "r28" },
2582 { REGSIZE*PT_R29, "r29" },
2583 { REGSIZE*PT_R30, "r30" },
2584 { REGSIZE*PT_R31, "r31" },
2585 { REGSIZE*PT_NIP, "NIP" },
2586 { REGSIZE*PT_MSR, "MSR" },
2587 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2588 { REGSIZE*PT_CTR, "CTR" },
2589 { REGSIZE*PT_LNK, "LNK" },
2590 { REGSIZE*PT_XER, "XER" },
2591 { REGSIZE*PT_CCR, "CCR" },
2592 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002593# undef REGSIZE
2594# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002595 { 0, "r0" },
2596 { 1, "r1" },
2597 { 2, "r2" },
2598 { 3, "r3" },
2599 { 4, "r4" },
2600 { 5, "r5" },
2601 { 6, "r6" },
2602 { 7, "r7" },
2603 { 8, "r8" },
2604 { 9, "r9" },
2605 { 10, "r10" },
2606 { 11, "r11" },
2607 { 12, "r12" },
2608 { 13, "r13" },
2609 { 14, "r14" },
2610 { 15, "r15" },
2611 { 16, "r16" },
2612 { 17, "r17" },
2613 { 18, "r18" },
2614 { 19, "r19" },
2615 { 20, "r20" },
2616 { 21, "r21" },
2617 { 22, "r22" },
2618 { 23, "r23" },
2619 { 24, "r24" },
2620 { 25, "r25" },
2621 { 26, "r26" },
2622 { 27, "r27" },
2623 { 28, "r28" },
2624 { 29, "gp" },
2625 { 30, "fp" },
2626 { 31, "zero" },
2627 { 32, "fp0" },
2628 { 33, "fp" },
2629 { 34, "fp2" },
2630 { 35, "fp3" },
2631 { 36, "fp4" },
2632 { 37, "fp5" },
2633 { 38, "fp6" },
2634 { 39, "fp7" },
2635 { 40, "fp8" },
2636 { 41, "fp9" },
2637 { 42, "fp10" },
2638 { 43, "fp11" },
2639 { 44, "fp12" },
2640 { 45, "fp13" },
2641 { 46, "fp14" },
2642 { 47, "fp15" },
2643 { 48, "fp16" },
2644 { 49, "fp17" },
2645 { 50, "fp18" },
2646 { 51, "fp19" },
2647 { 52, "fp20" },
2648 { 53, "fp21" },
2649 { 54, "fp22" },
2650 { 55, "fp23" },
2651 { 56, "fp24" },
2652 { 57, "fp25" },
2653 { 58, "fp26" },
2654 { 59, "fp27" },
2655 { 60, "fp28" },
2656 { 61, "fp29" },
2657 { 62, "fp30" },
2658 { 63, "fp31" },
2659 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002660# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002661 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2662 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2663 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2664 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2665 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2666 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2667 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2668 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2669 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2670 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2671 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2672 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2673 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2674 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2675 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2676 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2677 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2678 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2679 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2680 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2681 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2682 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2683 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2684 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2685 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2686 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2687 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2688 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2689 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2690 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2691 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2692 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2693 /* switch stack: */
2694 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2695 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2696 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2697 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2698 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2699 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2700 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2701 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2702 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2703 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002704 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2705 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002706 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002707 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002708 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2709 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002710 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2711 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2712 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2713 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2714 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2715 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2716 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2717 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2718 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2719 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2720 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2721 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2722 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2723 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2724 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002725# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002726 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002727# endif
2728# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002729 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002730# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002731 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002732# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002733 { 4*EBX, "4*EBX" },
2734 { 4*ECX, "4*ECX" },
2735 { 4*EDX, "4*EDX" },
2736 { 4*ESI, "4*ESI" },
2737 { 4*EDI, "4*EDI" },
2738 { 4*EBP, "4*EBP" },
2739 { 4*EAX, "4*EAX" },
2740 { 4*DS, "4*DS" },
2741 { 4*ES, "4*ES" },
2742 { 4*FS, "4*FS" },
2743 { 4*GS, "4*GS" },
2744 { 4*ORIG_EAX, "4*ORIG_EAX" },
2745 { 4*EIP, "4*EIP" },
2746 { 4*CS, "4*CS" },
2747 { 4*EFL, "4*EFL" },
2748 { 4*UESP, "4*UESP" },
2749 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002750# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002751 { 8*R15, "8*R15" },
2752 { 8*R14, "8*R14" },
2753 { 8*R13, "8*R13" },
2754 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002755 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002756 { 8*RBX, "8*RBX" },
2757 { 8*R11, "8*R11" },
2758 { 8*R10, "8*R10" },
2759 { 8*R9, "8*R9" },
2760 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002761 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002762 { 8*RCX, "8*RCX" },
2763 { 8*RDX, "8*RDX" },
2764 { 8*RSI, "8*RSI" },
2765 { 8*RDI, "8*RDI" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002766# if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002767 { DS, "DS" },
2768 { ES, "ES" },
2769 { FS, "FS" },
2770 { GS, "GS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002771# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002772 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002773 { 8*RIP, "8*RIP" },
2774 { 8*CS, "8*CS" },
2775 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002776 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002777 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002778# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002779 { 4*PT_D1, "4*PT_D1" },
2780 { 4*PT_D2, "4*PT_D2" },
2781 { 4*PT_D3, "4*PT_D3" },
2782 { 4*PT_D4, "4*PT_D4" },
2783 { 4*PT_D5, "4*PT_D5" },
2784 { 4*PT_D6, "4*PT_D6" },
2785 { 4*PT_D7, "4*PT_D7" },
2786 { 4*PT_A0, "4*PT_A0" },
2787 { 4*PT_A1, "4*PT_A1" },
2788 { 4*PT_A2, "4*PT_A2" },
2789 { 4*PT_A3, "4*PT_A3" },
2790 { 4*PT_A4, "4*PT_A4" },
2791 { 4*PT_A5, "4*PT_A5" },
2792 { 4*PT_A6, "4*PT_A6" },
2793 { 4*PT_D0, "4*PT_D0" },
2794 { 4*PT_USP, "4*PT_USP" },
2795 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2796 { 4*PT_SR, "4*PT_SR" },
2797 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002798# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002799 { 4*REG_REG0, "4*REG_REG0" },
2800 { 4*(REG_REG0+1), "4*REG_REG1" },
2801 { 4*(REG_REG0+2), "4*REG_REG2" },
2802 { 4*(REG_REG0+3), "4*REG_REG3" },
2803 { 4*(REG_REG0+4), "4*REG_REG4" },
2804 { 4*(REG_REG0+5), "4*REG_REG5" },
2805 { 4*(REG_REG0+6), "4*REG_REG6" },
2806 { 4*(REG_REG0+7), "4*REG_REG7" },
2807 { 4*(REG_REG0+8), "4*REG_REG8" },
2808 { 4*(REG_REG0+9), "4*REG_REG9" },
2809 { 4*(REG_REG0+10), "4*REG_REG10" },
2810 { 4*(REG_REG0+11), "4*REG_REG11" },
2811 { 4*(REG_REG0+12), "4*REG_REG12" },
2812 { 4*(REG_REG0+13), "4*REG_REG13" },
2813 { 4*(REG_REG0+14), "4*REG_REG14" },
2814 { 4*REG_REG15, "4*REG_REG15" },
2815 { 4*REG_PC, "4*REG_PC" },
2816 { 4*REG_PR, "4*REG_PR" },
2817 { 4*REG_SR, "4*REG_SR" },
2818 { 4*REG_GBR, "4*REG_GBR" },
2819 { 4*REG_MACH, "4*REG_MACH" },
2820 { 4*REG_MACL, "4*REG_MACL" },
2821 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2822 { 4*REG_FPUL, "4*REG_FPUL" },
2823 { 4*REG_FPREG0, "4*REG_FPREG0" },
2824 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2825 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2826 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2827 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2828 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2829 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2830 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2831 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2832 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2833 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2834 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2835 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2836 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2837 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2838 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002839# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002840 { 4*REG_XDREG0, "4*REG_XDREG0" },
2841 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2842 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2843 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2844 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2845 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2846 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2847 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002848# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002849 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002850# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002851 { 0, "PC(L)" },
2852 { 4, "PC(U)" },
2853 { 8, "SR(L)" },
2854 { 12, "SR(U)" },
2855 { 16, "syscall no.(L)" },
2856 { 20, "syscall_no.(U)" },
2857 { 24, "R0(L)" },
2858 { 28, "R0(U)" },
2859 { 32, "R1(L)" },
2860 { 36, "R1(U)" },
2861 { 40, "R2(L)" },
2862 { 44, "R2(U)" },
2863 { 48, "R3(L)" },
2864 { 52, "R3(U)" },
2865 { 56, "R4(L)" },
2866 { 60, "R4(U)" },
2867 { 64, "R5(L)" },
2868 { 68, "R5(U)" },
2869 { 72, "R6(L)" },
2870 { 76, "R6(U)" },
2871 { 80, "R7(L)" },
2872 { 84, "R7(U)" },
2873 { 88, "R8(L)" },
2874 { 92, "R8(U)" },
2875 { 96, "R9(L)" },
2876 { 100, "R9(U)" },
2877 { 104, "R10(L)" },
2878 { 108, "R10(U)" },
2879 { 112, "R11(L)" },
2880 { 116, "R11(U)" },
2881 { 120, "R12(L)" },
2882 { 124, "R12(U)" },
2883 { 128, "R13(L)" },
2884 { 132, "R13(U)" },
2885 { 136, "R14(L)" },
2886 { 140, "R14(U)" },
2887 { 144, "R15(L)" },
2888 { 148, "R15(U)" },
2889 { 152, "R16(L)" },
2890 { 156, "R16(U)" },
2891 { 160, "R17(L)" },
2892 { 164, "R17(U)" },
2893 { 168, "R18(L)" },
2894 { 172, "R18(U)" },
2895 { 176, "R19(L)" },
2896 { 180, "R19(U)" },
2897 { 184, "R20(L)" },
2898 { 188, "R20(U)" },
2899 { 192, "R21(L)" },
2900 { 196, "R21(U)" },
2901 { 200, "R22(L)" },
2902 { 204, "R22(U)" },
2903 { 208, "R23(L)" },
2904 { 212, "R23(U)" },
2905 { 216, "R24(L)" },
2906 { 220, "R24(U)" },
2907 { 224, "R25(L)" },
2908 { 228, "R25(U)" },
2909 { 232, "R26(L)" },
2910 { 236, "R26(U)" },
2911 { 240, "R27(L)" },
2912 { 244, "R27(U)" },
2913 { 248, "R28(L)" },
2914 { 252, "R28(U)" },
2915 { 256, "R29(L)" },
2916 { 260, "R29(U)" },
2917 { 264, "R30(L)" },
2918 { 268, "R30(U)" },
2919 { 272, "R31(L)" },
2920 { 276, "R31(U)" },
2921 { 280, "R32(L)" },
2922 { 284, "R32(U)" },
2923 { 288, "R33(L)" },
2924 { 292, "R33(U)" },
2925 { 296, "R34(L)" },
2926 { 300, "R34(U)" },
2927 { 304, "R35(L)" },
2928 { 308, "R35(U)" },
2929 { 312, "R36(L)" },
2930 { 316, "R36(U)" },
2931 { 320, "R37(L)" },
2932 { 324, "R37(U)" },
2933 { 328, "R38(L)" },
2934 { 332, "R38(U)" },
2935 { 336, "R39(L)" },
2936 { 340, "R39(U)" },
2937 { 344, "R40(L)" },
2938 { 348, "R40(U)" },
2939 { 352, "R41(L)" },
2940 { 356, "R41(U)" },
2941 { 360, "R42(L)" },
2942 { 364, "R42(U)" },
2943 { 368, "R43(L)" },
2944 { 372, "R43(U)" },
2945 { 376, "R44(L)" },
2946 { 380, "R44(U)" },
2947 { 384, "R45(L)" },
2948 { 388, "R45(U)" },
2949 { 392, "R46(L)" },
2950 { 396, "R46(U)" },
2951 { 400, "R47(L)" },
2952 { 404, "R47(U)" },
2953 { 408, "R48(L)" },
2954 { 412, "R48(U)" },
2955 { 416, "R49(L)" },
2956 { 420, "R49(U)" },
2957 { 424, "R50(L)" },
2958 { 428, "R50(U)" },
2959 { 432, "R51(L)" },
2960 { 436, "R51(U)" },
2961 { 440, "R52(L)" },
2962 { 444, "R52(U)" },
2963 { 448, "R53(L)" },
2964 { 452, "R53(U)" },
2965 { 456, "R54(L)" },
2966 { 460, "R54(U)" },
2967 { 464, "R55(L)" },
2968 { 468, "R55(U)" },
2969 { 472, "R56(L)" },
2970 { 476, "R56(U)" },
2971 { 480, "R57(L)" },
2972 { 484, "R57(U)" },
2973 { 488, "R58(L)" },
2974 { 492, "R58(U)" },
2975 { 496, "R59(L)" },
2976 { 500, "R59(U)" },
2977 { 504, "R60(L)" },
2978 { 508, "R60(U)" },
2979 { 512, "R61(L)" },
2980 { 516, "R61(U)" },
2981 { 520, "R62(L)" },
2982 { 524, "R62(U)" },
2983 { 528, "TR0(L)" },
2984 { 532, "TR0(U)" },
2985 { 536, "TR1(L)" },
2986 { 540, "TR1(U)" },
2987 { 544, "TR2(L)" },
2988 { 548, "TR2(U)" },
2989 { 552, "TR3(L)" },
2990 { 556, "TR3(U)" },
2991 { 560, "TR4(L)" },
2992 { 564, "TR4(U)" },
2993 { 568, "TR5(L)" },
2994 { 572, "TR5(U)" },
2995 { 576, "TR6(L)" },
2996 { 580, "TR6(U)" },
2997 { 584, "TR7(L)" },
2998 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002999 /* This entry is in case pt_regs contains dregs (depends on
3000 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00003001 { uoff(regs), "offsetof(struct user, regs)" },
3002 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003003# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00003004 { uoff(regs.ARM_r0), "r0" },
3005 { uoff(regs.ARM_r1), "r1" },
3006 { uoff(regs.ARM_r2), "r2" },
3007 { uoff(regs.ARM_r3), "r3" },
3008 { uoff(regs.ARM_r4), "r4" },
3009 { uoff(regs.ARM_r5), "r5" },
3010 { uoff(regs.ARM_r6), "r6" },
3011 { uoff(regs.ARM_r7), "r7" },
3012 { uoff(regs.ARM_r8), "r8" },
3013 { uoff(regs.ARM_r9), "r9" },
3014 { uoff(regs.ARM_r10), "r10" },
3015 { uoff(regs.ARM_fp), "fp" },
3016 { uoff(regs.ARM_ip), "ip" },
3017 { uoff(regs.ARM_sp), "sp" },
3018 { uoff(regs.ARM_lr), "lr" },
3019 { uoff(regs.ARM_pc), "pc" },
3020 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003021# elif defined(AVR32)
3022 { uoff(regs.sr), "sr" },
3023 { uoff(regs.pc), "pc" },
3024 { uoff(regs.lr), "lr" },
3025 { uoff(regs.sp), "sp" },
3026 { uoff(regs.r12), "r12" },
3027 { uoff(regs.r11), "r11" },
3028 { uoff(regs.r10), "r10" },
3029 { uoff(regs.r9), "r9" },
3030 { uoff(regs.r8), "r8" },
3031 { uoff(regs.r7), "r7" },
3032 { uoff(regs.r6), "r6" },
3033 { uoff(regs.r5), "r5" },
3034 { uoff(regs.r4), "r4" },
3035 { uoff(regs.r3), "r3" },
3036 { uoff(regs.r2), "r2" },
3037 { uoff(regs.r1), "r1" },
3038 { uoff(regs.r0), "r0" },
3039 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003040# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00003041 { 0, "r0" },
3042 { 1, "r1" },
3043 { 2, "r2" },
3044 { 3, "r3" },
3045 { 4, "r4" },
3046 { 5, "r5" },
3047 { 6, "r6" },
3048 { 7, "r7" },
3049 { 8, "r8" },
3050 { 9, "r9" },
3051 { 10, "r10" },
3052 { 11, "r11" },
3053 { 12, "r12" },
3054 { 13, "r13" },
3055 { 14, "r14" },
3056 { 15, "r15" },
3057 { 16, "r16" },
3058 { 17, "r17" },
3059 { 18, "r18" },
3060 { 19, "r19" },
3061 { 20, "r20" },
3062 { 21, "r21" },
3063 { 22, "r22" },
3064 { 23, "r23" },
3065 { 24, "r24" },
3066 { 25, "r25" },
3067 { 26, "r26" },
3068 { 27, "r27" },
3069 { 28, "r28" },
3070 { 29, "r29" },
3071 { 30, "r30" },
3072 { 31, "r31" },
3073 { 32, "f0" },
3074 { 33, "f1" },
3075 { 34, "f2" },
3076 { 35, "f3" },
3077 { 36, "f4" },
3078 { 37, "f5" },
3079 { 38, "f6" },
3080 { 39, "f7" },
3081 { 40, "f8" },
3082 { 41, "f9" },
3083 { 42, "f10" },
3084 { 43, "f11" },
3085 { 44, "f12" },
3086 { 45, "f13" },
3087 { 46, "f14" },
3088 { 47, "f15" },
3089 { 48, "f16" },
3090 { 49, "f17" },
3091 { 50, "f18" },
3092 { 51, "f19" },
3093 { 52, "f20" },
3094 { 53, "f21" },
3095 { 54, "f22" },
3096 { 55, "f23" },
3097 { 56, "f24" },
3098 { 57, "f25" },
3099 { 58, "f26" },
3100 { 59, "f27" },
3101 { 60, "f28" },
3102 { 61, "f29" },
3103 { 62, "f30" },
3104 { 63, "f31" },
3105 { 64, "pc" },
3106 { 65, "cause" },
3107 { 66, "badvaddr" },
3108 { 67, "mmhi" },
3109 { 68, "mmlo" },
3110 { 69, "fpcsr" },
3111 { 70, "fpeir" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003112# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003113# ifdef CRISV10
3114 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3115 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3116 { 4*PT_R13, "4*PT_R13" },
3117 { 4*PT_R12, "4*PT_R12" },
3118 { 4*PT_R11, "4*PT_R11" },
3119 { 4*PT_R10, "4*PT_R10" },
3120 { 4*PT_R9, "4*PT_R9" },
3121 { 4*PT_R8, "4*PT_R8" },
3122 { 4*PT_R7, "4*PT_R7" },
3123 { 4*PT_R6, "4*PT_R6" },
3124 { 4*PT_R5, "4*PT_R5" },
3125 { 4*PT_R4, "4*PT_R4" },
3126 { 4*PT_R3, "4*PT_R3" },
3127 { 4*PT_R2, "4*PT_R2" },
3128 { 4*PT_R1, "4*PT_R1" },
3129 { 4*PT_R0, "4*PT_R0" },
3130 { 4*PT_MOF, "4*PT_MOF" },
3131 { 4*PT_DCCR, "4*PT_DCCR" },
3132 { 4*PT_SRP, "4*PT_SRP" },
3133 { 4*PT_IRP, "4*PT_IRP" },
3134 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3135 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3136 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3137 { 4*PT_USP, "4*PT_USP" },
3138# endif
3139# ifdef CRISV32
3140 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3141 { 4*PT_R0, "4*PT_R0" },
3142 { 4*PT_R1, "4*PT_R1" },
3143 { 4*PT_R2, "4*PT_R2" },
3144 { 4*PT_R3, "4*PT_R3" },
3145 { 4*PT_R4, "4*PT_R4" },
3146 { 4*PT_R5, "4*PT_R5" },
3147 { 4*PT_R6, "4*PT_R6" },
3148 { 4*PT_R7, "4*PT_R7" },
3149 { 4*PT_R8, "4*PT_R8" },
3150 { 4*PT_R9, "4*PT_R9" },
3151 { 4*PT_R10, "4*PT_R10" },
3152 { 4*PT_R11, "4*PT_R11" },
3153 { 4*PT_R12, "4*PT_R12" },
3154 { 4*PT_R13, "4*PT_R13" },
3155 { 4*PT_ACR, "4*PT_ACR" },
3156 { 4*PT_SRS, "4*PT_SRS" },
3157 { 4*PT_MOF, "4*PT_MOF" },
3158 { 4*PT_SPC, "4*PT_SPC" },
3159 { 4*PT_CCS, "4*PT_CCS" },
3160 { 4*PT_SRP, "4*PT_SRP" },
3161 { 4*PT_ERP, "4*PT_ERP" },
3162 { 4*PT_EXS, "4*PT_EXS" },
3163 { 4*PT_EDA, "4*PT_EDA" },
3164 { 4*PT_USP, "4*PT_USP" },
3165 { 4*PT_PPC, "4*PT_PPC" },
3166 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3167 { 4*PT_BP+4, "4*PT_BP+4" },
3168 { 4*PT_BP+8, "4*PT_BP+8" },
3169 { 4*PT_BP+12, "4*PT_BP+12" },
3170 { 4*PT_BP+16, "4*PT_BP+16" },
3171 { 4*PT_BP+20, "4*PT_BP+20" },
3172 { 4*PT_BP+24, "4*PT_BP+24" },
3173 { 4*PT_BP+28, "4*PT_BP+28" },
3174 { 4*PT_BP+32, "4*PT_BP+32" },
3175 { 4*PT_BP+36, "4*PT_BP+36" },
3176 { 4*PT_BP+40, "4*PT_BP+40" },
3177 { 4*PT_BP+44, "4*PT_BP+44" },
3178 { 4*PT_BP+48, "4*PT_BP+48" },
3179 { 4*PT_BP+52, "4*PT_BP+52" },
3180 { 4*PT_BP+56, "4*PT_BP+56" },
3181# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003182
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003183# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3184 && !defined(ALPHA) && !defined(IA64) \
3185 && !defined(CRISV10) && !defined(CRISV32)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003186# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003187 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003188# endif
3189# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003190 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003191# endif
3192# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003193 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003194# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003195 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3196 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3197 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003198# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003199 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003200# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003201# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003202 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003203# endif
3204# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003205 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003206# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003207 { uoff(signal), "offsetof(struct user, signal)" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003208# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003209 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003210# endif
3211# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003212 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003213# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003214# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003215 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003216# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003217 { uoff(magic), "offsetof(struct user, magic)" },
3218 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003219# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003220 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003221# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003222# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003223
3224# endif /* LINUX */
3225
3226# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003227 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3228 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3229 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3230 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3231 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3232 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3233 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3234 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3235 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3236 { uoff(u_error), "offsetof(struct user, u_error)" },
3237 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3238 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3239 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3240 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3241 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3242 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3243 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3244 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3245 { uoff(u_code), "offsetof(struct user, u_code)" },
3246 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3247 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3248 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3249 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3250 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3251 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3252 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3253 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3254 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3255 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3256 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3257 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3258 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3259 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3260 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3261 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3262 { uoff(u_start), "offsetof(struct user, u_start)" },
3263 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3264 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3265 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3266 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3267 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3268 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3269 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3270 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3271 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003272# endif /* SUNOS4 */
3273# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003274 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003275# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003276 { 0, NULL },
3277};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003278# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003279
3280int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003281sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003282{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003283 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003284 long addr;
3285
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003286 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003287 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003288# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003289 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003290# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003291 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003292# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003293 );
3294 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003295 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003296# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003297 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3298 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3299 for (x = struct_user_offsets; x->str; x++) {
3300 if (x->val >= addr)
3301 break;
3302 }
3303 if (!x->str)
3304 tprintf("%#lx, ", addr);
3305 else if (x->val > addr && x != struct_user_offsets) {
3306 x--;
3307 tprintf("%s + %ld, ", x->str, addr - x->val);
3308 }
3309 else
3310 tprintf("%s, ", x->str);
3311 }
3312 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003313# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003314 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003315# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003316 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003317# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003318 case PTRACE_PEEKDATA:
3319 case PTRACE_PEEKTEXT:
3320 case PTRACE_PEEKUSER:
3321 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003322# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003323 case PTRACE_CONT:
3324 case PTRACE_SINGLESTEP:
3325 case PTRACE_SYSCALL:
3326 case PTRACE_DETACH:
3327 printsignal(tcp->u_arg[3]);
3328 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003329# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003330 case PTRACE_SETOPTIONS:
3331 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3332 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003333# endif
3334# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003335 case PTRACE_SETSIGINFO: {
3336 siginfo_t si;
3337 if (!tcp->u_arg[3])
3338 tprintf("NULL");
3339 else if (syserror(tcp))
3340 tprintf("%#lx", tcp->u_arg[3]);
3341 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3342 tprintf("{???}");
3343 else
3344 printsiginfo(&si, verbose(tcp));
3345 break;
3346 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003347# endif
3348# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003349 case PTRACE_GETSIGINFO:
3350 /* Don't print anything, do it at syscall return. */
3351 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003352# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003353 default:
3354 tprintf("%#lx", tcp->u_arg[3]);
3355 break;
3356 }
3357 } else {
3358 switch (tcp->u_arg[0]) {
3359 case PTRACE_PEEKDATA:
3360 case PTRACE_PEEKTEXT:
3361 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003362# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003363 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003364# else
Roland McGratheb285352003-01-14 09:59:00 +00003365 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003366 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003367# endif
3368# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003369 case PTRACE_GETSIGINFO: {
3370 siginfo_t si;
3371 if (!tcp->u_arg[3])
3372 tprintf("NULL");
3373 else if (syserror(tcp))
3374 tprintf("%#lx", tcp->u_arg[3]);
3375 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3376 tprintf("{???}");
3377 else
3378 printsiginfo(&si, verbose(tcp));
3379 break;
3380 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003381# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003382 }
3383 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003384# endif /* LINUX */
3385# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003386 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3387 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3388 tprintf("%lu, ", tcp->u_arg[3]);
3389 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3390 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3391 tcp->u_arg[0] != PTRACE_READTEXT) {
3392 tprintf("%#lx", tcp->u_arg[3]);
3393 }
3394 } else {
3395 if (tcp->u_arg[0] == PTRACE_READDATA ||
3396 tcp->u_arg[0] == PTRACE_READTEXT) {
3397 tprintf("%lu, ", tcp->u_arg[3]);
3398 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3399 }
3400 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003401# endif /* SUNOS4 */
3402# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003403 tprintf("%lu", tcp->u_arg[3]);
3404 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003405# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003406 return 0;
3407}
3408
3409#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003410
3411#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003412# ifndef FUTEX_CMP_REQUEUE
3413# define FUTEX_CMP_REQUEUE 4
3414# endif
3415# ifndef FUTEX_WAKE_OP
3416# define FUTEX_WAKE_OP 5
3417# endif
3418# ifndef FUTEX_LOCK_PI
3419# define FUTEX_LOCK_PI 6
3420# define FUTEX_UNLOCK_PI 7
3421# define FUTEX_TRYLOCK_PI 8
3422# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003423# ifndef FUTEX_WAIT_BITSET
3424# define FUTEX_WAIT_BITSET 9
3425# endif
3426# ifndef FUTEX_WAKE_BITSET
3427# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003428# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003429# ifndef FUTEX_WAIT_REQUEUE_PI
3430# define FUTEX_WAIT_REQUEUE_PI 11
3431# endif
3432# ifndef FUTEX_CMP_REQUEUE_PI
3433# define FUTEX_CMP_REQUEUE_PI 12
3434# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003435# ifndef FUTEX_PRIVATE_FLAG
3436# define FUTEX_PRIVATE_FLAG 128
3437# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003438# ifndef FUTEX_CLOCK_REALTIME
3439# define FUTEX_CLOCK_REALTIME 256
3440# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003441static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003442 { FUTEX_WAIT, "FUTEX_WAIT" },
3443 { FUTEX_WAKE, "FUTEX_WAKE" },
3444 { FUTEX_FD, "FUTEX_FD" },
3445 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3446 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3447 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3448 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3449 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3450 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003451 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3452 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003453 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3454 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003455 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3456 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3457 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3458 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3459 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3460 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3461 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3462 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3463 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003464 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3465 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003466 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3467 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3468 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3469 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3470 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3471 { 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 +00003472 { 0, NULL }
3473};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003474# ifndef FUTEX_OP_SET
3475# define FUTEX_OP_SET 0
3476# define FUTEX_OP_ADD 1
3477# define FUTEX_OP_OR 2
3478# define FUTEX_OP_ANDN 3
3479# define FUTEX_OP_XOR 4
3480# define FUTEX_OP_CMP_EQ 0
3481# define FUTEX_OP_CMP_NE 1
3482# define FUTEX_OP_CMP_LT 2
3483# define FUTEX_OP_CMP_LE 3
3484# define FUTEX_OP_CMP_GT 4
3485# define FUTEX_OP_CMP_GE 5
3486# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003487static const struct xlat futexwakeops[] = {
3488 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3489 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3490 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3491 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3492 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3493 { 0, NULL }
3494};
3495static const struct xlat futexwakecmps[] = {
3496 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3497 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3498 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3499 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3500 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3501 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3502 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003503};
3504
3505int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003506sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003507{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003508 if (entering(tcp)) {
3509 long int cmd = tcp->u_arg[1] & 127;
3510 tprintf("%p, ", (void *) tcp->u_arg[0]);
3511 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3512 tprintf(", %ld", tcp->u_arg[2]);
3513 if (cmd == FUTEX_WAKE_BITSET)
3514 tprintf(", %lx", tcp->u_arg[5]);
3515 else if (cmd == FUTEX_WAIT) {
3516 tprintf(", ");
3517 printtv(tcp, tcp->u_arg[3]);
3518 } else if (cmd == FUTEX_WAIT_BITSET) {
3519 tprintf(", ");
3520 printtv(tcp, tcp->u_arg[3]);
3521 tprintf(", %lx", tcp->u_arg[5]);
3522 } else if (cmd == FUTEX_REQUEUE)
3523 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003524 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003525 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3526 else if (cmd == FUTEX_WAKE_OP) {
3527 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3528 if ((tcp->u_arg[5] >> 28) & 8)
3529 tprintf("FUTEX_OP_OPARG_SHIFT|");
3530 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3531 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3532 if ((tcp->u_arg[5] >> 24) & 8)
3533 tprintf("FUTEX_OP_OPARG_SHIFT|");
3534 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3535 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003536 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3537 tprintf(", ");
3538 printtv(tcp, tcp->u_arg[3]);
3539 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003540 }
Roland McGrath51942a92007-07-05 18:59:11 +00003541 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003542 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003543}
3544
3545static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003546print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003547{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003548 int first = 1;
3549 tprintf(" {");
3550 while (len >= sizeof (unsigned long)) {
3551 unsigned long w;
3552 umove(tcp, list, &w);
3553 tprintf("%s %lx", first ? "" : ",", w);
3554 first = 0;
3555 len -= sizeof (unsigned long);
3556 list += sizeof(unsigned long);
3557 }
3558 tprintf(" }");
Roland McGrath5a223472002-12-15 23:58:26 +00003559}
3560
3561int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003562sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003563{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003564 if (entering(tcp)) {
3565 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3566 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3567 }
3568 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003569}
3570
3571int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003572sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003573{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003574 if (entering(tcp)) {
3575 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3576 } else {
3577 if (tcp->u_rval == -1)
3578 tprintf("%#lx", tcp->u_arg[2]);
3579 else
3580 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3581 }
3582 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003583}
Roland McGrath279d3782004-03-01 20:27:37 +00003584
Roland McGrathd9f816f2004-09-04 03:39:20 +00003585static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003586 { SCHED_OTHER, "SCHED_OTHER" },
3587 { SCHED_RR, "SCHED_RR" },
3588 { SCHED_FIFO, "SCHED_FIFO" },
3589 { 0, NULL }
3590};
3591
3592int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003593sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003594{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003595 if (entering(tcp)) {
3596 tprintf("%d", (int) tcp->u_arg[0]);
3597 } else if (! syserror(tcp)) {
3598 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3599 if (tcp->auxstr != NULL)
3600 return RVAL_STR;
3601 }
3602 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003603}
3604
3605int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003606sys_sched_setscheduler(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 tprintf("%d, ", (int) tcp->u_arg[0]);
3611 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3612 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3613 tprintf(", %#lx", tcp->u_arg[2]);
3614 else
3615 tprintf(", { %d }", p.__sched_priority);
3616 }
3617 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003618}
3619
3620int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003621sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003622{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003623 if (entering(tcp)) {
3624 tprintf("%d, ", (int) tcp->u_arg[0]);
3625 } else {
3626 struct sched_param p;
3627 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3628 tprintf("%#lx", tcp->u_arg[1]);
3629 else
3630 tprintf("{ %d }", p.__sched_priority);
3631 }
3632 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003633}
3634
3635int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003636sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003637{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003638 if (entering(tcp)) {
3639 struct sched_param p;
3640 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3641 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3642 else
3643 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3644 }
3645 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003646}
3647
3648int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003649sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003650{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003651 if (entering(tcp)) {
3652 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3653 }
3654 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003655}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003656
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003657# ifdef X86_64
3658# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003659
3660static const struct xlat archvals[] = {
3661 { ARCH_SET_GS, "ARCH_SET_GS" },
3662 { ARCH_SET_FS, "ARCH_SET_FS" },
3663 { ARCH_GET_FS, "ARCH_GET_FS" },
3664 { ARCH_GET_GS, "ARCH_GET_GS" },
3665 { 0, NULL },
3666};
3667
3668int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003669sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003670{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003671 if (entering(tcp)) {
3672 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3673 if (tcp->u_arg[0] == ARCH_SET_GS
3674 || tcp->u_arg[0] == ARCH_SET_FS
3675 ) {
3676 tprintf(", %#lx", tcp->u_arg[1]);
3677 }
3678 } else {
3679 if (tcp->u_arg[0] == ARCH_GET_GS
3680 || tcp->u_arg[0] == ARCH_GET_FS
3681 ) {
3682 long int v;
3683 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3684 tprintf(", [%#lx]", v);
3685 else
3686 tprintf(", %#lx", tcp->u_arg[1]);
3687 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003688 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003689 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003690}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003691# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003692
Roland McGrathdb8319f2007-08-02 01:37:55 +00003693
3694int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003695sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003696{
3697 if (exiting(tcp)) {
3698 unsigned u;
3699 if (tcp->u_arg[0] == 0)
3700 tprintf("NULL, ");
3701 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3702 tprintf("%#lx, ", tcp->u_arg[0]);
3703 else
3704 tprintf("[%u], ", u);
3705 if (tcp->u_arg[1] == 0)
3706 tprintf("NULL, ");
3707 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3708 tprintf("%#lx, ", tcp->u_arg[1]);
3709 else
3710 tprintf("[%u], ", u);
3711 tprintf("%#lx", tcp->u_arg[2]);
3712 }
3713 return 0;
3714}
3715
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003716#endif /* LINUX */