blob: 03cd251093925b7c345363ae2851c5e6e4ac1fa3 [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 Akkerman00a82ee2001-03-28 20:29:17 +000059#if HAVE_ASM_REG_H
Roland McGrath6d1a65c2004-07-12 07:44:08 +000060#if defined (SPARC) || defined (SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000061# define fpq kernel_fpq
62# define fq kernel_fq
63# define fpu kernel_fpu
Roland McGrath6d1a65c2004-07-12 07:44:08 +000064#endif /* SPARC || SPARC64 */
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000065#include <asm/reg.h>
Roland McGrath6d1a65c2004-07-12 07:44:08 +000066#if defined (SPARC) || defined (SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000067# undef fpq
68# undef fq
Roland McGrath5a223472002-12-15 23:58:26 +000069# undef fpu
Roland McGrath6d1a65c2004-07-12 07:44:08 +000070#endif /* SPARC || SPARC64 */
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000071#endif /* HAVE_ASM_REG_H */
72
Wichert Akkerman36915a11999-07-13 15:45:02 +000073#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000074# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000075#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000076# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000077#endif
78#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000079# define PTRACE_POKEUSR PTRACE_POKEUSER
80#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000081#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000082
Roland McGrath5bd7cf82003-01-24 04:31:18 +000083#ifdef HAVE_LINUX_PTRACE_H
84#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000085# ifdef HAVE_STRUCT_IA64_FPREG
86# define ia64_fpreg XXX_ia64_fpreg
87# endif
88# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
89# define pt_all_user_regs XXX_pt_all_user_regs
90# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000091#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000092# undef ia64_fpreg
93# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000094#endif
95
Roland McGrath6d1a65c2004-07-12 07:44:08 +000096#if defined (LINUX) && defined (SPARC64)
97# define r_pc r_tpc
98# undef PTRACE_GETREGS
99# define PTRACE_GETREGS PTRACE_GETREGS64
100# undef PTRACE_SETREGS
101# define PTRACE_SETREGS PTRACE_SETREGS64
102#endif /* LINUX && SPARC64 */
103
Roland McGrath5a223472002-12-15 23:58:26 +0000104#ifdef HAVE_LINUX_FUTEX_H
105#include <linux/futex.h>
106#endif
107#if defined LINUX
108# ifndef FUTEX_WAIT
109# define FUTEX_WAIT 0
110# endif
111# ifndef FUTEX_WAKE
112# define FUTEX_WAKE 1
113# endif
114# ifndef FUTEX_FD
115# define FUTEX_FD 2
116# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000117# ifndef FUTEX_REQUEUE
118# define FUTEX_REQUEUE 3
119# endif
Roland McGrath5a223472002-12-15 23:58:26 +0000120#endif
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000123#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000124#include <asm/posix_types.h>
125#undef GETGROUPS_T
126#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000127#undef GETGROUPS32_T
128#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000129#endif /* LINUX */
130
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000131#if defined(LINUX) && defined(IA64)
132# include <asm/ptrace_offsets.h>
133# include <asm/rse.h>
134#endif
135
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000136#ifdef HAVE_PRCTL
137#include <sys/prctl.h>
138#endif
139
140#ifndef WCOREDUMP
141#define WCOREDUMP(status) ((status) & 0200)
142#endif
143
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000144/* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000145#if defined(HAVE_PRCTL)
Roland McGrathd9f816f2004-09-04 03:39:20 +0000146static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000147#ifdef PR_MAXPROCS
148 { PR_MAXPROCS, "PR_MAXPROCS" },
149#endif
150#ifdef PR_ISBLOCKED
151 { PR_ISBLOCKED, "PR_ISBLOCKED" },
152#endif
153#ifdef PR_SETSTACKSIZE
154 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
155#endif
156#ifdef PR_GETSTACKSIZE
157 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
158#endif
159#ifdef PR_MAXPPROCS
160 { PR_MAXPPROCS, "PR_MAXPPROCS" },
161#endif
162#ifdef PR_UNBLKONEXEC
163 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
164#endif
165#ifdef PR_ATOMICSIM
166 { PR_ATOMICSIM, "PR_ATOMICSIM" },
167#endif
168#ifdef PR_SETEXITSIG
169 { PR_SETEXITSIG, "PR_SETEXITSIG" },
170#endif
171#ifdef PR_RESIDENT
172 { PR_RESIDENT, "PR_RESIDENT" },
173#endif
174#ifdef PR_ATTACHADDR
175 { PR_ATTACHADDR, "PR_ATTACHADDR" },
176#endif
177#ifdef PR_DETACHADDR
178 { PR_DETACHADDR, "PR_DETACHADDR" },
179#endif
180#ifdef PR_TERMCHILD
181 { PR_TERMCHILD, "PR_TERMCHILD" },
182#endif
183#ifdef PR_GETSHMASK
184 { PR_GETSHMASK, "PR_GETSHMASK" },
185#endif
186#ifdef PR_GETNSHARE
187 { PR_GETNSHARE, "PR_GETNSHARE" },
188#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000189#ifdef PR_COREPID
190 { PR_COREPID, "PR_COREPID" },
191#endif
192#ifdef PR_ATTACHADDRPERM
193 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
194#endif
195#ifdef PR_PTHREADEXIT
196 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
197#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000198#ifdef PR_SET_PDEATHSIG
199 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
200#endif
201#ifdef PR_GET_PDEATHSIG
202 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
203#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000204#ifdef PR_GET_DUMPABLE
205 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
206#endif
207#ifdef PR_SET_DUMPABLE
208 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
209#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000210#ifdef PR_GET_UNALIGN
211 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
212#endif
213#ifdef PR_SET_UNALIGN
214 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
215#endif
216#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000217 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000218#endif
219#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000220 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000221#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000222#ifdef PR_GET_FPEMU
223 { PR_GET_FPEMU, "PR_GET_FPEMU" },
224#endif
225#ifdef PR_SET_FPEMU
226 { PR_SET_FPEMU, "PR_SET_FPEMU" },
227#endif
228#ifdef PR_GET_FPEXC
229 { PR_GET_FPEXC, "PR_GET_FPEXC" },
230#endif
231#ifdef PR_SET_FPEXC
232 { PR_SET_FPEXC, "PR_SET_FPEXC" },
233#endif
234#ifdef PR_GET_TIMING
235 { PR_GET_TIMING, "PR_GET_TIMING" },
236#endif
237#ifdef PR_SET_TIMING
238 { PR_SET_TIMING, "PR_SET_TIMING" },
239#endif
240#ifdef PR_SET_NAME
241 { PR_SET_NAME, "PR_SET_NAME" },
242#endif
243#ifdef PR_GET_NAME
244 { PR_GET_NAME, "PR_GET_NAME" },
245#endif
246#ifdef PR_GET_ENDIAN
247 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
248#endif
249#ifdef PR_SET_ENDIAN
250 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
251#endif
252#ifdef PR_GET_SECCOMP
253 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
254#endif
255#ifdef PR_SET_SECCOMP
256 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
257#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000258#ifdef PR_GET_TSC
259 { PR_GET_TSC, "PR_GET_TSC" },
260#endif
261#ifdef PR_SET_TSC
262 { PR_SET_TSC, "PR_SET_TSC" },
263#endif
264#ifdef PR_GET_SECUREBITS
265 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
266#endif
267#ifdef PR_SET_SECUREBITS
268 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
269#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000270 { 0, NULL },
271};
272
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000273
Roland McGratha4d48532005-06-08 20:45:28 +0000274static const char *
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000275unalignctl_string (unsigned int ctl)
276{
277 static char buf[16];
278
279 switch (ctl) {
280#ifdef PR_UNALIGN_NOPRINT
281 case PR_UNALIGN_NOPRINT:
282 return "NOPRINT";
283#endif
284#ifdef PR_UNALIGN_SIGBUS
285 case PR_UNALIGN_SIGBUS:
286 return "SIGBUS";
287#endif
288 default:
289 break;
290 }
291 sprintf(buf, "%x", ctl);
292 return buf;
293}
294
295
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000296int
297sys_prctl(tcp)
298struct tcb *tcp;
299{
300 int i;
301
302 if (entering(tcp)) {
303 printxval(prctl_options, tcp->u_arg[0], "PR_???");
304 switch (tcp->u_arg[0]) {
305#ifdef PR_GETNSHARE
306 case PR_GETNSHARE:
307 break;
308#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000309#ifdef PR_SET_PDEATHSIG
310 case PR_SET_PDEATHSIG:
311 tprintf(", %lu", tcp->u_arg[1]);
312 break;
313#endif
314#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000315 case PR_GET_PDEATHSIG:
316 break;
317#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000318#ifdef PR_SET_DUMPABLE
319 case PR_SET_DUMPABLE:
320 tprintf(", %lu", tcp->u_arg[1]);
321 break;
322#endif
323#ifdef PR_GET_DUMPABLE
324 case PR_GET_DUMPABLE:
325 break;
326#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000327#ifdef PR_SET_UNALIGN
328 case PR_SET_UNALIGN:
329 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
330 break;
331#endif
332#ifdef PR_GET_UNALIGN
333 case PR_GET_UNALIGN:
334 tprintf(", %#lx", tcp->u_arg[1]);
335 break;
336#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000337#ifdef PR_SET_KEEPCAPS
338 case PR_SET_KEEPCAPS:
339 tprintf(", %lu", tcp->u_arg[1]);
340 break;
341#endif
342#ifdef PR_GET_KEEPCAPS
343 case PR_GET_KEEPCAPS:
344 break;
345#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000346 default:
347 for (i = 1; i < tcp->u_nargs; i++)
348 tprintf(", %#lx", tcp->u_arg[i]);
349 break;
350 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000351 } else {
352 switch (tcp->u_arg[0]) {
353#ifdef PR_GET_PDEATHSIG
354 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000355 if (umove(tcp, tcp->u_arg[1], &i) < 0)
356 tprintf(", %#lx", tcp->u_arg[1]);
357 else
358 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000359 break;
360#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000361#ifdef PR_GET_DUMPABLE
362 case PR_GET_DUMPABLE:
363 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000364#endif
365#ifdef PR_GET_UNALIGN
366 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000367 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
368 break;
369 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000370 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000371#endif
372#ifdef PR_GET_KEEPCAPS
373 case PR_GET_KEEPCAPS:
374 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000375#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000376 default:
377 break;
378 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000379 }
380 return 0;
381}
382
383#endif /* HAVE_PRCTL */
384
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000385#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000386int
387sys_gethostid(tcp)
388struct tcb *tcp;
389{
390 if (exiting(tcp))
391 return RVAL_HEX;
392 return 0;
393}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000394#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000395
396int
397sys_sethostname(tcp)
398struct tcb *tcp;
399{
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
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000407#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000408int
409sys_gethostname(tcp)
410struct tcb *tcp;
411{
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}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000421#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000422
423int
424sys_setdomainname(tcp)
425struct tcb *tcp;
426{
427 if (entering(tcp)) {
428 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
429 tprintf(", %lu", tcp->u_arg[1]);
430 }
431 return 0;
432}
433
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000434#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000435
436int
437sys_getdomainname(tcp)
438struct tcb *tcp;
439{
440 if (exiting(tcp)) {
441 if (syserror(tcp))
442 tprintf("%#lx", tcp->u_arg[0]);
443 else
444 printpath(tcp, tcp->u_arg[0]);
445 tprintf(", %lu", tcp->u_arg[1]);
446 }
447 return 0;
448}
449#endif /* !LINUX */
450
451int
452sys_exit(tcp)
453struct tcb *tcp;
454{
455 if (exiting(tcp)) {
456 fprintf(stderr, "_exit returned!\n");
457 return -1;
458 }
459 /* special case: we stop tracing this process, finish line now */
460 tprintf("%ld) ", tcp->u_arg[0]);
461 tabto(acolumn);
462 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000463 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000464 return 0;
465}
466
467int
468internal_exit(tcp)
469struct tcb *tcp;
470{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000471 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000472 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000473#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000474# ifdef IA64
475 if (ia32) {
476 if (tcp->scno == 252)
477 tcp->flags |= TCB_GROUP_EXITING;
478 } else
479# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000480 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000481 tcp->flags |= TCB_GROUP_EXITING;
482#endif
483 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000484 return 0;
485}
486
Roland McGrathee9d4352002-12-18 04:16:10 +0000487/* TCP is creating a child we want to follow.
488 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
489 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
490static int
491fork_tcb(struct tcb *tcp)
492{
493 if (nprocs == tcbtabsize) {
Roland McGrath7b54a7a2004-06-04 01:50:45 +0000494 if (expand_tcbtab()) {
Roland McGrathee9d4352002-12-18 04:16:10 +0000495 tcp->flags &= ~TCB_FOLLOWFORK;
Dmitry V. Levin76860f62006-10-11 22:55:25 +0000496 return 1;
Roland McGrathee9d4352002-12-18 04:16:10 +0000497 }
Roland McGrathee9d4352002-12-18 04:16:10 +0000498 }
499
500 tcp->flags |= TCB_FOLLOWFORK;
501 return 0;
502}
503
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000504#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000505
506int
507sys_fork(tcp)
508struct tcb *tcp;
509{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000510 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000511 if (getrval2(tcp)) {
512 tcp->auxstr = "child process";
513 return RVAL_UDECIMAL | RVAL_STR;
514 }
515 }
516 return 0;
517}
518
John Hughes4e36a812001-04-18 15:11:51 +0000519#if UNIXWARE > 2
520
521int
522sys_rfork(tcp)
523struct tcb *tcp;
524{
525 if (entering(tcp)) {
526 tprintf ("%ld", tcp->u_arg[0]);
527 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000528 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000529 if (getrval2(tcp)) {
530 tcp->auxstr = "child process";
531 return RVAL_UDECIMAL | RVAL_STR;
532 }
533 }
534 return 0;
535}
536
537#endif
538
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000539int
540internal_fork(tcp)
541struct tcb *tcp;
542{
543 struct tcb *tcpchild;
544
545 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000546#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000547 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000548 return 0;
549#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000550 if (getrval2(tcp))
551 return 0;
552 if (!followfork)
553 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000554 if (fork_tcb(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000555 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000556 if (syserror(tcp))
557 return 0;
Dmitry V. Levin76860f62006-10-11 22:55:25 +0000558 if ((tcpchild = alloctcb(tcp->u_rval)) == NULL)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000559 return 0;
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000560 if (proc_open(tcpchild, 2) < 0)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000561 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000562 }
563 return 0;
564}
565
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000566#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000567
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000568#ifdef LINUX
569
570/* defines copied from linux/sched.h since we can't include that
571 * ourselves (it conflicts with *lots* of libc includes)
572 */
573#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
574#define CLONE_VM 0x00000100 /* set if VM shared between processes */
575#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
576#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
577#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000578#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000579#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
580#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
581#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000582#define CLONE_THREAD 0x00010000 /* Same thread group? */
583#define CLONE_NEWNS 0x00020000 /* New namespace group? */
584#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
585#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
586#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
587#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
588#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
589#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
590#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000591
Roland McGrathd9f816f2004-09-04 03:39:20 +0000592static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000593 { CLONE_VM, "CLONE_VM" },
594 { CLONE_FS, "CLONE_FS" },
595 { CLONE_FILES, "CLONE_FILES" },
596 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000597 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000598 { CLONE_PTRACE, "CLONE_PTRACE" },
599 { CLONE_VFORK, "CLONE_VFORK" },
600 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000601 { CLONE_THREAD, "CLONE_THREAD" },
602 { CLONE_NEWNS, "CLONE_NEWNS" },
603 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
604 { CLONE_SETTLS, "CLONE_SETTLS" },
605 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
606 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
607 { CLONE_DETACHED, "CLONE_DETACHED" },
608 { CLONE_UNTRACED, "CLONE_UNTRACED" },
609 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000610 { 0, NULL },
611};
612
Roland McGrath909875b2002-12-22 03:34:36 +0000613# ifdef I386
614# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000615# ifdef HAVE_STRUCT_USER_DESC
616# define modify_ldt_ldt_s user_desc
617# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000618extern void print_ldt_entry();
619# endif
620
Roland McGrath9677b3a2003-03-12 09:54:36 +0000621# if defined IA64
622# define ARG_FLAGS 0
623# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000624# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
625# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
626# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
627# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000628# elif defined S390 || defined S390X
Roland McGrath9677b3a2003-03-12 09:54:36 +0000629# define ARG_STACK 0
630# define ARG_FLAGS 1
631# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000632# define ARG_CTID 3
633# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000634# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000635# define ARG_FLAGS 0
636# define ARG_STACK 1
637# define ARG_PTID 2
638# define ARG_CTID 3
639# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000640# else
641# define ARG_FLAGS 0
642# define ARG_STACK 1
643# define ARG_PTID 2
644# define ARG_TLS 3
645# define ARG_CTID 4
646# endif
647
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000648int
649sys_clone(tcp)
650struct tcb *tcp;
651{
652 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000653 unsigned long flags = tcp->u_arg[ARG_FLAGS];
654 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
655# ifdef ARG_STACKSIZE
656 if (ARG_STACKSIZE != -1)
657 tprintf("stack_size=%#lx, ",
658 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000659# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000660 tprintf("flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000661 printflags(clone_flags, flags &~ CSIGNAL, NULL);
Roland McGrath984154d2003-05-23 01:08:42 +0000662 if ((flags & CSIGNAL) != 0)
663 tprintf("|%s", signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000664 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000665 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000666 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000667 if (flags & CLONE_PARENT_SETTID)
668 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000669 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000670# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000671 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000672 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000673 tprintf(", {entry_number:%d, ",
674 copy.entry_number);
675 if (!verbose(tcp))
676 tprintf("...}");
677 else
678 print_ldt_entry(&copy);
679 }
680 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000681# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000682 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000683 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000684 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
685 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000686 }
687 return 0;
688}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000689
690int
691sys_unshare(struct tcb *tcp)
692{
693 if (entering(tcp))
694 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
695 return 0;
696}
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000697#endif
698
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000699int
700sys_fork(tcp)
701struct tcb *tcp;
702{
703 if (exiting(tcp))
704 return RVAL_UDECIMAL;
705 return 0;
706}
707
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000708int
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000709change_syscall(tcp, new)
710struct tcb *tcp;
711int new;
712{
713#if defined(LINUX)
714#if defined(I386)
715 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000716 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000717 return -1;
718 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000719#elif defined(X86_64)
720 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000721 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000722 return -1;
723 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000724#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000725 if (ptrace(PTRACE_POKEUSER, tcp->pid,
726 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000727 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000728 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000729#elif defined(S390) || defined(S390X)
730 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
731 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
732 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000733 return 0;
734#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000735 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000736 return -1;
737 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000738#elif defined(SPARC) || defined(SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000739 struct regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000740 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
741 return -1;
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000742 regs.r_g1=new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000743 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
744 return -1;
745 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000746#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000747 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000748 return -1;
749 return 0;
750#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000751 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000752 return -1;
753 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000754#elif defined(BFIN)
755 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
756 return -1;
757 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000758#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000759 if (ia32) {
760 switch (new) {
761 case 2: break; /* x86 SYS_fork */
762 case SYS_clone: new = 120; break;
763 default:
764 fprintf(stderr, "%s: unexpected syscall %d\n",
765 __FUNCTION__, new);
766 return -1;
767 }
768 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
769 return -1;
770 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000771 return -1;
772 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000773#elif defined(HPPA)
774 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
775 return -1;
776 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000777#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000778 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
779 return -1;
780 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000781#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000782 /* Top half of reg encodes the no. of args n as 0x1n.
783 Assume 0 args as kernel never actually checks... */
784 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
785 0x100000 | new) < 0)
786 return -1;
787 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000788#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000789 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000790# ifndef PTRACE_SET_SYSCALL
791# define PTRACE_SET_SYSCALL 23
792# endif
793
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000794 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000795 return -1;
796
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000797 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000798#else
799#warning Do not know how to handle change_syscall for this architecture
800#endif /* architecture */
801#endif /* LINUX */
802 return -1;
803}
804
Roland McGratha4d48532005-06-08 20:45:28 +0000805#if 0
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000806int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000807setarg(tcp, argnum)
808 struct tcb *tcp;
809 int argnum;
810{
811#if defined (IA64)
812 {
813 unsigned long *bsp, *ap;
814
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000815 if (upeek(tcp, PT_AR_BSP, (long *) &bsp) , 0)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000816 return -1;
817
818 ap = ia64_rse_skip_regs(bsp, argnum);
819 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000820 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000821 if (errno)
822 return -1;
823
824 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000825#elif defined(I386)
826 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000827 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000828 if (errno)
829 return -1;
830 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000831#elif defined(X86_64)
832 {
833 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
834 if (errno)
835 return -1;
836 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000837#elif defined(POWERPC)
838#ifndef PT_ORIG_R3
839#define PT_ORIG_R3 34
840#endif
841 {
842 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000843 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000844 tcp->u_arg[argnum]);
845 if (errno)
846 return -1;
847 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000848#elif defined(MIPS)
849 {
850 errno = 0;
851 if (argnum < 4)
852 ptrace(PTRACE_POKEUSER, tcp->pid,
853 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
854 else {
855 unsigned long *sp;
856
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000857 if (upeek(tcp, REG_SP, (long *) &sp) , 0)
Ralf Baechlee3816102000-08-01 00:06:06 +0000858 return -1;
859
860 ptrace(PTRACE_POKEDATA, tcp->pid,
861 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
862 }
863 if (errno)
864 return -1;
865 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000866#elif defined(S390) || defined(S390X)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000867 {
Michal Ludvig10a88d02002-10-07 14:31:00 +0000868 if(argnum <= 5)
869 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000870 (char *) (argnum==0 ? PT_ORIGGPR2 :
871 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000872 tcp->u_arg[argnum]);
873 else
874 return -E2BIG;
875 if (errno)
876 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000877 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000878#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000879# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000880#endif
881 return 0;
882}
Roland McGratha4d48532005-06-08 20:45:28 +0000883#endif
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000884
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000885#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000886int
887internal_clone(tcp)
888struct tcb *tcp;
889{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000890 struct tcb *tcpchild;
891 int pid;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000892 if (entering(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000893 if (!followfork)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000894 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000895 if (fork_tcb(tcp))
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000896 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000897 if (setbpt(tcp) < 0)
898 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000899 } else {
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000900 int bpt = tcp->flags & TCB_BPTSET;
901
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000902 if (!(tcp->flags & TCB_FOLLOWFORK))
903 return 0;
904
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000905 if (syserror(tcp)) {
906 if (bpt)
907 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000908 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000909 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000910
911 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000912
913#ifdef CLONE_PTRACE /* See new setbpt code. */
914 tcpchild = pid2tcb(pid);
915 if (tcpchild != NULL) {
916 /* The child already reported its startup trap
917 before the parent reported its syscall return. */
918 if ((tcpchild->flags
919 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
920 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
921 fprintf(stderr, "\
922[preattached child %d of %d in weird state!]\n",
923 pid, tcp->pid);
924 }
925 else
926#endif
Dmitry V. Levin76860f62006-10-11 22:55:25 +0000927 if (fork_tcb(tcp) || (tcpchild = alloctcb(pid)) == NULL) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000928 if (bpt)
929 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000930 kill(pid, SIGKILL); /* XXX */
931 return 0;
932 }
933
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000934#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000935 /* Attach to the new child */
936 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000937 if (bpt)
938 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000939 perror("PTRACE_ATTACH");
940 fprintf(stderr, "Too late?\n");
941 droptcb(tcpchild);
942 return 0;
943 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000944#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000945
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000946 if (bpt)
947 clearbpt(tcp);
948
Ulrich Drepper90512f01999-12-24 07:22:25 +0000949 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000950 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000951 if (bpt) {
952 tcpchild->flags |= TCB_BPTSET;
953 tcpchild->baddr = tcp->baddr;
954 memcpy(tcpchild->inst, tcp->inst,
955 sizeof tcpchild->inst);
956 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000957 tcpchild->parent = tcp;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000958 tcp->nchildren++;
959 if (tcpchild->flags & TCB_SUSPENDED) {
960 /* The child was born suspended, due to our having
961 forced CLONE_PTRACE. */
962 if (bpt)
963 clearbpt(tcpchild);
964
965 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000966 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000967 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000968
969 if (!qflag)
970 fprintf(stderr, "\
971Process %u resumed (parent %d ready)\n",
972 pid, tcp->pid);
973 }
974 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000975 if (!qflag)
976 fprintf(stderr, "Process %d attached\n", pid);
977 }
978
979#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000980 {
981 /*
982 * Save the flags used in this call,
983 * in case we point TCP to our parent below.
984 */
985 int call_flags = tcp->u_arg[ARG_FLAGS];
986 if ((tcp->flags & TCB_CLONE_THREAD) &&
987 tcp->parent != NULL) {
988 /* The parent in this clone is itself a
989 thread belonging to another process.
990 There is no meaning to the parentage
991 relationship of the new child with the
992 thread, only with the process. We
993 associate the new thread with our
994 parent. Since this is done for every
995 new thread, there will never be a
996 TCB_CLONE_THREAD process that has
997 children. */
998 --tcp->nchildren;
999 tcp = tcp->parent;
1000 tcpchild->parent = tcp;
1001 ++tcp->nchildren;
1002 }
1003 if (call_flags & CLONE_THREAD) {
1004 tcpchild->flags |= TCB_CLONE_THREAD;
1005 ++tcp->nclone_threads;
1006 }
1007 if (call_flags & CLONE_DETACHED) {
1008 tcpchild->flags |= TCB_CLONE_DETACHED;
1009 ++tcp->nclone_detached;
1010 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001011 }
1012#endif
1013
1014 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001015 return 0;
1016}
1017#endif
1018
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001019int
1020internal_fork(tcp)
1021struct tcb *tcp;
1022{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001023#ifdef LINUX
1024 /* We do special magic with clone for any clone or fork. */
1025 return internal_clone(tcp);
1026#else
1027
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001028 struct tcb *tcpchild;
1029 int pid;
Nate Sammonsccd8f211999-03-29 22:57:54 +00001030 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001031
1032#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +00001033 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +00001034 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +00001035 if (change_syscall(tcp, SYS_fork) < 0)
Nate Sammonsccd8f211999-03-29 22:57:54 +00001036 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +00001037 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001038#endif
1039 if (entering(tcp)) {
Nate Sammonsccd8f211999-03-29 22:57:54 +00001040 if (!followfork || dont_follow)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001041 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +00001042 if (fork_tcb(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001043 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001044 if (setbpt(tcp) < 0)
1045 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001046 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001047 else {
1048 int bpt = tcp->flags & TCB_BPTSET;
1049
1050 if (!(tcp->flags & TCB_FOLLOWFORK))
1051 return 0;
1052 if (bpt)
1053 clearbpt(tcp);
1054
1055 if (syserror(tcp))
1056 return 0;
1057
1058 pid = tcp->u_rval;
Dmitry V. Levin76860f62006-10-11 22:55:25 +00001059 if (fork_tcb(tcp) || (tcpchild = alloctcb(pid)) == NULL) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001060 kill(pid, SIGKILL); /* XXX */
1061 return 0;
1062 }
1063#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +00001064#ifdef HPPA
1065 /* The child must have run before it can be attached. */
1066 /* This must be a bug in the parisc kernel, but I havn't
1067 * identified it yet. Seems to be an issue associated
1068 * with attaching to a process (which sends it a signal)
1069 * before that process has ever been scheduled. When
1070 * debugging, I started seeing crashes in
1071 * arch/parisc/kernel/signal.c:do_signal(), apparently
1072 * caused by r8 getting corrupt over the dequeue_signal()
1073 * call. Didn't make much sense though...
1074 */
1075 {
1076 struct timeval tv;
1077 tv.tv_sec = 0;
1078 tv.tv_usec = 10000;
1079 select(0, NULL, NULL, NULL, &tv);
1080 }
1081#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001082 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
1083 perror("PTRACE_ATTACH");
1084 fprintf(stderr, "Too late?\n");
1085 droptcb(tcpchild);
1086 return 0;
1087 }
1088#endif /* LINUX */
1089#ifdef SUNOS4
1090#ifdef oldway
1091 /* The child must have run before it can be attached. */
1092 {
1093 struct timeval tv;
1094 tv.tv_sec = 0;
1095 tv.tv_usec = 10000;
1096 select(0, NULL, NULL, NULL, &tv);
1097 }
1098 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1099 perror("PTRACE_ATTACH");
1100 fprintf(stderr, "Too late?\n");
1101 droptcb(tcpchild);
1102 return 0;
1103 }
1104#else /* !oldway */
1105 /* Try to catch the new process as soon as possible. */
1106 {
1107 int i;
1108 for (i = 0; i < 1024; i++)
1109 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1110 break;
1111 if (i == 1024) {
1112 perror("PTRACE_ATTACH");
1113 fprintf(stderr, "Too late?\n");
1114 droptcb(tcpchild);
1115 return 0;
1116 }
1117 }
1118#endif /* !oldway */
1119#endif /* SUNOS4 */
1120 tcpchild->flags |= TCB_ATTACHED;
1121 /* Child has BPT too, must be removed on first occasion */
1122 if (bpt) {
1123 tcpchild->flags |= TCB_BPTSET;
1124 tcpchild->baddr = tcp->baddr;
1125 memcpy(tcpchild->inst, tcp->inst,
1126 sizeof tcpchild->inst);
1127 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001128 tcpchild->parent = tcp;
1129 tcp->nchildren++;
1130 if (!qflag)
1131 fprintf(stderr, "Process %d attached\n", pid);
1132 }
1133 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001134#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001135}
1136
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001137#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001138
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001139#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001140
1141int
1142sys_vfork(tcp)
1143struct tcb *tcp;
1144{
1145 if (exiting(tcp))
1146 return RVAL_UDECIMAL;
1147 return 0;
1148}
1149
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001150#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001151
1152#ifndef LINUX
1153
1154static char idstr[16];
1155
1156int
1157sys_getpid(tcp)
1158struct tcb *tcp;
1159{
1160 if (exiting(tcp)) {
1161 sprintf(idstr, "ppid %lu", getrval2(tcp));
1162 tcp->auxstr = idstr;
1163 return RVAL_STR;
1164 }
1165 return 0;
1166}
1167
1168int
1169sys_getuid(tcp)
1170struct tcb *tcp;
1171{
1172 if (exiting(tcp)) {
1173 sprintf(idstr, "euid %lu", getrval2(tcp));
1174 tcp->auxstr = idstr;
1175 return RVAL_STR;
1176 }
1177 return 0;
1178}
1179
1180int
1181sys_getgid(tcp)
1182struct tcb *tcp;
1183{
1184 if (exiting(tcp)) {
1185 sprintf(idstr, "egid %lu", getrval2(tcp));
1186 tcp->auxstr = idstr;
1187 return RVAL_STR;
1188 }
1189 return 0;
1190}
1191
1192#endif /* !LINUX */
1193
1194#ifdef LINUX
1195
1196int
1197sys_setuid(tcp)
1198struct tcb *tcp;
1199{
1200 if (entering(tcp)) {
1201 tprintf("%u", (uid_t) tcp->u_arg[0]);
1202 }
1203 return 0;
1204}
1205
1206int
1207sys_setgid(tcp)
1208struct tcb *tcp;
1209{
1210 if (entering(tcp)) {
1211 tprintf("%u", (gid_t) tcp->u_arg[0]);
1212 }
1213 return 0;
1214}
1215
1216int
1217sys_getresuid(tcp)
1218 struct tcb *tcp;
1219{
1220 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001221 __kernel_uid_t uid;
1222 if (syserror(tcp))
1223 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1224 tcp->u_arg[1], tcp->u_arg[2]);
1225 else {
1226 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1227 tprintf("%#lx, ", tcp->u_arg[0]);
1228 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001229 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001230 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1231 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001232 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001233 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001234 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1235 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001236 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001237 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001238 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001239 }
1240 return 0;
1241}
1242
1243int
1244sys_getresgid(tcp)
1245struct tcb *tcp;
1246{
1247 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001248 __kernel_gid_t gid;
1249 if (syserror(tcp))
1250 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1251 tcp->u_arg[1], tcp->u_arg[2]);
1252 else {
1253 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1254 tprintf("%#lx, ", tcp->u_arg[0]);
1255 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001256 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001257 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1258 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001259 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001260 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001261 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1262 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001263 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001264 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001265 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001266 }
1267 return 0;
1268}
1269
1270#endif /* LINUX */
1271
1272int
1273sys_setreuid(tcp)
1274struct tcb *tcp;
1275{
1276 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001277 printuid("", tcp->u_arg[0]);
1278 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001279 }
1280 return 0;
1281}
1282
1283int
1284sys_setregid(tcp)
1285struct tcb *tcp;
1286{
1287 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001288 printuid("", tcp->u_arg[0]);
1289 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001290 }
1291 return 0;
1292}
1293
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001294#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001295int
1296sys_setresuid(tcp)
1297 struct tcb *tcp;
1298{
1299 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001300 printuid("", tcp->u_arg[0]);
1301 printuid(", ", tcp->u_arg[1]);
1302 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001303 }
1304 return 0;
1305}
1306int
1307sys_setresgid(tcp)
1308 struct tcb *tcp;
1309{
1310 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001311 printuid("", tcp->u_arg[0]);
1312 printuid(", ", tcp->u_arg[1]);
1313 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001314 }
1315 return 0;
1316}
1317
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001318#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001319
1320int
1321sys_setgroups(tcp)
1322struct tcb *tcp;
1323{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001324 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001325 unsigned long len, size, start, cur, end, abbrev_end;
1326 GETGROUPS_T gid;
1327 int failed = 0;
1328
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001329 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001330 tprintf("%lu, ", len);
1331 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001332 tprintf("[]");
1333 return 0;
1334 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001335 start = tcp->u_arg[1];
1336 if (start == 0) {
1337 tprintf("NULL");
1338 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001339 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001340 size = len * sizeof(gid);
1341 end = start + size;
1342 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1343 tprintf("%#lx", start);
1344 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001345 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001346 if (abbrev(tcp)) {
1347 abbrev_end = start + max_strlen * sizeof(gid);
1348 if (abbrev_end < start)
1349 abbrev_end = end;
1350 } else {
1351 abbrev_end = end;
1352 }
1353 tprintf("[");
1354 for (cur = start; cur < end; cur += sizeof(gid)) {
1355 if (cur > start)
1356 tprintf(", ");
1357 if (cur >= abbrev_end) {
1358 tprintf("...");
1359 break;
1360 }
1361 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1362 tprintf("?");
1363 failed = 1;
1364 break;
1365 }
1366 tprintf("%lu", (unsigned long) gid);
1367 }
1368 tprintf("]");
1369 if (failed)
1370 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001371 }
1372 return 0;
1373}
1374
1375int
1376sys_getgroups(tcp)
1377struct tcb *tcp;
1378{
Roland McGrathaa524c82005-06-01 19:22:06 +00001379 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001380
1381 if (entering(tcp)) {
1382 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001383 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001384 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001385 unsigned long size, start, cur, end, abbrev_end;
1386 GETGROUPS_T gid;
1387 int failed = 0;
1388
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001389 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001390 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001391 tprintf("[]");
1392 return 0;
1393 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001394 start = tcp->u_arg[1];
1395 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001396 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001397 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001398 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001399 if (tcp->u_arg[0] == 0) {
1400 tprintf("%#lx", start);
1401 return 0;
1402 }
1403 size = len * sizeof(gid);
1404 end = start + size;
1405 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1406 size / sizeof(gid) != len || end < start) {
1407 tprintf("%#lx", start);
1408 return 0;
1409 }
1410 if (abbrev(tcp)) {
1411 abbrev_end = start + max_strlen * sizeof(gid);
1412 if (abbrev_end < start)
1413 abbrev_end = end;
1414 } else {
1415 abbrev_end = end;
1416 }
1417 tprintf("[");
1418 for (cur = start; cur < end; cur += sizeof(gid)) {
1419 if (cur > start)
1420 tprintf(", ");
1421 if (cur >= abbrev_end) {
1422 tprintf("...");
1423 break;
1424 }
1425 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1426 tprintf("?");
1427 failed = 1;
1428 break;
1429 }
1430 tprintf("%lu", (unsigned long) gid);
1431 }
1432 tprintf("]");
1433 if (failed)
1434 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001435 }
1436 return 0;
1437}
1438
Roland McGrath83bd47a2003-11-13 22:32:26 +00001439#ifdef LINUX
1440int
1441sys_setgroups32(tcp)
1442struct tcb *tcp;
1443{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001444 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001445 unsigned long len, size, start, cur, end, abbrev_end;
1446 GETGROUPS32_T gid;
1447 int failed = 0;
1448
Roland McGrath83bd47a2003-11-13 22:32:26 +00001449 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001450 tprintf("%lu, ", len);
1451 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001452 tprintf("[]");
1453 return 0;
1454 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001455 start = tcp->u_arg[1];
1456 if (start == 0) {
1457 tprintf("NULL");
1458 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001459 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001460 size = len * sizeof(gid);
1461 end = start + size;
1462 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1463 tprintf("%#lx", start);
1464 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001465 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001466 if (abbrev(tcp)) {
1467 abbrev_end = start + max_strlen * sizeof(gid);
1468 if (abbrev_end < start)
1469 abbrev_end = end;
1470 } else {
1471 abbrev_end = end;
1472 }
1473 tprintf("[");
1474 for (cur = start; cur < end; cur += sizeof(gid)) {
1475 if (cur > start)
1476 tprintf(", ");
1477 if (cur >= abbrev_end) {
1478 tprintf("...");
1479 break;
1480 }
1481 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1482 tprintf("?");
1483 failed = 1;
1484 break;
1485 }
1486 tprintf("%lu", (unsigned long) gid);
1487 }
1488 tprintf("]");
1489 if (failed)
1490 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001491 }
1492 return 0;
1493}
1494
1495int
1496sys_getgroups32(tcp)
1497struct tcb *tcp;
1498{
Roland McGrathaa524c82005-06-01 19:22:06 +00001499 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001500
1501 if (entering(tcp)) {
1502 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001503 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001504 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001505 unsigned long size, start, cur, end, abbrev_end;
1506 GETGROUPS32_T gid;
1507 int failed = 0;
1508
Roland McGrath83bd47a2003-11-13 22:32:26 +00001509 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001510 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001511 tprintf("[]");
1512 return 0;
1513 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001514 start = tcp->u_arg[1];
1515 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001516 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001517 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001518 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001519 size = len * sizeof(gid);
1520 end = start + size;
1521 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1522 size / sizeof(gid) != len || end < start) {
1523 tprintf("%#lx", start);
1524 return 0;
1525 }
1526 if (abbrev(tcp)) {
1527 abbrev_end = start + max_strlen * sizeof(gid);
1528 if (abbrev_end < start)
1529 abbrev_end = end;
1530 } else {
1531 abbrev_end = end;
1532 }
1533 tprintf("[");
1534 for (cur = start; cur < end; cur += sizeof(gid)) {
1535 if (cur > start)
1536 tprintf(", ");
1537 if (cur >= abbrev_end) {
1538 tprintf("...");
1539 break;
1540 }
1541 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1542 tprintf("?");
1543 failed = 1;
1544 break;
1545 }
1546 tprintf("%lu", (unsigned long) gid);
1547 }
1548 tprintf("]");
1549 if (failed)
1550 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001551 }
1552 return 0;
1553}
1554#endif /* LINUX */
1555
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001556#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001557int
1558sys_setpgrp(tcp)
1559struct tcb *tcp;
1560{
1561 if (entering(tcp)) {
1562#ifndef SVR4
1563 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1564#endif /* !SVR4 */
1565 }
1566 return 0;
1567}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001568#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001569
1570int
1571sys_getpgrp(tcp)
1572struct tcb *tcp;
1573{
1574 if (entering(tcp)) {
1575#ifndef SVR4
1576 tprintf("%lu", tcp->u_arg[0]);
1577#endif /* !SVR4 */
1578 }
1579 return 0;
1580}
1581
1582int
1583sys_getsid(tcp)
1584struct tcb *tcp;
1585{
1586 if (entering(tcp)) {
1587 tprintf("%lu", tcp->u_arg[0]);
1588 }
1589 return 0;
1590}
1591
1592int
1593sys_setsid(tcp)
1594struct tcb *tcp;
1595{
1596 return 0;
1597}
1598
1599int
1600sys_getpgid(tcp)
1601struct tcb *tcp;
1602{
1603 if (entering(tcp)) {
1604 tprintf("%lu", tcp->u_arg[0]);
1605 }
1606 return 0;
1607}
1608
1609int
1610sys_setpgid(tcp)
1611struct tcb *tcp;
1612{
1613 if (entering(tcp)) {
1614 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1615 }
1616 return 0;
1617}
1618
John Hughesc61eb3d2002-05-17 11:37:50 +00001619#if UNIXWARE >= 2
1620
1621#include <sys/privilege.h>
1622
1623
Roland McGrathd9f816f2004-09-04 03:39:20 +00001624static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001625 { SETPRV, "SETPRV" },
1626 { CLRPRV, "CLRPRV" },
1627 { PUTPRV, "PUTPRV" },
1628 { GETPRV, "GETPRV" },
1629 { CNTPRV, "CNTPRV" },
1630 { 0, NULL },
1631};
1632
1633
Roland McGrathd9f816f2004-09-04 03:39:20 +00001634static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001635 { P_OWNER, "P_OWNER" },
1636 { P_AUDIT, "P_AUDIT" },
1637 { P_COMPAT, "P_COMPAT" },
1638 { P_DACREAD, "P_DACREAD" },
1639 { P_DACWRITE, "P_DACWRITE" },
1640 { P_DEV, "P_DEV" },
1641 { P_FILESYS, "P_FILESYS" },
1642 { P_MACREAD, "P_MACREAD" },
1643 { P_MACWRITE, "P_MACWRITE" },
1644 { P_MOUNT, "P_MOUNT" },
1645 { P_MULTIDIR, "P_MULTIDIR" },
1646 { P_SETPLEVEL, "P_SETPLEVEL" },
1647 { P_SETSPRIV, "P_SETSPRIV" },
1648 { P_SETUID, "P_SETUID" },
1649 { P_SYSOPS, "P_SYSOPS" },
1650 { P_SETUPRIV, "P_SETUPRIV" },
1651 { P_DRIVER, "P_DRIVER" },
1652 { P_RTIME, "P_RTIME" },
1653 { P_MACUPGRADE, "P_MACUPGRADE" },
1654 { P_FSYSRANGE, "P_FSYSRANGE" },
1655 { P_SETFLEVEL, "P_SETFLEVEL" },
1656 { P_AUDITWR, "P_AUDITWR" },
1657 { P_TSHAR, "P_TSHAR" },
1658 { P_PLOCK, "P_PLOCK" },
1659 { P_CORE, "P_CORE" },
1660 { P_LOADMOD, "P_LOADMOD" },
1661 { P_BIND, "P_BIND" },
1662 { P_ALLPRIVS, "P_ALLPRIVS" },
1663 { 0, NULL },
1664};
1665
1666
Roland McGrathd9f816f2004-09-04 03:39:20 +00001667static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001668 { PS_FIX, "PS_FIX" },
1669 { PS_INH, "PS_INH" },
1670 { PS_MAX, "PS_MAX" },
1671 { PS_WKG, "PS_WKG" },
1672 { 0, NULL },
1673};
1674
1675
1676static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001677printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001678{
1679 priv_t buf [128];
1680 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1681 int dots = len > max;
1682 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001683
John Hughesc61eb3d2002-05-17 11:37:50 +00001684 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001685
John Hughesc61eb3d2002-05-17 11:37:50 +00001686 if (len <= 0 ||
1687 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1688 {
1689 tprintf ("%#lx", addr);
1690 return;
1691 }
1692
1693 tprintf ("[");
1694
1695 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001696 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001697
1698 if (i) tprintf (", ");
1699
1700 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1701 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1702 {
1703 tprintf ("%s|%s", t, p);
1704 }
1705 else {
1706 tprintf ("%#lx", buf [i]);
1707 }
1708 }
1709
1710 if (dots) tprintf (" ...");
1711
1712 tprintf ("]");
1713}
1714
1715
1716int
1717sys_procpriv(tcp)
1718struct tcb *tcp;
1719{
1720 if (entering(tcp)) {
1721 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1722 switch (tcp->u_arg[0]) {
1723 case CNTPRV:
1724 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1725 break;
1726
1727 case GETPRV:
1728 break;
1729
1730 default:
1731 tprintf (", ");
1732 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1733 tprintf (", %ld", tcp->u_arg[2]);
1734 }
1735 }
1736 else if (tcp->u_arg[0] == GETPRV) {
1737 if (syserror (tcp)) {
1738 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1739 }
1740 else {
1741 tprintf (", ");
1742 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1743 tprintf (", %ld", tcp->u_arg[2]);
1744 }
1745 }
Roland McGrath5a223472002-12-15 23:58:26 +00001746
John Hughesc61eb3d2002-05-17 11:37:50 +00001747 return 0;
1748}
1749
1750#endif
1751
1752
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001753static void
1754printargv(tcp, addr)
1755struct tcb *tcp;
1756long addr;
1757{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001758 union {
1759 int p32;
1760 long p64;
1761 char data[sizeof(long)];
1762 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001763 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001764 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001765
Roland McGrath85a3bc42007-08-02 02:13:05 +00001766 cp.p64 = 1;
1767 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1768 if (umoven(tcp, addr, personality_wordsize[current_personality],
1769 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001770 tprintf("%#lx", addr);
1771 return;
1772 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001773 if (personality_wordsize[current_personality] == 4)
1774 cp.p64 = cp.p32;
1775 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001776 break;
1777 tprintf(sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001778 printstr(tcp, cp.p64, -1);
1779 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001780 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001781 if (cp.p64)
1782 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001783}
1784
1785static void
1786printargc(fmt, tcp, addr)
1787char *fmt;
1788struct tcb *tcp;
1789long addr;
1790{
1791 int count;
1792 char *cp;
1793
1794 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1795 addr += sizeof(char *);
1796 }
1797 tprintf(fmt, count, count == 1 ? "" : "s");
1798}
1799
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001800#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001801int
1802sys_execv(tcp)
1803struct tcb *tcp;
1804{
1805 if (entering(tcp)) {
1806 printpath(tcp, tcp->u_arg[0]);
1807 if (!verbose(tcp))
1808 tprintf(", %#lx", tcp->u_arg[1]);
1809#if 0
1810 else if (abbrev(tcp))
1811 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1812#endif
1813 else {
1814 tprintf(", [");
1815 printargv(tcp, tcp->u_arg[1]);
1816 tprintf("]");
1817 }
1818 }
1819 return 0;
1820}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001821#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001822
1823int
1824sys_execve(tcp)
1825struct tcb *tcp;
1826{
1827 if (entering(tcp)) {
1828 printpath(tcp, tcp->u_arg[0]);
1829 if (!verbose(tcp))
1830 tprintf(", %#lx", tcp->u_arg[1]);
1831#if 0
1832 else if (abbrev(tcp))
1833 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1834#endif
1835 else {
1836 tprintf(", [");
1837 printargv(tcp, tcp->u_arg[1]);
1838 tprintf("]");
1839 }
1840 if (!verbose(tcp))
1841 tprintf(", %#lx", tcp->u_arg[2]);
1842 else if (abbrev(tcp))
1843 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1844 else {
1845 tprintf(", [");
1846 printargv(tcp, tcp->u_arg[2]);
1847 tprintf("]");
1848 }
1849 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001850 return 0;
1851}
1852
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001853#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001854
1855int sys_rexecve(tcp)
1856struct tcb *tcp;
1857{
1858 if (entering (tcp)) {
1859 sys_execve (tcp);
1860 tprintf (", %ld", tcp->u_arg[3]);
1861 }
1862 return 0;
1863}
1864
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001865#endif
John Hughes4e36a812001-04-18 15:11:51 +00001866
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001867int
1868internal_exec(tcp)
1869struct tcb *tcp;
1870{
1871#ifdef SUNOS4
1872 if (exiting(tcp) && !syserror(tcp) && followfork)
1873 fixvfork(tcp);
1874#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001875#if defined LINUX && defined TCB_WAITEXECVE
1876 if (exiting(tcp) && syserror(tcp))
1877 tcp->flags &= ~TCB_WAITEXECVE;
1878 else
1879 tcp->flags |= TCB_WAITEXECVE;
1880#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001881 return 0;
1882}
1883
1884#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001885#ifndef __WNOTHREAD
1886#define __WNOTHREAD 0x20000000
1887#endif
1888#ifndef __WALL
1889#define __WALL 0x40000000
1890#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001891#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001892#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001893#endif
1894#endif /* LINUX */
1895
Roland McGrathd9f816f2004-09-04 03:39:20 +00001896static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001897 { WNOHANG, "WNOHANG" },
1898#ifndef WSTOPPED
1899 { WUNTRACED, "WUNTRACED" },
1900#endif
1901#ifdef WEXITED
1902 { WEXITED, "WEXITED" },
1903#endif
1904#ifdef WTRAPPED
1905 { WTRAPPED, "WTRAPPED" },
1906#endif
1907#ifdef WSTOPPED
1908 { WSTOPPED, "WSTOPPED" },
1909#endif
1910#ifdef WCONTINUED
1911 { WCONTINUED, "WCONTINUED" },
1912#endif
1913#ifdef WNOWAIT
1914 { WNOWAIT, "WNOWAIT" },
1915#endif
1916#ifdef __WCLONE
1917 { __WCLONE, "__WCLONE" },
1918#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001919#ifdef __WALL
1920 { __WALL, "__WALL" },
1921#endif
1922#ifdef __WNOTHREAD
1923 { __WNOTHREAD, "__WNOTHREAD" },
1924#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001925 { 0, NULL },
1926};
1927
Roland McGrath5e02a572004-10-19 23:33:47 +00001928#if !defined WCOREFLAG && defined WCOREFLG
1929# define WCOREFLAG WCOREFLG
1930#endif
1931#ifndef WCOREFLAG
1932#define WCOREFLAG 0x80
1933#endif
1934
1935#ifndef W_STOPCODE
1936#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1937#endif
1938#ifndef W_EXITCODE
1939#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1940#endif
1941
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001942static int
1943printstatus(status)
1944int status;
1945{
1946 int exited = 0;
1947
1948 /*
1949 * Here is a tricky presentation problem. This solution
1950 * is still not entirely satisfactory but since there
1951 * are no wait status constructors it will have to do.
1952 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001953 if (WIFSTOPPED(status)) {
1954 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001955 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001956 status &= ~W_STOPCODE(WSTOPSIG(status));
1957 }
1958 else if (WIFSIGNALED(status)) {
1959 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001960 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001961 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001962 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1963 }
1964 else if (WIFEXITED(status)) {
1965 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001966 WEXITSTATUS(status));
1967 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001968 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001969 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001970 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001971 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001972 return 0;
1973 }
1974
1975 if (status == 0)
1976 tprintf("]");
1977 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001978 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001979
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001980 return exited;
1981}
1982
1983static int
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001984printwaitn(tcp, n, bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001985struct tcb *tcp;
1986int n;
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001987int bitness;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001988{
1989 int status;
1990 int exited = 0;
1991
1992 if (entering(tcp)) {
Roland McGrath5b63d962008-07-18 02:16:47 +00001993 /*
1994 * Sign-extend a 32-bit value when that's what it is.
1995 */
1996 long pid = tcp->u_arg[0];
1997 if (personality_wordsize[current_personality] < sizeof pid)
1998 pid = (long) (int) pid;
1999 tprintf("%ld, ", pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002000 } else {
2001 /* status */
2002 if (!tcp->u_arg[1])
2003 tprintf("NULL");
2004 else if (syserror(tcp) || tcp->u_rval == 0)
2005 tprintf("%#lx", tcp->u_arg[1]);
2006 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
2007 tprintf("[?]");
2008 else
2009 exited = printstatus(status);
2010 /* options */
2011 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002012 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002013 if (n == 4) {
2014 tprintf(", ");
2015 /* usage */
2016 if (!tcp->u_arg[3])
2017 tprintf("NULL");
2018#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002019 else if (tcp->u_rval > 0) {
2020#ifdef LINUX_64BIT
2021 if (bitness)
2022 printrusage32(tcp, tcp->u_arg[3]);
2023 else
2024#endif
2025 printrusage(tcp, tcp->u_arg[3]);
2026 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002027#endif /* LINUX */
2028#ifdef SUNOS4
2029 else if (tcp->u_rval > 0 && exited)
2030 printrusage(tcp, tcp->u_arg[3]);
2031#endif /* SUNOS4 */
2032 else
2033 tprintf("%#lx", tcp->u_arg[3]);
2034 }
2035 }
2036 return 0;
2037}
2038
2039int
Roland McGrathc74c0b72004-09-01 19:39:46 +00002040internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002041struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00002042int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002043{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002044 int got_kids;
2045
2046#ifdef TCB_CLONE_THREAD
2047 if (tcp->flags & TCB_CLONE_THREAD)
2048 /* The children we wait for are our parent's children. */
2049 got_kids = (tcp->parent->nchildren
2050 > tcp->parent->nclone_detached);
2051 else
2052 got_kids = (tcp->nchildren > tcp->nclone_detached);
2053#else
2054 got_kids = tcp->nchildren > 0;
2055#endif
2056
2057 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002058 /* There are children that this parent should block for.
2059 But ptrace made us the parent of the traced children
2060 and the real parent will get ECHILD from the wait call.
2061
2062 XXX If we attached with strace -f -p PID, then there
2063 may be untraced dead children the parent could be reaping
2064 now, but we make him block. */
2065
2066 /* ??? WTA: fix bug with hanging children */
2067
Roland McGrathc74c0b72004-09-01 19:39:46 +00002068 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00002069 /*
2070 * There are traced children. We'll make the parent
2071 * block to avoid a false ECHILD error due to our
2072 * ptrace having stolen the children. However,
2073 * we shouldn't block if there are zombies to reap.
2074 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
2075 */
Roland McGrathfccfb942003-10-01 21:59:44 +00002076 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00002077 if (tcp->nzombies > 0 &&
2078 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00002079 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00002080 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00002081 if (tcp->u_arg[0] > 0) {
2082 /*
2083 * If the parent waits for a specified child
2084 * PID, then it must get ECHILD right away
2085 * if that PID is not one of its children.
2086 * Make sure that the requested PID matches
2087 * one of the parent's children that we are
2088 * tracing, and don't suspend it otherwise.
2089 */
2090 if (child == NULL)
2091 child = pid2tcb(tcp->u_arg[0]);
2092 if (child == NULL || child->parent != (
2093#ifdef TCB_CLONE_THREAD
2094 (tcp->flags & TCB_CLONE_THREAD)
2095 ? tcp->parent :
2096#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002097 tcp) ||
2098 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002099 return 0;
2100 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002101 tcp->flags |= TCB_SUSPENDED;
2102 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002103#ifdef TCB_CLONE_THREAD
2104 if (tcp->flags & TCB_CLONE_THREAD)
2105 tcp->parent->nclone_waiting++;
2106#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002107 }
2108 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002109 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002110 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002111 /* We must force a fake result of 0 instead of
2112 the ECHILD error. */
2113 extern int force_result();
2114 return force_result(tcp, 0, 0);
2115 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002116 }
Roland McGrath09623452003-05-23 02:27:13 +00002117 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2118 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2119 /*
2120 * We just reaped a child we don't know about,
2121 * presumably a zombie we already droptcb'd.
2122 */
2123 tcp->nzombies--;
2124 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002125 return 0;
2126}
2127
2128#ifdef SVR4
2129
2130int
2131sys_wait(tcp)
2132struct tcb *tcp;
2133{
2134 if (exiting(tcp)) {
2135 /* The library wrapper stuffs this into the user variable. */
2136 if (!syserror(tcp))
2137 printstatus(getrval2(tcp));
2138 }
2139 return 0;
2140}
2141
2142#endif /* SVR4 */
2143
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002144#ifdef FREEBSD
2145int
2146sys_wait(tcp)
2147struct tcb *tcp;
2148{
2149 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002150
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002151 if (exiting(tcp)) {
2152 if (!syserror(tcp)) {
2153 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2154 tprintf("%#lx", tcp->u_arg[0]);
2155 else
2156 printstatus(status);
2157 }
2158 }
2159 return 0;
2160}
2161#endif
2162
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002163int
2164sys_waitpid(tcp)
2165struct tcb *tcp;
2166{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002167 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002168}
2169
2170int
2171sys_wait4(tcp)
2172struct tcb *tcp;
2173{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002174 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002175}
2176
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002177#ifdef ALPHA
2178int
2179sys_osf_wait4(tcp)
2180struct tcb *tcp;
2181{
2182 return printwaitn(tcp, 4, 1);
2183}
2184#endif
2185
Roland McGrathc74c0b72004-09-01 19:39:46 +00002186#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002187
Roland McGrathd9f816f2004-09-04 03:39:20 +00002188static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002189 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002190#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002191 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002192#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002193 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002194#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002195 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002196#endif
2197#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002198 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002199#endif
2200#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002201 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002202#endif
2203#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002204 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002205#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002206 { P_ALL, "P_ALL" },
2207#ifdef P_LWPID
2208 { P_LWPID, "P_LWPID" },
2209#endif
2210 { 0, NULL },
2211};
2212
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002213int
2214sys_waitid(tcp)
2215struct tcb *tcp;
2216{
2217 siginfo_t si;
2218 int exited;
2219
2220 if (entering(tcp)) {
2221 printxval(waitid_types, tcp->u_arg[0], "P_???");
2222 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002223 }
2224 else {
2225 /* siginfo */
2226 exited = 0;
2227 if (!tcp->u_arg[2])
2228 tprintf("NULL");
2229 else if (syserror(tcp))
2230 tprintf("%#lx", tcp->u_arg[2]);
2231 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2232 tprintf("{???}");
2233 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002234 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002235 /* options */
2236 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002237 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002238 if (tcp->u_nargs > 4) {
2239 /* usage */
2240 tprintf(", ");
2241 if (!tcp->u_arg[4])
2242 tprintf("NULL");
2243 else if (tcp->u_error)
2244 tprintf("%#lx", tcp->u_arg[4]);
2245 else
2246 printrusage(tcp, tcp->u_arg[4]);
2247 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002248 }
2249 return 0;
2250}
2251
Roland McGrathc74c0b72004-09-01 19:39:46 +00002252#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002253
2254int
2255sys_alarm(tcp)
2256struct tcb *tcp;
2257{
2258 if (entering(tcp))
2259 tprintf("%lu", tcp->u_arg[0]);
2260 return 0;
2261}
2262
2263int
2264sys_uname(tcp)
2265struct tcb *tcp;
2266{
2267 struct utsname uname;
2268
2269 if (exiting(tcp)) {
2270 if (syserror(tcp) || !verbose(tcp))
2271 tprintf("%#lx", tcp->u_arg[0]);
2272 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2273 tprintf("{...}");
2274 else if (!abbrev(tcp)) {
2275
2276 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2277 uname.sysname, uname.nodename);
2278 tprintf("release=\"%s\", version=\"%s\", ",
2279 uname.release, uname.version);
2280 tprintf("machine=\"%s\"", uname.machine);
2281#ifdef LINUX
2282#ifndef __GLIBC__
2283 tprintf(", domainname=\"%s\"", uname.domainname);
2284#endif /* __GLIBC__ */
2285#endif /* LINUX */
2286 tprintf("}");
2287 }
2288 else
2289 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2290 uname.sysname, uname.nodename);
2291 }
2292 return 0;
2293}
2294
2295#ifndef SVR4
2296
Roland McGrathd9f816f2004-09-04 03:39:20 +00002297static const struct xlat ptrace_cmds[] = {
Roland McGrath5a223472002-12-15 23:58:26 +00002298#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002299 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2300 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2301 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2302 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2303 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2304 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2305 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2306 { PTRACE_CONT, "PTRACE_CONT" },
2307 { PTRACE_KILL, "PTRACE_KILL" },
2308 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2309 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2310 { PTRACE_DETACH, "PTRACE_DETACH" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002311#ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002312 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002313#endif
2314#ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002315 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002316#endif
2317#ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002318 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002319#endif
2320#ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002321 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002322#endif
2323#ifdef PTRACE_GETFPXREGS
2324 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2325#endif
2326#ifdef PTRACE_SETFPXREGS
2327 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2328#endif
Roland McGrathf04bb482005-05-09 07:45:33 +00002329#ifdef PTRACE_GETVRREGS
2330 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
2331#endif
2332#ifdef PTRACE_SETVRREGS
2333 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
2334#endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002335#ifdef PTRACE_SETOPTIONS
2336 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
2337#endif
2338#ifdef PTRACE_GETEVENTMSG
2339 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
2340#endif
2341#ifdef PTRACE_GETSIGINFO
2342 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
2343#endif
2344#ifdef PTRACE_SETSIGINFO
2345 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
2346#endif
Roland McGrathbf621d42003-01-14 09:46:21 +00002347#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002348 { PTRACE_READDATA, "PTRACE_READDATA" },
2349 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2350 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2351 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2352 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2353 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2354#ifdef SPARC
2355 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2356 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2357#else /* !SPARC */
2358 { PTRACE_22, "PTRACE_PTRACE_22" },
2359 { PTRACE_23, "PTRACE_PTRACE_23" },
2360#endif /* !SPARC */
2361#endif /* SUNOS4 */
2362 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2363#ifdef SUNOS4
2364 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2365#ifdef I386
2366 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2367 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2368 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2369#else /* !I386 */
2370 { PTRACE_26, "PTRACE_26" },
2371 { PTRACE_27, "PTRACE_27" },
2372 { PTRACE_28, "PTRACE_28" },
2373#endif /* !I386 */
2374 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2375#endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002376
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002377#else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002378
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002379 { PT_TRACE_ME, "PT_TRACE_ME" },
2380 { PT_READ_I, "PT_READ_I" },
2381 { PT_READ_D, "PT_READ_D" },
2382 { PT_WRITE_I, "PT_WRITE_I" },
2383 { PT_WRITE_D, "PT_WRITE_D" },
John Hughesa2278142001-09-28 16:21:30 +00002384#ifdef PT_READ_U
2385 { PT_READ_U, "PT_READ_U" },
2386#endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002387 { PT_CONTINUE, "PT_CONTINUE" },
2388 { PT_KILL, "PT_KILL" },
2389 { PT_STEP, "PT_STEP" },
2390 { PT_ATTACH, "PT_ATTACH" },
2391 { PT_DETACH, "PT_DETACH" },
2392 { PT_GETREGS, "PT_GETREGS" },
2393 { PT_SETREGS, "PT_SETREGS" },
2394 { PT_GETFPREGS, "PT_GETFPREGS" },
2395 { PT_SETFPREGS, "PT_SETFPREGS" },
2396 { PT_GETDBREGS, "PT_GETDBREGS" },
2397 { PT_SETDBREGS, "PT_SETDBREGS" },
2398#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002399 { 0, NULL },
2400};
2401
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002402#ifndef FREEBSD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002403#ifdef PTRACE_SETOPTIONS
2404static const struct xlat ptrace_setoptions_flags[] = {
2405#ifdef PTRACE_O_TRACESYSGOOD
2406 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
2407#endif
2408#ifdef PTRACE_O_TRACEFORK
2409 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
2410#endif
2411#ifdef PTRACE_O_TRACEVFORK
2412 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
2413#endif
2414#ifdef PTRACE_O_TRACECLONE
2415 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
2416#endif
2417#ifdef PTRACE_O_TRACEEXEC
2418 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
2419#endif
2420#ifdef PTRACE_O_TRACEVFORKDONE
2421 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
2422#endif
2423#ifdef PTRACE_O_TRACEEXIT
2424 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
2425#endif
2426 { 0, NULL },
2427};
2428#endif
2429#endif
2430
2431#ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002432const struct xlat struct_user_offsets[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002433#ifdef LINUX
Michal Ludvig10a88d02002-10-07 14:31:00 +00002434#if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002435 { PT_PSWMASK, "psw_mask" },
2436 { PT_PSWADDR, "psw_addr" },
2437 { PT_GPR0, "gpr0" },
2438 { PT_GPR1, "gpr1" },
2439 { PT_GPR2, "gpr2" },
2440 { PT_GPR3, "gpr3" },
2441 { PT_GPR4, "gpr4" },
2442 { PT_GPR5, "gpr5" },
2443 { PT_GPR6, "gpr6" },
2444 { PT_GPR7, "gpr7" },
2445 { PT_GPR8, "gpr8" },
2446 { PT_GPR9, "gpr9" },
2447 { PT_GPR10, "gpr10" },
2448 { PT_GPR11, "gpr11" },
2449 { PT_GPR12, "gpr12" },
2450 { PT_GPR13, "gpr13" },
2451 { PT_GPR14, "gpr14" },
2452 { PT_GPR15, "gpr15" },
2453 { PT_ACR0, "acr0" },
2454 { PT_ACR1, "acr1" },
2455 { PT_ACR2, "acr2" },
2456 { PT_ACR3, "acr3" },
2457 { PT_ACR4, "acr4" },
2458 { PT_ACR5, "acr5" },
2459 { PT_ACR6, "acr6" },
2460 { PT_ACR7, "acr7" },
2461 { PT_ACR8, "acr8" },
2462 { PT_ACR9, "acr9" },
2463 { PT_ACR10, "acr10" },
2464 { PT_ACR11, "acr11" },
2465 { PT_ACR12, "acr12" },
2466 { PT_ACR13, "acr13" },
2467 { PT_ACR14, "acr14" },
2468 { PT_ACR15, "acr15" },
2469 { PT_ORIGGPR2, "orig_gpr2" },
2470 { PT_FPC, "fpc" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002471#if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002472 { PT_FPR0_HI, "fpr0.hi" },
2473 { PT_FPR0_LO, "fpr0.lo" },
2474 { PT_FPR1_HI, "fpr1.hi" },
2475 { PT_FPR1_LO, "fpr1.lo" },
2476 { PT_FPR2_HI, "fpr2.hi" },
2477 { PT_FPR2_LO, "fpr2.lo" },
2478 { PT_FPR3_HI, "fpr3.hi" },
2479 { PT_FPR3_LO, "fpr3.lo" },
2480 { PT_FPR4_HI, "fpr4.hi" },
2481 { PT_FPR4_LO, "fpr4.lo" },
2482 { PT_FPR5_HI, "fpr5.hi" },
2483 { PT_FPR5_LO, "fpr5.lo" },
2484 { PT_FPR6_HI, "fpr6.hi" },
2485 { PT_FPR6_LO, "fpr6.lo" },
2486 { PT_FPR7_HI, "fpr7.hi" },
2487 { PT_FPR7_LO, "fpr7.lo" },
2488 { PT_FPR8_HI, "fpr8.hi" },
2489 { PT_FPR8_LO, "fpr8.lo" },
2490 { PT_FPR9_HI, "fpr9.hi" },
2491 { PT_FPR9_LO, "fpr9.lo" },
2492 { PT_FPR10_HI, "fpr10.hi" },
2493 { PT_FPR10_LO, "fpr10.lo" },
2494 { PT_FPR11_HI, "fpr11.hi" },
2495 { PT_FPR11_LO, "fpr11.lo" },
2496 { PT_FPR12_HI, "fpr12.hi" },
2497 { PT_FPR12_LO, "fpr12.lo" },
2498 { PT_FPR13_HI, "fpr13.hi" },
2499 { PT_FPR13_LO, "fpr13.lo" },
2500 { PT_FPR14_HI, "fpr14.hi" },
2501 { PT_FPR14_LO, "fpr14.lo" },
2502 { PT_FPR15_HI, "fpr15.hi" },
2503 { PT_FPR15_LO, "fpr15.lo" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002504#endif
2505#if defined(S390X)
2506 { PT_FPR0, "fpr0" },
2507 { PT_FPR1, "fpr1" },
2508 { PT_FPR2, "fpr2" },
2509 { PT_FPR3, "fpr3" },
2510 { PT_FPR4, "fpr4" },
2511 { PT_FPR5, "fpr5" },
2512 { PT_FPR6, "fpr6" },
2513 { PT_FPR7, "fpr7" },
2514 { PT_FPR8, "fpr8" },
2515 { PT_FPR9, "fpr9" },
2516 { PT_FPR10, "fpr10" },
2517 { PT_FPR11, "fpr11" },
2518 { PT_FPR12, "fpr12" },
2519 { PT_FPR13, "fpr13" },
2520 { PT_FPR14, "fpr14" },
2521 { PT_FPR15, "fpr15" },
2522#endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002523 { PT_CR_9, "cr9" },
2524 { PT_CR_10, "cr10" },
2525 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002526 { PT_IEEE_IP, "ieee_exception_ip" },
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002527#endif
2528#if defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002529 /* XXX No support for these offsets yet. */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002530#elif defined(HPPA)
2531 /* XXX No support for these offsets yet. */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002532#elif defined(POWERPC)
Roland McGrath5a223472002-12-15 23:58:26 +00002533#ifndef PT_ORIG_R3
2534#define PT_ORIG_R3 34
2535#endif
Roland McGratheb285352003-01-14 09:59:00 +00002536#define REGSIZE (sizeof(unsigned long))
2537 { REGSIZE*PT_R0, "r0" },
2538 { REGSIZE*PT_R1, "r1" },
2539 { REGSIZE*PT_R2, "r2" },
2540 { REGSIZE*PT_R3, "r3" },
2541 { REGSIZE*PT_R4, "r4" },
2542 { REGSIZE*PT_R5, "r5" },
2543 { REGSIZE*PT_R6, "r6" },
2544 { REGSIZE*PT_R7, "r7" },
2545 { REGSIZE*PT_R8, "r8" },
2546 { REGSIZE*PT_R9, "r9" },
2547 { REGSIZE*PT_R10, "r10" },
2548 { REGSIZE*PT_R11, "r11" },
2549 { REGSIZE*PT_R12, "r12" },
2550 { REGSIZE*PT_R13, "r13" },
2551 { REGSIZE*PT_R14, "r14" },
2552 { REGSIZE*PT_R15, "r15" },
2553 { REGSIZE*PT_R16, "r16" },
2554 { REGSIZE*PT_R17, "r17" },
2555 { REGSIZE*PT_R18, "r18" },
2556 { REGSIZE*PT_R19, "r19" },
2557 { REGSIZE*PT_R20, "r20" },
2558 { REGSIZE*PT_R21, "r21" },
2559 { REGSIZE*PT_R22, "r22" },
2560 { REGSIZE*PT_R23, "r23" },
2561 { REGSIZE*PT_R24, "r24" },
2562 { REGSIZE*PT_R25, "r25" },
2563 { REGSIZE*PT_R26, "r26" },
2564 { REGSIZE*PT_R27, "r27" },
2565 { REGSIZE*PT_R28, "r28" },
2566 { REGSIZE*PT_R29, "r29" },
2567 { REGSIZE*PT_R30, "r30" },
2568 { REGSIZE*PT_R31, "r31" },
2569 { REGSIZE*PT_NIP, "NIP" },
2570 { REGSIZE*PT_MSR, "MSR" },
2571 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2572 { REGSIZE*PT_CTR, "CTR" },
2573 { REGSIZE*PT_LNK, "LNK" },
2574 { REGSIZE*PT_XER, "XER" },
2575 { REGSIZE*PT_CCR, "CCR" },
2576 { REGSIZE*PT_FPR0, "FPR0" },
2577#undef REGSIZE
Roland McGrath5a223472002-12-15 23:58:26 +00002578#else
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002579#ifdef ALPHA
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002580 { 0, "r0" },
2581 { 1, "r1" },
2582 { 2, "r2" },
2583 { 3, "r3" },
2584 { 4, "r4" },
2585 { 5, "r5" },
2586 { 6, "r6" },
2587 { 7, "r7" },
2588 { 8, "r8" },
2589 { 9, "r9" },
2590 { 10, "r10" },
2591 { 11, "r11" },
2592 { 12, "r12" },
2593 { 13, "r13" },
2594 { 14, "r14" },
2595 { 15, "r15" },
2596 { 16, "r16" },
2597 { 17, "r17" },
2598 { 18, "r18" },
2599 { 19, "r19" },
2600 { 20, "r20" },
2601 { 21, "r21" },
2602 { 22, "r22" },
2603 { 23, "r23" },
2604 { 24, "r24" },
2605 { 25, "r25" },
2606 { 26, "r26" },
2607 { 27, "r27" },
2608 { 28, "r28" },
2609 { 29, "gp" },
2610 { 30, "fp" },
2611 { 31, "zero" },
2612 { 32, "fp0" },
2613 { 33, "fp" },
2614 { 34, "fp2" },
2615 { 35, "fp3" },
2616 { 36, "fp4" },
2617 { 37, "fp5" },
2618 { 38, "fp6" },
2619 { 39, "fp7" },
2620 { 40, "fp8" },
2621 { 41, "fp9" },
2622 { 42, "fp10" },
2623 { 43, "fp11" },
2624 { 44, "fp12" },
2625 { 45, "fp13" },
2626 { 46, "fp14" },
2627 { 47, "fp15" },
2628 { 48, "fp16" },
2629 { 49, "fp17" },
2630 { 50, "fp18" },
2631 { 51, "fp19" },
2632 { 52, "fp20" },
2633 { 53, "fp21" },
2634 { 54, "fp22" },
2635 { 55, "fp23" },
2636 { 56, "fp24" },
2637 { 57, "fp25" },
2638 { 58, "fp26" },
2639 { 59, "fp27" },
2640 { 60, "fp28" },
2641 { 61, "fp29" },
2642 { 62, "fp30" },
2643 { 63, "fp31" },
2644 { 64, "pc" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002645#else /* !ALPHA */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002646#ifdef IA64
2647 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2648 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2649 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2650 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2651 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2652 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2653 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2654 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2655 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2656 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2657 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2658 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2659 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2660 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2661 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2662 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2663 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2664 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2665 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2666 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2667 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2668 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2669 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2670 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2671 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2672 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2673 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2674 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2675 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2676 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2677 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2678 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2679 /* switch stack: */
2680 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2681 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2682 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2683 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2684 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2685 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2686 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2687 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2688 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2689 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002690 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2691 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002692 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002693 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002694 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2695 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002696 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2697 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2698 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2699 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2700 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2701 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2702 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2703 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2704 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2705 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2706 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2707 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2708 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2709 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2710 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Roland McGrathfb1bc072004-03-01 21:29:24 +00002711# ifdef PT_AR_CSD
2712 { PT_AR_CSD, "ar.csd" },
2713# endif
2714# ifdef PT_AR_SSD
2715 { PT_AR_SSD, "ar.ssd" },
2716# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002717 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002718#else /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002719#ifdef I386
2720 { 4*EBX, "4*EBX" },
2721 { 4*ECX, "4*ECX" },
2722 { 4*EDX, "4*EDX" },
2723 { 4*ESI, "4*ESI" },
2724 { 4*EDI, "4*EDI" },
2725 { 4*EBP, "4*EBP" },
2726 { 4*EAX, "4*EAX" },
2727 { 4*DS, "4*DS" },
2728 { 4*ES, "4*ES" },
2729 { 4*FS, "4*FS" },
2730 { 4*GS, "4*GS" },
2731 { 4*ORIG_EAX, "4*ORIG_EAX" },
2732 { 4*EIP, "4*EIP" },
2733 { 4*CS, "4*CS" },
2734 { 4*EFL, "4*EFL" },
2735 { 4*UESP, "4*UESP" },
2736 { 4*SS, "4*SS" },
2737#else /* !I386 */
Michal Ludvig0e035502002-09-23 15:41:01 +00002738#ifdef X86_64
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002739 { 8*R15, "8*R15" },
2740 { 8*R14, "8*R14" },
2741 { 8*R13, "8*R13" },
2742 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002743 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002744 { 8*RBX, "8*RBX" },
2745 { 8*R11, "8*R11" },
2746 { 8*R10, "8*R10" },
2747 { 8*R9, "8*R9" },
2748 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002749 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002750 { 8*RCX, "8*RCX" },
2751 { 8*RDX, "8*RDX" },
2752 { 8*RSI, "8*RSI" },
2753 { 8*RDI, "8*RDI" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002754#if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002755 { DS, "DS" },
2756 { ES, "ES" },
2757 { FS, "FS" },
2758 { GS, "GS" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002759#endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002760 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002761 { 8*RIP, "8*RIP" },
2762 { 8*CS, "8*CS" },
2763 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002764 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002765 { 8*SS, "8*SS" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002766#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002767#ifdef M68K
2768 { 4*PT_D1, "4*PT_D1" },
2769 { 4*PT_D2, "4*PT_D2" },
2770 { 4*PT_D3, "4*PT_D3" },
2771 { 4*PT_D4, "4*PT_D4" },
2772 { 4*PT_D5, "4*PT_D5" },
2773 { 4*PT_D6, "4*PT_D6" },
2774 { 4*PT_D7, "4*PT_D7" },
2775 { 4*PT_A0, "4*PT_A0" },
2776 { 4*PT_A1, "4*PT_A1" },
2777 { 4*PT_A2, "4*PT_A2" },
2778 { 4*PT_A3, "4*PT_A3" },
2779 { 4*PT_A4, "4*PT_A4" },
2780 { 4*PT_A5, "4*PT_A5" },
2781 { 4*PT_A6, "4*PT_A6" },
2782 { 4*PT_D0, "4*PT_D0" },
2783 { 4*PT_USP, "4*PT_USP" },
2784 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2785 { 4*PT_SR, "4*PT_SR" },
2786 { 4*PT_PC, "4*PT_PC" },
2787#endif /* M68K */
2788#endif /* !I386 */
Wichert Akkermanccef6372002-05-01 16:39:22 +00002789#ifdef SH
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002790 { 4*REG_REG0, "4*REG_REG0" },
2791 { 4*(REG_REG0+1), "4*REG_REG1" },
2792 { 4*(REG_REG0+2), "4*REG_REG2" },
2793 { 4*(REG_REG0+3), "4*REG_REG3" },
2794 { 4*(REG_REG0+4), "4*REG_REG4" },
2795 { 4*(REG_REG0+5), "4*REG_REG5" },
2796 { 4*(REG_REG0+6), "4*REG_REG6" },
2797 { 4*(REG_REG0+7), "4*REG_REG7" },
2798 { 4*(REG_REG0+8), "4*REG_REG8" },
2799 { 4*(REG_REG0+9), "4*REG_REG9" },
2800 { 4*(REG_REG0+10), "4*REG_REG10" },
2801 { 4*(REG_REG0+11), "4*REG_REG11" },
2802 { 4*(REG_REG0+12), "4*REG_REG12" },
2803 { 4*(REG_REG0+13), "4*REG_REG13" },
2804 { 4*(REG_REG0+14), "4*REG_REG14" },
2805 { 4*REG_REG15, "4*REG_REG15" },
2806 { 4*REG_PC, "4*REG_PC" },
2807 { 4*REG_PR, "4*REG_PR" },
2808 { 4*REG_SR, "4*REG_SR" },
2809 { 4*REG_GBR, "4*REG_GBR" },
2810 { 4*REG_MACH, "4*REG_MACH" },
2811 { 4*REG_MACL, "4*REG_MACL" },
2812 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2813 { 4*REG_FPUL, "4*REG_FPUL" },
2814 { 4*REG_FPREG0, "4*REG_FPREG0" },
2815 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2816 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2817 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2818 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2819 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2820 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2821 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2822 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2823 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2824 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2825 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2826 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2827 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2828 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2829 { 4*REG_FPREG15, "4*REG_FPREG15" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002830#ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002831 { 4*REG_XDREG0, "4*REG_XDREG0" },
2832 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2833 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2834 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2835 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2836 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2837 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2838 { 4*REG_XDREG14, "4*REG_XDREG14" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002839#endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002840 { 4*REG_FPSCR, "4*REG_FPSCR" },
Wichert Akkermanccef6372002-05-01 16:39:22 +00002841#endif /* SH */
Roland McGrathf5a47772003-06-26 22:40:42 +00002842#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002843 { 0, "PC(L)" },
2844 { 4, "PC(U)" },
2845 { 8, "SR(L)" },
2846 { 12, "SR(U)" },
2847 { 16, "syscall no.(L)" },
2848 { 20, "syscall_no.(U)" },
2849 { 24, "R0(L)" },
2850 { 28, "R0(U)" },
2851 { 32, "R1(L)" },
2852 { 36, "R1(U)" },
2853 { 40, "R2(L)" },
2854 { 44, "R2(U)" },
2855 { 48, "R3(L)" },
2856 { 52, "R3(U)" },
2857 { 56, "R4(L)" },
2858 { 60, "R4(U)" },
2859 { 64, "R5(L)" },
2860 { 68, "R5(U)" },
2861 { 72, "R6(L)" },
2862 { 76, "R6(U)" },
2863 { 80, "R7(L)" },
2864 { 84, "R7(U)" },
2865 { 88, "R8(L)" },
2866 { 92, "R8(U)" },
2867 { 96, "R9(L)" },
2868 { 100, "R9(U)" },
2869 { 104, "R10(L)" },
2870 { 108, "R10(U)" },
2871 { 112, "R11(L)" },
2872 { 116, "R11(U)" },
2873 { 120, "R12(L)" },
2874 { 124, "R12(U)" },
2875 { 128, "R13(L)" },
2876 { 132, "R13(U)" },
2877 { 136, "R14(L)" },
2878 { 140, "R14(U)" },
2879 { 144, "R15(L)" },
2880 { 148, "R15(U)" },
2881 { 152, "R16(L)" },
2882 { 156, "R16(U)" },
2883 { 160, "R17(L)" },
2884 { 164, "R17(U)" },
2885 { 168, "R18(L)" },
2886 { 172, "R18(U)" },
2887 { 176, "R19(L)" },
2888 { 180, "R19(U)" },
2889 { 184, "R20(L)" },
2890 { 188, "R20(U)" },
2891 { 192, "R21(L)" },
2892 { 196, "R21(U)" },
2893 { 200, "R22(L)" },
2894 { 204, "R22(U)" },
2895 { 208, "R23(L)" },
2896 { 212, "R23(U)" },
2897 { 216, "R24(L)" },
2898 { 220, "R24(U)" },
2899 { 224, "R25(L)" },
2900 { 228, "R25(U)" },
2901 { 232, "R26(L)" },
2902 { 236, "R26(U)" },
2903 { 240, "R27(L)" },
2904 { 244, "R27(U)" },
2905 { 248, "R28(L)" },
2906 { 252, "R28(U)" },
2907 { 256, "R29(L)" },
2908 { 260, "R29(U)" },
2909 { 264, "R30(L)" },
2910 { 268, "R30(U)" },
2911 { 272, "R31(L)" },
2912 { 276, "R31(U)" },
2913 { 280, "R32(L)" },
2914 { 284, "R32(U)" },
2915 { 288, "R33(L)" },
2916 { 292, "R33(U)" },
2917 { 296, "R34(L)" },
2918 { 300, "R34(U)" },
2919 { 304, "R35(L)" },
2920 { 308, "R35(U)" },
2921 { 312, "R36(L)" },
2922 { 316, "R36(U)" },
2923 { 320, "R37(L)" },
2924 { 324, "R37(U)" },
2925 { 328, "R38(L)" },
2926 { 332, "R38(U)" },
2927 { 336, "R39(L)" },
2928 { 340, "R39(U)" },
2929 { 344, "R40(L)" },
2930 { 348, "R40(U)" },
2931 { 352, "R41(L)" },
2932 { 356, "R41(U)" },
2933 { 360, "R42(L)" },
2934 { 364, "R42(U)" },
2935 { 368, "R43(L)" },
2936 { 372, "R43(U)" },
2937 { 376, "R44(L)" },
2938 { 380, "R44(U)" },
2939 { 384, "R45(L)" },
2940 { 388, "R45(U)" },
2941 { 392, "R46(L)" },
2942 { 396, "R46(U)" },
2943 { 400, "R47(L)" },
2944 { 404, "R47(U)" },
2945 { 408, "R48(L)" },
2946 { 412, "R48(U)" },
2947 { 416, "R49(L)" },
2948 { 420, "R49(U)" },
2949 { 424, "R50(L)" },
2950 { 428, "R50(U)" },
2951 { 432, "R51(L)" },
2952 { 436, "R51(U)" },
2953 { 440, "R52(L)" },
2954 { 444, "R52(U)" },
2955 { 448, "R53(L)" },
2956 { 452, "R53(U)" },
2957 { 456, "R54(L)" },
2958 { 460, "R54(U)" },
2959 { 464, "R55(L)" },
2960 { 468, "R55(U)" },
2961 { 472, "R56(L)" },
2962 { 476, "R56(U)" },
2963 { 480, "R57(L)" },
2964 { 484, "R57(U)" },
2965 { 488, "R58(L)" },
2966 { 492, "R58(U)" },
2967 { 496, "R59(L)" },
2968 { 500, "R59(U)" },
2969 { 504, "R60(L)" },
2970 { 508, "R60(U)" },
2971 { 512, "R61(L)" },
2972 { 516, "R61(U)" },
2973 { 520, "R62(L)" },
2974 { 524, "R62(U)" },
2975 { 528, "TR0(L)" },
2976 { 532, "TR0(U)" },
2977 { 536, "TR1(L)" },
2978 { 540, "TR1(U)" },
2979 { 544, "TR2(L)" },
2980 { 548, "TR2(U)" },
2981 { 552, "TR3(L)" },
2982 { 556, "TR3(U)" },
2983 { 560, "TR4(L)" },
2984 { 564, "TR4(U)" },
2985 { 568, "TR5(L)" },
2986 { 572, "TR5(U)" },
2987 { 576, "TR6(L)" },
2988 { 580, "TR6(U)" },
2989 { 584, "TR7(L)" },
2990 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002991 /* This entry is in case pt_regs contains dregs (depends on
2992 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002993 { uoff(regs), "offsetof(struct user, regs)" },
2994 { uoff(fpu), "offsetof(struct user, fpu)" },
2995#endif
Roland McGrath0f87c492003-06-03 23:29:04 +00002996#ifdef ARM
2997 { uoff(regs.ARM_r0), "r0" },
2998 { uoff(regs.ARM_r1), "r1" },
2999 { uoff(regs.ARM_r2), "r2" },
3000 { uoff(regs.ARM_r3), "r3" },
3001 { uoff(regs.ARM_r4), "r4" },
3002 { uoff(regs.ARM_r5), "r5" },
3003 { uoff(regs.ARM_r6), "r6" },
3004 { uoff(regs.ARM_r7), "r7" },
3005 { uoff(regs.ARM_r8), "r8" },
3006 { uoff(regs.ARM_r9), "r9" },
3007 { uoff(regs.ARM_r10), "r10" },
3008 { uoff(regs.ARM_fp), "fp" },
3009 { uoff(regs.ARM_ip), "ip" },
3010 { uoff(regs.ARM_sp), "sp" },
3011 { uoff(regs.ARM_lr), "lr" },
3012 { uoff(regs.ARM_pc), "pc" },
3013 { uoff(regs.ARM_cpsr), "cpsr" },
3014#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00003015
Roland McGrath542c2c62008-05-20 01:11:56 +00003016#ifdef MIPS
3017 { 0, "r0" },
3018 { 1, "r1" },
3019 { 2, "r2" },
3020 { 3, "r3" },
3021 { 4, "r4" },
3022 { 5, "r5" },
3023 { 6, "r6" },
3024 { 7, "r7" },
3025 { 8, "r8" },
3026 { 9, "r9" },
3027 { 10, "r10" },
3028 { 11, "r11" },
3029 { 12, "r12" },
3030 { 13, "r13" },
3031 { 14, "r14" },
3032 { 15, "r15" },
3033 { 16, "r16" },
3034 { 17, "r17" },
3035 { 18, "r18" },
3036 { 19, "r19" },
3037 { 20, "r20" },
3038 { 21, "r21" },
3039 { 22, "r22" },
3040 { 23, "r23" },
3041 { 24, "r24" },
3042 { 25, "r25" },
3043 { 26, "r26" },
3044 { 27, "r27" },
3045 { 28, "r28" },
3046 { 29, "r29" },
3047 { 30, "r30" },
3048 { 31, "r31" },
3049 { 32, "f0" },
3050 { 33, "f1" },
3051 { 34, "f2" },
3052 { 35, "f3" },
3053 { 36, "f4" },
3054 { 37, "f5" },
3055 { 38, "f6" },
3056 { 39, "f7" },
3057 { 40, "f8" },
3058 { 41, "f9" },
3059 { 42, "f10" },
3060 { 43, "f11" },
3061 { 44, "f12" },
3062 { 45, "f13" },
3063 { 46, "f14" },
3064 { 47, "f15" },
3065 { 48, "f16" },
3066 { 49, "f17" },
3067 { 50, "f18" },
3068 { 51, "f19" },
3069 { 52, "f20" },
3070 { 53, "f21" },
3071 { 54, "f22" },
3072 { 55, "f23" },
3073 { 56, "f24" },
3074 { 57, "f25" },
3075 { 58, "f26" },
3076 { 59, "f27" },
3077 { 60, "f28" },
3078 { 61, "f29" },
3079 { 62, "f30" },
3080 { 63, "f31" },
3081 { 64, "pc" },
3082 { 65, "cause" },
3083 { 66, "badvaddr" },
3084 { 67, "mmhi" },
3085 { 68, "mmlo" },
3086 { 69, "fpcsr" },
3087 { 70, "fpeir" },
3088#endif
3089
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +00003090#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003091 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00003092#endif
Michal Ludvig0e035502002-09-23 15:41:01 +00003093#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003094 { uoff(i387), "offsetof(struct user, i387)" },
3095#else /* !I386 */
3096#ifdef M68K
3097 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
3098#endif /* M68K */
3099#endif /* !I386 */
3100 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3101 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3102 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003103#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003104 { uoff(start_code), "offsetof(struct user, start_code)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003105#endif
Roland McGrathf5a47772003-06-26 22:40:42 +00003106#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00003107 { uoff(start_data), "offsetof(struct user, start_data)" },
3108#endif
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003109#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003110 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003111#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003112 { uoff(signal), "offsetof(struct user, signal)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003113#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003114 { uoff(reserved), "offsetof(struct user, reserved)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00003115#endif
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003116#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003117 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003118#endif
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +00003119#if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003120 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
3121#endif
3122 { uoff(magic), "offsetof(struct user, magic)" },
3123 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Michal Ludvig0e035502002-09-23 15:41:01 +00003124#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003125 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
3126#endif /* I386 */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00003127#endif /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003128#endif /* !ALPHA */
3129#endif /* !POWERPC/!SPARC */
3130#endif /* LINUX */
3131#ifdef SUNOS4
3132 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3133 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3134 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3135 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3136 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3137 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3138 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3139 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3140 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3141 { uoff(u_error), "offsetof(struct user, u_error)" },
3142 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3143 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3144 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3145 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3146 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3147 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3148 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3149 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3150 { uoff(u_code), "offsetof(struct user, u_code)" },
3151 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3152 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3153 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3154 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3155 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3156 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3157 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3158 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3159 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3160 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3161 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3162 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3163 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3164 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3165 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3166 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3167 { uoff(u_start), "offsetof(struct user, u_start)" },
3168 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3169 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3170 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3171 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3172 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3173 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3174 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3175 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3176 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
3177#endif /* SUNOS4 */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00003178#ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003179 { sizeof(struct user), "sizeof(struct user)" },
Wichert Akkermanc1652e22001-03-27 12:17:16 +00003180#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003181 { 0, NULL },
3182};
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003183#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003184
3185int
3186sys_ptrace(tcp)
3187struct tcb *tcp;
3188{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003189 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003190 long addr;
3191
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003192 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003193 printxval(ptrace_cmds, tcp->u_arg[0],
3194#ifndef FREEBSD
3195 "PTRACE_???"
3196#else
3197 "PT_???"
3198#endif
3199 );
3200 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003201 addr = tcp->u_arg[2];
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003202#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003203 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3204 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3205 for (x = struct_user_offsets; x->str; x++) {
3206 if (x->val >= addr)
3207 break;
3208 }
3209 if (!x->str)
3210 tprintf("%#lx, ", addr);
3211 else if (x->val > addr && x != struct_user_offsets) {
3212 x--;
3213 tprintf("%s + %ld, ", x->str, addr - x->val);
3214 }
3215 else
3216 tprintf("%s, ", x->str);
3217 }
3218 else
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003219#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003220 tprintf("%#lx, ", tcp->u_arg[2]);
3221#ifdef LINUX
3222 switch (tcp->u_arg[0]) {
Roland McGrath1e868062007-11-19 22:11:45 +00003223#ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003224 case PTRACE_PEEKDATA:
3225 case PTRACE_PEEKTEXT:
3226 case PTRACE_PEEKUSER:
3227 break;
Roland McGrath1e868062007-11-19 22:11:45 +00003228#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003229 case PTRACE_CONT:
3230 case PTRACE_SINGLESTEP:
3231 case PTRACE_SYSCALL:
3232 case PTRACE_DETACH:
3233 printsignal(tcp->u_arg[3]);
3234 break;
Denys Vlasenkof535b542009-01-13 18:30:55 +00003235#ifdef PTRACE_SETOPTIONS
3236 case PTRACE_SETOPTIONS:
3237 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3238 break;
3239#endif
3240#ifdef PTRACE_SETSIGINFO
3241 case PTRACE_SETSIGINFO: {
3242 siginfo_t si;
3243 if (!tcp->u_arg[3])
3244 tprintf("NULL");
3245 else if (syserror(tcp))
3246 tprintf("%#lx", tcp->u_arg[3]);
3247 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3248 tprintf("{???}");
3249 else
3250 printsiginfo(&si, verbose(tcp));
3251 break;
3252 }
3253#endif
3254#ifdef PTRACE_GETSIGINFO
3255 case PTRACE_GETSIGINFO:
3256 /* Don't print anything, do it at syscall return. */
3257 break;
3258#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003259 default:
3260 tprintf("%#lx", tcp->u_arg[3]);
3261 break;
3262 }
3263 } else {
3264 switch (tcp->u_arg[0]) {
3265 case PTRACE_PEEKDATA:
3266 case PTRACE_PEEKTEXT:
3267 case PTRACE_PEEKUSER:
Roland McGrath1e868062007-11-19 22:11:45 +00003268#ifdef IA64
3269 return RVAL_HEX;
3270#else
Roland McGratheb285352003-01-14 09:59:00 +00003271 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003272 break;
Roland McGrath1e868062007-11-19 22:11:45 +00003273#endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00003274#ifdef PTRACE_GETSIGINFO
3275 case PTRACE_GETSIGINFO: {
3276 siginfo_t si;
3277 if (!tcp->u_arg[3])
3278 tprintf("NULL");
3279 else if (syserror(tcp))
3280 tprintf("%#lx", tcp->u_arg[3]);
3281 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3282 tprintf("{???}");
3283 else
3284 printsiginfo(&si, verbose(tcp));
3285 break;
3286 }
3287#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003288 }
3289 }
3290#endif /* LINUX */
3291#ifdef SUNOS4
3292 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3293 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3294 tprintf("%lu, ", tcp->u_arg[3]);
3295 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3296 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3297 tcp->u_arg[0] != PTRACE_READTEXT) {
3298 tprintf("%#lx", tcp->u_arg[3]);
3299 }
3300 } else {
3301 if (tcp->u_arg[0] == PTRACE_READDATA ||
3302 tcp->u_arg[0] == PTRACE_READTEXT) {
3303 tprintf("%lu, ", tcp->u_arg[3]);
3304 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3305 }
3306 }
3307#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003308#ifdef FREEBSD
3309 tprintf("%lu", tcp->u_arg[3]);
3310 }
3311#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003312 return 0;
3313}
3314
3315#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003316
3317#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003318# ifndef FUTEX_CMP_REQUEUE
3319# define FUTEX_CMP_REQUEUE 4
3320# endif
3321# ifndef FUTEX_WAKE_OP
3322# define FUTEX_WAKE_OP 5
3323# endif
3324# ifndef FUTEX_LOCK_PI
3325# define FUTEX_LOCK_PI 6
3326# define FUTEX_UNLOCK_PI 7
3327# define FUTEX_TRYLOCK_PI 8
3328# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003329# ifndef FUTEX_WAIT_BITSET
3330# define FUTEX_WAIT_BITSET 9
3331# endif
3332# ifndef FUTEX_WAKE_BITSET
3333# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003334# endif
3335# ifndef FUTEX_PRIVATE_FLAG
3336# define FUTEX_PRIVATE_FLAG 128
3337# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003338static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003339 { FUTEX_WAIT, "FUTEX_WAIT" },
3340 { FUTEX_WAKE, "FUTEX_WAKE" },
3341 { FUTEX_FD, "FUTEX_FD" },
3342 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3343 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3344 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3345 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3346 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3347 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003348 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3349 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Roland McGrath51942a92007-07-05 18:59:11 +00003350 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3351 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3352 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3353 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3354 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3355 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3356 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3357 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3358 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003359 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3360 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Roland McGrath51942a92007-07-05 18:59:11 +00003361 { 0, NULL }
3362};
3363#ifndef FUTEX_OP_SET
3364# define FUTEX_OP_SET 0
3365# define FUTEX_OP_ADD 1
3366# define FUTEX_OP_OR 2
3367# define FUTEX_OP_ANDN 3
3368# define FUTEX_OP_XOR 4
3369# define FUTEX_OP_CMP_EQ 0
3370# define FUTEX_OP_CMP_NE 1
3371# define FUTEX_OP_CMP_LT 2
3372# define FUTEX_OP_CMP_LE 3
3373# define FUTEX_OP_CMP_GT 4
3374# define FUTEX_OP_CMP_GE 5
3375#endif
3376static const struct xlat futexwakeops[] = {
3377 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3378 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3379 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3380 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3381 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3382 { 0, NULL }
3383};
3384static const struct xlat futexwakecmps[] = {
3385 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3386 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3387 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3388 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3389 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3390 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3391 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003392};
3393
3394int
3395sys_futex(tcp)
3396struct tcb *tcp;
3397{
3398 if (entering(tcp)) {
Roland McGrath1aeaf742008-07-18 01:27:39 +00003399 long int cmd = tcp->u_arg[1] & 127;
Roland McGrath5a223472002-12-15 23:58:26 +00003400 tprintf("%p, ", (void *) tcp->u_arg[0]);
Roland McGrath88812d62003-06-26 22:27:23 +00003401 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003402 tprintf(", %ld", tcp->u_arg[2]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003403 if (cmd == FUTEX_WAKE_BITSET)
3404 tprintf(", %lx", tcp->u_arg[5]);
3405 else if (cmd == FUTEX_WAIT) {
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003406 tprintf(", ");
3407 printtv(tcp, tcp->u_arg[3]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003408 } else if (cmd == FUTEX_WAIT_BITSET) {
3409 tprintf(", ");
3410 printtv(tcp, tcp->u_arg[3]);
3411 tprintf(", %lx", tcp->u_arg[5]);
Roland McGrath51942a92007-07-05 18:59:11 +00003412 } else if (cmd == FUTEX_REQUEUE)
Roland McGrath88812d62003-06-26 22:27:23 +00003413 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Roland McGrath51942a92007-07-05 18:59:11 +00003414 else if (cmd == FUTEX_CMP_REQUEUE)
3415 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3416 else if (cmd == FUTEX_WAKE_OP) {
3417 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3418 if ((tcp->u_arg[5] >> 28) & 8)
3419 tprintf("FUTEX_OP_OPARG_SHIFT|");
3420 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3421 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3422 if ((tcp->u_arg[5] >> 24) & 8)
3423 tprintf("FUTEX_OP_OPARG_SHIFT|");
3424 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3425 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
3426 }
Roland McGrath5a223472002-12-15 23:58:26 +00003427 }
3428 return 0;
3429}
3430
3431static void
Roland McGrath79fbda52004-04-14 02:45:55 +00003432print_affinitylist(tcp, list, len)
3433struct tcb *tcp;
3434long list;
Roland McGrath5a223472002-12-15 23:58:26 +00003435unsigned int len;
3436{
3437 int first = 1;
3438 tprintf(" {");
Roland McGratha2f34962003-05-23 00:14:04 +00003439 while (len >= sizeof (unsigned long)) {
Roland McGrath79fbda52004-04-14 02:45:55 +00003440 unsigned long w;
3441 umove(tcp, list, &w);
3442 tprintf("%s %lx", first ? "" : ",", w);
Roland McGrath5a223472002-12-15 23:58:26 +00003443 first = 0;
3444 len -= sizeof (unsigned long);
Roland McGrath79fbda52004-04-14 02:45:55 +00003445 list += sizeof(unsigned long);
Roland McGrath5a223472002-12-15 23:58:26 +00003446 }
3447 tprintf(" }");
3448}
3449
3450int
3451sys_sched_setaffinity(tcp)
3452struct tcb *tcp;
3453{
3454 if (entering(tcp)) {
3455 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath79fbda52004-04-14 02:45:55 +00003456 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
Roland McGrath5a223472002-12-15 23:58:26 +00003457 }
3458 return 0;
3459}
3460
3461int
3462sys_sched_getaffinity(tcp)
3463struct tcb *tcp;
3464{
3465 if (entering(tcp)) {
3466 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3467 } else {
Roland McGrath79fbda52004-04-14 02:45:55 +00003468 if (tcp->u_rval == -1)
3469 tprintf("%#lx", tcp->u_arg[2]);
3470 else
3471 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
Roland McGrath5a223472002-12-15 23:58:26 +00003472 }
3473 return 0;
3474}
Roland McGrath279d3782004-03-01 20:27:37 +00003475
Roland McGrathd9f816f2004-09-04 03:39:20 +00003476static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003477 { SCHED_OTHER, "SCHED_OTHER" },
3478 { SCHED_RR, "SCHED_RR" },
3479 { SCHED_FIFO, "SCHED_FIFO" },
3480 { 0, NULL }
3481};
3482
3483int
3484sys_sched_getscheduler(tcp)
3485struct tcb *tcp;
3486{
3487 if (entering(tcp)) {
3488 tprintf("%d", (int) tcp->u_arg[0]);
3489 } else if (! syserror(tcp)) {
3490 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3491 if (tcp->auxstr != NULL)
3492 return RVAL_STR;
3493 }
3494 return 0;
3495}
3496
3497int
3498sys_sched_setscheduler(tcp)
3499struct tcb *tcp;
3500{
3501 if (entering(tcp)) {
3502 struct sched_param p;
3503 tprintf("%d, ", (int) tcp->u_arg[0]);
3504 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3505 if (umove(tcp, tcp->u_arg[2], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003506 tprintf(", %#lx", tcp->u_arg[2]);
Roland McGrath279d3782004-03-01 20:27:37 +00003507 else
3508 tprintf(", { %d }", p.__sched_priority);
3509 }
3510 return 0;
3511}
3512
3513int
3514sys_sched_getparam(tcp)
3515struct tcb *tcp;
3516{
3517 if (entering(tcp)) {
3518 tprintf("%d, ", (int) tcp->u_arg[0]);
3519 } else {
3520 struct sched_param p;
3521 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003522 tprintf("%#lx", tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003523 else
3524 tprintf("{ %d }", p.__sched_priority);
3525 }
3526 return 0;
3527}
3528
3529int
3530sys_sched_setparam(tcp)
3531struct tcb *tcp;
3532{
3533 if (entering(tcp)) {
3534 struct sched_param p;
3535 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003536 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003537 else
3538 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3539 }
3540 return 0;
3541}
3542
3543int
3544sys_sched_get_priority_min(tcp)
3545struct tcb *tcp;
3546{
3547 if (entering(tcp)) {
3548 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3549 }
3550 return 0;
3551}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003552
3553#ifdef X86_64
3554#include <asm/prctl.h>
3555
3556static const struct xlat archvals[] = {
3557 { ARCH_SET_GS, "ARCH_SET_GS" },
3558 { ARCH_SET_FS, "ARCH_SET_FS" },
3559 { ARCH_GET_FS, "ARCH_GET_FS" },
3560 { ARCH_GET_GS, "ARCH_GET_GS" },
3561 { 0, NULL },
3562};
3563
3564int
3565sys_arch_prctl(tcp)
3566struct tcb *tcp;
3567{
3568 if (entering(tcp)) {
3569 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3570 if (tcp->u_arg[0] == ARCH_SET_GS
3571 || tcp->u_arg[0] == ARCH_SET_FS)
3572 tprintf(", %#lx", tcp->u_arg[1]);
3573 } else {
3574 if (tcp->u_arg[0] == ARCH_GET_GS
3575 || tcp->u_arg[0] == ARCH_GET_FS) {
3576 long int v;
3577 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3578 tprintf(", [%#lx]", v);
3579 else
3580 tprintf(", %#lx", tcp->u_arg[1]);
3581 }
3582 }
3583 return 0;
3584}
3585#endif
3586
Roland McGrathdb8319f2007-08-02 01:37:55 +00003587
3588int
3589sys_getcpu(tcp)
3590struct tcb *tcp;
3591{
3592 if (exiting(tcp)) {
3593 unsigned u;
3594 if (tcp->u_arg[0] == 0)
3595 tprintf("NULL, ");
3596 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3597 tprintf("%#lx, ", tcp->u_arg[0]);
3598 else
3599 tprintf("[%u], ", u);
3600 if (tcp->u_arg[1] == 0)
3601 tprintf("NULL, ");
3602 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3603 tprintf("%#lx, ", tcp->u_arg[1]);
3604 else
3605 tprintf("[%u], ", u);
3606 tprintf("%#lx", tcp->u_arg[2]);
3607 }
3608 return 0;
3609}
3610
Roland McGrath5a223472002-12-15 23:58:26 +00003611#endif