blob: c1020a93646d3fb31e0d5bbc19664faf9b395026 [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
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000487#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000488
489int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000490sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000491{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000492 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000493 if (getrval2(tcp)) {
494 tcp->auxstr = "child process";
495 return RVAL_UDECIMAL | RVAL_STR;
496 }
497 }
498 return 0;
499}
500
John Hughes4e36a812001-04-18 15:11:51 +0000501#if UNIXWARE > 2
502
503int
504sys_rfork(tcp)
505struct tcb *tcp;
506{
507 if (entering(tcp)) {
508 tprintf ("%ld", tcp->u_arg[0]);
509 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000510 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000511 if (getrval2(tcp)) {
512 tcp->auxstr = "child process";
513 return RVAL_UDECIMAL | RVAL_STR;
514 }
515 }
516 return 0;
517}
518
519#endif
520
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000521int
522internal_fork(tcp)
523struct tcb *tcp;
524{
525 struct tcb *tcpchild;
526
527 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000528#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000529 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000530 return 0;
531#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000532 if (getrval2(tcp))
533 return 0;
534 if (!followfork)
535 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000536 if (syserror(tcp))
537 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000538 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000539 if (proc_open(tcpchild, 2) < 0)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000540 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000541 }
542 return 0;
543}
544
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000545#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000546
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000547#ifdef LINUX
548
549/* defines copied from linux/sched.h since we can't include that
550 * ourselves (it conflicts with *lots* of libc includes)
551 */
552#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
553#define CLONE_VM 0x00000100 /* set if VM shared between processes */
554#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
555#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
556#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000557#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000558#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
559#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
560#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000561#define CLONE_THREAD 0x00010000 /* Same thread group? */
562#define CLONE_NEWNS 0x00020000 /* New namespace group? */
563#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
564#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
565#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
566#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
567#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
568#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
569#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000570
Roland McGrathd9f816f2004-09-04 03:39:20 +0000571static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000572 { CLONE_VM, "CLONE_VM" },
573 { CLONE_FS, "CLONE_FS" },
574 { CLONE_FILES, "CLONE_FILES" },
575 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000576 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000577 { CLONE_PTRACE, "CLONE_PTRACE" },
578 { CLONE_VFORK, "CLONE_VFORK" },
579 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000580 { CLONE_THREAD, "CLONE_THREAD" },
581 { CLONE_NEWNS, "CLONE_NEWNS" },
582 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
583 { CLONE_SETTLS, "CLONE_SETTLS" },
584 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
585 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
586 { CLONE_DETACHED, "CLONE_DETACHED" },
587 { CLONE_UNTRACED, "CLONE_UNTRACED" },
588 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000589 { 0, NULL },
590};
591
Roland McGrath909875b2002-12-22 03:34:36 +0000592# ifdef I386
593# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000594# ifdef HAVE_STRUCT_USER_DESC
595# define modify_ldt_ldt_s user_desc
596# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000597extern void print_ldt_entry();
598# endif
599
Roland McGrath9677b3a2003-03-12 09:54:36 +0000600# if defined IA64
601# define ARG_FLAGS 0
602# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000603# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
604# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
605# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
606# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000607# elif defined S390 || defined S390X
Roland McGrath9677b3a2003-03-12 09:54:36 +0000608# define ARG_STACK 0
609# define ARG_FLAGS 1
610# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000611# define ARG_CTID 3
612# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000613# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000614# define ARG_FLAGS 0
615# define ARG_STACK 1
616# define ARG_PTID 2
617# define ARG_CTID 3
618# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000619# else
620# define ARG_FLAGS 0
621# define ARG_STACK 1
622# define ARG_PTID 2
623# define ARG_TLS 3
624# define ARG_CTID 4
625# endif
626
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000627int
628sys_clone(tcp)
629struct tcb *tcp;
630{
631 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000632 unsigned long flags = tcp->u_arg[ARG_FLAGS];
633 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
634# ifdef ARG_STACKSIZE
635 if (ARG_STACKSIZE != -1)
636 tprintf("stack_size=%#lx, ",
637 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000638# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000639 tprintf("flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000640 printflags(clone_flags, flags &~ CSIGNAL, NULL);
Roland McGrath984154d2003-05-23 01:08:42 +0000641 if ((flags & CSIGNAL) != 0)
642 tprintf("|%s", signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000643 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000644 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000645 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000646 if (flags & CLONE_PARENT_SETTID)
647 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000648 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000649# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000650 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000651 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000652 tprintf(", {entry_number:%d, ",
653 copy.entry_number);
654 if (!verbose(tcp))
655 tprintf("...}");
656 else
657 print_ldt_entry(&copy);
658 }
659 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000660# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000661 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000662 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000663 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
664 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000665 }
666 return 0;
667}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000668
669int
670sys_unshare(struct tcb *tcp)
671{
672 if (entering(tcp))
673 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
674 return 0;
675}
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000676#endif
677
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000678int
679sys_fork(tcp)
680struct tcb *tcp;
681{
682 if (exiting(tcp))
683 return RVAL_UDECIMAL;
684 return 0;
685}
686
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000687int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000688change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000689{
690#if defined(LINUX)
691#if defined(I386)
692 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000693 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000694 return -1;
695 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000696#elif defined(X86_64)
697 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000698 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000699 return -1;
700 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000702 if (ptrace(PTRACE_POKEUSER, tcp->pid,
703 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000704 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000705 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000706#elif defined(S390) || defined(S390X)
707 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
708 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
709 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000710 return 0;
711#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000712 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000713 return -1;
714 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000715#elif defined(SPARC) || defined(SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000716 struct regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000717 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
718 return -1;
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000719 regs.r_g1=new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000720 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
721 return -1;
722 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000723#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000724 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000725 return -1;
726 return 0;
727#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000728 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000729 return -1;
730 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000731#elif defined(BFIN)
732 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
733 return -1;
734 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000735#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000736 if (ia32) {
737 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000738 case 2:
739 break; /* x86 SYS_fork */
740 case SYS_clone:
741 new = 120;
742 break;
743 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000744 fprintf(stderr, "%s: unexpected syscall %d\n",
745 __FUNCTION__, new);
746 return -1;
747 }
748 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
749 return -1;
750 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000751 return -1;
752 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000753#elif defined(HPPA)
754 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
755 return -1;
756 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000757#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000758 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
759 return -1;
760 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000761#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000762 /* Top half of reg encodes the no. of args n as 0x1n.
763 Assume 0 args as kernel never actually checks... */
764 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
765 0x100000 | new) < 0)
766 return -1;
767 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000768#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000769 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000770# ifndef PTRACE_SET_SYSCALL
771# define PTRACE_SET_SYSCALL 23
772# endif
773
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000774 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000775 return -1;
776
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000777 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000778#else
779#warning Do not know how to handle change_syscall for this architecture
780#endif /* architecture */
781#endif /* LINUX */
782 return -1;
783}
784
Roland McGratha4d48532005-06-08 20:45:28 +0000785#if 0
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000786int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000787setarg(tcp, argnum)
788 struct tcb *tcp;
789 int argnum;
790{
791#if defined (IA64)
792 {
793 unsigned long *bsp, *ap;
794
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000795 if (upeek(tcp, PT_AR_BSP, (long *) &bsp) , 0)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000796 return -1;
797
798 ap = ia64_rse_skip_regs(bsp, argnum);
799 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000800 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000801 if (errno)
802 return -1;
803
804 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000805#elif defined(I386)
806 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000807 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000808 if (errno)
809 return -1;
810 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000811#elif defined(X86_64)
812 {
813 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
814 if (errno)
815 return -1;
816 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000817#elif defined(POWERPC)
818#ifndef PT_ORIG_R3
819#define PT_ORIG_R3 34
820#endif
821 {
822 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000823 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000824 tcp->u_arg[argnum]);
825 if (errno)
826 return -1;
827 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000828#elif defined(MIPS)
829 {
830 errno = 0;
831 if (argnum < 4)
832 ptrace(PTRACE_POKEUSER, tcp->pid,
833 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
834 else {
835 unsigned long *sp;
836
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000837 if (upeek(tcp, REG_SP, (long *) &sp) , 0)
Ralf Baechlee3816102000-08-01 00:06:06 +0000838 return -1;
839
840 ptrace(PTRACE_POKEDATA, tcp->pid,
841 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
842 }
843 if (errno)
844 return -1;
845 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000846#elif defined(S390) || defined(S390X)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000847 {
Michal Ludvig10a88d02002-10-07 14:31:00 +0000848 if(argnum <= 5)
849 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000850 (char *) (argnum==0 ? PT_ORIGGPR2 :
851 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000852 tcp->u_arg[argnum]);
853 else
854 return -E2BIG;
855 if (errno)
856 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000857 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000858#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000859# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000860#endif
861 return 0;
862}
Roland McGratha4d48532005-06-08 20:45:28 +0000863#endif
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000864
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000865#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000866int
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000867internal_clone(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000868{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000869 struct tcb *tcpchild;
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000870 int pid, bpt;
871
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000872 if (!followfork)
873 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000874 if (entering(tcp)) {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000875 setbpt(tcp);
876 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000877 } else {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000878 bpt = tcp->flags & TCB_BPTSET;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000879
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000880 if (syserror(tcp)) {
881 if (bpt)
882 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000883 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000884 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000885
886 pid = tcp->u_rval;
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000887 /* Should not happen, but bugs often cause bogus value here. */
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000888 if (pid <= 1
889 || (sizeof(pid) != sizeof(tcp->u_rval) && pid != tcp->u_rval)
890 ) {
891 if (bpt)
892 clearbpt(tcp);
893 fprintf(stderr, "bogus clone() return value %lx!\n", tcp->u_rval);
894 return 0;
895 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000896
897#ifdef CLONE_PTRACE /* See new setbpt code. */
898 tcpchild = pid2tcb(pid);
899 if (tcpchild != NULL) {
900 /* The child already reported its startup trap
901 before the parent reported its syscall return. */
902 if ((tcpchild->flags
903 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
904 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
905 fprintf(stderr, "\
906[preattached child %d of %d in weird state!]\n",
907 pid, tcp->pid);
908 }
909 else
910#endif
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000911 {
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000912 tcpchild = alloctcb(pid);
913 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000914
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000915#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000916 /* Attach to the new child */
917 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000918 if (bpt)
919 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000920 perror("PTRACE_ATTACH");
921 fprintf(stderr, "Too late?\n");
922 droptcb(tcpchild);
923 return 0;
924 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000925#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000926
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000927 if (bpt)
928 clearbpt(tcp);
929
Ulrich Drepper90512f01999-12-24 07:22:25 +0000930 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000931 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000932 if (bpt) {
933 tcpchild->flags |= TCB_BPTSET;
934 tcpchild->baddr = tcp->baddr;
935 memcpy(tcpchild->inst, tcp->inst,
936 sizeof tcpchild->inst);
937 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000938 tcpchild->parent = tcp;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000939 tcp->nchildren++;
940 if (tcpchild->flags & TCB_SUSPENDED) {
941 /* The child was born suspended, due to our having
942 forced CLONE_PTRACE. */
943 if (bpt)
944 clearbpt(tcpchild);
945
946 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenkof9a7e632009-01-17 00:21:31 +0000947 /* TCB_SUSPENDED tasks are not collected by waitpid
948 * loop, and left stopped. Restart it:
949 */
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000950 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000951 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000952
953 if (!qflag)
954 fprintf(stderr, "\
955Process %u resumed (parent %d ready)\n",
956 pid, tcp->pid);
957 }
958 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000959 if (!qflag)
960 fprintf(stderr, "Process %d attached\n", pid);
961 }
962
963#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000964 {
965 /*
966 * Save the flags used in this call,
967 * in case we point TCP to our parent below.
968 */
969 int call_flags = tcp->u_arg[ARG_FLAGS];
970 if ((tcp->flags & TCB_CLONE_THREAD) &&
971 tcp->parent != NULL) {
972 /* The parent in this clone is itself a
973 thread belonging to another process.
974 There is no meaning to the parentage
975 relationship of the new child with the
976 thread, only with the process. We
977 associate the new thread with our
978 parent. Since this is done for every
979 new thread, there will never be a
980 TCB_CLONE_THREAD process that has
981 children. */
982 --tcp->nchildren;
983 tcp = tcp->parent;
984 tcpchild->parent = tcp;
985 ++tcp->nchildren;
986 }
987 if (call_flags & CLONE_THREAD) {
988 tcpchild->flags |= TCB_CLONE_THREAD;
989 ++tcp->nclone_threads;
990 }
991 if (call_flags & CLONE_DETACHED) {
992 tcpchild->flags |= TCB_CLONE_DETACHED;
993 ++tcp->nclone_detached;
994 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000995 }
996#endif
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000997 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000998 return 0;
999}
1000#endif
1001
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001002int
1003internal_fork(tcp)
1004struct tcb *tcp;
1005{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001006#ifdef LINUX
1007 /* We do special magic with clone for any clone or fork. */
1008 return internal_clone(tcp);
1009#else
1010
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001011 struct tcb *tcpchild;
1012 int pid;
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001013 int follow = 1;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001014
1015#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +00001016 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +00001017 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +00001018 if (change_syscall(tcp, SYS_fork) < 0)
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001019 follow = 0;
Nate Sammonsccd8f211999-03-29 22:57:54 +00001020 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001021#endif
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001022 if (!followfork || !follow)
1023 return 0;
1024
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001025 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001026 if (setbpt(tcp) < 0)
1027 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001028 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001029 else {
1030 int bpt = tcp->flags & TCB_BPTSET;
1031
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001032 if (bpt)
1033 clearbpt(tcp);
1034
1035 if (syserror(tcp))
1036 return 0;
1037
1038 pid = tcp->u_rval;
Denys Vlasenko418d66a2009-01-17 01:52:54 +00001039 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001040#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +00001041#ifdef HPPA
1042 /* The child must have run before it can be attached. */
1043 /* This must be a bug in the parisc kernel, but I havn't
1044 * identified it yet. Seems to be an issue associated
1045 * with attaching to a process (which sends it a signal)
1046 * before that process has ever been scheduled. When
1047 * debugging, I started seeing crashes in
1048 * arch/parisc/kernel/signal.c:do_signal(), apparently
1049 * caused by r8 getting corrupt over the dequeue_signal()
1050 * call. Didn't make much sense though...
1051 */
1052 {
1053 struct timeval tv;
1054 tv.tv_sec = 0;
1055 tv.tv_usec = 10000;
1056 select(0, NULL, NULL, NULL, &tv);
1057 }
1058#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001059 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
1060 perror("PTRACE_ATTACH");
1061 fprintf(stderr, "Too late?\n");
1062 droptcb(tcpchild);
1063 return 0;
1064 }
1065#endif /* LINUX */
1066#ifdef SUNOS4
1067#ifdef oldway
1068 /* The child must have run before it can be attached. */
1069 {
1070 struct timeval tv;
1071 tv.tv_sec = 0;
1072 tv.tv_usec = 10000;
1073 select(0, NULL, NULL, NULL, &tv);
1074 }
1075 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1076 perror("PTRACE_ATTACH");
1077 fprintf(stderr, "Too late?\n");
1078 droptcb(tcpchild);
1079 return 0;
1080 }
1081#else /* !oldway */
1082 /* Try to catch the new process as soon as possible. */
1083 {
1084 int i;
1085 for (i = 0; i < 1024; i++)
1086 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1087 break;
1088 if (i == 1024) {
1089 perror("PTRACE_ATTACH");
1090 fprintf(stderr, "Too late?\n");
1091 droptcb(tcpchild);
1092 return 0;
1093 }
1094 }
1095#endif /* !oldway */
1096#endif /* SUNOS4 */
1097 tcpchild->flags |= TCB_ATTACHED;
1098 /* Child has BPT too, must be removed on first occasion */
1099 if (bpt) {
1100 tcpchild->flags |= TCB_BPTSET;
1101 tcpchild->baddr = tcp->baddr;
1102 memcpy(tcpchild->inst, tcp->inst,
1103 sizeof tcpchild->inst);
1104 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001105 tcpchild->parent = tcp;
1106 tcp->nchildren++;
1107 if (!qflag)
1108 fprintf(stderr, "Process %d attached\n", pid);
1109 }
1110 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001111#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001112}
1113
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001114#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001115
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001116#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001117
1118int
1119sys_vfork(tcp)
1120struct tcb *tcp;
1121{
1122 if (exiting(tcp))
1123 return RVAL_UDECIMAL;
1124 return 0;
1125}
1126
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001127#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001128
1129#ifndef LINUX
1130
1131static char idstr[16];
1132
1133int
1134sys_getpid(tcp)
1135struct tcb *tcp;
1136{
1137 if (exiting(tcp)) {
1138 sprintf(idstr, "ppid %lu", getrval2(tcp));
1139 tcp->auxstr = idstr;
1140 return RVAL_STR;
1141 }
1142 return 0;
1143}
1144
1145int
1146sys_getuid(tcp)
1147struct tcb *tcp;
1148{
1149 if (exiting(tcp)) {
1150 sprintf(idstr, "euid %lu", getrval2(tcp));
1151 tcp->auxstr = idstr;
1152 return RVAL_STR;
1153 }
1154 return 0;
1155}
1156
1157int
1158sys_getgid(tcp)
1159struct tcb *tcp;
1160{
1161 if (exiting(tcp)) {
1162 sprintf(idstr, "egid %lu", getrval2(tcp));
1163 tcp->auxstr = idstr;
1164 return RVAL_STR;
1165 }
1166 return 0;
1167}
1168
1169#endif /* !LINUX */
1170
1171#ifdef LINUX
1172
1173int
1174sys_setuid(tcp)
1175struct tcb *tcp;
1176{
1177 if (entering(tcp)) {
1178 tprintf("%u", (uid_t) tcp->u_arg[0]);
1179 }
1180 return 0;
1181}
1182
1183int
1184sys_setgid(tcp)
1185struct tcb *tcp;
1186{
1187 if (entering(tcp)) {
1188 tprintf("%u", (gid_t) tcp->u_arg[0]);
1189 }
1190 return 0;
1191}
1192
1193int
1194sys_getresuid(tcp)
1195 struct tcb *tcp;
1196{
1197 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001198 __kernel_uid_t uid;
1199 if (syserror(tcp))
1200 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1201 tcp->u_arg[1], tcp->u_arg[2]);
1202 else {
1203 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1204 tprintf("%#lx, ", tcp->u_arg[0]);
1205 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001206 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001207 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1208 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001209 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001210 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001211 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1212 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001213 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001214 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001215 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001216 }
1217 return 0;
1218}
1219
1220int
1221sys_getresgid(tcp)
1222struct tcb *tcp;
1223{
1224 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001225 __kernel_gid_t gid;
1226 if (syserror(tcp))
1227 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1228 tcp->u_arg[1], tcp->u_arg[2]);
1229 else {
1230 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1231 tprintf("%#lx, ", tcp->u_arg[0]);
1232 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001233 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001234 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1235 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001236 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001237 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001238 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1239 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001240 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001241 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001242 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001243 }
1244 return 0;
1245}
1246
1247#endif /* LINUX */
1248
1249int
1250sys_setreuid(tcp)
1251struct tcb *tcp;
1252{
1253 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001254 printuid("", tcp->u_arg[0]);
1255 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001256 }
1257 return 0;
1258}
1259
1260int
1261sys_setregid(tcp)
1262struct tcb *tcp;
1263{
1264 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001265 printuid("", tcp->u_arg[0]);
1266 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001267 }
1268 return 0;
1269}
1270
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001271#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001272int
1273sys_setresuid(tcp)
1274 struct 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]);
1279 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001280 }
1281 return 0;
1282}
1283int
1284sys_setresgid(tcp)
1285 struct 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]);
1290 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001291 }
1292 return 0;
1293}
1294
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001295#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001296
1297int
1298sys_setgroups(tcp)
1299struct tcb *tcp;
1300{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001301 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001302 unsigned long len, size, start, cur, end, abbrev_end;
1303 GETGROUPS_T gid;
1304 int failed = 0;
1305
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001306 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001307 tprintf("%lu, ", len);
1308 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001309 tprintf("[]");
1310 return 0;
1311 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001312 start = tcp->u_arg[1];
1313 if (start == 0) {
1314 tprintf("NULL");
1315 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001316 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001317 size = len * sizeof(gid);
1318 end = start + size;
1319 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1320 tprintf("%#lx", start);
1321 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001322 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001323 if (abbrev(tcp)) {
1324 abbrev_end = start + max_strlen * sizeof(gid);
1325 if (abbrev_end < start)
1326 abbrev_end = end;
1327 } else {
1328 abbrev_end = end;
1329 }
1330 tprintf("[");
1331 for (cur = start; cur < end; cur += sizeof(gid)) {
1332 if (cur > start)
1333 tprintf(", ");
1334 if (cur >= abbrev_end) {
1335 tprintf("...");
1336 break;
1337 }
1338 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1339 tprintf("?");
1340 failed = 1;
1341 break;
1342 }
1343 tprintf("%lu", (unsigned long) gid);
1344 }
1345 tprintf("]");
1346 if (failed)
1347 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001348 }
1349 return 0;
1350}
1351
1352int
1353sys_getgroups(tcp)
1354struct tcb *tcp;
1355{
Roland McGrathaa524c82005-06-01 19:22:06 +00001356 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001357
1358 if (entering(tcp)) {
1359 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001360 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001361 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001362 unsigned long size, start, cur, end, abbrev_end;
1363 GETGROUPS_T gid;
1364 int failed = 0;
1365
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001366 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001367 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001368 tprintf("[]");
1369 return 0;
1370 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001371 start = tcp->u_arg[1];
1372 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001373 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001374 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001375 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001376 if (tcp->u_arg[0] == 0) {
1377 tprintf("%#lx", start);
1378 return 0;
1379 }
1380 size = len * sizeof(gid);
1381 end = start + size;
1382 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1383 size / sizeof(gid) != len || end < start) {
1384 tprintf("%#lx", start);
1385 return 0;
1386 }
1387 if (abbrev(tcp)) {
1388 abbrev_end = start + max_strlen * sizeof(gid);
1389 if (abbrev_end < start)
1390 abbrev_end = end;
1391 } else {
1392 abbrev_end = end;
1393 }
1394 tprintf("[");
1395 for (cur = start; cur < end; cur += sizeof(gid)) {
1396 if (cur > start)
1397 tprintf(", ");
1398 if (cur >= abbrev_end) {
1399 tprintf("...");
1400 break;
1401 }
1402 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1403 tprintf("?");
1404 failed = 1;
1405 break;
1406 }
1407 tprintf("%lu", (unsigned long) gid);
1408 }
1409 tprintf("]");
1410 if (failed)
1411 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001412 }
1413 return 0;
1414}
1415
Roland McGrath83bd47a2003-11-13 22:32:26 +00001416#ifdef LINUX
1417int
1418sys_setgroups32(tcp)
1419struct tcb *tcp;
1420{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001421 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001422 unsigned long len, size, start, cur, end, abbrev_end;
1423 GETGROUPS32_T gid;
1424 int failed = 0;
1425
Roland McGrath83bd47a2003-11-13 22:32:26 +00001426 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001427 tprintf("%lu, ", len);
1428 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001429 tprintf("[]");
1430 return 0;
1431 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001432 start = tcp->u_arg[1];
1433 if (start == 0) {
1434 tprintf("NULL");
1435 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001436 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001437 size = len * sizeof(gid);
1438 end = start + size;
1439 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1440 tprintf("%#lx", start);
1441 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001442 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001443 if (abbrev(tcp)) {
1444 abbrev_end = start + max_strlen * sizeof(gid);
1445 if (abbrev_end < start)
1446 abbrev_end = end;
1447 } else {
1448 abbrev_end = end;
1449 }
1450 tprintf("[");
1451 for (cur = start; cur < end; cur += sizeof(gid)) {
1452 if (cur > start)
1453 tprintf(", ");
1454 if (cur >= abbrev_end) {
1455 tprintf("...");
1456 break;
1457 }
1458 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1459 tprintf("?");
1460 failed = 1;
1461 break;
1462 }
1463 tprintf("%lu", (unsigned long) gid);
1464 }
1465 tprintf("]");
1466 if (failed)
1467 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001468 }
1469 return 0;
1470}
1471
1472int
1473sys_getgroups32(tcp)
1474struct tcb *tcp;
1475{
Roland McGrathaa524c82005-06-01 19:22:06 +00001476 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001477
1478 if (entering(tcp)) {
1479 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001480 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001481 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001482 unsigned long size, start, cur, end, abbrev_end;
1483 GETGROUPS32_T gid;
1484 int failed = 0;
1485
Roland McGrath83bd47a2003-11-13 22:32:26 +00001486 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001487 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001488 tprintf("[]");
1489 return 0;
1490 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001491 start = tcp->u_arg[1];
1492 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001493 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001494 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001495 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001496 size = len * sizeof(gid);
1497 end = start + size;
1498 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1499 size / sizeof(gid) != len || end < start) {
1500 tprintf("%#lx", start);
1501 return 0;
1502 }
1503 if (abbrev(tcp)) {
1504 abbrev_end = start + max_strlen * sizeof(gid);
1505 if (abbrev_end < start)
1506 abbrev_end = end;
1507 } else {
1508 abbrev_end = end;
1509 }
1510 tprintf("[");
1511 for (cur = start; cur < end; cur += sizeof(gid)) {
1512 if (cur > start)
1513 tprintf(", ");
1514 if (cur >= abbrev_end) {
1515 tprintf("...");
1516 break;
1517 }
1518 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1519 tprintf("?");
1520 failed = 1;
1521 break;
1522 }
1523 tprintf("%lu", (unsigned long) gid);
1524 }
1525 tprintf("]");
1526 if (failed)
1527 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001528 }
1529 return 0;
1530}
1531#endif /* LINUX */
1532
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001533#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001534int
1535sys_setpgrp(tcp)
1536struct tcb *tcp;
1537{
1538 if (entering(tcp)) {
1539#ifndef SVR4
1540 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1541#endif /* !SVR4 */
1542 }
1543 return 0;
1544}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001545#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001546
1547int
1548sys_getpgrp(tcp)
1549struct tcb *tcp;
1550{
1551 if (entering(tcp)) {
1552#ifndef SVR4
1553 tprintf("%lu", tcp->u_arg[0]);
1554#endif /* !SVR4 */
1555 }
1556 return 0;
1557}
1558
1559int
1560sys_getsid(tcp)
1561struct tcb *tcp;
1562{
1563 if (entering(tcp)) {
1564 tprintf("%lu", tcp->u_arg[0]);
1565 }
1566 return 0;
1567}
1568
1569int
1570sys_setsid(tcp)
1571struct tcb *tcp;
1572{
1573 return 0;
1574}
1575
1576int
1577sys_getpgid(tcp)
1578struct tcb *tcp;
1579{
1580 if (entering(tcp)) {
1581 tprintf("%lu", tcp->u_arg[0]);
1582 }
1583 return 0;
1584}
1585
1586int
1587sys_setpgid(tcp)
1588struct tcb *tcp;
1589{
1590 if (entering(tcp)) {
1591 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1592 }
1593 return 0;
1594}
1595
John Hughesc61eb3d2002-05-17 11:37:50 +00001596#if UNIXWARE >= 2
1597
1598#include <sys/privilege.h>
1599
1600
Roland McGrathd9f816f2004-09-04 03:39:20 +00001601static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001602 { SETPRV, "SETPRV" },
1603 { CLRPRV, "CLRPRV" },
1604 { PUTPRV, "PUTPRV" },
1605 { GETPRV, "GETPRV" },
1606 { CNTPRV, "CNTPRV" },
1607 { 0, NULL },
1608};
1609
1610
Roland McGrathd9f816f2004-09-04 03:39:20 +00001611static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001612 { P_OWNER, "P_OWNER" },
1613 { P_AUDIT, "P_AUDIT" },
1614 { P_COMPAT, "P_COMPAT" },
1615 { P_DACREAD, "P_DACREAD" },
1616 { P_DACWRITE, "P_DACWRITE" },
1617 { P_DEV, "P_DEV" },
1618 { P_FILESYS, "P_FILESYS" },
1619 { P_MACREAD, "P_MACREAD" },
1620 { P_MACWRITE, "P_MACWRITE" },
1621 { P_MOUNT, "P_MOUNT" },
1622 { P_MULTIDIR, "P_MULTIDIR" },
1623 { P_SETPLEVEL, "P_SETPLEVEL" },
1624 { P_SETSPRIV, "P_SETSPRIV" },
1625 { P_SETUID, "P_SETUID" },
1626 { P_SYSOPS, "P_SYSOPS" },
1627 { P_SETUPRIV, "P_SETUPRIV" },
1628 { P_DRIVER, "P_DRIVER" },
1629 { P_RTIME, "P_RTIME" },
1630 { P_MACUPGRADE, "P_MACUPGRADE" },
1631 { P_FSYSRANGE, "P_FSYSRANGE" },
1632 { P_SETFLEVEL, "P_SETFLEVEL" },
1633 { P_AUDITWR, "P_AUDITWR" },
1634 { P_TSHAR, "P_TSHAR" },
1635 { P_PLOCK, "P_PLOCK" },
1636 { P_CORE, "P_CORE" },
1637 { P_LOADMOD, "P_LOADMOD" },
1638 { P_BIND, "P_BIND" },
1639 { P_ALLPRIVS, "P_ALLPRIVS" },
1640 { 0, NULL },
1641};
1642
1643
Roland McGrathd9f816f2004-09-04 03:39:20 +00001644static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001645 { PS_FIX, "PS_FIX" },
1646 { PS_INH, "PS_INH" },
1647 { PS_MAX, "PS_MAX" },
1648 { PS_WKG, "PS_WKG" },
1649 { 0, NULL },
1650};
1651
1652
1653static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001654printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001655{
1656 priv_t buf [128];
1657 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1658 int dots = len > max;
1659 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001660
John Hughesc61eb3d2002-05-17 11:37:50 +00001661 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001662
John Hughesc61eb3d2002-05-17 11:37:50 +00001663 if (len <= 0 ||
1664 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1665 {
1666 tprintf ("%#lx", addr);
1667 return;
1668 }
1669
1670 tprintf ("[");
1671
1672 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001673 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001674
1675 if (i) tprintf (", ");
1676
1677 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1678 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1679 {
1680 tprintf ("%s|%s", t, p);
1681 }
1682 else {
1683 tprintf ("%#lx", buf [i]);
1684 }
1685 }
1686
1687 if (dots) tprintf (" ...");
1688
1689 tprintf ("]");
1690}
1691
1692
1693int
1694sys_procpriv(tcp)
1695struct tcb *tcp;
1696{
1697 if (entering(tcp)) {
1698 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1699 switch (tcp->u_arg[0]) {
1700 case CNTPRV:
1701 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1702 break;
1703
1704 case GETPRV:
1705 break;
1706
1707 default:
1708 tprintf (", ");
1709 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1710 tprintf (", %ld", tcp->u_arg[2]);
1711 }
1712 }
1713 else if (tcp->u_arg[0] == GETPRV) {
1714 if (syserror (tcp)) {
1715 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1716 }
1717 else {
1718 tprintf (", ");
1719 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1720 tprintf (", %ld", tcp->u_arg[2]);
1721 }
1722 }
Roland McGrath5a223472002-12-15 23:58:26 +00001723
John Hughesc61eb3d2002-05-17 11:37:50 +00001724 return 0;
1725}
1726
1727#endif
1728
1729
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001730static void
1731printargv(tcp, addr)
1732struct tcb *tcp;
1733long addr;
1734{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001735 union {
1736 int p32;
1737 long p64;
1738 char data[sizeof(long)];
1739 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001740 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001741 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001742
Roland McGrath85a3bc42007-08-02 02:13:05 +00001743 cp.p64 = 1;
1744 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1745 if (umoven(tcp, addr, personality_wordsize[current_personality],
1746 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001747 tprintf("%#lx", addr);
1748 return;
1749 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001750 if (personality_wordsize[current_personality] == 4)
1751 cp.p64 = cp.p32;
1752 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001753 break;
1754 tprintf(sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001755 printstr(tcp, cp.p64, -1);
1756 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001757 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001758 if (cp.p64)
1759 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001760}
1761
1762static void
1763printargc(fmt, tcp, addr)
1764char *fmt;
1765struct tcb *tcp;
1766long addr;
1767{
1768 int count;
1769 char *cp;
1770
1771 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1772 addr += sizeof(char *);
1773 }
1774 tprintf(fmt, count, count == 1 ? "" : "s");
1775}
1776
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001777#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001778int
1779sys_execv(tcp)
1780struct tcb *tcp;
1781{
1782 if (entering(tcp)) {
1783 printpath(tcp, tcp->u_arg[0]);
1784 if (!verbose(tcp))
1785 tprintf(", %#lx", tcp->u_arg[1]);
1786#if 0
1787 else if (abbrev(tcp))
1788 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1789#endif
1790 else {
1791 tprintf(", [");
1792 printargv(tcp, tcp->u_arg[1]);
1793 tprintf("]");
1794 }
1795 }
1796 return 0;
1797}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001798#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001799
1800int
1801sys_execve(tcp)
1802struct tcb *tcp;
1803{
1804 if (entering(tcp)) {
1805 printpath(tcp, tcp->u_arg[0]);
1806 if (!verbose(tcp))
1807 tprintf(", %#lx", tcp->u_arg[1]);
1808#if 0
1809 else if (abbrev(tcp))
1810 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1811#endif
1812 else {
1813 tprintf(", [");
1814 printargv(tcp, tcp->u_arg[1]);
1815 tprintf("]");
1816 }
1817 if (!verbose(tcp))
1818 tprintf(", %#lx", tcp->u_arg[2]);
1819 else if (abbrev(tcp))
1820 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1821 else {
1822 tprintf(", [");
1823 printargv(tcp, tcp->u_arg[2]);
1824 tprintf("]");
1825 }
1826 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001827 return 0;
1828}
1829
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001830#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001831
1832int sys_rexecve(tcp)
1833struct tcb *tcp;
1834{
1835 if (entering (tcp)) {
1836 sys_execve (tcp);
1837 tprintf (", %ld", tcp->u_arg[3]);
1838 }
1839 return 0;
1840}
1841
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001842#endif
John Hughes4e36a812001-04-18 15:11:51 +00001843
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001844int
1845internal_exec(tcp)
1846struct tcb *tcp;
1847{
1848#ifdef SUNOS4
1849 if (exiting(tcp) && !syserror(tcp) && followfork)
1850 fixvfork(tcp);
1851#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001852#if defined LINUX && defined TCB_WAITEXECVE
1853 if (exiting(tcp) && syserror(tcp))
1854 tcp->flags &= ~TCB_WAITEXECVE;
1855 else
1856 tcp->flags |= TCB_WAITEXECVE;
1857#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001858 return 0;
1859}
1860
1861#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001862#ifndef __WNOTHREAD
1863#define __WNOTHREAD 0x20000000
1864#endif
1865#ifndef __WALL
1866#define __WALL 0x40000000
1867#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001868#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001869#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001870#endif
1871#endif /* LINUX */
1872
Roland McGrathd9f816f2004-09-04 03:39:20 +00001873static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001874 { WNOHANG, "WNOHANG" },
1875#ifndef WSTOPPED
1876 { WUNTRACED, "WUNTRACED" },
1877#endif
1878#ifdef WEXITED
1879 { WEXITED, "WEXITED" },
1880#endif
1881#ifdef WTRAPPED
1882 { WTRAPPED, "WTRAPPED" },
1883#endif
1884#ifdef WSTOPPED
1885 { WSTOPPED, "WSTOPPED" },
1886#endif
1887#ifdef WCONTINUED
1888 { WCONTINUED, "WCONTINUED" },
1889#endif
1890#ifdef WNOWAIT
1891 { WNOWAIT, "WNOWAIT" },
1892#endif
1893#ifdef __WCLONE
1894 { __WCLONE, "__WCLONE" },
1895#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001896#ifdef __WALL
1897 { __WALL, "__WALL" },
1898#endif
1899#ifdef __WNOTHREAD
1900 { __WNOTHREAD, "__WNOTHREAD" },
1901#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001902 { 0, NULL },
1903};
1904
Roland McGrath5e02a572004-10-19 23:33:47 +00001905#if !defined WCOREFLAG && defined WCOREFLG
1906# define WCOREFLAG WCOREFLG
1907#endif
1908#ifndef WCOREFLAG
1909#define WCOREFLAG 0x80
1910#endif
1911
1912#ifndef W_STOPCODE
1913#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1914#endif
1915#ifndef W_EXITCODE
1916#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1917#endif
1918
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001919static int
1920printstatus(status)
1921int status;
1922{
1923 int exited = 0;
1924
1925 /*
1926 * Here is a tricky presentation problem. This solution
1927 * is still not entirely satisfactory but since there
1928 * are no wait status constructors it will have to do.
1929 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001930 if (WIFSTOPPED(status)) {
1931 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001932 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001933 status &= ~W_STOPCODE(WSTOPSIG(status));
1934 }
1935 else if (WIFSIGNALED(status)) {
1936 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001937 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001938 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001939 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1940 }
1941 else if (WIFEXITED(status)) {
1942 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001943 WEXITSTATUS(status));
1944 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001945 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001946 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001947 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001948 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001949 return 0;
1950 }
1951
1952 if (status == 0)
1953 tprintf("]");
1954 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001955 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001956
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001957 return exited;
1958}
1959
1960static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001961printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001962{
1963 int status;
1964 int exited = 0;
1965
1966 if (entering(tcp)) {
Roland McGrath5b63d962008-07-18 02:16:47 +00001967 /*
1968 * Sign-extend a 32-bit value when that's what it is.
Denys Vlasenko59432db2009-01-26 19:09:35 +00001969 *
1970 * NB: On Linux, kernel-side pid_t is typedef'ed to int
1971 * on all arches; also, glibc-2.8 truncates wait3 and wait4
1972 * pid argument to int on 64bit arches, producing,
1973 * for example, wait4(4294967295, ...) instead of -1
1974 * in strace.
1975 * Therefore, maybe it makes sense to *unconditionally*
1976 * widen int to long here...
Roland McGrath5b63d962008-07-18 02:16:47 +00001977 */
1978 long pid = tcp->u_arg[0];
1979 if (personality_wordsize[current_personality] < sizeof pid)
1980 pid = (long) (int) pid;
1981 tprintf("%ld, ", pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001982 } else {
1983 /* status */
1984 if (!tcp->u_arg[1])
1985 tprintf("NULL");
1986 else if (syserror(tcp) || tcp->u_rval == 0)
1987 tprintf("%#lx", tcp->u_arg[1]);
1988 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1989 tprintf("[?]");
1990 else
1991 exited = printstatus(status);
1992 /* options */
1993 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001994 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001995 if (n == 4) {
1996 tprintf(", ");
1997 /* usage */
1998 if (!tcp->u_arg[3])
1999 tprintf("NULL");
2000#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002001 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00002002#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002003 if (bitness)
2004 printrusage32(tcp, tcp->u_arg[3]);
2005 else
2006#endif
2007 printrusage(tcp, tcp->u_arg[3]);
2008 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002009#endif /* LINUX */
2010#ifdef SUNOS4
2011 else if (tcp->u_rval > 0 && exited)
2012 printrusage(tcp, tcp->u_arg[3]);
2013#endif /* SUNOS4 */
2014 else
2015 tprintf("%#lx", tcp->u_arg[3]);
2016 }
2017 }
2018 return 0;
2019}
2020
2021int
Roland McGrathc74c0b72004-09-01 19:39:46 +00002022internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002023struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00002024int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002025{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002026 int got_kids;
2027
2028#ifdef TCB_CLONE_THREAD
2029 if (tcp->flags & TCB_CLONE_THREAD)
2030 /* The children we wait for are our parent's children. */
2031 got_kids = (tcp->parent->nchildren
2032 > tcp->parent->nclone_detached);
2033 else
2034 got_kids = (tcp->nchildren > tcp->nclone_detached);
2035#else
2036 got_kids = tcp->nchildren > 0;
2037#endif
2038
2039 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002040 /* There are children that this parent should block for.
2041 But ptrace made us the parent of the traced children
2042 and the real parent will get ECHILD from the wait call.
2043
2044 XXX If we attached with strace -f -p PID, then there
2045 may be untraced dead children the parent could be reaping
2046 now, but we make him block. */
2047
2048 /* ??? WTA: fix bug with hanging children */
2049
Roland McGrathc74c0b72004-09-01 19:39:46 +00002050 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00002051 /*
2052 * There are traced children. We'll make the parent
2053 * block to avoid a false ECHILD error due to our
2054 * ptrace having stolen the children. However,
2055 * we shouldn't block if there are zombies to reap.
2056 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
2057 */
Roland McGrathfccfb942003-10-01 21:59:44 +00002058 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00002059 if (tcp->nzombies > 0 &&
2060 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00002061 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00002062 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00002063 if (tcp->u_arg[0] > 0) {
2064 /*
2065 * If the parent waits for a specified child
2066 * PID, then it must get ECHILD right away
2067 * if that PID is not one of its children.
2068 * Make sure that the requested PID matches
2069 * one of the parent's children that we are
2070 * tracing, and don't suspend it otherwise.
2071 */
2072 if (child == NULL)
2073 child = pid2tcb(tcp->u_arg[0]);
2074 if (child == NULL || child->parent != (
2075#ifdef TCB_CLONE_THREAD
2076 (tcp->flags & TCB_CLONE_THREAD)
2077 ? tcp->parent :
2078#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002079 tcp) ||
2080 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002081 return 0;
2082 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002083 tcp->flags |= TCB_SUSPENDED;
2084 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002085#ifdef TCB_CLONE_THREAD
2086 if (tcp->flags & TCB_CLONE_THREAD)
2087 tcp->parent->nclone_waiting++;
2088#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002089 }
2090 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002091 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002092 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002093 /* We must force a fake result of 0 instead of
2094 the ECHILD error. */
2095 extern int force_result();
2096 return force_result(tcp, 0, 0);
2097 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002098 }
Roland McGrath09623452003-05-23 02:27:13 +00002099 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2100 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2101 /*
2102 * We just reaped a child we don't know about,
2103 * presumably a zombie we already droptcb'd.
2104 */
2105 tcp->nzombies--;
2106 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002107 return 0;
2108}
2109
2110#ifdef SVR4
2111
2112int
2113sys_wait(tcp)
2114struct tcb *tcp;
2115{
2116 if (exiting(tcp)) {
2117 /* The library wrapper stuffs this into the user variable. */
2118 if (!syserror(tcp))
2119 printstatus(getrval2(tcp));
2120 }
2121 return 0;
2122}
2123
2124#endif /* SVR4 */
2125
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002126#ifdef FREEBSD
2127int
2128sys_wait(tcp)
2129struct tcb *tcp;
2130{
2131 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002132
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002133 if (exiting(tcp)) {
2134 if (!syserror(tcp)) {
2135 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2136 tprintf("%#lx", tcp->u_arg[0]);
2137 else
2138 printstatus(status);
2139 }
2140 }
2141 return 0;
2142}
2143#endif
2144
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002145int
2146sys_waitpid(tcp)
2147struct tcb *tcp;
2148{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002149 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002150}
2151
2152int
2153sys_wait4(tcp)
2154struct tcb *tcp;
2155{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002156 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002157}
2158
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002159#ifdef ALPHA
2160int
2161sys_osf_wait4(tcp)
2162struct tcb *tcp;
2163{
2164 return printwaitn(tcp, 4, 1);
2165}
2166#endif
2167
Roland McGrathc74c0b72004-09-01 19:39:46 +00002168#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002169
Roland McGrathd9f816f2004-09-04 03:39:20 +00002170static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002171 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002172#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002173 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002174#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002175 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002176#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002177 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002178#endif
2179#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002180 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002181#endif
2182#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002183 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002184#endif
2185#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002186 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002187#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002188 { P_ALL, "P_ALL" },
2189#ifdef P_LWPID
2190 { P_LWPID, "P_LWPID" },
2191#endif
2192 { 0, NULL },
2193};
2194
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002195int
2196sys_waitid(tcp)
2197struct tcb *tcp;
2198{
2199 siginfo_t si;
2200 int exited;
2201
2202 if (entering(tcp)) {
2203 printxval(waitid_types, tcp->u_arg[0], "P_???");
2204 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002205 }
2206 else {
2207 /* siginfo */
2208 exited = 0;
2209 if (!tcp->u_arg[2])
2210 tprintf("NULL");
2211 else if (syserror(tcp))
2212 tprintf("%#lx", tcp->u_arg[2]);
2213 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2214 tprintf("{???}");
2215 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002216 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002217 /* options */
2218 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002219 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002220 if (tcp->u_nargs > 4) {
2221 /* usage */
2222 tprintf(", ");
2223 if (!tcp->u_arg[4])
2224 tprintf("NULL");
2225 else if (tcp->u_error)
2226 tprintf("%#lx", tcp->u_arg[4]);
2227 else
2228 printrusage(tcp, tcp->u_arg[4]);
2229 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002230 }
2231 return 0;
2232}
2233
Roland McGrathc74c0b72004-09-01 19:39:46 +00002234#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002235
2236int
2237sys_alarm(tcp)
2238struct tcb *tcp;
2239{
2240 if (entering(tcp))
2241 tprintf("%lu", tcp->u_arg[0]);
2242 return 0;
2243}
2244
2245int
2246sys_uname(tcp)
2247struct tcb *tcp;
2248{
2249 struct utsname uname;
2250
2251 if (exiting(tcp)) {
2252 if (syserror(tcp) || !verbose(tcp))
2253 tprintf("%#lx", tcp->u_arg[0]);
2254 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2255 tprintf("{...}");
2256 else if (!abbrev(tcp)) {
2257
2258 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2259 uname.sysname, uname.nodename);
2260 tprintf("release=\"%s\", version=\"%s\", ",
2261 uname.release, uname.version);
2262 tprintf("machine=\"%s\"", uname.machine);
2263#ifdef LINUX
2264#ifndef __GLIBC__
2265 tprintf(", domainname=\"%s\"", uname.domainname);
2266#endif /* __GLIBC__ */
2267#endif /* LINUX */
2268 tprintf("}");
2269 }
2270 else
2271 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2272 uname.sysname, uname.nodename);
2273 }
2274 return 0;
2275}
2276
2277#ifndef SVR4
2278
Roland McGrathd9f816f2004-09-04 03:39:20 +00002279static const struct xlat ptrace_cmds[] = {
Roland McGrath5a223472002-12-15 23:58:26 +00002280#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002281 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2282 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2283 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2284 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2285 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2286 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2287 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2288 { PTRACE_CONT, "PTRACE_CONT" },
2289 { PTRACE_KILL, "PTRACE_KILL" },
2290 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2291 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2292 { PTRACE_DETACH, "PTRACE_DETACH" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002293#ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002294 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002295#endif
2296#ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002297 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002298#endif
2299#ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002300 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002301#endif
2302#ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002303 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002304#endif
2305#ifdef PTRACE_GETFPXREGS
2306 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2307#endif
2308#ifdef PTRACE_SETFPXREGS
2309 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2310#endif
Roland McGrathf04bb482005-05-09 07:45:33 +00002311#ifdef PTRACE_GETVRREGS
2312 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
2313#endif
2314#ifdef PTRACE_SETVRREGS
2315 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
2316#endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002317#ifdef PTRACE_SETOPTIONS
2318 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
2319#endif
2320#ifdef PTRACE_GETEVENTMSG
2321 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
2322#endif
2323#ifdef PTRACE_GETSIGINFO
2324 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
2325#endif
2326#ifdef PTRACE_SETSIGINFO
2327 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
2328#endif
Roland McGrathbf621d42003-01-14 09:46:21 +00002329#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002330 { PTRACE_READDATA, "PTRACE_READDATA" },
2331 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2332 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2333 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2334 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2335 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2336#ifdef SPARC
2337 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2338 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2339#else /* !SPARC */
2340 { PTRACE_22, "PTRACE_PTRACE_22" },
2341 { PTRACE_23, "PTRACE_PTRACE_23" },
2342#endif /* !SPARC */
2343#endif /* SUNOS4 */
2344 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2345#ifdef SUNOS4
2346 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2347#ifdef I386
2348 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2349 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2350 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2351#else /* !I386 */
2352 { PTRACE_26, "PTRACE_26" },
2353 { PTRACE_27, "PTRACE_27" },
2354 { PTRACE_28, "PTRACE_28" },
2355#endif /* !I386 */
2356 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2357#endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002358
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002359#else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002360
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002361 { PT_TRACE_ME, "PT_TRACE_ME" },
2362 { PT_READ_I, "PT_READ_I" },
2363 { PT_READ_D, "PT_READ_D" },
2364 { PT_WRITE_I, "PT_WRITE_I" },
2365 { PT_WRITE_D, "PT_WRITE_D" },
John Hughesa2278142001-09-28 16:21:30 +00002366#ifdef PT_READ_U
2367 { PT_READ_U, "PT_READ_U" },
2368#endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002369 { PT_CONTINUE, "PT_CONTINUE" },
2370 { PT_KILL, "PT_KILL" },
2371 { PT_STEP, "PT_STEP" },
2372 { PT_ATTACH, "PT_ATTACH" },
2373 { PT_DETACH, "PT_DETACH" },
2374 { PT_GETREGS, "PT_GETREGS" },
2375 { PT_SETREGS, "PT_SETREGS" },
2376 { PT_GETFPREGS, "PT_GETFPREGS" },
2377 { PT_SETFPREGS, "PT_SETFPREGS" },
2378 { PT_GETDBREGS, "PT_GETDBREGS" },
2379 { PT_SETDBREGS, "PT_SETDBREGS" },
2380#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002381 { 0, NULL },
2382};
2383
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002384#ifndef FREEBSD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002385#ifdef PTRACE_SETOPTIONS
2386static const struct xlat ptrace_setoptions_flags[] = {
2387#ifdef PTRACE_O_TRACESYSGOOD
2388 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
2389#endif
2390#ifdef PTRACE_O_TRACEFORK
2391 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
2392#endif
2393#ifdef PTRACE_O_TRACEVFORK
2394 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
2395#endif
2396#ifdef PTRACE_O_TRACECLONE
2397 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
2398#endif
2399#ifdef PTRACE_O_TRACEEXEC
2400 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
2401#endif
2402#ifdef PTRACE_O_TRACEVFORKDONE
2403 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
2404#endif
2405#ifdef PTRACE_O_TRACEEXIT
2406 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
2407#endif
2408 { 0, NULL },
2409};
2410#endif
2411#endif
2412
2413#ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002414const struct xlat struct_user_offsets[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002415#ifdef LINUX
Michal Ludvig10a88d02002-10-07 14:31:00 +00002416#if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002417 { PT_PSWMASK, "psw_mask" },
2418 { PT_PSWADDR, "psw_addr" },
2419 { PT_GPR0, "gpr0" },
2420 { PT_GPR1, "gpr1" },
2421 { PT_GPR2, "gpr2" },
2422 { PT_GPR3, "gpr3" },
2423 { PT_GPR4, "gpr4" },
2424 { PT_GPR5, "gpr5" },
2425 { PT_GPR6, "gpr6" },
2426 { PT_GPR7, "gpr7" },
2427 { PT_GPR8, "gpr8" },
2428 { PT_GPR9, "gpr9" },
2429 { PT_GPR10, "gpr10" },
2430 { PT_GPR11, "gpr11" },
2431 { PT_GPR12, "gpr12" },
2432 { PT_GPR13, "gpr13" },
2433 { PT_GPR14, "gpr14" },
2434 { PT_GPR15, "gpr15" },
2435 { PT_ACR0, "acr0" },
2436 { PT_ACR1, "acr1" },
2437 { PT_ACR2, "acr2" },
2438 { PT_ACR3, "acr3" },
2439 { PT_ACR4, "acr4" },
2440 { PT_ACR5, "acr5" },
2441 { PT_ACR6, "acr6" },
2442 { PT_ACR7, "acr7" },
2443 { PT_ACR8, "acr8" },
2444 { PT_ACR9, "acr9" },
2445 { PT_ACR10, "acr10" },
2446 { PT_ACR11, "acr11" },
2447 { PT_ACR12, "acr12" },
2448 { PT_ACR13, "acr13" },
2449 { PT_ACR14, "acr14" },
2450 { PT_ACR15, "acr15" },
2451 { PT_ORIGGPR2, "orig_gpr2" },
2452 { PT_FPC, "fpc" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002453#if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002454 { PT_FPR0_HI, "fpr0.hi" },
2455 { PT_FPR0_LO, "fpr0.lo" },
2456 { PT_FPR1_HI, "fpr1.hi" },
2457 { PT_FPR1_LO, "fpr1.lo" },
2458 { PT_FPR2_HI, "fpr2.hi" },
2459 { PT_FPR2_LO, "fpr2.lo" },
2460 { PT_FPR3_HI, "fpr3.hi" },
2461 { PT_FPR3_LO, "fpr3.lo" },
2462 { PT_FPR4_HI, "fpr4.hi" },
2463 { PT_FPR4_LO, "fpr4.lo" },
2464 { PT_FPR5_HI, "fpr5.hi" },
2465 { PT_FPR5_LO, "fpr5.lo" },
2466 { PT_FPR6_HI, "fpr6.hi" },
2467 { PT_FPR6_LO, "fpr6.lo" },
2468 { PT_FPR7_HI, "fpr7.hi" },
2469 { PT_FPR7_LO, "fpr7.lo" },
2470 { PT_FPR8_HI, "fpr8.hi" },
2471 { PT_FPR8_LO, "fpr8.lo" },
2472 { PT_FPR9_HI, "fpr9.hi" },
2473 { PT_FPR9_LO, "fpr9.lo" },
2474 { PT_FPR10_HI, "fpr10.hi" },
2475 { PT_FPR10_LO, "fpr10.lo" },
2476 { PT_FPR11_HI, "fpr11.hi" },
2477 { PT_FPR11_LO, "fpr11.lo" },
2478 { PT_FPR12_HI, "fpr12.hi" },
2479 { PT_FPR12_LO, "fpr12.lo" },
2480 { PT_FPR13_HI, "fpr13.hi" },
2481 { PT_FPR13_LO, "fpr13.lo" },
2482 { PT_FPR14_HI, "fpr14.hi" },
2483 { PT_FPR14_LO, "fpr14.lo" },
2484 { PT_FPR15_HI, "fpr15.hi" },
2485 { PT_FPR15_LO, "fpr15.lo" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002486#endif
2487#if defined(S390X)
2488 { PT_FPR0, "fpr0" },
2489 { PT_FPR1, "fpr1" },
2490 { PT_FPR2, "fpr2" },
2491 { PT_FPR3, "fpr3" },
2492 { PT_FPR4, "fpr4" },
2493 { PT_FPR5, "fpr5" },
2494 { PT_FPR6, "fpr6" },
2495 { PT_FPR7, "fpr7" },
2496 { PT_FPR8, "fpr8" },
2497 { PT_FPR9, "fpr9" },
2498 { PT_FPR10, "fpr10" },
2499 { PT_FPR11, "fpr11" },
2500 { PT_FPR12, "fpr12" },
2501 { PT_FPR13, "fpr13" },
2502 { PT_FPR14, "fpr14" },
2503 { PT_FPR15, "fpr15" },
2504#endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002505 { PT_CR_9, "cr9" },
2506 { PT_CR_10, "cr10" },
2507 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002508 { PT_IEEE_IP, "ieee_exception_ip" },
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002509#endif
2510#if defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002511 /* XXX No support for these offsets yet. */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002512#elif defined(HPPA)
2513 /* XXX No support for these offsets yet. */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002514#elif defined(POWERPC)
Roland McGrath5a223472002-12-15 23:58:26 +00002515#ifndef PT_ORIG_R3
2516#define PT_ORIG_R3 34
2517#endif
Roland McGratheb285352003-01-14 09:59:00 +00002518#define REGSIZE (sizeof(unsigned long))
2519 { REGSIZE*PT_R0, "r0" },
2520 { REGSIZE*PT_R1, "r1" },
2521 { REGSIZE*PT_R2, "r2" },
2522 { REGSIZE*PT_R3, "r3" },
2523 { REGSIZE*PT_R4, "r4" },
2524 { REGSIZE*PT_R5, "r5" },
2525 { REGSIZE*PT_R6, "r6" },
2526 { REGSIZE*PT_R7, "r7" },
2527 { REGSIZE*PT_R8, "r8" },
2528 { REGSIZE*PT_R9, "r9" },
2529 { REGSIZE*PT_R10, "r10" },
2530 { REGSIZE*PT_R11, "r11" },
2531 { REGSIZE*PT_R12, "r12" },
2532 { REGSIZE*PT_R13, "r13" },
2533 { REGSIZE*PT_R14, "r14" },
2534 { REGSIZE*PT_R15, "r15" },
2535 { REGSIZE*PT_R16, "r16" },
2536 { REGSIZE*PT_R17, "r17" },
2537 { REGSIZE*PT_R18, "r18" },
2538 { REGSIZE*PT_R19, "r19" },
2539 { REGSIZE*PT_R20, "r20" },
2540 { REGSIZE*PT_R21, "r21" },
2541 { REGSIZE*PT_R22, "r22" },
2542 { REGSIZE*PT_R23, "r23" },
2543 { REGSIZE*PT_R24, "r24" },
2544 { REGSIZE*PT_R25, "r25" },
2545 { REGSIZE*PT_R26, "r26" },
2546 { REGSIZE*PT_R27, "r27" },
2547 { REGSIZE*PT_R28, "r28" },
2548 { REGSIZE*PT_R29, "r29" },
2549 { REGSIZE*PT_R30, "r30" },
2550 { REGSIZE*PT_R31, "r31" },
2551 { REGSIZE*PT_NIP, "NIP" },
2552 { REGSIZE*PT_MSR, "MSR" },
2553 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2554 { REGSIZE*PT_CTR, "CTR" },
2555 { REGSIZE*PT_LNK, "LNK" },
2556 { REGSIZE*PT_XER, "XER" },
2557 { REGSIZE*PT_CCR, "CCR" },
2558 { REGSIZE*PT_FPR0, "FPR0" },
2559#undef REGSIZE
Roland McGrath5a223472002-12-15 23:58:26 +00002560#else
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002561#ifdef ALPHA
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002562 { 0, "r0" },
2563 { 1, "r1" },
2564 { 2, "r2" },
2565 { 3, "r3" },
2566 { 4, "r4" },
2567 { 5, "r5" },
2568 { 6, "r6" },
2569 { 7, "r7" },
2570 { 8, "r8" },
2571 { 9, "r9" },
2572 { 10, "r10" },
2573 { 11, "r11" },
2574 { 12, "r12" },
2575 { 13, "r13" },
2576 { 14, "r14" },
2577 { 15, "r15" },
2578 { 16, "r16" },
2579 { 17, "r17" },
2580 { 18, "r18" },
2581 { 19, "r19" },
2582 { 20, "r20" },
2583 { 21, "r21" },
2584 { 22, "r22" },
2585 { 23, "r23" },
2586 { 24, "r24" },
2587 { 25, "r25" },
2588 { 26, "r26" },
2589 { 27, "r27" },
2590 { 28, "r28" },
2591 { 29, "gp" },
2592 { 30, "fp" },
2593 { 31, "zero" },
2594 { 32, "fp0" },
2595 { 33, "fp" },
2596 { 34, "fp2" },
2597 { 35, "fp3" },
2598 { 36, "fp4" },
2599 { 37, "fp5" },
2600 { 38, "fp6" },
2601 { 39, "fp7" },
2602 { 40, "fp8" },
2603 { 41, "fp9" },
2604 { 42, "fp10" },
2605 { 43, "fp11" },
2606 { 44, "fp12" },
2607 { 45, "fp13" },
2608 { 46, "fp14" },
2609 { 47, "fp15" },
2610 { 48, "fp16" },
2611 { 49, "fp17" },
2612 { 50, "fp18" },
2613 { 51, "fp19" },
2614 { 52, "fp20" },
2615 { 53, "fp21" },
2616 { 54, "fp22" },
2617 { 55, "fp23" },
2618 { 56, "fp24" },
2619 { 57, "fp25" },
2620 { 58, "fp26" },
2621 { 59, "fp27" },
2622 { 60, "fp28" },
2623 { 61, "fp29" },
2624 { 62, "fp30" },
2625 { 63, "fp31" },
2626 { 64, "pc" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002627#else /* !ALPHA */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002628#ifdef IA64
2629 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2630 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2631 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2632 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2633 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2634 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2635 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2636 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2637 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2638 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2639 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2640 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2641 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2642 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2643 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2644 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2645 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2646 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2647 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2648 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2649 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2650 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2651 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2652 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2653 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2654 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2655 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2656 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2657 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2658 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2659 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2660 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2661 /* switch stack: */
2662 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2663 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2664 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2665 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2666 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2667 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2668 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2669 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2670 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2671 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002672 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2673 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002674 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002675 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002676 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2677 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002678 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2679 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2680 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2681 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2682 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2683 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2684 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2685 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2686 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2687 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2688 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2689 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2690 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2691 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2692 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Roland McGrathfb1bc072004-03-01 21:29:24 +00002693# ifdef PT_AR_CSD
2694 { PT_AR_CSD, "ar.csd" },
2695# endif
2696# ifdef PT_AR_SSD
2697 { PT_AR_SSD, "ar.ssd" },
2698# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002699 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002700#else /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002701#ifdef I386
2702 { 4*EBX, "4*EBX" },
2703 { 4*ECX, "4*ECX" },
2704 { 4*EDX, "4*EDX" },
2705 { 4*ESI, "4*ESI" },
2706 { 4*EDI, "4*EDI" },
2707 { 4*EBP, "4*EBP" },
2708 { 4*EAX, "4*EAX" },
2709 { 4*DS, "4*DS" },
2710 { 4*ES, "4*ES" },
2711 { 4*FS, "4*FS" },
2712 { 4*GS, "4*GS" },
2713 { 4*ORIG_EAX, "4*ORIG_EAX" },
2714 { 4*EIP, "4*EIP" },
2715 { 4*CS, "4*CS" },
2716 { 4*EFL, "4*EFL" },
2717 { 4*UESP, "4*UESP" },
2718 { 4*SS, "4*SS" },
2719#else /* !I386 */
Michal Ludvig0e035502002-09-23 15:41:01 +00002720#ifdef X86_64
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002721 { 8*R15, "8*R15" },
2722 { 8*R14, "8*R14" },
2723 { 8*R13, "8*R13" },
2724 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002725 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002726 { 8*RBX, "8*RBX" },
2727 { 8*R11, "8*R11" },
2728 { 8*R10, "8*R10" },
2729 { 8*R9, "8*R9" },
2730 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002731 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002732 { 8*RCX, "8*RCX" },
2733 { 8*RDX, "8*RDX" },
2734 { 8*RSI, "8*RSI" },
2735 { 8*RDI, "8*RDI" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002736#if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002737 { DS, "DS" },
2738 { ES, "ES" },
2739 { FS, "FS" },
2740 { GS, "GS" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002741#endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002742 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002743 { 8*RIP, "8*RIP" },
2744 { 8*CS, "8*CS" },
2745 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002746 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002747 { 8*SS, "8*SS" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002748#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002749#ifdef M68K
2750 { 4*PT_D1, "4*PT_D1" },
2751 { 4*PT_D2, "4*PT_D2" },
2752 { 4*PT_D3, "4*PT_D3" },
2753 { 4*PT_D4, "4*PT_D4" },
2754 { 4*PT_D5, "4*PT_D5" },
2755 { 4*PT_D6, "4*PT_D6" },
2756 { 4*PT_D7, "4*PT_D7" },
2757 { 4*PT_A0, "4*PT_A0" },
2758 { 4*PT_A1, "4*PT_A1" },
2759 { 4*PT_A2, "4*PT_A2" },
2760 { 4*PT_A3, "4*PT_A3" },
2761 { 4*PT_A4, "4*PT_A4" },
2762 { 4*PT_A5, "4*PT_A5" },
2763 { 4*PT_A6, "4*PT_A6" },
2764 { 4*PT_D0, "4*PT_D0" },
2765 { 4*PT_USP, "4*PT_USP" },
2766 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2767 { 4*PT_SR, "4*PT_SR" },
2768 { 4*PT_PC, "4*PT_PC" },
2769#endif /* M68K */
2770#endif /* !I386 */
Wichert Akkermanccef6372002-05-01 16:39:22 +00002771#ifdef SH
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002772 { 4*REG_REG0, "4*REG_REG0" },
2773 { 4*(REG_REG0+1), "4*REG_REG1" },
2774 { 4*(REG_REG0+2), "4*REG_REG2" },
2775 { 4*(REG_REG0+3), "4*REG_REG3" },
2776 { 4*(REG_REG0+4), "4*REG_REG4" },
2777 { 4*(REG_REG0+5), "4*REG_REG5" },
2778 { 4*(REG_REG0+6), "4*REG_REG6" },
2779 { 4*(REG_REG0+7), "4*REG_REG7" },
2780 { 4*(REG_REG0+8), "4*REG_REG8" },
2781 { 4*(REG_REG0+9), "4*REG_REG9" },
2782 { 4*(REG_REG0+10), "4*REG_REG10" },
2783 { 4*(REG_REG0+11), "4*REG_REG11" },
2784 { 4*(REG_REG0+12), "4*REG_REG12" },
2785 { 4*(REG_REG0+13), "4*REG_REG13" },
2786 { 4*(REG_REG0+14), "4*REG_REG14" },
2787 { 4*REG_REG15, "4*REG_REG15" },
2788 { 4*REG_PC, "4*REG_PC" },
2789 { 4*REG_PR, "4*REG_PR" },
2790 { 4*REG_SR, "4*REG_SR" },
2791 { 4*REG_GBR, "4*REG_GBR" },
2792 { 4*REG_MACH, "4*REG_MACH" },
2793 { 4*REG_MACL, "4*REG_MACL" },
2794 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2795 { 4*REG_FPUL, "4*REG_FPUL" },
2796 { 4*REG_FPREG0, "4*REG_FPREG0" },
2797 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2798 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2799 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2800 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2801 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2802 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2803 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2804 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2805 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2806 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2807 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2808 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2809 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2810 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2811 { 4*REG_FPREG15, "4*REG_FPREG15" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002812#ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002813 { 4*REG_XDREG0, "4*REG_XDREG0" },
2814 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2815 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2816 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2817 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2818 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2819 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2820 { 4*REG_XDREG14, "4*REG_XDREG14" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002821#endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002822 { 4*REG_FPSCR, "4*REG_FPSCR" },
Wichert Akkermanccef6372002-05-01 16:39:22 +00002823#endif /* SH */
Roland McGrathf5a47772003-06-26 22:40:42 +00002824#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002825 { 0, "PC(L)" },
2826 { 4, "PC(U)" },
2827 { 8, "SR(L)" },
2828 { 12, "SR(U)" },
2829 { 16, "syscall no.(L)" },
2830 { 20, "syscall_no.(U)" },
2831 { 24, "R0(L)" },
2832 { 28, "R0(U)" },
2833 { 32, "R1(L)" },
2834 { 36, "R1(U)" },
2835 { 40, "R2(L)" },
2836 { 44, "R2(U)" },
2837 { 48, "R3(L)" },
2838 { 52, "R3(U)" },
2839 { 56, "R4(L)" },
2840 { 60, "R4(U)" },
2841 { 64, "R5(L)" },
2842 { 68, "R5(U)" },
2843 { 72, "R6(L)" },
2844 { 76, "R6(U)" },
2845 { 80, "R7(L)" },
2846 { 84, "R7(U)" },
2847 { 88, "R8(L)" },
2848 { 92, "R8(U)" },
2849 { 96, "R9(L)" },
2850 { 100, "R9(U)" },
2851 { 104, "R10(L)" },
2852 { 108, "R10(U)" },
2853 { 112, "R11(L)" },
2854 { 116, "R11(U)" },
2855 { 120, "R12(L)" },
2856 { 124, "R12(U)" },
2857 { 128, "R13(L)" },
2858 { 132, "R13(U)" },
2859 { 136, "R14(L)" },
2860 { 140, "R14(U)" },
2861 { 144, "R15(L)" },
2862 { 148, "R15(U)" },
2863 { 152, "R16(L)" },
2864 { 156, "R16(U)" },
2865 { 160, "R17(L)" },
2866 { 164, "R17(U)" },
2867 { 168, "R18(L)" },
2868 { 172, "R18(U)" },
2869 { 176, "R19(L)" },
2870 { 180, "R19(U)" },
2871 { 184, "R20(L)" },
2872 { 188, "R20(U)" },
2873 { 192, "R21(L)" },
2874 { 196, "R21(U)" },
2875 { 200, "R22(L)" },
2876 { 204, "R22(U)" },
2877 { 208, "R23(L)" },
2878 { 212, "R23(U)" },
2879 { 216, "R24(L)" },
2880 { 220, "R24(U)" },
2881 { 224, "R25(L)" },
2882 { 228, "R25(U)" },
2883 { 232, "R26(L)" },
2884 { 236, "R26(U)" },
2885 { 240, "R27(L)" },
2886 { 244, "R27(U)" },
2887 { 248, "R28(L)" },
2888 { 252, "R28(U)" },
2889 { 256, "R29(L)" },
2890 { 260, "R29(U)" },
2891 { 264, "R30(L)" },
2892 { 268, "R30(U)" },
2893 { 272, "R31(L)" },
2894 { 276, "R31(U)" },
2895 { 280, "R32(L)" },
2896 { 284, "R32(U)" },
2897 { 288, "R33(L)" },
2898 { 292, "R33(U)" },
2899 { 296, "R34(L)" },
2900 { 300, "R34(U)" },
2901 { 304, "R35(L)" },
2902 { 308, "R35(U)" },
2903 { 312, "R36(L)" },
2904 { 316, "R36(U)" },
2905 { 320, "R37(L)" },
2906 { 324, "R37(U)" },
2907 { 328, "R38(L)" },
2908 { 332, "R38(U)" },
2909 { 336, "R39(L)" },
2910 { 340, "R39(U)" },
2911 { 344, "R40(L)" },
2912 { 348, "R40(U)" },
2913 { 352, "R41(L)" },
2914 { 356, "R41(U)" },
2915 { 360, "R42(L)" },
2916 { 364, "R42(U)" },
2917 { 368, "R43(L)" },
2918 { 372, "R43(U)" },
2919 { 376, "R44(L)" },
2920 { 380, "R44(U)" },
2921 { 384, "R45(L)" },
2922 { 388, "R45(U)" },
2923 { 392, "R46(L)" },
2924 { 396, "R46(U)" },
2925 { 400, "R47(L)" },
2926 { 404, "R47(U)" },
2927 { 408, "R48(L)" },
2928 { 412, "R48(U)" },
2929 { 416, "R49(L)" },
2930 { 420, "R49(U)" },
2931 { 424, "R50(L)" },
2932 { 428, "R50(U)" },
2933 { 432, "R51(L)" },
2934 { 436, "R51(U)" },
2935 { 440, "R52(L)" },
2936 { 444, "R52(U)" },
2937 { 448, "R53(L)" },
2938 { 452, "R53(U)" },
2939 { 456, "R54(L)" },
2940 { 460, "R54(U)" },
2941 { 464, "R55(L)" },
2942 { 468, "R55(U)" },
2943 { 472, "R56(L)" },
2944 { 476, "R56(U)" },
2945 { 480, "R57(L)" },
2946 { 484, "R57(U)" },
2947 { 488, "R58(L)" },
2948 { 492, "R58(U)" },
2949 { 496, "R59(L)" },
2950 { 500, "R59(U)" },
2951 { 504, "R60(L)" },
2952 { 508, "R60(U)" },
2953 { 512, "R61(L)" },
2954 { 516, "R61(U)" },
2955 { 520, "R62(L)" },
2956 { 524, "R62(U)" },
2957 { 528, "TR0(L)" },
2958 { 532, "TR0(U)" },
2959 { 536, "TR1(L)" },
2960 { 540, "TR1(U)" },
2961 { 544, "TR2(L)" },
2962 { 548, "TR2(U)" },
2963 { 552, "TR3(L)" },
2964 { 556, "TR3(U)" },
2965 { 560, "TR4(L)" },
2966 { 564, "TR4(U)" },
2967 { 568, "TR5(L)" },
2968 { 572, "TR5(U)" },
2969 { 576, "TR6(L)" },
2970 { 580, "TR6(U)" },
2971 { 584, "TR7(L)" },
2972 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002973 /* This entry is in case pt_regs contains dregs (depends on
2974 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002975 { uoff(regs), "offsetof(struct user, regs)" },
2976 { uoff(fpu), "offsetof(struct user, fpu)" },
2977#endif
Roland McGrath0f87c492003-06-03 23:29:04 +00002978#ifdef ARM
2979 { uoff(regs.ARM_r0), "r0" },
2980 { uoff(regs.ARM_r1), "r1" },
2981 { uoff(regs.ARM_r2), "r2" },
2982 { uoff(regs.ARM_r3), "r3" },
2983 { uoff(regs.ARM_r4), "r4" },
2984 { uoff(regs.ARM_r5), "r5" },
2985 { uoff(regs.ARM_r6), "r6" },
2986 { uoff(regs.ARM_r7), "r7" },
2987 { uoff(regs.ARM_r8), "r8" },
2988 { uoff(regs.ARM_r9), "r9" },
2989 { uoff(regs.ARM_r10), "r10" },
2990 { uoff(regs.ARM_fp), "fp" },
2991 { uoff(regs.ARM_ip), "ip" },
2992 { uoff(regs.ARM_sp), "sp" },
2993 { uoff(regs.ARM_lr), "lr" },
2994 { uoff(regs.ARM_pc), "pc" },
2995 { uoff(regs.ARM_cpsr), "cpsr" },
2996#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00002997
Roland McGrath542c2c62008-05-20 01:11:56 +00002998#ifdef MIPS
2999 { 0, "r0" },
3000 { 1, "r1" },
3001 { 2, "r2" },
3002 { 3, "r3" },
3003 { 4, "r4" },
3004 { 5, "r5" },
3005 { 6, "r6" },
3006 { 7, "r7" },
3007 { 8, "r8" },
3008 { 9, "r9" },
3009 { 10, "r10" },
3010 { 11, "r11" },
3011 { 12, "r12" },
3012 { 13, "r13" },
3013 { 14, "r14" },
3014 { 15, "r15" },
3015 { 16, "r16" },
3016 { 17, "r17" },
3017 { 18, "r18" },
3018 { 19, "r19" },
3019 { 20, "r20" },
3020 { 21, "r21" },
3021 { 22, "r22" },
3022 { 23, "r23" },
3023 { 24, "r24" },
3024 { 25, "r25" },
3025 { 26, "r26" },
3026 { 27, "r27" },
3027 { 28, "r28" },
3028 { 29, "r29" },
3029 { 30, "r30" },
3030 { 31, "r31" },
3031 { 32, "f0" },
3032 { 33, "f1" },
3033 { 34, "f2" },
3034 { 35, "f3" },
3035 { 36, "f4" },
3036 { 37, "f5" },
3037 { 38, "f6" },
3038 { 39, "f7" },
3039 { 40, "f8" },
3040 { 41, "f9" },
3041 { 42, "f10" },
3042 { 43, "f11" },
3043 { 44, "f12" },
3044 { 45, "f13" },
3045 { 46, "f14" },
3046 { 47, "f15" },
3047 { 48, "f16" },
3048 { 49, "f17" },
3049 { 50, "f18" },
3050 { 51, "f19" },
3051 { 52, "f20" },
3052 { 53, "f21" },
3053 { 54, "f22" },
3054 { 55, "f23" },
3055 { 56, "f24" },
3056 { 57, "f25" },
3057 { 58, "f26" },
3058 { 59, "f27" },
3059 { 60, "f28" },
3060 { 61, "f29" },
3061 { 62, "f30" },
3062 { 63, "f31" },
3063 { 64, "pc" },
3064 { 65, "cause" },
3065 { 66, "badvaddr" },
3066 { 67, "mmhi" },
3067 { 68, "mmlo" },
3068 { 69, "fpcsr" },
3069 { 70, "fpeir" },
3070#endif
3071
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +00003072#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003073 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00003074#endif
Michal Ludvig0e035502002-09-23 15:41:01 +00003075#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003076 { uoff(i387), "offsetof(struct user, i387)" },
3077#else /* !I386 */
3078#ifdef M68K
3079 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
3080#endif /* M68K */
3081#endif /* !I386 */
3082 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3083 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3084 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003085#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003086 { uoff(start_code), "offsetof(struct user, start_code)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003087#endif
Roland McGrathf5a47772003-06-26 22:40:42 +00003088#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00003089 { uoff(start_data), "offsetof(struct user, start_data)" },
3090#endif
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003091#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003092 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003093#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003094 { uoff(signal), "offsetof(struct user, signal)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003095#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003096 { uoff(reserved), "offsetof(struct user, reserved)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00003097#endif
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003098#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003099 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00003100#endif
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +00003101#if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003102 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
3103#endif
3104 { uoff(magic), "offsetof(struct user, magic)" },
3105 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Michal Ludvig0e035502002-09-23 15:41:01 +00003106#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003107 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
3108#endif /* I386 */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00003109#endif /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003110#endif /* !ALPHA */
3111#endif /* !POWERPC/!SPARC */
3112#endif /* LINUX */
3113#ifdef SUNOS4
3114 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3115 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3116 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3117 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3118 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3119 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3120 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3121 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3122 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3123 { uoff(u_error), "offsetof(struct user, u_error)" },
3124 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3125 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3126 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3127 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3128 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3129 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3130 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3131 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3132 { uoff(u_code), "offsetof(struct user, u_code)" },
3133 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3134 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3135 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3136 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3137 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3138 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3139 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3140 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3141 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3142 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3143 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3144 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3145 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3146 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3147 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3148 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3149 { uoff(u_start), "offsetof(struct user, u_start)" },
3150 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3151 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3152 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3153 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3154 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3155 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3156 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3157 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3158 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
3159#endif /* SUNOS4 */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00003160#ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003161 { sizeof(struct user), "sizeof(struct user)" },
Wichert Akkermanc1652e22001-03-27 12:17:16 +00003162#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003163 { 0, NULL },
3164};
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003165#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003166
3167int
3168sys_ptrace(tcp)
3169struct tcb *tcp;
3170{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003171 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003172 long addr;
3173
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003174 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003175 printxval(ptrace_cmds, tcp->u_arg[0],
3176#ifndef FREEBSD
3177 "PTRACE_???"
3178#else
3179 "PT_???"
3180#endif
3181 );
3182 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003183 addr = tcp->u_arg[2];
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003184#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003185 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3186 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3187 for (x = struct_user_offsets; x->str; x++) {
3188 if (x->val >= addr)
3189 break;
3190 }
3191 if (!x->str)
3192 tprintf("%#lx, ", addr);
3193 else if (x->val > addr && x != struct_user_offsets) {
3194 x--;
3195 tprintf("%s + %ld, ", x->str, addr - x->val);
3196 }
3197 else
3198 tprintf("%s, ", x->str);
3199 }
3200 else
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003201#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003202 tprintf("%#lx, ", tcp->u_arg[2]);
3203#ifdef LINUX
3204 switch (tcp->u_arg[0]) {
Roland McGrath1e868062007-11-19 22:11:45 +00003205#ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003206 case PTRACE_PEEKDATA:
3207 case PTRACE_PEEKTEXT:
3208 case PTRACE_PEEKUSER:
3209 break;
Roland McGrath1e868062007-11-19 22:11:45 +00003210#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003211 case PTRACE_CONT:
3212 case PTRACE_SINGLESTEP:
3213 case PTRACE_SYSCALL:
3214 case PTRACE_DETACH:
3215 printsignal(tcp->u_arg[3]);
3216 break;
Denys Vlasenkof535b542009-01-13 18:30:55 +00003217#ifdef PTRACE_SETOPTIONS
3218 case PTRACE_SETOPTIONS:
3219 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3220 break;
3221#endif
3222#ifdef PTRACE_SETSIGINFO
3223 case PTRACE_SETSIGINFO: {
3224 siginfo_t si;
3225 if (!tcp->u_arg[3])
3226 tprintf("NULL");
3227 else if (syserror(tcp))
3228 tprintf("%#lx", tcp->u_arg[3]);
3229 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3230 tprintf("{???}");
3231 else
3232 printsiginfo(&si, verbose(tcp));
3233 break;
3234 }
3235#endif
3236#ifdef PTRACE_GETSIGINFO
3237 case PTRACE_GETSIGINFO:
3238 /* Don't print anything, do it at syscall return. */
3239 break;
3240#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003241 default:
3242 tprintf("%#lx", tcp->u_arg[3]);
3243 break;
3244 }
3245 } else {
3246 switch (tcp->u_arg[0]) {
3247 case PTRACE_PEEKDATA:
3248 case PTRACE_PEEKTEXT:
3249 case PTRACE_PEEKUSER:
Roland McGrath1e868062007-11-19 22:11:45 +00003250#ifdef IA64
3251 return RVAL_HEX;
3252#else
Roland McGratheb285352003-01-14 09:59:00 +00003253 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003254 break;
Roland McGrath1e868062007-11-19 22:11:45 +00003255#endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00003256#ifdef PTRACE_GETSIGINFO
3257 case PTRACE_GETSIGINFO: {
3258 siginfo_t si;
3259 if (!tcp->u_arg[3])
3260 tprintf("NULL");
3261 else if (syserror(tcp))
3262 tprintf("%#lx", tcp->u_arg[3]);
3263 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3264 tprintf("{???}");
3265 else
3266 printsiginfo(&si, verbose(tcp));
3267 break;
3268 }
3269#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003270 }
3271 }
3272#endif /* LINUX */
3273#ifdef SUNOS4
3274 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3275 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3276 tprintf("%lu, ", tcp->u_arg[3]);
3277 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3278 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3279 tcp->u_arg[0] != PTRACE_READTEXT) {
3280 tprintf("%#lx", tcp->u_arg[3]);
3281 }
3282 } else {
3283 if (tcp->u_arg[0] == PTRACE_READDATA ||
3284 tcp->u_arg[0] == PTRACE_READTEXT) {
3285 tprintf("%lu, ", tcp->u_arg[3]);
3286 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3287 }
3288 }
3289#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003290#ifdef FREEBSD
3291 tprintf("%lu", tcp->u_arg[3]);
3292 }
3293#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003294 return 0;
3295}
3296
3297#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003298
3299#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003300# ifndef FUTEX_CMP_REQUEUE
3301# define FUTEX_CMP_REQUEUE 4
3302# endif
3303# ifndef FUTEX_WAKE_OP
3304# define FUTEX_WAKE_OP 5
3305# endif
3306# ifndef FUTEX_LOCK_PI
3307# define FUTEX_LOCK_PI 6
3308# define FUTEX_UNLOCK_PI 7
3309# define FUTEX_TRYLOCK_PI 8
3310# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003311# ifndef FUTEX_WAIT_BITSET
3312# define FUTEX_WAIT_BITSET 9
3313# endif
3314# ifndef FUTEX_WAKE_BITSET
3315# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003316# endif
3317# ifndef FUTEX_PRIVATE_FLAG
3318# define FUTEX_PRIVATE_FLAG 128
3319# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003320static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003321 { FUTEX_WAIT, "FUTEX_WAIT" },
3322 { FUTEX_WAKE, "FUTEX_WAKE" },
3323 { FUTEX_FD, "FUTEX_FD" },
3324 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3325 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3326 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3327 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3328 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3329 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003330 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3331 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Roland McGrath51942a92007-07-05 18:59:11 +00003332 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3333 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3334 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3335 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3336 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3337 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3338 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3339 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3340 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003341 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3342 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Roland McGrath51942a92007-07-05 18:59:11 +00003343 { 0, NULL }
3344};
3345#ifndef FUTEX_OP_SET
3346# define FUTEX_OP_SET 0
3347# define FUTEX_OP_ADD 1
3348# define FUTEX_OP_OR 2
3349# define FUTEX_OP_ANDN 3
3350# define FUTEX_OP_XOR 4
3351# define FUTEX_OP_CMP_EQ 0
3352# define FUTEX_OP_CMP_NE 1
3353# define FUTEX_OP_CMP_LT 2
3354# define FUTEX_OP_CMP_LE 3
3355# define FUTEX_OP_CMP_GT 4
3356# define FUTEX_OP_CMP_GE 5
3357#endif
3358static const struct xlat futexwakeops[] = {
3359 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3360 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3361 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3362 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3363 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3364 { 0, NULL }
3365};
3366static const struct xlat futexwakecmps[] = {
3367 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3368 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3369 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3370 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3371 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3372 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3373 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003374};
3375
3376int
3377sys_futex(tcp)
3378struct tcb *tcp;
3379{
3380 if (entering(tcp)) {
Roland McGrath1aeaf742008-07-18 01:27:39 +00003381 long int cmd = tcp->u_arg[1] & 127;
Roland McGrath5a223472002-12-15 23:58:26 +00003382 tprintf("%p, ", (void *) tcp->u_arg[0]);
Roland McGrath88812d62003-06-26 22:27:23 +00003383 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003384 tprintf(", %ld", tcp->u_arg[2]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003385 if (cmd == FUTEX_WAKE_BITSET)
3386 tprintf(", %lx", tcp->u_arg[5]);
3387 else if (cmd == FUTEX_WAIT) {
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003388 tprintf(", ");
3389 printtv(tcp, tcp->u_arg[3]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003390 } else if (cmd == FUTEX_WAIT_BITSET) {
3391 tprintf(", ");
3392 printtv(tcp, tcp->u_arg[3]);
3393 tprintf(", %lx", tcp->u_arg[5]);
Roland McGrath51942a92007-07-05 18:59:11 +00003394 } else if (cmd == FUTEX_REQUEUE)
Roland McGrath88812d62003-06-26 22:27:23 +00003395 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Roland McGrath51942a92007-07-05 18:59:11 +00003396 else if (cmd == FUTEX_CMP_REQUEUE)
3397 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3398 else if (cmd == FUTEX_WAKE_OP) {
3399 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3400 if ((tcp->u_arg[5] >> 28) & 8)
3401 tprintf("FUTEX_OP_OPARG_SHIFT|");
3402 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3403 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3404 if ((tcp->u_arg[5] >> 24) & 8)
3405 tprintf("FUTEX_OP_OPARG_SHIFT|");
3406 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3407 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
3408 }
Roland McGrath5a223472002-12-15 23:58:26 +00003409 }
3410 return 0;
3411}
3412
3413static void
Roland McGrath79fbda52004-04-14 02:45:55 +00003414print_affinitylist(tcp, list, len)
3415struct tcb *tcp;
3416long list;
Roland McGrath5a223472002-12-15 23:58:26 +00003417unsigned int len;
3418{
3419 int first = 1;
3420 tprintf(" {");
Roland McGratha2f34962003-05-23 00:14:04 +00003421 while (len >= sizeof (unsigned long)) {
Roland McGrath79fbda52004-04-14 02:45:55 +00003422 unsigned long w;
3423 umove(tcp, list, &w);
3424 tprintf("%s %lx", first ? "" : ",", w);
Roland McGrath5a223472002-12-15 23:58:26 +00003425 first = 0;
3426 len -= sizeof (unsigned long);
Roland McGrath79fbda52004-04-14 02:45:55 +00003427 list += sizeof(unsigned long);
Roland McGrath5a223472002-12-15 23:58:26 +00003428 }
3429 tprintf(" }");
3430}
3431
3432int
3433sys_sched_setaffinity(tcp)
3434struct tcb *tcp;
3435{
3436 if (entering(tcp)) {
3437 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath79fbda52004-04-14 02:45:55 +00003438 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
Roland McGrath5a223472002-12-15 23:58:26 +00003439 }
3440 return 0;
3441}
3442
3443int
3444sys_sched_getaffinity(tcp)
3445struct tcb *tcp;
3446{
3447 if (entering(tcp)) {
3448 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3449 } else {
Roland McGrath79fbda52004-04-14 02:45:55 +00003450 if (tcp->u_rval == -1)
3451 tprintf("%#lx", tcp->u_arg[2]);
3452 else
3453 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
Roland McGrath5a223472002-12-15 23:58:26 +00003454 }
3455 return 0;
3456}
Roland McGrath279d3782004-03-01 20:27:37 +00003457
Roland McGrathd9f816f2004-09-04 03:39:20 +00003458static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003459 { SCHED_OTHER, "SCHED_OTHER" },
3460 { SCHED_RR, "SCHED_RR" },
3461 { SCHED_FIFO, "SCHED_FIFO" },
3462 { 0, NULL }
3463};
3464
3465int
3466sys_sched_getscheduler(tcp)
3467struct tcb *tcp;
3468{
3469 if (entering(tcp)) {
3470 tprintf("%d", (int) tcp->u_arg[0]);
3471 } else if (! syserror(tcp)) {
3472 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3473 if (tcp->auxstr != NULL)
3474 return RVAL_STR;
3475 }
3476 return 0;
3477}
3478
3479int
3480sys_sched_setscheduler(tcp)
3481struct tcb *tcp;
3482{
3483 if (entering(tcp)) {
3484 struct sched_param p;
3485 tprintf("%d, ", (int) tcp->u_arg[0]);
3486 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3487 if (umove(tcp, tcp->u_arg[2], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003488 tprintf(", %#lx", tcp->u_arg[2]);
Roland McGrath279d3782004-03-01 20:27:37 +00003489 else
3490 tprintf(", { %d }", p.__sched_priority);
3491 }
3492 return 0;
3493}
3494
3495int
3496sys_sched_getparam(tcp)
3497struct tcb *tcp;
3498{
3499 if (entering(tcp)) {
3500 tprintf("%d, ", (int) tcp->u_arg[0]);
3501 } else {
3502 struct sched_param p;
3503 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003504 tprintf("%#lx", tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003505 else
3506 tprintf("{ %d }", p.__sched_priority);
3507 }
3508 return 0;
3509}
3510
3511int
3512sys_sched_setparam(tcp)
3513struct tcb *tcp;
3514{
3515 if (entering(tcp)) {
3516 struct sched_param p;
3517 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003518 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003519 else
3520 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3521 }
3522 return 0;
3523}
3524
3525int
3526sys_sched_get_priority_min(tcp)
3527struct tcb *tcp;
3528{
3529 if (entering(tcp)) {
3530 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3531 }
3532 return 0;
3533}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003534
3535#ifdef X86_64
3536#include <asm/prctl.h>
3537
3538static const struct xlat archvals[] = {
3539 { ARCH_SET_GS, "ARCH_SET_GS" },
3540 { ARCH_SET_FS, "ARCH_SET_FS" },
3541 { ARCH_GET_FS, "ARCH_GET_FS" },
3542 { ARCH_GET_GS, "ARCH_GET_GS" },
3543 { 0, NULL },
3544};
3545
3546int
3547sys_arch_prctl(tcp)
3548struct tcb *tcp;
3549{
3550 if (entering(tcp)) {
3551 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3552 if (tcp->u_arg[0] == ARCH_SET_GS
3553 || tcp->u_arg[0] == ARCH_SET_FS)
3554 tprintf(", %#lx", tcp->u_arg[1]);
3555 } else {
3556 if (tcp->u_arg[0] == ARCH_GET_GS
3557 || tcp->u_arg[0] == ARCH_GET_FS) {
3558 long int v;
3559 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3560 tprintf(", [%#lx]", v);
3561 else
3562 tprintf(", %#lx", tcp->u_arg[1]);
3563 }
3564 }
3565 return 0;
3566}
3567#endif
3568
Roland McGrathdb8319f2007-08-02 01:37:55 +00003569
3570int
3571sys_getcpu(tcp)
3572struct tcb *tcp;
3573{
3574 if (exiting(tcp)) {
3575 unsigned u;
3576 if (tcp->u_arg[0] == 0)
3577 tprintf("NULL, ");
3578 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3579 tprintf("%#lx, ", tcp->u_arg[0]);
3580 else
3581 tprintf("[%u], ", u);
3582 if (tcp->u_arg[1] == 0)
3583 tprintf("NULL, ");
3584 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3585 tprintf("%#lx, ", tcp->u_arg[1]);
3586 else
3587 tprintf("[%u], ", u);
3588 tprintf("%#lx", tcp->u_arg[2]);
3589 }
3590 return 0;
3591}
3592
Roland McGrath5a223472002-12-15 23:58:26 +00003593#endif