blob: c16e93f4291b0adb3644513fe71ff4e971eb7b53 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Linux for s390 port by D.J. Barrow
8 * <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
Wichert Akkermanccef6372002-05-01 16:39:22 +00009 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
11
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000012 *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000013 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 */
39
40#include "defs.h"
41
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <sys/time.h>
45#include <sys/wait.h>
46#include <sys/resource.h>
47#include <sys/utsname.h>
48#include <sys/user.h>
49#include <sys/syscall.h>
50#include <signal.h>
51#ifdef SUNOS4
52#include <machine/reg.h>
53#endif /* SUNOS4 */
54
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000055#ifdef FREEBSD
56#include <sys/ptrace.h>
57#endif
58
Wichert Akkerman36915a11999-07-13 15:45:02 +000059#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000060# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000061#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000062# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000063#endif
64#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000065# define PTRACE_POKEUSR PTRACE_POKEUSER
66#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000067#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000068
Roland McGrath5bd7cf82003-01-24 04:31:18 +000069#ifdef HAVE_LINUX_PTRACE_H
70#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000071# ifdef HAVE_STRUCT_IA64_FPREG
72# define ia64_fpreg XXX_ia64_fpreg
73# endif
74# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
75# define pt_all_user_regs XXX_pt_all_user_regs
76# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000077#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000078# undef ia64_fpreg
79# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000080#endif
81
Roland McGrath6d1a65c2004-07-12 07:44:08 +000082#if defined (LINUX) && defined (SPARC64)
83# define r_pc r_tpc
84# undef PTRACE_GETREGS
85# define PTRACE_GETREGS PTRACE_GETREGS64
86# undef PTRACE_SETREGS
87# define PTRACE_SETREGS PTRACE_SETREGS64
88#endif /* LINUX && SPARC64 */
89
Roland McGrath5a223472002-12-15 23:58:26 +000090#ifdef HAVE_LINUX_FUTEX_H
Dmitry V. Levine5e60852009-12-31 22:50:49 +000091# include <linux/futex.h>
Roland McGrath5a223472002-12-15 23:58:26 +000092#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +000093#ifdef LINUX
Roland McGrath5a223472002-12-15 23:58:26 +000094# ifndef FUTEX_WAIT
95# define FUTEX_WAIT 0
96# endif
97# ifndef FUTEX_WAKE
98# define FUTEX_WAKE 1
99# endif
100# ifndef FUTEX_FD
101# define FUTEX_FD 2
102# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000103# ifndef FUTEX_REQUEUE
104# define FUTEX_REQUEUE 3
105# endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000106#endif /* LINUX */
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000107
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000108#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000109#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000110#include <asm/posix_types.h>
111#undef GETGROUPS_T
112#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000113#undef GETGROUPS32_T
114#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000115#endif /* LINUX */
116
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000117#if defined(LINUX) && defined(IA64)
118# include <asm/ptrace_offsets.h>
119# include <asm/rse.h>
120#endif
121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef HAVE_PRCTL
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000123# include <sys/prctl.h>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000124
Roland McGrathd9f816f2004-09-04 03:39:20 +0000125static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000126#ifdef PR_MAXPROCS
127 { PR_MAXPROCS, "PR_MAXPROCS" },
128#endif
129#ifdef PR_ISBLOCKED
130 { PR_ISBLOCKED, "PR_ISBLOCKED" },
131#endif
132#ifdef PR_SETSTACKSIZE
133 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
134#endif
135#ifdef PR_GETSTACKSIZE
136 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
137#endif
138#ifdef PR_MAXPPROCS
139 { PR_MAXPPROCS, "PR_MAXPPROCS" },
140#endif
141#ifdef PR_UNBLKONEXEC
142 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
143#endif
144#ifdef PR_ATOMICSIM
145 { PR_ATOMICSIM, "PR_ATOMICSIM" },
146#endif
147#ifdef PR_SETEXITSIG
148 { PR_SETEXITSIG, "PR_SETEXITSIG" },
149#endif
150#ifdef PR_RESIDENT
151 { PR_RESIDENT, "PR_RESIDENT" },
152#endif
153#ifdef PR_ATTACHADDR
154 { PR_ATTACHADDR, "PR_ATTACHADDR" },
155#endif
156#ifdef PR_DETACHADDR
157 { PR_DETACHADDR, "PR_DETACHADDR" },
158#endif
159#ifdef PR_TERMCHILD
160 { PR_TERMCHILD, "PR_TERMCHILD" },
161#endif
162#ifdef PR_GETSHMASK
163 { PR_GETSHMASK, "PR_GETSHMASK" },
164#endif
165#ifdef PR_GETNSHARE
166 { PR_GETNSHARE, "PR_GETNSHARE" },
167#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000168#ifdef PR_COREPID
169 { PR_COREPID, "PR_COREPID" },
170#endif
171#ifdef PR_ATTACHADDRPERM
172 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
173#endif
174#ifdef PR_PTHREADEXIT
175 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
176#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000177#ifdef PR_SET_PDEATHSIG
178 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
179#endif
180#ifdef PR_GET_PDEATHSIG
181 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
182#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000183#ifdef PR_GET_DUMPABLE
184 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
185#endif
186#ifdef PR_SET_DUMPABLE
187 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
188#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000189#ifdef PR_GET_UNALIGN
190 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
191#endif
192#ifdef PR_SET_UNALIGN
193 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
194#endif
195#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000196 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000197#endif
198#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000199 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000200#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000201#ifdef PR_GET_FPEMU
202 { PR_GET_FPEMU, "PR_GET_FPEMU" },
203#endif
204#ifdef PR_SET_FPEMU
205 { PR_SET_FPEMU, "PR_SET_FPEMU" },
206#endif
207#ifdef PR_GET_FPEXC
208 { PR_GET_FPEXC, "PR_GET_FPEXC" },
209#endif
210#ifdef PR_SET_FPEXC
211 { PR_SET_FPEXC, "PR_SET_FPEXC" },
212#endif
213#ifdef PR_GET_TIMING
214 { PR_GET_TIMING, "PR_GET_TIMING" },
215#endif
216#ifdef PR_SET_TIMING
217 { PR_SET_TIMING, "PR_SET_TIMING" },
218#endif
219#ifdef PR_SET_NAME
220 { PR_SET_NAME, "PR_SET_NAME" },
221#endif
222#ifdef PR_GET_NAME
223 { PR_GET_NAME, "PR_GET_NAME" },
224#endif
225#ifdef PR_GET_ENDIAN
226 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
227#endif
228#ifdef PR_SET_ENDIAN
229 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
230#endif
231#ifdef PR_GET_SECCOMP
232 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
233#endif
234#ifdef PR_SET_SECCOMP
235 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
236#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000237#ifdef PR_GET_TSC
238 { PR_GET_TSC, "PR_GET_TSC" },
239#endif
240#ifdef PR_SET_TSC
241 { PR_SET_TSC, "PR_SET_TSC" },
242#endif
243#ifdef PR_GET_SECUREBITS
244 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
245#endif
246#ifdef PR_SET_SECUREBITS
247 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
248#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000249 { 0, NULL },
250};
251
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000252
Roland McGratha4d48532005-06-08 20:45:28 +0000253static const char *
Denys Vlasenko12014262011-05-30 14:00:14 +0200254unalignctl_string(unsigned int ctl)
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000255{
256 static char buf[16];
257
258 switch (ctl) {
259#ifdef PR_UNALIGN_NOPRINT
260 case PR_UNALIGN_NOPRINT:
261 return "NOPRINT";
262#endif
263#ifdef PR_UNALIGN_SIGBUS
264 case PR_UNALIGN_SIGBUS:
265 return "SIGBUS";
266#endif
267 default:
268 break;
269 }
270 sprintf(buf, "%x", ctl);
271 return buf;
272}
273
274
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000275int
Denys Vlasenko12014262011-05-30 14:00:14 +0200276sys_prctl(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000277{
278 int i;
279
280 if (entering(tcp)) {
281 printxval(prctl_options, tcp->u_arg[0], "PR_???");
282 switch (tcp->u_arg[0]) {
283#ifdef PR_GETNSHARE
284 case PR_GETNSHARE:
285 break;
286#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000287#ifdef PR_SET_PDEATHSIG
288 case PR_SET_PDEATHSIG:
289 tprintf(", %lu", tcp->u_arg[1]);
290 break;
291#endif
292#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000293 case PR_GET_PDEATHSIG:
294 break;
295#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000296#ifdef PR_SET_DUMPABLE
297 case PR_SET_DUMPABLE:
298 tprintf(", %lu", tcp->u_arg[1]);
299 break;
300#endif
301#ifdef PR_GET_DUMPABLE
302 case PR_GET_DUMPABLE:
303 break;
304#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000305#ifdef PR_SET_UNALIGN
306 case PR_SET_UNALIGN:
307 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
308 break;
309#endif
310#ifdef PR_GET_UNALIGN
311 case PR_GET_UNALIGN:
312 tprintf(", %#lx", tcp->u_arg[1]);
313 break;
314#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000315#ifdef PR_SET_KEEPCAPS
316 case PR_SET_KEEPCAPS:
317 tprintf(", %lu", tcp->u_arg[1]);
318 break;
319#endif
320#ifdef PR_GET_KEEPCAPS
321 case PR_GET_KEEPCAPS:
322 break;
323#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000324 default:
325 for (i = 1; i < tcp->u_nargs; i++)
326 tprintf(", %#lx", tcp->u_arg[i]);
327 break;
328 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000329 } else {
330 switch (tcp->u_arg[0]) {
331#ifdef PR_GET_PDEATHSIG
332 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000333 if (umove(tcp, tcp->u_arg[1], &i) < 0)
334 tprintf(", %#lx", tcp->u_arg[1]);
335 else
336 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000337 break;
338#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000339#ifdef PR_GET_DUMPABLE
340 case PR_GET_DUMPABLE:
341 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000342#endif
343#ifdef PR_GET_UNALIGN
344 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000345 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
346 break;
347 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000348 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000349#endif
350#ifdef PR_GET_KEEPCAPS
351 case PR_GET_KEEPCAPS:
352 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000353#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000354 default:
355 break;
356 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000357 }
358 return 0;
359}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000360#endif /* HAVE_PRCTL */
361
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000362#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000363int
Denys Vlasenko12014262011-05-30 14:00:14 +0200364sys_gethostid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000365{
366 if (exiting(tcp))
367 return RVAL_HEX;
368 return 0;
369}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000370#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000371
372int
Denys Vlasenko12014262011-05-30 14:00:14 +0200373sys_sethostname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000374{
375 if (entering(tcp)) {
376 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
377 tprintf(", %lu", tcp->u_arg[1]);
378 }
379 return 0;
380}
381
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000382#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000383int
Denys Vlasenko12014262011-05-30 14:00:14 +0200384sys_gethostname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000385{
386 if (exiting(tcp)) {
387 if (syserror(tcp))
388 tprintf("%#lx", tcp->u_arg[0]);
389 else
390 printpath(tcp, tcp->u_arg[0]);
391 tprintf(", %lu", tcp->u_arg[1]);
392 }
393 return 0;
394}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000395#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000396
397int
Denys Vlasenko12014262011-05-30 14:00:14 +0200398sys_setdomainname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000399{
400 if (entering(tcp)) {
401 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
402 tprintf(", %lu", tcp->u_arg[1]);
403 }
404 return 0;
405}
406
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000407#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000408
409int
Denys Vlasenko12014262011-05-30 14:00:14 +0200410sys_getdomainname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000411{
412 if (exiting(tcp)) {
413 if (syserror(tcp))
414 tprintf("%#lx", tcp->u_arg[0]);
415 else
416 printpath(tcp, tcp->u_arg[0]);
417 tprintf(", %lu", tcp->u_arg[1]);
418 }
419 return 0;
420}
421#endif /* !LINUX */
422
423int
Denys Vlasenko12014262011-05-30 14:00:14 +0200424sys_exit(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000425{
426 if (exiting(tcp)) {
427 fprintf(stderr, "_exit returned!\n");
428 return -1;
429 }
430 /* special case: we stop tracing this process, finish line now */
431 tprintf("%ld) ", tcp->u_arg[0]);
432 tabto(acolumn);
433 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000434 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000435 return 0;
436}
437
438int
Dmitry V. Levinfde119c2011-02-18 23:16:20 +0000439internal_exit(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000440{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000441 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000442 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000443#ifdef __NR_exit_group
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000444 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000445 tcp->flags |= TCB_GROUP_EXITING;
446#endif
447 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000448 return 0;
449}
450
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000451#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000452
453int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000454sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000455{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000456 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000457 if (getrval2(tcp)) {
458 tcp->auxstr = "child process";
459 return RVAL_UDECIMAL | RVAL_STR;
460 }
461 }
462 return 0;
463}
464
John Hughes4e36a812001-04-18 15:11:51 +0000465#if UNIXWARE > 2
466
467int
Denys Vlasenko12014262011-05-30 14:00:14 +0200468sys_rfork(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +0000469{
470 if (entering(tcp)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200471 tprintf("%ld", tcp->u_arg[0]);
John Hughes4e36a812001-04-18 15:11:51 +0000472 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000473 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000474 if (getrval2(tcp)) {
475 tcp->auxstr = "child process";
476 return RVAL_UDECIMAL | RVAL_STR;
477 }
478 }
479 return 0;
480}
481
482#endif
483
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000484int
Denys Vlasenko12014262011-05-30 14:00:14 +0200485internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000486{
487 struct tcb *tcpchild;
488
489 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000490#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000491 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000492 return 0;
493#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000494 if (getrval2(tcp))
495 return 0;
496 if (!followfork)
497 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000498 if (syserror(tcp))
499 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000500 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000501 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000502 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000503 }
504 return 0;
505}
506
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000507#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000508
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000509#ifdef LINUX
510
511/* defines copied from linux/sched.h since we can't include that
512 * ourselves (it conflicts with *lots* of libc includes)
513 */
514#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
515#define CLONE_VM 0x00000100 /* set if VM shared between processes */
516#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
517#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
518#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000519#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000520#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
521#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
522#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000523#define CLONE_THREAD 0x00010000 /* Same thread group? */
524#define CLONE_NEWNS 0x00020000 /* New namespace group? */
525#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
526#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
527#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
528#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
Roland McGrath909875b2002-12-22 03:34:36 +0000529#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
530#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000531#define CLONE_STOPPED 0x02000000 /* Start in stopped state */
532#define CLONE_NEWUTS 0x04000000 /* New utsname group? */
533#define CLONE_NEWIPC 0x08000000 /* New ipcs */
534#define CLONE_NEWUSER 0x10000000 /* New user namespace */
535#define CLONE_NEWPID 0x20000000 /* New pid namespace */
536#define CLONE_NEWNET 0x40000000 /* New network namespace */
537#define CLONE_IO 0x80000000 /* Clone io context */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000538
Roland McGrathd9f816f2004-09-04 03:39:20 +0000539static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000540 { CLONE_VM, "CLONE_VM" },
541 { CLONE_FS, "CLONE_FS" },
542 { CLONE_FILES, "CLONE_FILES" },
543 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000544 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000545 { CLONE_PTRACE, "CLONE_PTRACE" },
546 { CLONE_VFORK, "CLONE_VFORK" },
547 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000548 { CLONE_THREAD, "CLONE_THREAD" },
549 { CLONE_NEWNS, "CLONE_NEWNS" },
550 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
551 { CLONE_SETTLS, "CLONE_SETTLS" },
552 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
553 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
Roland McGrath909875b2002-12-22 03:34:36 +0000554 { CLONE_UNTRACED, "CLONE_UNTRACED" },
555 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Dmitry V. Levine3d4b682010-12-03 17:19:51 +0000556 { CLONE_STOPPED, "CLONE_STOPPED" },
557 { CLONE_NEWUTS, "CLONE_NEWUTS" },
558 { CLONE_NEWIPC, "CLONE_NEWIPC" },
559 { CLONE_NEWUSER, "CLONE_NEWUSER" },
560 { CLONE_NEWPID, "CLONE_NEWPID" },
561 { CLONE_NEWNET, "CLONE_NEWNET" },
562 { CLONE_IO, "CLONE_IO" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000563 { 0, NULL },
564};
565
Roland McGrath909875b2002-12-22 03:34:36 +0000566# ifdef I386
567# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000568# ifdef HAVE_STRUCT_USER_DESC
569# define modify_ldt_ldt_s user_desc
570# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000571extern void print_ldt_entry();
572# endif
573
Roland McGrath9677b3a2003-03-12 09:54:36 +0000574# if defined IA64
575# define ARG_FLAGS 0
576# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000577# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
578# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
579# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
580# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000581# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000582# define ARG_STACK 0
583# define ARG_FLAGS 1
584# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000585# define ARG_CTID 3
586# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000587# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000588# define ARG_FLAGS 0
589# define ARG_STACK 1
590# define ARG_PTID 2
591# define ARG_CTID 3
592# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000593# else
594# define ARG_FLAGS 0
595# define ARG_STACK 1
596# define ARG_PTID 2
597# define ARG_TLS 3
598# define ARG_CTID 4
599# endif
600
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000601int
Denys Vlasenko12014262011-05-30 14:00:14 +0200602sys_clone(struct tcb *tcp)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000603{
604 if (exiting(tcp)) {
Wang Chaocbdd1902010-09-02 15:08:59 +0800605 const char *sep = "|";
Roland McGrath9677b3a2003-03-12 09:54:36 +0000606 unsigned long flags = tcp->u_arg[ARG_FLAGS];
607 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
608# ifdef ARG_STACKSIZE
609 if (ARG_STACKSIZE != -1)
610 tprintf("stack_size=%#lx, ",
611 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000612# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000613 tprintf("flags=");
Wang Chaocbdd1902010-09-02 15:08:59 +0800614 if (!printflags(clone_flags, flags &~ CSIGNAL, NULL))
615 sep = "";
Roland McGrath984154d2003-05-23 01:08:42 +0000616 if ((flags & CSIGNAL) != 0)
Wang Chaocbdd1902010-09-02 15:08:59 +0800617 tprintf("%s%s", sep, signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000618 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000619 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000620 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000621 if (flags & CLONE_PARENT_SETTID)
622 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000623 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000624# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000625 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000626 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000627 tprintf(", {entry_number:%d, ",
628 copy.entry_number);
629 if (!verbose(tcp))
630 tprintf("...}");
631 else
632 print_ldt_entry(&copy);
633 }
634 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000635# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000636 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000637 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000638 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
639 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000640 }
641 return 0;
642}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000643
644int
645sys_unshare(struct tcb *tcp)
646{
647 if (entering(tcp))
648 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
649 return 0;
650}
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000651#endif /* LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000652
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000653int
Denys Vlasenko12014262011-05-30 14:00:14 +0200654sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000655{
656 if (exiting(tcp))
657 return RVAL_UDECIMAL;
658 return 0;
659}
660
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000661int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000662change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000663{
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000664#ifdef LINUX
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000665#if defined(I386)
666 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000667 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000668 return -1;
669 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000670#elif defined(X86_64)
671 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000672 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000673 return -1;
674 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000675#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000676 if (ptrace(PTRACE_POKEUSER, tcp->pid,
677 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000678 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000679 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000680#elif defined(S390) || defined(S390X)
681 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200682 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000683 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000684 return 0;
685#elif defined(M68K)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200686 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000687 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000688 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000689#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400690 struct pt_regs regs;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200691 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0) < 0)
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000692 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400693 regs.u_regs[U_REG_G1] = new;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200694 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000695 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000696 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000697#elif defined(MIPS)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200698 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000699 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000700 return 0;
701#elif defined(ALPHA)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200702 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000703 return -1;
704 return 0;
705#elif defined(AVR32)
706 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
707 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000708 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000709#elif defined(BFIN)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200710 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new) < 0)
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000711 return -1;
712 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000713#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000714 if (ia32) {
715 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000716 case 2:
717 break; /* x86 SYS_fork */
718 case SYS_clone:
719 new = 120;
720 break;
721 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000722 fprintf(stderr, "%s: unexpected syscall %d\n",
723 __FUNCTION__, new);
724 return -1;
725 }
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200726 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0)
Roland McGrath08267b82004-02-20 22:56:43 +0000727 return -1;
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200728 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new) < 0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000729 return -1;
730 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000731#elif defined(HPPA)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200732 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000733 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000734 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000735#elif defined(SH)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200736 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000737 return -1;
738 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000739#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000740 /* Top half of reg encodes the no. of args n as 0x1n.
741 Assume 0 args as kernel never actually checks... */
742 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
743 0x100000 | new) < 0)
744 return -1;
745 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000746#elif defined(CRISV10) || defined(CRISV32)
747 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
748 return -1;
749 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000750#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000751 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000752# ifndef PTRACE_SET_SYSCALL
753# define PTRACE_SET_SYSCALL 23
754# endif
755
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200756 if (ptrace(PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000757 return -1;
758
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000759 return 0;
Chris Metcalfc8c66982009-12-28 10:00:15 -0500760#elif defined(TILE)
761 if (ptrace(PTRACE_POKEUSER, tcp->pid,
762 (char*)PTREGS_OFFSET_REG(0),
763 new) != 0)
764 return -1;
765 return 0;
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200766#elif defined(MICROBLAZE)
Denys Vlasenkob63256e2011-06-07 12:13:24 +0200767 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0)
Edgar E. Iglesias939caba2010-07-06 14:21:07 +0200768 return -1;
769 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000770#else
771#warning Do not know how to handle change_syscall for this architecture
772#endif /* architecture */
773#endif /* LINUX */
774 return -1;
775}
776
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000777#ifdef LINUX
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000778int
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800779handle_new_child(struct tcb *tcp, int pid, int bpt)
780{
781 struct tcb *tcpchild;
782
783#ifdef CLONE_PTRACE /* See new setbpt code. */
784 tcpchild = pid2tcb(pid);
785 if (tcpchild != NULL) {
786 /* The child already reported its startup trap
787 before the parent reported its syscall return. */
788 if ((tcpchild->flags
789 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
790 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
791 fprintf(stderr, "\
792[preattached child %d of %d in weird state!]\n",
793 pid, tcp->pid);
794 }
795 else
796#endif /* CLONE_PTRACE */
797 {
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800798 tcpchild = alloctcb(pid);
799 }
800
801#ifndef CLONE_PTRACE
802 /* Attach to the new child */
803 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
804 if (bpt)
805 clearbpt(tcp);
806 perror("PTRACE_ATTACH");
807 fprintf(stderr, "Too late?\n");
808 droptcb(tcpchild);
809 return 0;
810 }
811#endif /* !CLONE_PTRACE */
812
813 if (bpt)
814 clearbpt(tcp);
815
816 tcpchild->flags |= TCB_ATTACHED;
817 /* Child has BPT too, must be removed on first occasion. */
818 if (bpt) {
819 tcpchild->flags |= TCB_BPTSET;
820 tcpchild->baddr = tcp->baddr;
821 memcpy(tcpchild->inst, tcp->inst,
822 sizeof tcpchild->inst);
823 }
824 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800825 if (tcpchild->flags & TCB_SUSPENDED) {
826 /* The child was born suspended, due to our having
827 forced CLONE_PTRACE. */
828 if (bpt)
829 clearbpt(tcpchild);
830
831 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
832 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
833 return -1;
834
835 if (!qflag)
836 fprintf(stderr, "\
837Process %u resumed (parent %d ready)\n",
838 pid, tcp->pid);
839 }
840 else {
841 if (!qflag)
842 fprintf(stderr, "Process %d attached\n", pid);
843 }
844
845#ifdef TCB_CLONE_THREAD
Denys Vlasenko7b609d52011-06-22 14:32:43 +0200846 if (sysent[tcp->scno].sys_func == sys_clone) {
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800847 /*
848 * Save the flags used in this call,
849 * in case we point TCP to our parent below.
850 */
851 int call_flags = tcp->u_arg[ARG_FLAGS];
852 if ((tcp->flags & TCB_CLONE_THREAD) &&
853 tcp->parent != NULL) {
854 /* The parent in this clone is itself a
855 thread belonging to another process.
856 There is no meaning to the parentage
857 relationship of the new child with the
858 thread, only with the process. We
859 associate the new thread with our
860 parent. Since this is done for every
861 new thread, there will never be a
862 TCB_CLONE_THREAD process that has
863 children. */
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800864 tcp = tcp->parent;
865 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800866 }
867 if (call_flags & CLONE_THREAD) {
868 tcpchild->flags |= TCB_CLONE_THREAD;
869 ++tcp->nclone_threads;
870 }
871 if ((call_flags & CLONE_PARENT) &&
872 !(call_flags & CLONE_THREAD)) {
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800873 tcpchild->parent = NULL;
874 if (tcp->parent != NULL) {
875 tcp = tcp->parent;
876 tcpchild->parent = tcp;
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800877 }
878 }
879 }
880#endif /* TCB_CLONE_THREAD */
881 return 0;
882}
883
884int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000885internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000886{
Denys Vlasenkof44cce42011-06-21 14:34:10 +0200887 if ((ptrace_setoptions
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800888 & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
889 == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
890 return 0;
891
Denys Vlasenko65d7c4d2011-06-23 21:46:37 +0200892 if (!followfork)
893 return 0;
894
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000895 if (entering(tcp)) {
Wang Chaoe636c852010-09-16 11:20:56 +0800896 /*
897 * In occasion of using PTRACE_O_TRACECLONE, we won't see the
898 * new child if clone is called with flag CLONE_UNTRACED, so
899 * we keep the same logic with that option and don't trace it.
900 */
901 if ((sysent[tcp->scno].sys_func == sys_clone) &&
902 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
903 return 0;
Denys Vlasenkoe7c90242011-06-22 00:09:25 +0200904 setbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000905 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000906 int pid;
907 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700908
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000909 bpt = tcp->flags & TCB_BPTSET;
910
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000911 if (syserror(tcp)) {
912 if (bpt)
913 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000914 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000915 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000916
917 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000918
Wang Chaoca8ab8d2010-11-12 17:26:08 +0800919 return handle_new_child(tcp, pid, bpt);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000920 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000921 return 0;
922}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000923
924#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000925
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000926int
Denys Vlasenko12014262011-05-30 14:00:14 +0200927internal_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000928{
929 struct tcb *tcpchild;
930 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700931 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000932
933#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000934 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000935 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000936 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700937 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000938 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000939#endif
Denys Vlasenko65d7c4d2011-06-23 21:46:37 +0200940
941 if (!followfork)
942 return 0;
943
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000944 if (entering(tcp)) {
Denys Vlasenko65d7c4d2011-06-23 21:46:37 +0200945 if (dont_follow)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700946 return 0;
Denys Vlasenkoe7c90242011-06-22 00:09:25 +0200947 setbpt(tcp);
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000948 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000949 else {
950 int bpt = tcp->flags & TCB_BPTSET;
951
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000952 if (bpt)
953 clearbpt(tcp);
954
955 if (syserror(tcp))
956 return 0;
957
958 pid = tcp->u_rval;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000959 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000960#ifdef SUNOS4
961#ifdef oldway
962 /* The child must have run before it can be attached. */
963 {
964 struct timeval tv;
965 tv.tv_sec = 0;
966 tv.tv_usec = 10000;
967 select(0, NULL, NULL, NULL, &tv);
968 }
969 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
970 perror("PTRACE_ATTACH");
971 fprintf(stderr, "Too late?\n");
972 droptcb(tcpchild);
973 return 0;
974 }
975#else /* !oldway */
976 /* Try to catch the new process as soon as possible. */
977 {
978 int i;
979 for (i = 0; i < 1024; i++)
980 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
981 break;
982 if (i == 1024) {
983 perror("PTRACE_ATTACH");
984 fprintf(stderr, "Too late?\n");
985 droptcb(tcpchild);
986 return 0;
987 }
988 }
989#endif /* !oldway */
990#endif /* SUNOS4 */
991 tcpchild->flags |= TCB_ATTACHED;
992 /* Child has BPT too, must be removed on first occasion */
993 if (bpt) {
994 tcpchild->flags |= TCB_BPTSET;
995 tcpchild->baddr = tcp->baddr;
996 memcpy(tcpchild->inst, tcp->inst,
997 sizeof tcpchild->inst);
998 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000999 tcpchild->parent = tcp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001000 if (!qflag)
1001 fprintf(stderr, "Process %d attached\n", pid);
1002 }
1003 return 0;
1004}
1005
Dmitry V. Levin257e1572009-12-26 17:55:24 +00001006#endif /* !LINUX */
1007
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001008#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001009
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001010#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001011
1012int
Denys Vlasenko12014262011-05-30 14:00:14 +02001013sys_vfork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001014{
1015 if (exiting(tcp))
1016 return RVAL_UDECIMAL;
1017 return 0;
1018}
1019
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001020#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001021
1022#ifndef LINUX
1023
1024static char idstr[16];
1025
1026int
Denys Vlasenko12014262011-05-30 14:00:14 +02001027sys_getpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001028{
1029 if (exiting(tcp)) {
1030 sprintf(idstr, "ppid %lu", getrval2(tcp));
1031 tcp->auxstr = idstr;
1032 return RVAL_STR;
1033 }
1034 return 0;
1035}
1036
1037int
Denys Vlasenko12014262011-05-30 14:00:14 +02001038sys_getuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001039{
1040 if (exiting(tcp)) {
1041 sprintf(idstr, "euid %lu", getrval2(tcp));
1042 tcp->auxstr = idstr;
1043 return RVAL_STR;
1044 }
1045 return 0;
1046}
1047
1048int
Denys Vlasenko12014262011-05-30 14:00:14 +02001049sys_getgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001050{
1051 if (exiting(tcp)) {
1052 sprintf(idstr, "egid %lu", getrval2(tcp));
1053 tcp->auxstr = idstr;
1054 return RVAL_STR;
1055 }
1056 return 0;
1057}
1058
1059#endif /* !LINUX */
1060
1061#ifdef LINUX
1062
Dmitry V. Levin50a218d2011-01-18 17:36:20 +00001063int sys_getuid(struct tcb *tcp)
1064{
1065 if (exiting(tcp))
1066 tcp->u_rval = (uid_t) tcp->u_rval;
1067 return RVAL_UDECIMAL;
1068}
1069
1070int sys_setfsuid(struct tcb *tcp)
1071{
1072 if (entering(tcp))
1073 tprintf("%u", (uid_t) tcp->u_arg[0]);
1074 else
1075 tcp->u_rval = (uid_t) tcp->u_rval;
1076 return RVAL_UDECIMAL;
1077}
1078
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001079int
Denys Vlasenko12014262011-05-30 14:00:14 +02001080sys_setuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001081{
1082 if (entering(tcp)) {
1083 tprintf("%u", (uid_t) tcp->u_arg[0]);
1084 }
1085 return 0;
1086}
1087
1088int
Denys Vlasenko12014262011-05-30 14:00:14 +02001089sys_setgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001090{
1091 if (entering(tcp)) {
1092 tprintf("%u", (gid_t) tcp->u_arg[0]);
1093 }
1094 return 0;
1095}
1096
1097int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001098sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001099{
1100 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001101 __kernel_uid_t uid;
1102 if (syserror(tcp))
1103 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1104 tcp->u_arg[1], tcp->u_arg[2]);
1105 else {
1106 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1107 tprintf("%#lx, ", tcp->u_arg[0]);
1108 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001109 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001110 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1111 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001112 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001113 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001114 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1115 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001116 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001117 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001118 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001119 }
1120 return 0;
1121}
1122
1123int
Denys Vlasenko12014262011-05-30 14:00:14 +02001124sys_getresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001125{
1126 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001127 __kernel_gid_t gid;
1128 if (syserror(tcp))
1129 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1130 tcp->u_arg[1], tcp->u_arg[2]);
1131 else {
1132 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1133 tprintf("%#lx, ", tcp->u_arg[0]);
1134 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001135 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001136 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1137 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001138 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001139 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001140 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1141 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001142 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001143 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001144 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001145 }
1146 return 0;
1147}
1148
1149#endif /* LINUX */
1150
1151int
Denys Vlasenko12014262011-05-30 14:00:14 +02001152sys_setreuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001153{
1154 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001155 printuid("", tcp->u_arg[0]);
1156 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001157 }
1158 return 0;
1159}
1160
1161int
Denys Vlasenko12014262011-05-30 14:00:14 +02001162sys_setregid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001163{
1164 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001165 printuid("", tcp->u_arg[0]);
1166 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001167 }
1168 return 0;
1169}
1170
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001171#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001172int
Denys Vlasenko12014262011-05-30 14:00:14 +02001173sys_setresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001174{
1175 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001176 printuid("", tcp->u_arg[0]);
1177 printuid(", ", tcp->u_arg[1]);
1178 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001179 }
1180 return 0;
1181}
1182int
Denys Vlasenko12014262011-05-30 14:00:14 +02001183sys_setresgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001184{
1185 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001186 printuid("", tcp->u_arg[0]);
1187 printuid(", ", tcp->u_arg[1]);
1188 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001189 }
1190 return 0;
1191}
1192
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001193#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001194
1195int
Denys Vlasenko12014262011-05-30 14:00:14 +02001196sys_setgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001197{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001198 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001199 unsigned long len, size, start, cur, end, abbrev_end;
1200 GETGROUPS_T gid;
1201 int failed = 0;
1202
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001203 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001204 tprintf("%lu, ", len);
1205 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001206 tprintf("[]");
1207 return 0;
1208 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001209 start = tcp->u_arg[1];
1210 if (start == 0) {
1211 tprintf("NULL");
1212 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001213 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001214 size = len * sizeof(gid);
1215 end = start + size;
1216 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1217 tprintf("%#lx", start);
1218 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001219 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001220 if (abbrev(tcp)) {
1221 abbrev_end = start + max_strlen * sizeof(gid);
1222 if (abbrev_end < start)
1223 abbrev_end = end;
1224 } else {
1225 abbrev_end = end;
1226 }
1227 tprintf("[");
1228 for (cur = start; cur < end; cur += sizeof(gid)) {
1229 if (cur > start)
1230 tprintf(", ");
1231 if (cur >= abbrev_end) {
1232 tprintf("...");
1233 break;
1234 }
1235 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1236 tprintf("?");
1237 failed = 1;
1238 break;
1239 }
1240 tprintf("%lu", (unsigned long) gid);
1241 }
1242 tprintf("]");
1243 if (failed)
1244 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001245 }
1246 return 0;
1247}
1248
1249int
Denys Vlasenko12014262011-05-30 14:00:14 +02001250sys_getgroups(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001251{
Roland McGrathaa524c82005-06-01 19:22:06 +00001252 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001253
1254 if (entering(tcp)) {
1255 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001256 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001257 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001258 unsigned long size, start, cur, end, abbrev_end;
1259 GETGROUPS_T gid;
1260 int failed = 0;
1261
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001262 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001263 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001264 tprintf("[]");
1265 return 0;
1266 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001267 start = tcp->u_arg[1];
1268 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001269 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001270 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001271 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001272 if (tcp->u_arg[0] == 0) {
1273 tprintf("%#lx", start);
1274 return 0;
1275 }
1276 size = len * sizeof(gid);
1277 end = start + size;
1278 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1279 size / sizeof(gid) != len || end < start) {
1280 tprintf("%#lx", start);
1281 return 0;
1282 }
1283 if (abbrev(tcp)) {
1284 abbrev_end = start + max_strlen * sizeof(gid);
1285 if (abbrev_end < start)
1286 abbrev_end = end;
1287 } else {
1288 abbrev_end = end;
1289 }
1290 tprintf("[");
1291 for (cur = start; cur < end; cur += sizeof(gid)) {
1292 if (cur > start)
1293 tprintf(", ");
1294 if (cur >= abbrev_end) {
1295 tprintf("...");
1296 break;
1297 }
1298 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1299 tprintf("?");
1300 failed = 1;
1301 break;
1302 }
1303 tprintf("%lu", (unsigned long) gid);
1304 }
1305 tprintf("]");
1306 if (failed)
1307 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001308 }
1309 return 0;
1310}
1311
Roland McGrath83bd47a2003-11-13 22:32:26 +00001312#ifdef LINUX
1313int
Denys Vlasenko12014262011-05-30 14:00:14 +02001314sys_setgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001315{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001316 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001317 unsigned long len, size, start, cur, end, abbrev_end;
1318 GETGROUPS32_T gid;
1319 int failed = 0;
1320
Roland McGrath83bd47a2003-11-13 22:32:26 +00001321 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001322 tprintf("%lu, ", len);
1323 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001324 tprintf("[]");
1325 return 0;
1326 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001327 start = tcp->u_arg[1];
1328 if (start == 0) {
1329 tprintf("NULL");
1330 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001331 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001332 size = len * sizeof(gid);
1333 end = start + size;
1334 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1335 tprintf("%#lx", start);
1336 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001337 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001338 if (abbrev(tcp)) {
1339 abbrev_end = start + max_strlen * sizeof(gid);
1340 if (abbrev_end < start)
1341 abbrev_end = end;
1342 } else {
1343 abbrev_end = end;
1344 }
1345 tprintf("[");
1346 for (cur = start; cur < end; cur += sizeof(gid)) {
1347 if (cur > start)
1348 tprintf(", ");
1349 if (cur >= abbrev_end) {
1350 tprintf("...");
1351 break;
1352 }
1353 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1354 tprintf("?");
1355 failed = 1;
1356 break;
1357 }
1358 tprintf("%lu", (unsigned long) gid);
1359 }
1360 tprintf("]");
1361 if (failed)
1362 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001363 }
1364 return 0;
1365}
1366
1367int
Denys Vlasenko12014262011-05-30 14:00:14 +02001368sys_getgroups32(struct tcb *tcp)
Roland McGrath83bd47a2003-11-13 22:32:26 +00001369{
Roland McGrathaa524c82005-06-01 19:22:06 +00001370 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001371
1372 if (entering(tcp)) {
1373 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001374 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001375 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001376 unsigned long size, start, cur, end, abbrev_end;
1377 GETGROUPS32_T gid;
1378 int failed = 0;
1379
Roland McGrath83bd47a2003-11-13 22:32:26 +00001380 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001381 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001382 tprintf("[]");
1383 return 0;
1384 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001385 start = tcp->u_arg[1];
1386 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001387 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001388 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001389 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001390 size = len * sizeof(gid);
1391 end = start + size;
1392 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1393 size / sizeof(gid) != len || end < start) {
1394 tprintf("%#lx", start);
1395 return 0;
1396 }
1397 if (abbrev(tcp)) {
1398 abbrev_end = start + max_strlen * sizeof(gid);
1399 if (abbrev_end < start)
1400 abbrev_end = end;
1401 } else {
1402 abbrev_end = end;
1403 }
1404 tprintf("[");
1405 for (cur = start; cur < end; cur += sizeof(gid)) {
1406 if (cur > start)
1407 tprintf(", ");
1408 if (cur >= abbrev_end) {
1409 tprintf("...");
1410 break;
1411 }
1412 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1413 tprintf("?");
1414 failed = 1;
1415 break;
1416 }
1417 tprintf("%lu", (unsigned long) gid);
1418 }
1419 tprintf("]");
1420 if (failed)
1421 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001422 }
1423 return 0;
1424}
1425#endif /* LINUX */
1426
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001427#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001428int
Denys Vlasenko12014262011-05-30 14:00:14 +02001429sys_setpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001430{
1431 if (entering(tcp)) {
1432#ifndef SVR4
1433 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1434#endif /* !SVR4 */
1435 }
1436 return 0;
1437}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001438#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001439
1440int
Denys Vlasenko12014262011-05-30 14:00:14 +02001441sys_getpgrp(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001442{
1443 if (entering(tcp)) {
1444#ifndef SVR4
1445 tprintf("%lu", tcp->u_arg[0]);
1446#endif /* !SVR4 */
1447 }
1448 return 0;
1449}
1450
1451int
Denys Vlasenko12014262011-05-30 14:00:14 +02001452sys_getsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001453{
1454 if (entering(tcp)) {
1455 tprintf("%lu", tcp->u_arg[0]);
1456 }
1457 return 0;
1458}
1459
1460int
Denys Vlasenko12014262011-05-30 14:00:14 +02001461sys_setsid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001462{
1463 return 0;
1464}
1465
1466int
Denys Vlasenko12014262011-05-30 14:00:14 +02001467sys_getpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001468{
1469 if (entering(tcp)) {
1470 tprintf("%lu", tcp->u_arg[0]);
1471 }
1472 return 0;
1473}
1474
1475int
Denys Vlasenko12014262011-05-30 14:00:14 +02001476sys_setpgid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001477{
1478 if (entering(tcp)) {
1479 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1480 }
1481 return 0;
1482}
1483
John Hughesc61eb3d2002-05-17 11:37:50 +00001484#if UNIXWARE >= 2
1485
1486#include <sys/privilege.h>
1487
1488
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001489static const struct xlat procpriv_cmds[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001490 { SETPRV, "SETPRV" },
1491 { CLRPRV, "CLRPRV" },
1492 { PUTPRV, "PUTPRV" },
1493 { GETPRV, "GETPRV" },
1494 { CNTPRV, "CNTPRV" },
1495 { 0, NULL },
1496};
1497
1498
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001499static const struct xlat procpriv_priv[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001500 { P_OWNER, "P_OWNER" },
1501 { P_AUDIT, "P_AUDIT" },
1502 { P_COMPAT, "P_COMPAT" },
1503 { P_DACREAD, "P_DACREAD" },
1504 { P_DACWRITE, "P_DACWRITE" },
1505 { P_DEV, "P_DEV" },
1506 { P_FILESYS, "P_FILESYS" },
1507 { P_MACREAD, "P_MACREAD" },
1508 { P_MACWRITE, "P_MACWRITE" },
1509 { P_MOUNT, "P_MOUNT" },
1510 { P_MULTIDIR, "P_MULTIDIR" },
1511 { P_SETPLEVEL, "P_SETPLEVEL" },
1512 { P_SETSPRIV, "P_SETSPRIV" },
1513 { P_SETUID, "P_SETUID" },
1514 { P_SYSOPS, "P_SYSOPS" },
1515 { P_SETUPRIV, "P_SETUPRIV" },
1516 { P_DRIVER, "P_DRIVER" },
1517 { P_RTIME, "P_RTIME" },
1518 { P_MACUPGRADE, "P_MACUPGRADE" },
1519 { P_FSYSRANGE, "P_FSYSRANGE" },
1520 { P_SETFLEVEL, "P_SETFLEVEL" },
1521 { P_AUDITWR, "P_AUDITWR" },
1522 { P_TSHAR, "P_TSHAR" },
1523 { P_PLOCK, "P_PLOCK" },
1524 { P_CORE, "P_CORE" },
1525 { P_LOADMOD, "P_LOADMOD" },
1526 { P_BIND, "P_BIND" },
1527 { P_ALLPRIVS, "P_ALLPRIVS" },
1528 { 0, NULL },
1529};
1530
1531
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001532static const struct xlat procpriv_type[] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001533 { PS_FIX, "PS_FIX" },
1534 { PS_INH, "PS_INH" },
1535 { PS_MAX, "PS_MAX" },
1536 { PS_WKG, "PS_WKG" },
1537 { 0, NULL },
1538};
1539
1540
1541static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001542printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001543{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001544 priv_t buf[128];
Dmitry V. Levinfcda7a52011-06-13 21:58:43 +00001545 int max = verbose(tcp) ? ARRAY_SIZE(buf) : 10;
John Hughesc61eb3d2002-05-17 11:37:50 +00001546 int dots = len > max;
1547 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001548
John Hughesc61eb3d2002-05-17 11:37:50 +00001549 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001550
John Hughesc61eb3d2002-05-17 11:37:50 +00001551 if (len <= 0 ||
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001552 umoven(tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
John Hughesc61eb3d2002-05-17 11:37:50 +00001553 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001554 tprintf("%#lx", addr);
John Hughesc61eb3d2002-05-17 11:37:50 +00001555 return;
1556 }
1557
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001558 tprintf("[");
John Hughesc61eb3d2002-05-17 11:37:50 +00001559
1560 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001561 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001562
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001563 if (i) tprintf(", ");
John Hughesc61eb3d2002-05-17 11:37:50 +00001564
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001565 if ((t = xlookup(procpriv_type, buf[i] & PS_TYPE)) &&
1566 (p = xlookup(procpriv_priv, buf[i] & ~PS_TYPE)))
John Hughesc61eb3d2002-05-17 11:37:50 +00001567 {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001568 tprintf("%s|%s", t, p);
John Hughesc61eb3d2002-05-17 11:37:50 +00001569 }
1570 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001571 tprintf("%#lx", buf[i]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001572 }
1573 }
1574
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001575 if (dots) tprintf(" ...");
John Hughesc61eb3d2002-05-17 11:37:50 +00001576
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001577 tprintf("]");
John Hughesc61eb3d2002-05-17 11:37:50 +00001578}
1579
1580
1581int
Denys Vlasenko12014262011-05-30 14:00:14 +02001582sys_procpriv(struct tcb *tcp)
John Hughesc61eb3d2002-05-17 11:37:50 +00001583{
1584 if (entering(tcp)) {
1585 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1586 switch (tcp->u_arg[0]) {
1587 case CNTPRV:
1588 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1589 break;
1590
1591 case GETPRV:
1592 break;
1593
1594 default:
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001595 tprintf(", ");
1596 printpriv(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1597 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001598 }
1599 }
1600 else if (tcp->u_arg[0] == GETPRV) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001601 if (syserror(tcp)) {
John Hughesc61eb3d2002-05-17 11:37:50 +00001602 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1603 }
1604 else {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001605 tprintf(", ");
1606 printpriv(tcp, tcp->u_arg[1], tcp->u_rval);
1607 tprintf(", %ld", tcp->u_arg[2]);
John Hughesc61eb3d2002-05-17 11:37:50 +00001608 }
1609 }
Roland McGrath5a223472002-12-15 23:58:26 +00001610
John Hughesc61eb3d2002-05-17 11:37:50 +00001611 return 0;
1612}
1613
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001614#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001615
1616
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001617static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001618printargv(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001619{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001620 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001621 unsigned int p32;
1622 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001623 char data[sizeof(long)];
1624 } cp;
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001625 const char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001626 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001627
Roland McGrath85a3bc42007-08-02 02:13:05 +00001628 cp.p64 = 1;
1629 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1630 if (umoven(tcp, addr, personality_wordsize[current_personality],
1631 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001632 tprintf("%#lx", addr);
1633 return;
1634 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001635 if (personality_wordsize[current_personality] == 4)
1636 cp.p64 = cp.p32;
1637 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001638 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001639 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001640 printstr(tcp, cp.p64, -1);
1641 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001642 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001643 if (cp.p64)
1644 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001645}
1646
1647static void
Dmitry V. Levin30145dd2010-09-06 22:08:24 +00001648printargc(const char *fmt, struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001649{
1650 int count;
1651 char *cp;
1652
1653 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1654 addr += sizeof(char *);
1655 }
1656 tprintf(fmt, count, count == 1 ? "" : "s");
1657}
1658
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001659#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001660int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001661sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001662{
1663 if (entering(tcp)) {
1664 printpath(tcp, tcp->u_arg[0]);
1665 if (!verbose(tcp))
1666 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001667 else {
1668 tprintf(", [");
1669 printargv(tcp, tcp->u_arg[1]);
1670 tprintf("]");
1671 }
1672 }
1673 return 0;
1674}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001675#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001676
1677int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001678sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001679{
1680 if (entering(tcp)) {
1681 printpath(tcp, tcp->u_arg[0]);
1682 if (!verbose(tcp))
1683 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001684 else {
1685 tprintf(", [");
1686 printargv(tcp, tcp->u_arg[1]);
1687 tprintf("]");
1688 }
1689 if (!verbose(tcp))
1690 tprintf(", %#lx", tcp->u_arg[2]);
1691 else if (abbrev(tcp))
1692 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1693 else {
1694 tprintf(", [");
1695 printargv(tcp, tcp->u_arg[2]);
1696 tprintf("]");
1697 }
1698 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001699 return 0;
1700}
1701
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001702#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001703
Denys Vlasenko12014262011-05-30 14:00:14 +02001704int sys_rexecve(struct tcb *tcp)
John Hughes4e36a812001-04-18 15:11:51 +00001705{
Denys Vlasenkob63256e2011-06-07 12:13:24 +02001706 if (entering(tcp)) {
1707 sys_execve(tcp);
1708 tprintf(", %ld", tcp->u_arg[3]);
John Hughes4e36a812001-04-18 15:11:51 +00001709 }
1710 return 0;
1711}
1712
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001713#endif
John Hughes4e36a812001-04-18 15:11:51 +00001714
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001715int
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001716internal_exec(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001717{
1718#ifdef SUNOS4
1719 if (exiting(tcp) && !syserror(tcp) && followfork)
1720 fixvfork(tcp);
1721#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001722#if defined LINUX && defined TCB_WAITEXECVE
1723 if (exiting(tcp) && syserror(tcp))
1724 tcp->flags &= ~TCB_WAITEXECVE;
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001725 else {
1726 /* Maybe we have post-execve SIGTRAP suppressed? */
Denys Vlasenkof44cce42011-06-21 14:34:10 +02001727 if (!(ptrace_setoptions & PTRACE_O_TRACEEXEC))
Denys Vlasenkof8bc0652011-05-24 20:30:24 +02001728 tcp->flags |= TCB_WAITEXECVE; /* no */
1729 }
Roland McGrathfdb097f2004-07-12 07:38:55 +00001730#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001731 return 0;
1732}
1733
1734#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001735#ifndef __WNOTHREAD
1736#define __WNOTHREAD 0x20000000
1737#endif
1738#ifndef __WALL
1739#define __WALL 0x40000000
1740#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001741#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001742#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001743#endif
1744#endif /* LINUX */
1745
Roland McGrathd9f816f2004-09-04 03:39:20 +00001746static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001747 { WNOHANG, "WNOHANG" },
1748#ifndef WSTOPPED
1749 { WUNTRACED, "WUNTRACED" },
1750#endif
1751#ifdef WEXITED
1752 { WEXITED, "WEXITED" },
1753#endif
1754#ifdef WTRAPPED
1755 { WTRAPPED, "WTRAPPED" },
1756#endif
1757#ifdef WSTOPPED
1758 { WSTOPPED, "WSTOPPED" },
1759#endif
1760#ifdef WCONTINUED
1761 { WCONTINUED, "WCONTINUED" },
1762#endif
1763#ifdef WNOWAIT
1764 { WNOWAIT, "WNOWAIT" },
1765#endif
1766#ifdef __WCLONE
1767 { __WCLONE, "__WCLONE" },
1768#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001769#ifdef __WALL
1770 { __WALL, "__WALL" },
1771#endif
1772#ifdef __WNOTHREAD
1773 { __WNOTHREAD, "__WNOTHREAD" },
1774#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001775 { 0, NULL },
1776};
1777
Roland McGrath5e02a572004-10-19 23:33:47 +00001778#if !defined WCOREFLAG && defined WCOREFLG
1779# define WCOREFLAG WCOREFLG
1780#endif
1781#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001782# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001783#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001784#ifndef WCOREDUMP
1785# define WCOREDUMP(status) ((status) & 0200)
1786#endif
1787
Roland McGrath5e02a572004-10-19 23:33:47 +00001788
1789#ifndef W_STOPCODE
1790#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1791#endif
1792#ifndef W_EXITCODE
1793#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1794#endif
1795
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001796static int
Denys Vlasenko12014262011-05-30 14:00:14 +02001797printstatus(int status)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001798{
1799 int exited = 0;
1800
1801 /*
1802 * Here is a tricky presentation problem. This solution
1803 * is still not entirely satisfactory but since there
1804 * are no wait status constructors it will have to do.
1805 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001806 if (WIFSTOPPED(status)) {
1807 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001808 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001809 status &= ~W_STOPCODE(WSTOPSIG(status));
1810 }
1811 else if (WIFSIGNALED(status)) {
1812 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001813 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001814 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001815 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1816 }
1817 else if (WIFEXITED(status)) {
1818 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001819 WEXITSTATUS(status));
1820 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001821 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001822 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001823 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001824 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001825 return 0;
1826 }
1827
1828 if (status == 0)
1829 tprintf("]");
1830 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001831 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001832
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001833 return exited;
1834}
1835
1836static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001837printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001838{
1839 int status;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001840#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001841 int exited = 0;
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001842#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001843
1844 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001845#ifdef LINUX
1846 /* On Linux, kernel-side pid_t is typedef'ed to int
1847 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001848 * pid argument to int on 64bit arches, producing,
1849 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001850 * in strace. We have to use int here, not long.
1851 */
1852 int pid = tcp->u_arg[0];
1853 tprintf("%d, ", pid);
1854#else
1855 /*
1856 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001857 */
1858 long pid = tcp->u_arg[0];
1859 if (personality_wordsize[current_personality] < sizeof pid)
1860 pid = (long) (int) pid;
1861 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001862#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001863 } else {
1864 /* status */
1865 if (!tcp->u_arg[1])
1866 tprintf("NULL");
1867 else if (syserror(tcp) || tcp->u_rval == 0)
1868 tprintf("%#lx", tcp->u_arg[1]);
1869 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1870 tprintf("[?]");
1871 else
Dmitry V. Levind9a4b0a2011-02-23 00:27:12 +00001872#ifdef SUNOS4
1873 exited =
1874#endif
1875 printstatus(status);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001876 /* options */
1877 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001878 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001879 if (n == 4) {
1880 tprintf(", ");
1881 /* usage */
1882 if (!tcp->u_arg[3])
1883 tprintf("NULL");
1884#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001885 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001886#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001887 if (bitness)
1888 printrusage32(tcp, tcp->u_arg[3]);
1889 else
1890#endif
1891 printrusage(tcp, tcp->u_arg[3]);
1892 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001893#endif /* LINUX */
1894#ifdef SUNOS4
1895 else if (tcp->u_rval > 0 && exited)
1896 printrusage(tcp, tcp->u_arg[3]);
1897#endif /* SUNOS4 */
1898 else
1899 tprintf("%#lx", tcp->u_arg[3]);
1900 }
1901 }
1902 return 0;
1903}
1904
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001905#ifdef SVR4
1906
1907int
Denys Vlasenko12014262011-05-30 14:00:14 +02001908sys_wait(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001909{
1910 if (exiting(tcp)) {
1911 /* The library wrapper stuffs this into the user variable. */
1912 if (!syserror(tcp))
1913 printstatus(getrval2(tcp));
1914 }
1915 return 0;
1916}
1917
1918#endif /* SVR4 */
1919
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001920#ifdef FREEBSD
1921int
Denys Vlasenko12014262011-05-30 14:00:14 +02001922sys_wait(struct tcb *tcp)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001923{
1924 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00001925
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001926 if (exiting(tcp)) {
1927 if (!syserror(tcp)) {
1928 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1929 tprintf("%#lx", tcp->u_arg[0]);
1930 else
1931 printstatus(status);
1932 }
1933 }
1934 return 0;
1935}
1936#endif
1937
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001938int
Denys Vlasenko12014262011-05-30 14:00:14 +02001939sys_waitpid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001940{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001941 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001942}
1943
1944int
Denys Vlasenko12014262011-05-30 14:00:14 +02001945sys_wait4(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001946{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001947 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001948}
1949
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001950#ifdef ALPHA
1951int
Denys Vlasenko12014262011-05-30 14:00:14 +02001952sys_osf_wait4(struct tcb *tcp)
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001953{
1954 return printwaitn(tcp, 4, 1);
1955}
1956#endif
1957
Roland McGrathc74c0b72004-09-01 19:39:46 +00001958#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001959
Roland McGrathd9f816f2004-09-04 03:39:20 +00001960static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001961 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001962#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001963 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001964#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001965 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001966#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001967 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001968#endif
1969#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001970 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001971#endif
1972#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001973 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001974#endif
1975#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001976 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00001977#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001978 { P_ALL, "P_ALL" },
1979#ifdef P_LWPID
1980 { P_LWPID, "P_LWPID" },
1981#endif
1982 { 0, NULL },
1983};
1984
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001985int
Dmitry V. Levin3eb94912010-09-09 23:08:59 +00001986sys_waitid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001987{
1988 siginfo_t si;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001989
1990 if (entering(tcp)) {
1991 printxval(waitid_types, tcp->u_arg[0], "P_???");
1992 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001993 }
1994 else {
1995 /* siginfo */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001996 if (!tcp->u_arg[2])
1997 tprintf("NULL");
1998 else if (syserror(tcp))
1999 tprintf("%#lx", tcp->u_arg[2]);
2000 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2001 tprintf("{???}");
2002 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002003 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002004 /* options */
2005 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002006 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002007 if (tcp->u_nargs > 4) {
2008 /* usage */
2009 tprintf(", ");
2010 if (!tcp->u_arg[4])
2011 tprintf("NULL");
2012 else if (tcp->u_error)
2013 tprintf("%#lx", tcp->u_arg[4]);
2014 else
2015 printrusage(tcp, tcp->u_arg[4]);
2016 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002017 }
2018 return 0;
2019}
2020
Roland McGrathc74c0b72004-09-01 19:39:46 +00002021#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002022
2023int
Denys Vlasenko12014262011-05-30 14:00:14 +02002024sys_alarm(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002025{
2026 if (entering(tcp))
2027 tprintf("%lu", tcp->u_arg[0]);
2028 return 0;
2029}
2030
2031int
Denys Vlasenko12014262011-05-30 14:00:14 +02002032sys_uname(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002033{
2034 struct utsname uname;
2035
2036 if (exiting(tcp)) {
2037 if (syserror(tcp) || !verbose(tcp))
2038 tprintf("%#lx", tcp->u_arg[0]);
2039 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2040 tprintf("{...}");
2041 else if (!abbrev(tcp)) {
2042
2043 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2044 uname.sysname, uname.nodename);
2045 tprintf("release=\"%s\", version=\"%s\", ",
2046 uname.release, uname.version);
2047 tprintf("machine=\"%s\"", uname.machine);
2048#ifdef LINUX
2049#ifndef __GLIBC__
2050 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002051#endif
2052#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002053 tprintf("}");
2054 }
2055 else
2056 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2057 uname.sysname, uname.nodename);
2058 }
2059 return 0;
2060}
2061
2062#ifndef SVR4
2063
Roland McGratheb9e2e82009-06-02 16:49:22 -07002064static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002065# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002066 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2067 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2068 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2069 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2070 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2071 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2072 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2073 { PTRACE_CONT, "PTRACE_CONT" },
2074 { PTRACE_KILL, "PTRACE_KILL" },
2075 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2076 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2077 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002078# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002079 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002080# endif
2081# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002082 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002083# endif
2084# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002085 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002086# endif
2087# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002088 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002089# endif
2090# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002091 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002092# endif
2093# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002094 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002095# endif
2096# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002097 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002098# endif
2099# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002100 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002101# endif
2102# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002103 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002104# endif
2105# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002106 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002107# endif
2108# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002109 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002110# endif
2111# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002112 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002113# endif
Dmitry V. Levinbb668a52011-03-14 21:58:59 +00002114# ifdef PTRACE_GETREGSET
2115 { PTRACE_GETREGSET, "PTRACE_GETREGSET", },
2116# endif
2117# ifdef PTRACE_SETREGSET
2118 { PTRACE_SETREGSET, "PTRACE_SETREGSET", },
2119# endif
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002120# ifdef PTRACE_SET_SYSCALL
2121 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2122# endif
2123# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002124 { PTRACE_READDATA, "PTRACE_READDATA" },
2125 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2126 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2127 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2128 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2129 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002130# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002131 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2132 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002133# else /* !SPARC */
2134 { PTRACE_22, "PTRACE_22" },
2135 { PTRACE_23, "PTRACE_3" },
2136# endif /* !SPARC */
2137# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002138 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002139# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002140 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002141# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002142 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2143 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2144 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002145# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002146 { PTRACE_26, "PTRACE_26" },
2147 { PTRACE_27, "PTRACE_27" },
2148 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002149# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002150 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002151# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002152
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002153# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002154
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002155 { PT_TRACE_ME, "PT_TRACE_ME" },
2156 { PT_READ_I, "PT_READ_I" },
2157 { PT_READ_D, "PT_READ_D" },
2158 { PT_WRITE_I, "PT_WRITE_I" },
2159 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002160# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002161 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002162# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002163 { PT_CONTINUE, "PT_CONTINUE" },
2164 { PT_KILL, "PT_KILL" },
2165 { PT_STEP, "PT_STEP" },
2166 { PT_ATTACH, "PT_ATTACH" },
2167 { PT_DETACH, "PT_DETACH" },
2168 { PT_GETREGS, "PT_GETREGS" },
2169 { PT_SETREGS, "PT_SETREGS" },
2170 { PT_GETFPREGS, "PT_GETFPREGS" },
2171 { PT_SETFPREGS, "PT_SETFPREGS" },
2172 { PT_GETDBREGS, "PT_GETDBREGS" },
2173 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002174# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002175 { 0, NULL },
2176};
2177
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002178# ifndef FREEBSD
2179# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002180static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002181# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002182 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002183# endif
2184# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002185 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002186# endif
2187# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002188 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002189# endif
2190# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002191 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002192# endif
2193# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002194 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002195# endif
2196# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002197 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002198# endif
2199# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002200 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002201# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002202 { 0, NULL },
2203};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002204# endif /* PTRACE_SETOPTIONS */
2205# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002206
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002207# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002208const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002209# ifdef LINUX
2210# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002211 { PT_PSWMASK, "psw_mask" },
2212 { PT_PSWADDR, "psw_addr" },
2213 { PT_GPR0, "gpr0" },
2214 { PT_GPR1, "gpr1" },
2215 { PT_GPR2, "gpr2" },
2216 { PT_GPR3, "gpr3" },
2217 { PT_GPR4, "gpr4" },
2218 { PT_GPR5, "gpr5" },
2219 { PT_GPR6, "gpr6" },
2220 { PT_GPR7, "gpr7" },
2221 { PT_GPR8, "gpr8" },
2222 { PT_GPR9, "gpr9" },
2223 { PT_GPR10, "gpr10" },
2224 { PT_GPR11, "gpr11" },
2225 { PT_GPR12, "gpr12" },
2226 { PT_GPR13, "gpr13" },
2227 { PT_GPR14, "gpr14" },
2228 { PT_GPR15, "gpr15" },
2229 { PT_ACR0, "acr0" },
2230 { PT_ACR1, "acr1" },
2231 { PT_ACR2, "acr2" },
2232 { PT_ACR3, "acr3" },
2233 { PT_ACR4, "acr4" },
2234 { PT_ACR5, "acr5" },
2235 { PT_ACR6, "acr6" },
2236 { PT_ACR7, "acr7" },
2237 { PT_ACR8, "acr8" },
2238 { PT_ACR9, "acr9" },
2239 { PT_ACR10, "acr10" },
2240 { PT_ACR11, "acr11" },
2241 { PT_ACR12, "acr12" },
2242 { PT_ACR13, "acr13" },
2243 { PT_ACR14, "acr14" },
2244 { PT_ACR15, "acr15" },
2245 { PT_ORIGGPR2, "orig_gpr2" },
2246 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002247# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002248 { PT_FPR0_HI, "fpr0.hi" },
2249 { PT_FPR0_LO, "fpr0.lo" },
2250 { PT_FPR1_HI, "fpr1.hi" },
2251 { PT_FPR1_LO, "fpr1.lo" },
2252 { PT_FPR2_HI, "fpr2.hi" },
2253 { PT_FPR2_LO, "fpr2.lo" },
2254 { PT_FPR3_HI, "fpr3.hi" },
2255 { PT_FPR3_LO, "fpr3.lo" },
2256 { PT_FPR4_HI, "fpr4.hi" },
2257 { PT_FPR4_LO, "fpr4.lo" },
2258 { PT_FPR5_HI, "fpr5.hi" },
2259 { PT_FPR5_LO, "fpr5.lo" },
2260 { PT_FPR6_HI, "fpr6.hi" },
2261 { PT_FPR6_LO, "fpr6.lo" },
2262 { PT_FPR7_HI, "fpr7.hi" },
2263 { PT_FPR7_LO, "fpr7.lo" },
2264 { PT_FPR8_HI, "fpr8.hi" },
2265 { PT_FPR8_LO, "fpr8.lo" },
2266 { PT_FPR9_HI, "fpr9.hi" },
2267 { PT_FPR9_LO, "fpr9.lo" },
2268 { PT_FPR10_HI, "fpr10.hi" },
2269 { PT_FPR10_LO, "fpr10.lo" },
2270 { PT_FPR11_HI, "fpr11.hi" },
2271 { PT_FPR11_LO, "fpr11.lo" },
2272 { PT_FPR12_HI, "fpr12.hi" },
2273 { PT_FPR12_LO, "fpr12.lo" },
2274 { PT_FPR13_HI, "fpr13.hi" },
2275 { PT_FPR13_LO, "fpr13.lo" },
2276 { PT_FPR14_HI, "fpr14.hi" },
2277 { PT_FPR14_LO, "fpr14.lo" },
2278 { PT_FPR15_HI, "fpr15.hi" },
2279 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002280# endif
2281# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002282 { PT_FPR0, "fpr0" },
2283 { PT_FPR1, "fpr1" },
2284 { PT_FPR2, "fpr2" },
2285 { PT_FPR3, "fpr3" },
2286 { PT_FPR4, "fpr4" },
2287 { PT_FPR5, "fpr5" },
2288 { PT_FPR6, "fpr6" },
2289 { PT_FPR7, "fpr7" },
2290 { PT_FPR8, "fpr8" },
2291 { PT_FPR9, "fpr9" },
2292 { PT_FPR10, "fpr10" },
2293 { PT_FPR11, "fpr11" },
2294 { PT_FPR12, "fpr12" },
2295 { PT_FPR13, "fpr13" },
2296 { PT_FPR14, "fpr14" },
2297 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002298# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002299 { PT_CR_9, "cr9" },
2300 { PT_CR_10, "cr10" },
2301 { PT_CR_11, "cr11" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002302 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002303# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002304 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002305# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002306 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002307# elif defined(POWERPC)
2308# ifndef PT_ORIG_R3
2309# define PT_ORIG_R3 34
2310# endif
2311# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002312 { REGSIZE*PT_R0, "r0" },
2313 { REGSIZE*PT_R1, "r1" },
2314 { REGSIZE*PT_R2, "r2" },
2315 { REGSIZE*PT_R3, "r3" },
2316 { REGSIZE*PT_R4, "r4" },
2317 { REGSIZE*PT_R5, "r5" },
2318 { REGSIZE*PT_R6, "r6" },
2319 { REGSIZE*PT_R7, "r7" },
2320 { REGSIZE*PT_R8, "r8" },
2321 { REGSIZE*PT_R9, "r9" },
2322 { REGSIZE*PT_R10, "r10" },
2323 { REGSIZE*PT_R11, "r11" },
2324 { REGSIZE*PT_R12, "r12" },
2325 { REGSIZE*PT_R13, "r13" },
2326 { REGSIZE*PT_R14, "r14" },
2327 { REGSIZE*PT_R15, "r15" },
2328 { REGSIZE*PT_R16, "r16" },
2329 { REGSIZE*PT_R17, "r17" },
2330 { REGSIZE*PT_R18, "r18" },
2331 { REGSIZE*PT_R19, "r19" },
2332 { REGSIZE*PT_R20, "r20" },
2333 { REGSIZE*PT_R21, "r21" },
2334 { REGSIZE*PT_R22, "r22" },
2335 { REGSIZE*PT_R23, "r23" },
2336 { REGSIZE*PT_R24, "r24" },
2337 { REGSIZE*PT_R25, "r25" },
2338 { REGSIZE*PT_R26, "r26" },
2339 { REGSIZE*PT_R27, "r27" },
2340 { REGSIZE*PT_R28, "r28" },
2341 { REGSIZE*PT_R29, "r29" },
2342 { REGSIZE*PT_R30, "r30" },
2343 { REGSIZE*PT_R31, "r31" },
2344 { REGSIZE*PT_NIP, "NIP" },
2345 { REGSIZE*PT_MSR, "MSR" },
2346 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2347 { REGSIZE*PT_CTR, "CTR" },
2348 { REGSIZE*PT_LNK, "LNK" },
2349 { REGSIZE*PT_XER, "XER" },
2350 { REGSIZE*PT_CCR, "CCR" },
2351 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002352# undef REGSIZE
2353# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002354 { 0, "r0" },
2355 { 1, "r1" },
2356 { 2, "r2" },
2357 { 3, "r3" },
2358 { 4, "r4" },
2359 { 5, "r5" },
2360 { 6, "r6" },
2361 { 7, "r7" },
2362 { 8, "r8" },
2363 { 9, "r9" },
2364 { 10, "r10" },
2365 { 11, "r11" },
2366 { 12, "r12" },
2367 { 13, "r13" },
2368 { 14, "r14" },
2369 { 15, "r15" },
2370 { 16, "r16" },
2371 { 17, "r17" },
2372 { 18, "r18" },
2373 { 19, "r19" },
2374 { 20, "r20" },
2375 { 21, "r21" },
2376 { 22, "r22" },
2377 { 23, "r23" },
2378 { 24, "r24" },
2379 { 25, "r25" },
2380 { 26, "r26" },
2381 { 27, "r27" },
2382 { 28, "r28" },
2383 { 29, "gp" },
2384 { 30, "fp" },
2385 { 31, "zero" },
2386 { 32, "fp0" },
2387 { 33, "fp" },
2388 { 34, "fp2" },
2389 { 35, "fp3" },
2390 { 36, "fp4" },
2391 { 37, "fp5" },
2392 { 38, "fp6" },
2393 { 39, "fp7" },
2394 { 40, "fp8" },
2395 { 41, "fp9" },
2396 { 42, "fp10" },
2397 { 43, "fp11" },
2398 { 44, "fp12" },
2399 { 45, "fp13" },
2400 { 46, "fp14" },
2401 { 47, "fp15" },
2402 { 48, "fp16" },
2403 { 49, "fp17" },
2404 { 50, "fp18" },
2405 { 51, "fp19" },
2406 { 52, "fp20" },
2407 { 53, "fp21" },
2408 { 54, "fp22" },
2409 { 55, "fp23" },
2410 { 56, "fp24" },
2411 { 57, "fp25" },
2412 { 58, "fp26" },
2413 { 59, "fp27" },
2414 { 60, "fp28" },
2415 { 61, "fp29" },
2416 { 62, "fp30" },
2417 { 63, "fp31" },
2418 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002419# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002420 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2421 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2422 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2423 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2424 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2425 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2426 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2427 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2428 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2429 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2430 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2431 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2432 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2433 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2434 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2435 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2436 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2437 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2438 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2439 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2440 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2441 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2442 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2443 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2444 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2445 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2446 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2447 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2448 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2449 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2450 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2451 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2452 /* switch stack: */
2453 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2454 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2455 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2456 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2457 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2458 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2459 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2460 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2461 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2462 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002463 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2464 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002465 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002466 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002467 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2468 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002469 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2470 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2471 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2472 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2473 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2474 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2475 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2476 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2477 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2478 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2479 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2480 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2481 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2482 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2483 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002484# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002485 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002486# endif
2487# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002488 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002489# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002490 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002491# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002492 { 4*EBX, "4*EBX" },
2493 { 4*ECX, "4*ECX" },
2494 { 4*EDX, "4*EDX" },
2495 { 4*ESI, "4*ESI" },
2496 { 4*EDI, "4*EDI" },
2497 { 4*EBP, "4*EBP" },
2498 { 4*EAX, "4*EAX" },
2499 { 4*DS, "4*DS" },
2500 { 4*ES, "4*ES" },
2501 { 4*FS, "4*FS" },
2502 { 4*GS, "4*GS" },
2503 { 4*ORIG_EAX, "4*ORIG_EAX" },
2504 { 4*EIP, "4*EIP" },
2505 { 4*CS, "4*CS" },
2506 { 4*EFL, "4*EFL" },
2507 { 4*UESP, "4*UESP" },
2508 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002509# elif defined(X86_64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002510 { 8*R15, "8*R15" },
2511 { 8*R14, "8*R14" },
2512 { 8*R13, "8*R13" },
2513 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002514 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002515 { 8*RBX, "8*RBX" },
2516 { 8*R11, "8*R11" },
2517 { 8*R10, "8*R10" },
2518 { 8*R9, "8*R9" },
2519 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002520 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002521 { 8*RCX, "8*RCX" },
2522 { 8*RDX, "8*RDX" },
2523 { 8*RSI, "8*RSI" },
2524 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002525 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002526 { 8*RIP, "8*RIP" },
2527 { 8*CS, "8*CS" },
2528 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002529 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002530 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002531# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002532 { 4*PT_D1, "4*PT_D1" },
2533 { 4*PT_D2, "4*PT_D2" },
2534 { 4*PT_D3, "4*PT_D3" },
2535 { 4*PT_D4, "4*PT_D4" },
2536 { 4*PT_D5, "4*PT_D5" },
2537 { 4*PT_D6, "4*PT_D6" },
2538 { 4*PT_D7, "4*PT_D7" },
2539 { 4*PT_A0, "4*PT_A0" },
2540 { 4*PT_A1, "4*PT_A1" },
2541 { 4*PT_A2, "4*PT_A2" },
2542 { 4*PT_A3, "4*PT_A3" },
2543 { 4*PT_A4, "4*PT_A4" },
2544 { 4*PT_A5, "4*PT_A5" },
2545 { 4*PT_A6, "4*PT_A6" },
2546 { 4*PT_D0, "4*PT_D0" },
2547 { 4*PT_USP, "4*PT_USP" },
2548 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2549 { 4*PT_SR, "4*PT_SR" },
2550 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002551# elif defined(SH)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002552 { 4*REG_REG0, "4*REG_REG0" },
2553 { 4*(REG_REG0+1), "4*REG_REG1" },
2554 { 4*(REG_REG0+2), "4*REG_REG2" },
2555 { 4*(REG_REG0+3), "4*REG_REG3" },
2556 { 4*(REG_REG0+4), "4*REG_REG4" },
2557 { 4*(REG_REG0+5), "4*REG_REG5" },
2558 { 4*(REG_REG0+6), "4*REG_REG6" },
2559 { 4*(REG_REG0+7), "4*REG_REG7" },
2560 { 4*(REG_REG0+8), "4*REG_REG8" },
2561 { 4*(REG_REG0+9), "4*REG_REG9" },
2562 { 4*(REG_REG0+10), "4*REG_REG10" },
2563 { 4*(REG_REG0+11), "4*REG_REG11" },
2564 { 4*(REG_REG0+12), "4*REG_REG12" },
2565 { 4*(REG_REG0+13), "4*REG_REG13" },
2566 { 4*(REG_REG0+14), "4*REG_REG14" },
2567 { 4*REG_REG15, "4*REG_REG15" },
2568 { 4*REG_PC, "4*REG_PC" },
2569 { 4*REG_PR, "4*REG_PR" },
2570 { 4*REG_SR, "4*REG_SR" },
2571 { 4*REG_GBR, "4*REG_GBR" },
2572 { 4*REG_MACH, "4*REG_MACH" },
2573 { 4*REG_MACL, "4*REG_MACL" },
2574 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2575 { 4*REG_FPUL, "4*REG_FPUL" },
2576 { 4*REG_FPREG0, "4*REG_FPREG0" },
2577 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2578 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2579 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2580 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2581 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2582 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2583 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2584 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2585 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2586 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2587 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2588 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2589 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2590 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2591 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002592# ifdef REG_XDREG0
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002593 { 4*REG_XDREG0, "4*REG_XDREG0" },
2594 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2595 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2596 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2597 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2598 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2599 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2600 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002601# endif
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002602 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002603# elif defined(SH64)
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002604 { 0, "PC(L)" },
2605 { 4, "PC(U)" },
2606 { 8, "SR(L)" },
2607 { 12, "SR(U)" },
2608 { 16, "syscall no.(L)" },
2609 { 20, "syscall_no.(U)" },
2610 { 24, "R0(L)" },
2611 { 28, "R0(U)" },
2612 { 32, "R1(L)" },
2613 { 36, "R1(U)" },
2614 { 40, "R2(L)" },
2615 { 44, "R2(U)" },
2616 { 48, "R3(L)" },
2617 { 52, "R3(U)" },
2618 { 56, "R4(L)" },
2619 { 60, "R4(U)" },
2620 { 64, "R5(L)" },
2621 { 68, "R5(U)" },
2622 { 72, "R6(L)" },
2623 { 76, "R6(U)" },
2624 { 80, "R7(L)" },
2625 { 84, "R7(U)" },
2626 { 88, "R8(L)" },
2627 { 92, "R8(U)" },
2628 { 96, "R9(L)" },
2629 { 100, "R9(U)" },
2630 { 104, "R10(L)" },
2631 { 108, "R10(U)" },
2632 { 112, "R11(L)" },
2633 { 116, "R11(U)" },
2634 { 120, "R12(L)" },
2635 { 124, "R12(U)" },
2636 { 128, "R13(L)" },
2637 { 132, "R13(U)" },
2638 { 136, "R14(L)" },
2639 { 140, "R14(U)" },
2640 { 144, "R15(L)" },
2641 { 148, "R15(U)" },
2642 { 152, "R16(L)" },
2643 { 156, "R16(U)" },
2644 { 160, "R17(L)" },
2645 { 164, "R17(U)" },
2646 { 168, "R18(L)" },
2647 { 172, "R18(U)" },
2648 { 176, "R19(L)" },
2649 { 180, "R19(U)" },
2650 { 184, "R20(L)" },
2651 { 188, "R20(U)" },
2652 { 192, "R21(L)" },
2653 { 196, "R21(U)" },
2654 { 200, "R22(L)" },
2655 { 204, "R22(U)" },
2656 { 208, "R23(L)" },
2657 { 212, "R23(U)" },
2658 { 216, "R24(L)" },
2659 { 220, "R24(U)" },
2660 { 224, "R25(L)" },
2661 { 228, "R25(U)" },
2662 { 232, "R26(L)" },
2663 { 236, "R26(U)" },
2664 { 240, "R27(L)" },
2665 { 244, "R27(U)" },
2666 { 248, "R28(L)" },
2667 { 252, "R28(U)" },
2668 { 256, "R29(L)" },
2669 { 260, "R29(U)" },
2670 { 264, "R30(L)" },
2671 { 268, "R30(U)" },
2672 { 272, "R31(L)" },
2673 { 276, "R31(U)" },
2674 { 280, "R32(L)" },
2675 { 284, "R32(U)" },
2676 { 288, "R33(L)" },
2677 { 292, "R33(U)" },
2678 { 296, "R34(L)" },
2679 { 300, "R34(U)" },
2680 { 304, "R35(L)" },
2681 { 308, "R35(U)" },
2682 { 312, "R36(L)" },
2683 { 316, "R36(U)" },
2684 { 320, "R37(L)" },
2685 { 324, "R37(U)" },
2686 { 328, "R38(L)" },
2687 { 332, "R38(U)" },
2688 { 336, "R39(L)" },
2689 { 340, "R39(U)" },
2690 { 344, "R40(L)" },
2691 { 348, "R40(U)" },
2692 { 352, "R41(L)" },
2693 { 356, "R41(U)" },
2694 { 360, "R42(L)" },
2695 { 364, "R42(U)" },
2696 { 368, "R43(L)" },
2697 { 372, "R43(U)" },
2698 { 376, "R44(L)" },
2699 { 380, "R44(U)" },
2700 { 384, "R45(L)" },
2701 { 388, "R45(U)" },
2702 { 392, "R46(L)" },
2703 { 396, "R46(U)" },
2704 { 400, "R47(L)" },
2705 { 404, "R47(U)" },
2706 { 408, "R48(L)" },
2707 { 412, "R48(U)" },
2708 { 416, "R49(L)" },
2709 { 420, "R49(U)" },
2710 { 424, "R50(L)" },
2711 { 428, "R50(U)" },
2712 { 432, "R51(L)" },
2713 { 436, "R51(U)" },
2714 { 440, "R52(L)" },
2715 { 444, "R52(U)" },
2716 { 448, "R53(L)" },
2717 { 452, "R53(U)" },
2718 { 456, "R54(L)" },
2719 { 460, "R54(U)" },
2720 { 464, "R55(L)" },
2721 { 468, "R55(U)" },
2722 { 472, "R56(L)" },
2723 { 476, "R56(U)" },
2724 { 480, "R57(L)" },
2725 { 484, "R57(U)" },
2726 { 488, "R58(L)" },
2727 { 492, "R58(U)" },
2728 { 496, "R59(L)" },
2729 { 500, "R59(U)" },
2730 { 504, "R60(L)" },
2731 { 508, "R60(U)" },
2732 { 512, "R61(L)" },
2733 { 516, "R61(U)" },
2734 { 520, "R62(L)" },
2735 { 524, "R62(U)" },
2736 { 528, "TR0(L)" },
2737 { 532, "TR0(U)" },
2738 { 536, "TR1(L)" },
2739 { 540, "TR1(U)" },
2740 { 544, "TR2(L)" },
2741 { 548, "TR2(U)" },
2742 { 552, "TR3(L)" },
2743 { 556, "TR3(U)" },
2744 { 560, "TR4(L)" },
2745 { 564, "TR4(U)" },
2746 { 568, "TR5(L)" },
2747 { 572, "TR5(U)" },
2748 { 576, "TR6(L)" },
2749 { 580, "TR6(U)" },
2750 { 584, "TR7(L)" },
2751 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002752 /* This entry is in case pt_regs contains dregs (depends on
2753 the kernel build options). */
Denys Vlasenkob63256e2011-06-07 12:13:24 +02002754 { uoff(regs), "offsetof(struct user, regs)" },
2755 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002756# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002757 { uoff(regs.ARM_r0), "r0" },
2758 { uoff(regs.ARM_r1), "r1" },
2759 { uoff(regs.ARM_r2), "r2" },
2760 { uoff(regs.ARM_r3), "r3" },
2761 { uoff(regs.ARM_r4), "r4" },
2762 { uoff(regs.ARM_r5), "r5" },
2763 { uoff(regs.ARM_r6), "r6" },
2764 { uoff(regs.ARM_r7), "r7" },
2765 { uoff(regs.ARM_r8), "r8" },
2766 { uoff(regs.ARM_r9), "r9" },
2767 { uoff(regs.ARM_r10), "r10" },
2768 { uoff(regs.ARM_fp), "fp" },
2769 { uoff(regs.ARM_ip), "ip" },
2770 { uoff(regs.ARM_sp), "sp" },
2771 { uoff(regs.ARM_lr), "lr" },
2772 { uoff(regs.ARM_pc), "pc" },
2773 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002774# elif defined(AVR32)
2775 { uoff(regs.sr), "sr" },
2776 { uoff(regs.pc), "pc" },
2777 { uoff(regs.lr), "lr" },
2778 { uoff(regs.sp), "sp" },
2779 { uoff(regs.r12), "r12" },
2780 { uoff(regs.r11), "r11" },
2781 { uoff(regs.r10), "r10" },
2782 { uoff(regs.r9), "r9" },
2783 { uoff(regs.r8), "r8" },
2784 { uoff(regs.r7), "r7" },
2785 { uoff(regs.r6), "r6" },
2786 { uoff(regs.r5), "r5" },
2787 { uoff(regs.r4), "r4" },
2788 { uoff(regs.r3), "r3" },
2789 { uoff(regs.r2), "r2" },
2790 { uoff(regs.r1), "r1" },
2791 { uoff(regs.r0), "r0" },
2792 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002793# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002794 { 0, "r0" },
2795 { 1, "r1" },
2796 { 2, "r2" },
2797 { 3, "r3" },
2798 { 4, "r4" },
2799 { 5, "r5" },
2800 { 6, "r6" },
2801 { 7, "r7" },
2802 { 8, "r8" },
2803 { 9, "r9" },
2804 { 10, "r10" },
2805 { 11, "r11" },
2806 { 12, "r12" },
2807 { 13, "r13" },
2808 { 14, "r14" },
2809 { 15, "r15" },
2810 { 16, "r16" },
2811 { 17, "r17" },
2812 { 18, "r18" },
2813 { 19, "r19" },
2814 { 20, "r20" },
2815 { 21, "r21" },
2816 { 22, "r22" },
2817 { 23, "r23" },
2818 { 24, "r24" },
2819 { 25, "r25" },
2820 { 26, "r26" },
2821 { 27, "r27" },
2822 { 28, "r28" },
2823 { 29, "r29" },
2824 { 30, "r30" },
2825 { 31, "r31" },
2826 { 32, "f0" },
2827 { 33, "f1" },
2828 { 34, "f2" },
2829 { 35, "f3" },
2830 { 36, "f4" },
2831 { 37, "f5" },
2832 { 38, "f6" },
2833 { 39, "f7" },
2834 { 40, "f8" },
2835 { 41, "f9" },
2836 { 42, "f10" },
2837 { 43, "f11" },
2838 { 44, "f12" },
2839 { 45, "f13" },
2840 { 46, "f14" },
2841 { 47, "f15" },
2842 { 48, "f16" },
2843 { 49, "f17" },
2844 { 50, "f18" },
2845 { 51, "f19" },
2846 { 52, "f20" },
2847 { 53, "f21" },
2848 { 54, "f22" },
2849 { 55, "f23" },
2850 { 56, "f24" },
2851 { 57, "f25" },
2852 { 58, "f26" },
2853 { 59, "f27" },
2854 { 60, "f28" },
2855 { 61, "f29" },
2856 { 62, "f30" },
2857 { 63, "f31" },
2858 { 64, "pc" },
2859 { 65, "cause" },
2860 { 66, "badvaddr" },
2861 { 67, "mmhi" },
2862 { 68, "mmlo" },
2863 { 69, "fpcsr" },
2864 { 70, "fpeir" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05002865# elif defined(TILE)
2866 { PTREGS_OFFSET_REG(0), "r0" },
2867 { PTREGS_OFFSET_REG(1), "r1" },
2868 { PTREGS_OFFSET_REG(2), "r2" },
2869 { PTREGS_OFFSET_REG(3), "r3" },
2870 { PTREGS_OFFSET_REG(4), "r4" },
2871 { PTREGS_OFFSET_REG(5), "r5" },
2872 { PTREGS_OFFSET_REG(6), "r6" },
2873 { PTREGS_OFFSET_REG(7), "r7" },
2874 { PTREGS_OFFSET_REG(8), "r8" },
2875 { PTREGS_OFFSET_REG(9), "r9" },
2876 { PTREGS_OFFSET_REG(10), "r10" },
2877 { PTREGS_OFFSET_REG(11), "r11" },
2878 { PTREGS_OFFSET_REG(12), "r12" },
2879 { PTREGS_OFFSET_REG(13), "r13" },
2880 { PTREGS_OFFSET_REG(14), "r14" },
2881 { PTREGS_OFFSET_REG(15), "r15" },
2882 { PTREGS_OFFSET_REG(16), "r16" },
2883 { PTREGS_OFFSET_REG(17), "r17" },
2884 { PTREGS_OFFSET_REG(18), "r18" },
2885 { PTREGS_OFFSET_REG(19), "r19" },
2886 { PTREGS_OFFSET_REG(20), "r20" },
2887 { PTREGS_OFFSET_REG(21), "r21" },
2888 { PTREGS_OFFSET_REG(22), "r22" },
2889 { PTREGS_OFFSET_REG(23), "r23" },
2890 { PTREGS_OFFSET_REG(24), "r24" },
2891 { PTREGS_OFFSET_REG(25), "r25" },
2892 { PTREGS_OFFSET_REG(26), "r26" },
2893 { PTREGS_OFFSET_REG(27), "r27" },
2894 { PTREGS_OFFSET_REG(28), "r28" },
2895 { PTREGS_OFFSET_REG(29), "r29" },
2896 { PTREGS_OFFSET_REG(30), "r30" },
2897 { PTREGS_OFFSET_REG(31), "r31" },
2898 { PTREGS_OFFSET_REG(32), "r32" },
2899 { PTREGS_OFFSET_REG(33), "r33" },
2900 { PTREGS_OFFSET_REG(34), "r34" },
2901 { PTREGS_OFFSET_REG(35), "r35" },
2902 { PTREGS_OFFSET_REG(36), "r36" },
2903 { PTREGS_OFFSET_REG(37), "r37" },
2904 { PTREGS_OFFSET_REG(38), "r38" },
2905 { PTREGS_OFFSET_REG(39), "r39" },
2906 { PTREGS_OFFSET_REG(40), "r40" },
2907 { PTREGS_OFFSET_REG(41), "r41" },
2908 { PTREGS_OFFSET_REG(42), "r42" },
2909 { PTREGS_OFFSET_REG(43), "r43" },
2910 { PTREGS_OFFSET_REG(44), "r44" },
2911 { PTREGS_OFFSET_REG(45), "r45" },
2912 { PTREGS_OFFSET_REG(46), "r46" },
2913 { PTREGS_OFFSET_REG(47), "r47" },
2914 { PTREGS_OFFSET_REG(48), "r48" },
2915 { PTREGS_OFFSET_REG(49), "r49" },
2916 { PTREGS_OFFSET_REG(50), "r50" },
2917 { PTREGS_OFFSET_REG(51), "r51" },
2918 { PTREGS_OFFSET_REG(52), "r52" },
2919 { PTREGS_OFFSET_TP, "tp" },
2920 { PTREGS_OFFSET_SP, "sp" },
2921 { PTREGS_OFFSET_LR, "lr" },
2922 { PTREGS_OFFSET_PC, "pc" },
2923 { PTREGS_OFFSET_EX1, "ex1" },
2924 { PTREGS_OFFSET_FAULTNUM, "faultnum" },
2925 { PTREGS_OFFSET_ORIG_R0, "orig_r0" },
2926 { PTREGS_OFFSET_FLAGS, "flags" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002927# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00002928# ifdef CRISV10
2929 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
2930 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2931 { 4*PT_R13, "4*PT_R13" },
2932 { 4*PT_R12, "4*PT_R12" },
2933 { 4*PT_R11, "4*PT_R11" },
2934 { 4*PT_R10, "4*PT_R10" },
2935 { 4*PT_R9, "4*PT_R9" },
2936 { 4*PT_R8, "4*PT_R8" },
2937 { 4*PT_R7, "4*PT_R7" },
2938 { 4*PT_R6, "4*PT_R6" },
2939 { 4*PT_R5, "4*PT_R5" },
2940 { 4*PT_R4, "4*PT_R4" },
2941 { 4*PT_R3, "4*PT_R3" },
2942 { 4*PT_R2, "4*PT_R2" },
2943 { 4*PT_R1, "4*PT_R1" },
2944 { 4*PT_R0, "4*PT_R0" },
2945 { 4*PT_MOF, "4*PT_MOF" },
2946 { 4*PT_DCCR, "4*PT_DCCR" },
2947 { 4*PT_SRP, "4*PT_SRP" },
2948 { 4*PT_IRP, "4*PT_IRP" },
2949 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
2950 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
2951 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
2952 { 4*PT_USP, "4*PT_USP" },
2953# endif
2954# ifdef CRISV32
2955 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2956 { 4*PT_R0, "4*PT_R0" },
2957 { 4*PT_R1, "4*PT_R1" },
2958 { 4*PT_R2, "4*PT_R2" },
2959 { 4*PT_R3, "4*PT_R3" },
2960 { 4*PT_R4, "4*PT_R4" },
2961 { 4*PT_R5, "4*PT_R5" },
2962 { 4*PT_R6, "4*PT_R6" },
2963 { 4*PT_R7, "4*PT_R7" },
2964 { 4*PT_R8, "4*PT_R8" },
2965 { 4*PT_R9, "4*PT_R9" },
2966 { 4*PT_R10, "4*PT_R10" },
2967 { 4*PT_R11, "4*PT_R11" },
2968 { 4*PT_R12, "4*PT_R12" },
2969 { 4*PT_R13, "4*PT_R13" },
2970 { 4*PT_ACR, "4*PT_ACR" },
2971 { 4*PT_SRS, "4*PT_SRS" },
2972 { 4*PT_MOF, "4*PT_MOF" },
2973 { 4*PT_SPC, "4*PT_SPC" },
2974 { 4*PT_CCS, "4*PT_CCS" },
2975 { 4*PT_SRP, "4*PT_SRP" },
2976 { 4*PT_ERP, "4*PT_ERP" },
2977 { 4*PT_EXS, "4*PT_EXS" },
2978 { 4*PT_EDA, "4*PT_EDA" },
2979 { 4*PT_USP, "4*PT_USP" },
2980 { 4*PT_PPC, "4*PT_PPC" },
2981 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
2982 { 4*PT_BP+4, "4*PT_BP+4" },
2983 { 4*PT_BP+8, "4*PT_BP+8" },
2984 { 4*PT_BP+12, "4*PT_BP+12" },
2985 { 4*PT_BP+16, "4*PT_BP+16" },
2986 { 4*PT_BP+20, "4*PT_BP+20" },
2987 { 4*PT_BP+24, "4*PT_BP+24" },
2988 { 4*PT_BP+28, "4*PT_BP+28" },
2989 { 4*PT_BP+32, "4*PT_BP+32" },
2990 { 4*PT_BP+36, "4*PT_BP+36" },
2991 { 4*PT_BP+40, "4*PT_BP+40" },
2992 { 4*PT_BP+44, "4*PT_BP+44" },
2993 { 4*PT_BP+48, "4*PT_BP+48" },
2994 { 4*PT_BP+52, "4*PT_BP+52" },
2995 { 4*PT_BP+56, "4*PT_BP+56" },
2996# endif
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02002997# ifdef MICROBLAZE
2998 { PT_GPR(0), "r0" },
2999 { PT_GPR(1), "r1" },
3000 { PT_GPR(2), "r2" },
3001 { PT_GPR(3), "r3" },
3002 { PT_GPR(4), "r4" },
3003 { PT_GPR(5), "r5" },
3004 { PT_GPR(6), "r6" },
3005 { PT_GPR(7), "r7" },
3006 { PT_GPR(8), "r8" },
3007 { PT_GPR(9), "r9" },
3008 { PT_GPR(10), "r10" },
3009 { PT_GPR(11), "r11" },
3010 { PT_GPR(12), "r12" },
3011 { PT_GPR(13), "r13" },
3012 { PT_GPR(14), "r14" },
3013 { PT_GPR(15), "r15" },
3014 { PT_GPR(16), "r16" },
3015 { PT_GPR(17), "r17" },
3016 { PT_GPR(18), "r18" },
3017 { PT_GPR(19), "r19" },
3018 { PT_GPR(20), "r20" },
3019 { PT_GPR(21), "r21" },
3020 { PT_GPR(22), "r22" },
3021 { PT_GPR(23), "r23" },
3022 { PT_GPR(24), "r24" },
3023 { PT_GPR(25), "r25" },
3024 { PT_GPR(26), "r26" },
3025 { PT_GPR(27), "r27" },
3026 { PT_GPR(28), "r28" },
3027 { PT_GPR(29), "r29" },
3028 { PT_GPR(30), "r30" },
3029 { PT_GPR(31), "r31" },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003030 { PT_PC, "rpc", },
3031 { PT_MSR, "rmsr", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003032 { PT_EAR, "rear", },
3033 { PT_ESR, "resr", },
3034 { PT_FSR, "rfsr", },
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003035 { PT_KERNEL_MODE, "kernel_mode", },
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003036# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003037
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003038# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3039 && !defined(ALPHA) && !defined(IA64) \
Edgar E. Iglesias939caba2010-07-06 14:21:07 +02003040 && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
Chris Metcalfc8c66982009-12-28 10:00:15 -05003041# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003042 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003043# endif
3044# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003045 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003046# endif
3047# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003048 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003049# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003050 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3051 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3052 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003053# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003054 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003055# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003056# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003057 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003058# endif
3059# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003060 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003061# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003062 { uoff(signal), "offsetof(struct user, signal)" },
Chris Metcalfc8c66982009-12-28 10:00:15 -05003063# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003064 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003065# endif
3066# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003067 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003068# endif
Chris Metcalfc8c66982009-12-28 10:00:15 -05003069# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003070 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003071# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003072 { uoff(magic), "offsetof(struct user, magic)" },
3073 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003074# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003075 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003076# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003077# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003078
3079# endif /* LINUX */
3080
3081# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003082 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3083 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3084 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3085 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3086 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3087 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3088 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3089 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3090 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3091 { uoff(u_error), "offsetof(struct user, u_error)" },
3092 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3093 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3094 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3095 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3096 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3097 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3098 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3099 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3100 { uoff(u_code), "offsetof(struct user, u_code)" },
3101 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3102 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3103 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3104 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3105 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3106 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3107 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3108 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3109 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3110 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3111 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3112 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3113 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3114 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3115 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3116 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3117 { uoff(u_start), "offsetof(struct user, u_start)" },
3118 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3119 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3120 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3121 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3122 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3123 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3124 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3125 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3126 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003127# endif /* SUNOS4 */
3128# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003129 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003130# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003131 { 0, NULL },
3132};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003133# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003134
3135int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003136sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003137{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003138 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003139 long addr;
3140
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003141 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003142 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003143# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003144 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003145# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003146 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003147# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003148 );
3149 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003150 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003151# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003152 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3153 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3154 for (x = struct_user_offsets; x->str; x++) {
3155 if (x->val >= addr)
3156 break;
3157 }
3158 if (!x->str)
3159 tprintf("%#lx, ", addr);
3160 else if (x->val > addr && x != struct_user_offsets) {
3161 x--;
3162 tprintf("%s + %ld, ", x->str, addr - x->val);
3163 }
3164 else
3165 tprintf("%s, ", x->str);
3166 }
3167 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003168# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003169 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003170# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003171 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003172# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003173 case PTRACE_PEEKDATA:
3174 case PTRACE_PEEKTEXT:
3175 case PTRACE_PEEKUSER:
3176 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003177# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003178 case PTRACE_CONT:
3179 case PTRACE_SINGLESTEP:
3180 case PTRACE_SYSCALL:
3181 case PTRACE_DETACH:
3182 printsignal(tcp->u_arg[3]);
3183 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003184# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003185 case PTRACE_SETOPTIONS:
3186 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3187 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003188# endif
3189# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003190 case PTRACE_SETSIGINFO: {
3191 siginfo_t si;
3192 if (!tcp->u_arg[3])
3193 tprintf("NULL");
3194 else if (syserror(tcp))
3195 tprintf("%#lx", tcp->u_arg[3]);
3196 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3197 tprintf("{???}");
3198 else
3199 printsiginfo(&si, verbose(tcp));
3200 break;
3201 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003202# endif
3203# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003204 case PTRACE_GETSIGINFO:
3205 /* Don't print anything, do it at syscall return. */
3206 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003207# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003208 default:
3209 tprintf("%#lx", tcp->u_arg[3]);
3210 break;
3211 }
3212 } else {
3213 switch (tcp->u_arg[0]) {
3214 case PTRACE_PEEKDATA:
3215 case PTRACE_PEEKTEXT:
3216 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003217# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003218 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003219# else
Roland McGratheb285352003-01-14 09:59:00 +00003220 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003221 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003222# endif
3223# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003224 case PTRACE_GETSIGINFO: {
3225 siginfo_t si;
3226 if (!tcp->u_arg[3])
3227 tprintf("NULL");
3228 else if (syserror(tcp))
3229 tprintf("%#lx", tcp->u_arg[3]);
3230 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3231 tprintf("{???}");
3232 else
3233 printsiginfo(&si, verbose(tcp));
3234 break;
3235 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003236# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003237 }
3238 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003239# endif /* LINUX */
3240# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003241 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3242 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3243 tprintf("%lu, ", tcp->u_arg[3]);
3244 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3245 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3246 tcp->u_arg[0] != PTRACE_READTEXT) {
3247 tprintf("%#lx", tcp->u_arg[3]);
3248 }
3249 } else {
3250 if (tcp->u_arg[0] == PTRACE_READDATA ||
3251 tcp->u_arg[0] == PTRACE_READTEXT) {
3252 tprintf("%lu, ", tcp->u_arg[3]);
3253 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3254 }
3255 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003256# endif /* SUNOS4 */
3257# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003258 tprintf("%lu", tcp->u_arg[3]);
3259 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003260# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003261 return 0;
3262}
3263
3264#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003265
3266#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003267# ifndef FUTEX_CMP_REQUEUE
3268# define FUTEX_CMP_REQUEUE 4
3269# endif
3270# ifndef FUTEX_WAKE_OP
3271# define FUTEX_WAKE_OP 5
3272# endif
3273# ifndef FUTEX_LOCK_PI
3274# define FUTEX_LOCK_PI 6
3275# define FUTEX_UNLOCK_PI 7
3276# define FUTEX_TRYLOCK_PI 8
3277# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003278# ifndef FUTEX_WAIT_BITSET
3279# define FUTEX_WAIT_BITSET 9
3280# endif
3281# ifndef FUTEX_WAKE_BITSET
3282# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003283# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003284# ifndef FUTEX_WAIT_REQUEUE_PI
3285# define FUTEX_WAIT_REQUEUE_PI 11
3286# endif
3287# ifndef FUTEX_CMP_REQUEUE_PI
3288# define FUTEX_CMP_REQUEUE_PI 12
3289# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003290# ifndef FUTEX_PRIVATE_FLAG
3291# define FUTEX_PRIVATE_FLAG 128
3292# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003293# ifndef FUTEX_CLOCK_REALTIME
3294# define FUTEX_CLOCK_REALTIME 256
3295# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003296static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003297 { FUTEX_WAIT, "FUTEX_WAIT" },
3298 { FUTEX_WAKE, "FUTEX_WAKE" },
3299 { FUTEX_FD, "FUTEX_FD" },
3300 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3301 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3302 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3303 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3304 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3305 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003306 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3307 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003308 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3309 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003310 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3311 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3312 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3313 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3314 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3315 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3316 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3317 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3318 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003319 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3320 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003321 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3322 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3323 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3324 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3325 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3326 { 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 +00003327 { 0, NULL }
3328};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003329# ifndef FUTEX_OP_SET
3330# define FUTEX_OP_SET 0
3331# define FUTEX_OP_ADD 1
3332# define FUTEX_OP_OR 2
3333# define FUTEX_OP_ANDN 3
3334# define FUTEX_OP_XOR 4
3335# define FUTEX_OP_CMP_EQ 0
3336# define FUTEX_OP_CMP_NE 1
3337# define FUTEX_OP_CMP_LT 2
3338# define FUTEX_OP_CMP_LE 3
3339# define FUTEX_OP_CMP_GT 4
3340# define FUTEX_OP_CMP_GE 5
3341# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003342static const struct xlat futexwakeops[] = {
3343 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3344 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3345 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3346 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3347 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3348 { 0, NULL }
3349};
3350static const struct xlat futexwakecmps[] = {
3351 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3352 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3353 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3354 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3355 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3356 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3357 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003358};
3359
3360int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003361sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003362{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003363 if (entering(tcp)) {
3364 long int cmd = tcp->u_arg[1] & 127;
3365 tprintf("%p, ", (void *) tcp->u_arg[0]);
3366 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3367 tprintf(", %ld", tcp->u_arg[2]);
3368 if (cmd == FUTEX_WAKE_BITSET)
3369 tprintf(", %lx", tcp->u_arg[5]);
3370 else if (cmd == FUTEX_WAIT) {
3371 tprintf(", ");
3372 printtv(tcp, tcp->u_arg[3]);
3373 } else if (cmd == FUTEX_WAIT_BITSET) {
3374 tprintf(", ");
3375 printtv(tcp, tcp->u_arg[3]);
3376 tprintf(", %lx", tcp->u_arg[5]);
3377 } else if (cmd == FUTEX_REQUEUE)
3378 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003379 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003380 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3381 else if (cmd == FUTEX_WAKE_OP) {
3382 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3383 if ((tcp->u_arg[5] >> 28) & 8)
3384 tprintf("FUTEX_OP_OPARG_SHIFT|");
3385 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3386 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3387 if ((tcp->u_arg[5] >> 24) & 8)
3388 tprintf("FUTEX_OP_OPARG_SHIFT|");
3389 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3390 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003391 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3392 tprintf(", ");
3393 printtv(tcp, tcp->u_arg[3]);
3394 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003395 }
Roland McGrath51942a92007-07-05 18:59:11 +00003396 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003397 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003398}
3399
3400static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003401print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003402{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003403 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003404 unsigned long w, min_len;
3405
3406 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3407 min_len = len - max_strlen * sizeof(w);
3408 else
3409 min_len = 0;
3410 for (; len >= sizeof(w) && len > min_len;
3411 len -= sizeof(w), list += sizeof(w)) {
3412 if (umove(tcp, list, &w) < 0)
3413 break;
3414 if (first)
3415 tprintf("{");
3416 else
3417 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003418 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003419 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003420 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003421 if (len) {
3422 if (first)
3423 tprintf("%#lx", list);
3424 else
3425 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3426 "???" : "..."));
3427 } else {
3428 tprintf(first ? "{}" : "}");
3429 }
Roland McGrath5a223472002-12-15 23:58:26 +00003430}
3431
3432int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003433sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003434{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003435 if (entering(tcp)) {
3436 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3437 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3438 }
3439 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003440}
3441
3442int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003443sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003444{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003445 if (entering(tcp)) {
3446 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3447 } else {
3448 if (tcp->u_rval == -1)
3449 tprintf("%#lx", tcp->u_arg[2]);
3450 else
3451 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3452 }
3453 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003454}
Roland McGrath279d3782004-03-01 20:27:37 +00003455
Roland McGrathd9f816f2004-09-04 03:39:20 +00003456static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003457 { SCHED_OTHER, "SCHED_OTHER" },
3458 { SCHED_RR, "SCHED_RR" },
3459 { SCHED_FIFO, "SCHED_FIFO" },
3460 { 0, NULL }
3461};
3462
3463int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003464sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003465{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003466 if (entering(tcp)) {
3467 tprintf("%d", (int) tcp->u_arg[0]);
3468 } else if (! syserror(tcp)) {
Denys Vlasenkob63256e2011-06-07 12:13:24 +02003469 tcp->auxstr = xlookup(schedulers, tcp->u_rval);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003470 if (tcp->auxstr != NULL)
3471 return RVAL_STR;
3472 }
3473 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003474}
3475
3476int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003477sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003478{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003479 if (entering(tcp)) {
3480 struct sched_param p;
3481 tprintf("%d, ", (int) tcp->u_arg[0]);
3482 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3483 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3484 tprintf(", %#lx", tcp->u_arg[2]);
3485 else
3486 tprintf(", { %d }", p.__sched_priority);
3487 }
3488 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003489}
3490
3491int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003492sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003493{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003494 if (entering(tcp)) {
3495 tprintf("%d, ", (int) tcp->u_arg[0]);
3496 } else {
3497 struct sched_param p;
3498 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3499 tprintf("%#lx", tcp->u_arg[1]);
3500 else
3501 tprintf("{ %d }", p.__sched_priority);
3502 }
3503 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003504}
3505
3506int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003507sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003508{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003509 if (entering(tcp)) {
3510 struct sched_param p;
3511 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3512 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3513 else
3514 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3515 }
3516 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003517}
3518
3519int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003520sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003521{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003522 if (entering(tcp)) {
3523 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3524 }
3525 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003526}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003527
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003528# ifdef X86_64
3529# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003530
3531static const struct xlat archvals[] = {
3532 { ARCH_SET_GS, "ARCH_SET_GS" },
3533 { ARCH_SET_FS, "ARCH_SET_FS" },
3534 { ARCH_GET_FS, "ARCH_GET_FS" },
3535 { ARCH_GET_GS, "ARCH_GET_GS" },
3536 { 0, NULL },
3537};
3538
3539int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003540sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003541{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003542 if (entering(tcp)) {
3543 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3544 if (tcp->u_arg[0] == ARCH_SET_GS
3545 || tcp->u_arg[0] == ARCH_SET_FS
3546 ) {
3547 tprintf(", %#lx", tcp->u_arg[1]);
3548 }
3549 } else {
3550 if (tcp->u_arg[0] == ARCH_GET_GS
3551 || tcp->u_arg[0] == ARCH_GET_FS
3552 ) {
3553 long int v;
3554 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3555 tprintf(", [%#lx]", v);
3556 else
3557 tprintf(", %#lx", tcp->u_arg[1]);
3558 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003559 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003560 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003561}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003562# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003563
Roland McGrathdb8319f2007-08-02 01:37:55 +00003564
3565int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003566sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003567{
3568 if (exiting(tcp)) {
3569 unsigned u;
3570 if (tcp->u_arg[0] == 0)
3571 tprintf("NULL, ");
3572 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3573 tprintf("%#lx, ", tcp->u_arg[0]);
3574 else
3575 tprintf("[%u], ", u);
3576 if (tcp->u_arg[1] == 0)
3577 tprintf("NULL, ");
3578 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3579 tprintf("%#lx, ", tcp->u_arg[1]);
3580 else
3581 tprintf("[%u], ", u);
3582 tprintf("%#lx", tcp->u_arg[2]);
3583 }
3584 return 0;
3585}
3586
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003587#endif /* LINUX */