blob: 695b9a5d65aa291bcfdeb1014f1b726993ae57e9 [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)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +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)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000607# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
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)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000709 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)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000713 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000714 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)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000721 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000722 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)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000725 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000726 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)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000729 return -1;
730 return 0;
731#elif defined(AVR32)
732 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
733 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000734 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000735#elif defined(BFIN)
736 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
737 return -1;
738 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000739#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000740 if (ia32) {
741 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000742 case 2:
743 break; /* x86 SYS_fork */
744 case SYS_clone:
745 new = 120;
746 break;
747 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000748 fprintf(stderr, "%s: unexpected syscall %d\n",
749 __FUNCTION__, new);
750 return -1;
751 }
752 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
753 return -1;
754 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000755 return -1;
756 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000757#elif defined(HPPA)
758 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000759 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000760 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000761#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000762 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
763 return -1;
764 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000765#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000766 /* Top half of reg encodes the no. of args n as 0x1n.
767 Assume 0 args as kernel never actually checks... */
768 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
769 0x100000 | new) < 0)
770 return -1;
771 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000772#elif defined(CRISV10) || defined(CRISV32)
773 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
774 return -1;
775 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000776#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000777 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000778# ifndef PTRACE_SET_SYSCALL
779# define PTRACE_SET_SYSCALL 23
780# endif
781
Denys Vlasenko4dedd562009-02-24 15:17:53 +0000782 if (do_ptrace(PTRACE_SET_SYSCALL, tcp, NULL, new) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000783 return -1;
784
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000785 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000786#else
787#warning Do not know how to handle change_syscall for this architecture
788#endif /* architecture */
789#endif /* LINUX */
790 return -1;
791}
792
Roland McGratha4d48532005-06-08 20:45:28 +0000793#if 0
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000794int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000795setarg(tcp, argnum)
796 struct tcb *tcp;
797 int argnum;
798{
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000799#if defined(AVR32)
800 {
801 errno = 0;
802 if (argnum == 0)
803 ptrace(PTRACE_POKEUSER, tcp->pid,
804 (char *)(REG_R12_ORIG),
805 tcp->u_arg[argnum]);
806 else if (argnum < 4)
807 /* r11 .. r9 */
808 ptrace(PTRACE_POKEUSER, tcp->pid,
809 (char *)(REG_R12 - 4 * argnum),
810 tcp->u_arg[argnum]);
811 else if (argnum < 5)
812 /* r5 */
813 ptrace(PTRACE_POKEUSER, tcp->pid,
814 (char *)(REG_R5),
815 tcp->u_arg[argnum]);
816 else if (argnum < 6)
817 /* r3 */
818 ptrace(PTRACE_POKEUSER, tcp->pid,
819 (char *)(REG_R3),
820 tcp->u_arg[argnum]);
821 else
822 return -E2BIG;
823 if (errno)
824 return -1;
825 }
826#elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000827 {
828 unsigned long *bsp, *ap;
829
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000830 if (upeek(tcp, PT_AR_BSP, (long *) &bsp) , 0)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000831 return -1;
832
833 ap = ia64_rse_skip_regs(bsp, argnum);
834 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000835 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000836 if (errno)
837 return -1;
838
839 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000840#elif defined(I386)
841 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000842 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000843 if (errno)
844 return -1;
845 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000846#elif defined(X86_64)
847 {
848 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
849 if (errno)
850 return -1;
851 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000852#elif defined(POWERPC)
853#ifndef PT_ORIG_R3
854#define PT_ORIG_R3 34
855#endif
856 {
857 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000858 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000859 tcp->u_arg[argnum]);
860 if (errno)
861 return -1;
862 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000863#elif defined(MIPS)
864 {
865 errno = 0;
866 if (argnum < 4)
867 ptrace(PTRACE_POKEUSER, tcp->pid,
868 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
869 else {
870 unsigned long *sp;
871
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000872 if (upeek(tcp, REG_SP, (long *) &sp) , 0)
Ralf Baechlee3816102000-08-01 00:06:06 +0000873 return -1;
874
875 ptrace(PTRACE_POKEDATA, tcp->pid,
876 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
877 }
878 if (errno)
879 return -1;
880 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000881#elif defined(S390) || defined(S390X)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000882 {
Michal Ludvig10a88d02002-10-07 14:31:00 +0000883 if(argnum <= 5)
884 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000885 (char *) (argnum==0 ? PT_ORIGGPR2 :
886 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000887 tcp->u_arg[argnum]);
888 else
889 return -E2BIG;
890 if (errno)
891 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000892 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000893#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000894# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000895#endif
896 return 0;
897}
Roland McGratha4d48532005-06-08 20:45:28 +0000898#endif
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000899
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000900#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000901int
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000902internal_clone(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000903{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000904 struct tcb *tcpchild;
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000905 int pid, bpt;
906
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000907 if (!followfork)
908 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000909 if (entering(tcp)) {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000910 setbpt(tcp);
911 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000912 } else {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000913 bpt = tcp->flags & TCB_BPTSET;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000914
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000915 if (syserror(tcp)) {
916 if (bpt)
917 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000918 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000919 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000920
921 pid = tcp->u_rval;
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000922 /* Should not happen, but bugs often cause bogus value here. */
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000923 if (pid <= 1
924 || (sizeof(pid) != sizeof(tcp->u_rval) && pid != tcp->u_rval)
925 ) {
926 if (bpt)
927 clearbpt(tcp);
928 fprintf(stderr, "bogus clone() return value %lx!\n", tcp->u_rval);
929 return 0;
930 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000931
932#ifdef CLONE_PTRACE /* See new setbpt code. */
933 tcpchild = pid2tcb(pid);
934 if (tcpchild != NULL) {
935 /* The child already reported its startup trap
936 before the parent reported its syscall return. */
937 if ((tcpchild->flags
938 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
939 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
940 fprintf(stderr, "\
941[preattached child %d of %d in weird state!]\n",
942 pid, tcp->pid);
943 }
944 else
945#endif
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000946 {
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000947 tcpchild = alloctcb(pid);
948 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000949
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000950#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000951 /* Attach to the new child */
952 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000953 if (bpt)
954 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000955 perror("PTRACE_ATTACH");
956 fprintf(stderr, "Too late?\n");
957 droptcb(tcpchild);
958 return 0;
959 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000960#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000961
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000962 if (bpt)
963 clearbpt(tcp);
964
Ulrich Drepper90512f01999-12-24 07:22:25 +0000965 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000966 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000967 if (bpt) {
968 tcpchild->flags |= TCB_BPTSET;
969 tcpchild->baddr = tcp->baddr;
970 memcpy(tcpchild->inst, tcp->inst,
971 sizeof tcpchild->inst);
972 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000973 tcpchild->parent = tcp;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000974 tcp->nchildren++;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000975 if (tcpchild->flags & TCB_SUSPENDED) {
976 /* The child was born suspended, due to our having
977 forced CLONE_PTRACE. */
978 if (bpt)
979 clearbpt(tcpchild);
980
981 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenkof9a7e632009-01-17 00:21:31 +0000982 /* TCB_SUSPENDED tasks are not collected by waitpid
983 * loop, and left stopped. Restart it:
984 */
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000985 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000986 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000987
988 if (!qflag)
989 fprintf(stderr, "\
990Process %u resumed (parent %d ready)\n",
991 pid, tcp->pid);
992 }
993 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000994 if (!qflag)
995 fprintf(stderr, "Process %d attached\n", pid);
996 }
997
998#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000999 {
1000 /*
1001 * Save the flags used in this call,
1002 * in case we point TCP to our parent below.
1003 */
1004 int call_flags = tcp->u_arg[ARG_FLAGS];
1005 if ((tcp->flags & TCB_CLONE_THREAD) &&
1006 tcp->parent != NULL) {
1007 /* The parent in this clone is itself a
1008 thread belonging to another process.
1009 There is no meaning to the parentage
1010 relationship of the new child with the
1011 thread, only with the process. We
1012 associate the new thread with our
1013 parent. Since this is done for every
1014 new thread, there will never be a
1015 TCB_CLONE_THREAD process that has
1016 children. */
1017 --tcp->nchildren;
1018 tcp = tcp->parent;
1019 tcpchild->parent = tcp;
1020 ++tcp->nchildren;
1021 }
1022 if (call_flags & CLONE_THREAD) {
1023 tcpchild->flags |= TCB_CLONE_THREAD;
1024 ++tcp->nclone_threads;
1025 }
1026 if (call_flags & CLONE_DETACHED) {
1027 tcpchild->flags |= TCB_CLONE_DETACHED;
1028 ++tcp->nclone_detached;
1029 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001030 }
1031#endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00001032 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001033 return 0;
1034}
1035#endif
1036
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001037int
1038internal_fork(tcp)
1039struct tcb *tcp;
1040{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001041#ifdef LINUX
1042 /* We do special magic with clone for any clone or fork. */
1043 return internal_clone(tcp);
1044#else
1045
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001046 struct tcb *tcpchild;
1047 int pid;
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001048 int follow = 1;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001049
1050#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +00001051 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +00001052 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +00001053 if (change_syscall(tcp, SYS_fork) < 0)
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001054 follow = 0;
Nate Sammonsccd8f211999-03-29 22:57:54 +00001055 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001056#endif
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001057 if (!followfork || !follow)
1058 return 0;
1059
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001060 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001061 if (setbpt(tcp) < 0)
1062 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00001063 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001064 else {
1065 int bpt = tcp->flags & TCB_BPTSET;
1066
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001067 if (bpt)
1068 clearbpt(tcp);
1069
1070 if (syserror(tcp))
1071 return 0;
1072
1073 pid = tcp->u_rval;
Denys Vlasenko418d66a2009-01-17 01:52:54 +00001074 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001075#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +00001076#ifdef HPPA
1077 /* The child must have run before it can be attached. */
1078 /* This must be a bug in the parisc kernel, but I havn't
1079 * identified it yet. Seems to be an issue associated
1080 * with attaching to a process (which sends it a signal)
1081 * before that process has ever been scheduled. When
1082 * debugging, I started seeing crashes in
1083 * arch/parisc/kernel/signal.c:do_signal(), apparently
1084 * caused by r8 getting corrupt over the dequeue_signal()
1085 * call. Didn't make much sense though...
1086 */
1087 {
1088 struct timeval tv;
1089 tv.tv_sec = 0;
1090 tv.tv_usec = 10000;
1091 select(0, NULL, NULL, NULL, &tv);
1092 }
1093#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001094 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
1095 perror("PTRACE_ATTACH");
1096 fprintf(stderr, "Too late?\n");
1097 droptcb(tcpchild);
1098 return 0;
1099 }
1100#endif /* LINUX */
1101#ifdef SUNOS4
1102#ifdef oldway
1103 /* The child must have run before it can be attached. */
1104 {
1105 struct timeval tv;
1106 tv.tv_sec = 0;
1107 tv.tv_usec = 10000;
1108 select(0, NULL, NULL, NULL, &tv);
1109 }
1110 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1111 perror("PTRACE_ATTACH");
1112 fprintf(stderr, "Too late?\n");
1113 droptcb(tcpchild);
1114 return 0;
1115 }
1116#else /* !oldway */
1117 /* Try to catch the new process as soon as possible. */
1118 {
1119 int i;
1120 for (i = 0; i < 1024; i++)
1121 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1122 break;
1123 if (i == 1024) {
1124 perror("PTRACE_ATTACH");
1125 fprintf(stderr, "Too late?\n");
1126 droptcb(tcpchild);
1127 return 0;
1128 }
1129 }
1130#endif /* !oldway */
1131#endif /* SUNOS4 */
1132 tcpchild->flags |= TCB_ATTACHED;
1133 /* Child has BPT too, must be removed on first occasion */
1134 if (bpt) {
1135 tcpchild->flags |= TCB_BPTSET;
1136 tcpchild->baddr = tcp->baddr;
1137 memcpy(tcpchild->inst, tcp->inst,
1138 sizeof tcpchild->inst);
1139 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001140 tcpchild->parent = tcp;
1141 tcp->nchildren++;
1142 if (!qflag)
1143 fprintf(stderr, "Process %d attached\n", pid);
1144 }
1145 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001146#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001147}
1148
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001149#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001150
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001151#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001152
1153int
1154sys_vfork(tcp)
1155struct tcb *tcp;
1156{
1157 if (exiting(tcp))
1158 return RVAL_UDECIMAL;
1159 return 0;
1160}
1161
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001162#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001163
1164#ifndef LINUX
1165
1166static char idstr[16];
1167
1168int
1169sys_getpid(tcp)
1170struct tcb *tcp;
1171{
1172 if (exiting(tcp)) {
1173 sprintf(idstr, "ppid %lu", getrval2(tcp));
1174 tcp->auxstr = idstr;
1175 return RVAL_STR;
1176 }
1177 return 0;
1178}
1179
1180int
1181sys_getuid(tcp)
1182struct tcb *tcp;
1183{
1184 if (exiting(tcp)) {
1185 sprintf(idstr, "euid %lu", getrval2(tcp));
1186 tcp->auxstr = idstr;
1187 return RVAL_STR;
1188 }
1189 return 0;
1190}
1191
1192int
1193sys_getgid(tcp)
1194struct tcb *tcp;
1195{
1196 if (exiting(tcp)) {
1197 sprintf(idstr, "egid %lu", getrval2(tcp));
1198 tcp->auxstr = idstr;
1199 return RVAL_STR;
1200 }
1201 return 0;
1202}
1203
1204#endif /* !LINUX */
1205
1206#ifdef LINUX
1207
1208int
1209sys_setuid(tcp)
1210struct tcb *tcp;
1211{
1212 if (entering(tcp)) {
1213 tprintf("%u", (uid_t) tcp->u_arg[0]);
1214 }
1215 return 0;
1216}
1217
1218int
1219sys_setgid(tcp)
1220struct tcb *tcp;
1221{
1222 if (entering(tcp)) {
1223 tprintf("%u", (gid_t) tcp->u_arg[0]);
1224 }
1225 return 0;
1226}
1227
1228int
1229sys_getresuid(tcp)
1230 struct tcb *tcp;
1231{
1232 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001233 __kernel_uid_t uid;
1234 if (syserror(tcp))
1235 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1236 tcp->u_arg[1], tcp->u_arg[2]);
1237 else {
1238 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1239 tprintf("%#lx, ", tcp->u_arg[0]);
1240 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001241 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001242 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1243 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001244 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001245 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001246 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1247 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001248 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001249 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001250 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001251 }
1252 return 0;
1253}
1254
1255int
1256sys_getresgid(tcp)
1257struct tcb *tcp;
1258{
1259 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001260 __kernel_gid_t gid;
1261 if (syserror(tcp))
1262 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1263 tcp->u_arg[1], tcp->u_arg[2]);
1264 else {
1265 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1266 tprintf("%#lx, ", tcp->u_arg[0]);
1267 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001268 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001269 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1270 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001271 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001272 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001273 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1274 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001275 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001276 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001277 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001278 }
1279 return 0;
1280}
1281
1282#endif /* LINUX */
1283
1284int
1285sys_setreuid(tcp)
1286struct tcb *tcp;
1287{
1288 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001289 printuid("", tcp->u_arg[0]);
1290 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001291 }
1292 return 0;
1293}
1294
1295int
1296sys_setregid(tcp)
1297struct tcb *tcp;
1298{
1299 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001300 printuid("", tcp->u_arg[0]);
1301 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001302 }
1303 return 0;
1304}
1305
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001306#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001307int
1308sys_setresuid(tcp)
1309 struct tcb *tcp;
1310{
1311 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001312 printuid("", tcp->u_arg[0]);
1313 printuid(", ", tcp->u_arg[1]);
1314 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001315 }
1316 return 0;
1317}
1318int
1319sys_setresgid(tcp)
1320 struct tcb *tcp;
1321{
1322 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001323 printuid("", tcp->u_arg[0]);
1324 printuid(", ", tcp->u_arg[1]);
1325 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001326 }
1327 return 0;
1328}
1329
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001330#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001331
1332int
1333sys_setgroups(tcp)
1334struct tcb *tcp;
1335{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001336 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001337 unsigned long len, size, start, cur, end, abbrev_end;
1338 GETGROUPS_T gid;
1339 int failed = 0;
1340
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001341 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001342 tprintf("%lu, ", len);
1343 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001344 tprintf("[]");
1345 return 0;
1346 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001347 start = tcp->u_arg[1];
1348 if (start == 0) {
1349 tprintf("NULL");
1350 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001351 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001352 size = len * sizeof(gid);
1353 end = start + size;
1354 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1355 tprintf("%#lx", start);
1356 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001357 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001358 if (abbrev(tcp)) {
1359 abbrev_end = start + max_strlen * sizeof(gid);
1360 if (abbrev_end < start)
1361 abbrev_end = end;
1362 } else {
1363 abbrev_end = end;
1364 }
1365 tprintf("[");
1366 for (cur = start; cur < end; cur += sizeof(gid)) {
1367 if (cur > start)
1368 tprintf(", ");
1369 if (cur >= abbrev_end) {
1370 tprintf("...");
1371 break;
1372 }
1373 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1374 tprintf("?");
1375 failed = 1;
1376 break;
1377 }
1378 tprintf("%lu", (unsigned long) gid);
1379 }
1380 tprintf("]");
1381 if (failed)
1382 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001383 }
1384 return 0;
1385}
1386
1387int
1388sys_getgroups(tcp)
1389struct tcb *tcp;
1390{
Roland McGrathaa524c82005-06-01 19:22:06 +00001391 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001392
1393 if (entering(tcp)) {
1394 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001395 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001396 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001397 unsigned long size, start, cur, end, abbrev_end;
1398 GETGROUPS_T gid;
1399 int failed = 0;
1400
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001401 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001402 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001403 tprintf("[]");
1404 return 0;
1405 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001406 start = tcp->u_arg[1];
1407 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001408 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001409 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001410 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001411 if (tcp->u_arg[0] == 0) {
1412 tprintf("%#lx", start);
1413 return 0;
1414 }
1415 size = len * sizeof(gid);
1416 end = start + size;
1417 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1418 size / sizeof(gid) != len || end < start) {
1419 tprintf("%#lx", start);
1420 return 0;
1421 }
1422 if (abbrev(tcp)) {
1423 abbrev_end = start + max_strlen * sizeof(gid);
1424 if (abbrev_end < start)
1425 abbrev_end = end;
1426 } else {
1427 abbrev_end = end;
1428 }
1429 tprintf("[");
1430 for (cur = start; cur < end; cur += sizeof(gid)) {
1431 if (cur > start)
1432 tprintf(", ");
1433 if (cur >= abbrev_end) {
1434 tprintf("...");
1435 break;
1436 }
1437 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1438 tprintf("?");
1439 failed = 1;
1440 break;
1441 }
1442 tprintf("%lu", (unsigned long) gid);
1443 }
1444 tprintf("]");
1445 if (failed)
1446 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001447 }
1448 return 0;
1449}
1450
Roland McGrath83bd47a2003-11-13 22:32:26 +00001451#ifdef LINUX
1452int
1453sys_setgroups32(tcp)
1454struct tcb *tcp;
1455{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001456 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001457 unsigned long len, size, start, cur, end, abbrev_end;
1458 GETGROUPS32_T gid;
1459 int failed = 0;
1460
Roland McGrath83bd47a2003-11-13 22:32:26 +00001461 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001462 tprintf("%lu, ", len);
1463 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001464 tprintf("[]");
1465 return 0;
1466 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001467 start = tcp->u_arg[1];
1468 if (start == 0) {
1469 tprintf("NULL");
1470 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001471 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001472 size = len * sizeof(gid);
1473 end = start + size;
1474 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1475 tprintf("%#lx", start);
1476 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001477 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001478 if (abbrev(tcp)) {
1479 abbrev_end = start + max_strlen * sizeof(gid);
1480 if (abbrev_end < start)
1481 abbrev_end = end;
1482 } else {
1483 abbrev_end = end;
1484 }
1485 tprintf("[");
1486 for (cur = start; cur < end; cur += sizeof(gid)) {
1487 if (cur > start)
1488 tprintf(", ");
1489 if (cur >= abbrev_end) {
1490 tprintf("...");
1491 break;
1492 }
1493 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1494 tprintf("?");
1495 failed = 1;
1496 break;
1497 }
1498 tprintf("%lu", (unsigned long) gid);
1499 }
1500 tprintf("]");
1501 if (failed)
1502 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001503 }
1504 return 0;
1505}
1506
1507int
1508sys_getgroups32(tcp)
1509struct tcb *tcp;
1510{
Roland McGrathaa524c82005-06-01 19:22:06 +00001511 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001512
1513 if (entering(tcp)) {
1514 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001515 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001516 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001517 unsigned long size, start, cur, end, abbrev_end;
1518 GETGROUPS32_T gid;
1519 int failed = 0;
1520
Roland McGrath83bd47a2003-11-13 22:32:26 +00001521 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001522 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001523 tprintf("[]");
1524 return 0;
1525 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001526 start = tcp->u_arg[1];
1527 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001528 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001529 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001530 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001531 size = len * sizeof(gid);
1532 end = start + size;
1533 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1534 size / sizeof(gid) != len || end < start) {
1535 tprintf("%#lx", start);
1536 return 0;
1537 }
1538 if (abbrev(tcp)) {
1539 abbrev_end = start + max_strlen * sizeof(gid);
1540 if (abbrev_end < start)
1541 abbrev_end = end;
1542 } else {
1543 abbrev_end = end;
1544 }
1545 tprintf("[");
1546 for (cur = start; cur < end; cur += sizeof(gid)) {
1547 if (cur > start)
1548 tprintf(", ");
1549 if (cur >= abbrev_end) {
1550 tprintf("...");
1551 break;
1552 }
1553 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1554 tprintf("?");
1555 failed = 1;
1556 break;
1557 }
1558 tprintf("%lu", (unsigned long) gid);
1559 }
1560 tprintf("]");
1561 if (failed)
1562 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001563 }
1564 return 0;
1565}
1566#endif /* LINUX */
1567
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001568#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001569int
1570sys_setpgrp(tcp)
1571struct tcb *tcp;
1572{
1573 if (entering(tcp)) {
1574#ifndef SVR4
1575 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1576#endif /* !SVR4 */
1577 }
1578 return 0;
1579}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001580#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001581
1582int
1583sys_getpgrp(tcp)
1584struct tcb *tcp;
1585{
1586 if (entering(tcp)) {
1587#ifndef SVR4
1588 tprintf("%lu", tcp->u_arg[0]);
1589#endif /* !SVR4 */
1590 }
1591 return 0;
1592}
1593
1594int
1595sys_getsid(tcp)
1596struct tcb *tcp;
1597{
1598 if (entering(tcp)) {
1599 tprintf("%lu", tcp->u_arg[0]);
1600 }
1601 return 0;
1602}
1603
1604int
1605sys_setsid(tcp)
1606struct tcb *tcp;
1607{
1608 return 0;
1609}
1610
1611int
1612sys_getpgid(tcp)
1613struct tcb *tcp;
1614{
1615 if (entering(tcp)) {
1616 tprintf("%lu", tcp->u_arg[0]);
1617 }
1618 return 0;
1619}
1620
1621int
1622sys_setpgid(tcp)
1623struct tcb *tcp;
1624{
1625 if (entering(tcp)) {
1626 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1627 }
1628 return 0;
1629}
1630
John Hughesc61eb3d2002-05-17 11:37:50 +00001631#if UNIXWARE >= 2
1632
1633#include <sys/privilege.h>
1634
1635
Roland McGrathd9f816f2004-09-04 03:39:20 +00001636static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001637 { SETPRV, "SETPRV" },
1638 { CLRPRV, "CLRPRV" },
1639 { PUTPRV, "PUTPRV" },
1640 { GETPRV, "GETPRV" },
1641 { CNTPRV, "CNTPRV" },
1642 { 0, NULL },
1643};
1644
1645
Roland McGrathd9f816f2004-09-04 03:39:20 +00001646static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001647 { P_OWNER, "P_OWNER" },
1648 { P_AUDIT, "P_AUDIT" },
1649 { P_COMPAT, "P_COMPAT" },
1650 { P_DACREAD, "P_DACREAD" },
1651 { P_DACWRITE, "P_DACWRITE" },
1652 { P_DEV, "P_DEV" },
1653 { P_FILESYS, "P_FILESYS" },
1654 { P_MACREAD, "P_MACREAD" },
1655 { P_MACWRITE, "P_MACWRITE" },
1656 { P_MOUNT, "P_MOUNT" },
1657 { P_MULTIDIR, "P_MULTIDIR" },
1658 { P_SETPLEVEL, "P_SETPLEVEL" },
1659 { P_SETSPRIV, "P_SETSPRIV" },
1660 { P_SETUID, "P_SETUID" },
1661 { P_SYSOPS, "P_SYSOPS" },
1662 { P_SETUPRIV, "P_SETUPRIV" },
1663 { P_DRIVER, "P_DRIVER" },
1664 { P_RTIME, "P_RTIME" },
1665 { P_MACUPGRADE, "P_MACUPGRADE" },
1666 { P_FSYSRANGE, "P_FSYSRANGE" },
1667 { P_SETFLEVEL, "P_SETFLEVEL" },
1668 { P_AUDITWR, "P_AUDITWR" },
1669 { P_TSHAR, "P_TSHAR" },
1670 { P_PLOCK, "P_PLOCK" },
1671 { P_CORE, "P_CORE" },
1672 { P_LOADMOD, "P_LOADMOD" },
1673 { P_BIND, "P_BIND" },
1674 { P_ALLPRIVS, "P_ALLPRIVS" },
1675 { 0, NULL },
1676};
1677
1678
Roland McGrathd9f816f2004-09-04 03:39:20 +00001679static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001680 { PS_FIX, "PS_FIX" },
1681 { PS_INH, "PS_INH" },
1682 { PS_MAX, "PS_MAX" },
1683 { PS_WKG, "PS_WKG" },
1684 { 0, NULL },
1685};
1686
1687
1688static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001689printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001690{
1691 priv_t buf [128];
1692 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1693 int dots = len > max;
1694 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001695
John Hughesc61eb3d2002-05-17 11:37:50 +00001696 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001697
John Hughesc61eb3d2002-05-17 11:37:50 +00001698 if (len <= 0 ||
1699 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1700 {
1701 tprintf ("%#lx", addr);
1702 return;
1703 }
1704
1705 tprintf ("[");
1706
1707 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001708 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001709
1710 if (i) tprintf (", ");
1711
1712 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1713 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1714 {
1715 tprintf ("%s|%s", t, p);
1716 }
1717 else {
1718 tprintf ("%#lx", buf [i]);
1719 }
1720 }
1721
1722 if (dots) tprintf (" ...");
1723
1724 tprintf ("]");
1725}
1726
1727
1728int
1729sys_procpriv(tcp)
1730struct tcb *tcp;
1731{
1732 if (entering(tcp)) {
1733 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1734 switch (tcp->u_arg[0]) {
1735 case CNTPRV:
1736 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1737 break;
1738
1739 case GETPRV:
1740 break;
1741
1742 default:
1743 tprintf (", ");
1744 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1745 tprintf (", %ld", tcp->u_arg[2]);
1746 }
1747 }
1748 else if (tcp->u_arg[0] == GETPRV) {
1749 if (syserror (tcp)) {
1750 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1751 }
1752 else {
1753 tprintf (", ");
1754 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1755 tprintf (", %ld", tcp->u_arg[2]);
1756 }
1757 }
Roland McGrath5a223472002-12-15 23:58:26 +00001758
John Hughesc61eb3d2002-05-17 11:37:50 +00001759 return 0;
1760}
1761
1762#endif
1763
1764
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001765static void
1766printargv(tcp, addr)
1767struct tcb *tcp;
1768long addr;
1769{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001770 union {
1771 int p32;
1772 long p64;
1773 char data[sizeof(long)];
1774 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001775 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001776 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001777
Roland McGrath85a3bc42007-08-02 02:13:05 +00001778 cp.p64 = 1;
1779 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1780 if (umoven(tcp, addr, personality_wordsize[current_personality],
1781 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001782 tprintf("%#lx", addr);
1783 return;
1784 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001785 if (personality_wordsize[current_personality] == 4)
1786 cp.p64 = cp.p32;
1787 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001788 break;
1789 tprintf(sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001790 printstr(tcp, cp.p64, -1);
1791 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001792 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001793 if (cp.p64)
1794 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001795}
1796
1797static void
1798printargc(fmt, tcp, addr)
1799char *fmt;
1800struct tcb *tcp;
1801long addr;
1802{
1803 int count;
1804 char *cp;
1805
1806 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1807 addr += sizeof(char *);
1808 }
1809 tprintf(fmt, count, count == 1 ? "" : "s");
1810}
1811
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001812#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001813int
1814sys_execv(tcp)
1815struct tcb *tcp;
1816{
1817 if (entering(tcp)) {
1818 printpath(tcp, tcp->u_arg[0]);
1819 if (!verbose(tcp))
1820 tprintf(", %#lx", tcp->u_arg[1]);
1821#if 0
1822 else if (abbrev(tcp))
1823 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1824#endif
1825 else {
1826 tprintf(", [");
1827 printargv(tcp, tcp->u_arg[1]);
1828 tprintf("]");
1829 }
1830 }
1831 return 0;
1832}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001833#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001834
1835int
1836sys_execve(tcp)
1837struct tcb *tcp;
1838{
1839 if (entering(tcp)) {
1840 printpath(tcp, tcp->u_arg[0]);
1841 if (!verbose(tcp))
1842 tprintf(", %#lx", tcp->u_arg[1]);
1843#if 0
1844 else if (abbrev(tcp))
1845 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1846#endif
1847 else {
1848 tprintf(", [");
1849 printargv(tcp, tcp->u_arg[1]);
1850 tprintf("]");
1851 }
1852 if (!verbose(tcp))
1853 tprintf(", %#lx", tcp->u_arg[2]);
1854 else if (abbrev(tcp))
1855 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1856 else {
1857 tprintf(", [");
1858 printargv(tcp, tcp->u_arg[2]);
1859 tprintf("]");
1860 }
1861 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001862 return 0;
1863}
1864
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001865#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001866
1867int sys_rexecve(tcp)
1868struct tcb *tcp;
1869{
1870 if (entering (tcp)) {
1871 sys_execve (tcp);
1872 tprintf (", %ld", tcp->u_arg[3]);
1873 }
1874 return 0;
1875}
1876
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001877#endif
John Hughes4e36a812001-04-18 15:11:51 +00001878
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001879int
1880internal_exec(tcp)
1881struct tcb *tcp;
1882{
1883#ifdef SUNOS4
1884 if (exiting(tcp) && !syserror(tcp) && followfork)
1885 fixvfork(tcp);
1886#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001887#if defined LINUX && defined TCB_WAITEXECVE
1888 if (exiting(tcp) && syserror(tcp))
1889 tcp->flags &= ~TCB_WAITEXECVE;
1890 else
1891 tcp->flags |= TCB_WAITEXECVE;
1892#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001893 return 0;
1894}
1895
1896#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001897#ifndef __WNOTHREAD
1898#define __WNOTHREAD 0x20000000
1899#endif
1900#ifndef __WALL
1901#define __WALL 0x40000000
1902#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001903#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001904#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001905#endif
1906#endif /* LINUX */
1907
Roland McGrathd9f816f2004-09-04 03:39:20 +00001908static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001909 { WNOHANG, "WNOHANG" },
1910#ifndef WSTOPPED
1911 { WUNTRACED, "WUNTRACED" },
1912#endif
1913#ifdef WEXITED
1914 { WEXITED, "WEXITED" },
1915#endif
1916#ifdef WTRAPPED
1917 { WTRAPPED, "WTRAPPED" },
1918#endif
1919#ifdef WSTOPPED
1920 { WSTOPPED, "WSTOPPED" },
1921#endif
1922#ifdef WCONTINUED
1923 { WCONTINUED, "WCONTINUED" },
1924#endif
1925#ifdef WNOWAIT
1926 { WNOWAIT, "WNOWAIT" },
1927#endif
1928#ifdef __WCLONE
1929 { __WCLONE, "__WCLONE" },
1930#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001931#ifdef __WALL
1932 { __WALL, "__WALL" },
1933#endif
1934#ifdef __WNOTHREAD
1935 { __WNOTHREAD, "__WNOTHREAD" },
1936#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001937 { 0, NULL },
1938};
1939
Roland McGrath5e02a572004-10-19 23:33:47 +00001940#if !defined WCOREFLAG && defined WCOREFLG
1941# define WCOREFLAG WCOREFLG
1942#endif
1943#ifndef WCOREFLAG
1944#define WCOREFLAG 0x80
1945#endif
1946
1947#ifndef W_STOPCODE
1948#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1949#endif
1950#ifndef W_EXITCODE
1951#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1952#endif
1953
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001954static int
1955printstatus(status)
1956int status;
1957{
1958 int exited = 0;
1959
1960 /*
1961 * Here is a tricky presentation problem. This solution
1962 * is still not entirely satisfactory but since there
1963 * are no wait status constructors it will have to do.
1964 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001965 if (WIFSTOPPED(status)) {
1966 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001967 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001968 status &= ~W_STOPCODE(WSTOPSIG(status));
1969 }
1970 else if (WIFSIGNALED(status)) {
1971 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001972 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001973 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001974 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1975 }
1976 else if (WIFEXITED(status)) {
1977 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001978 WEXITSTATUS(status));
1979 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001980 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001981 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001982 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001983 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001984 return 0;
1985 }
1986
1987 if (status == 0)
1988 tprintf("]");
1989 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001990 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001991
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001992 return exited;
1993}
1994
1995static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001996printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001997{
1998 int status;
1999 int exited = 0;
2000
2001 if (entering(tcp)) {
Roland McGrath5b63d962008-07-18 02:16:47 +00002002 /*
2003 * Sign-extend a 32-bit value when that's what it is.
Denys Vlasenko59432db2009-01-26 19:09:35 +00002004 *
2005 * NB: On Linux, kernel-side pid_t is typedef'ed to int
2006 * on all arches; also, glibc-2.8 truncates wait3 and wait4
2007 * pid argument to int on 64bit arches, producing,
2008 * for example, wait4(4294967295, ...) instead of -1
2009 * in strace.
2010 * Therefore, maybe it makes sense to *unconditionally*
2011 * widen int to long here...
Roland McGrath5b63d962008-07-18 02:16:47 +00002012 */
2013 long pid = tcp->u_arg[0];
2014 if (personality_wordsize[current_personality] < sizeof pid)
2015 pid = (long) (int) pid;
2016 tprintf("%ld, ", pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002017 } else {
2018 /* status */
2019 if (!tcp->u_arg[1])
2020 tprintf("NULL");
2021 else if (syserror(tcp) || tcp->u_rval == 0)
2022 tprintf("%#lx", tcp->u_arg[1]);
2023 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
2024 tprintf("[?]");
2025 else
2026 exited = printstatus(status);
2027 /* options */
2028 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002029 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002030 if (n == 4) {
2031 tprintf(", ");
2032 /* usage */
2033 if (!tcp->u_arg[3])
2034 tprintf("NULL");
2035#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002036 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00002037#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002038 if (bitness)
2039 printrusage32(tcp, tcp->u_arg[3]);
2040 else
2041#endif
2042 printrusage(tcp, tcp->u_arg[3]);
2043 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002044#endif /* LINUX */
2045#ifdef SUNOS4
2046 else if (tcp->u_rval > 0 && exited)
2047 printrusage(tcp, tcp->u_arg[3]);
2048#endif /* SUNOS4 */
2049 else
2050 tprintf("%#lx", tcp->u_arg[3]);
2051 }
2052 }
2053 return 0;
2054}
2055
2056int
Roland McGrathc74c0b72004-09-01 19:39:46 +00002057internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002058struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00002059int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002060{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002061 int got_kids;
2062
2063#ifdef TCB_CLONE_THREAD
2064 if (tcp->flags & TCB_CLONE_THREAD)
2065 /* The children we wait for are our parent's children. */
2066 got_kids = (tcp->parent->nchildren
2067 > tcp->parent->nclone_detached);
2068 else
2069 got_kids = (tcp->nchildren > tcp->nclone_detached);
2070#else
2071 got_kids = tcp->nchildren > 0;
2072#endif
2073
2074 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002075 /* There are children that this parent should block for.
2076 But ptrace made us the parent of the traced children
2077 and the real parent will get ECHILD from the wait call.
2078
2079 XXX If we attached with strace -f -p PID, then there
2080 may be untraced dead children the parent could be reaping
2081 now, but we make him block. */
2082
2083 /* ??? WTA: fix bug with hanging children */
2084
Roland McGrathc74c0b72004-09-01 19:39:46 +00002085 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00002086 /*
2087 * There are traced children. We'll make the parent
2088 * block to avoid a false ECHILD error due to our
2089 * ptrace having stolen the children. However,
2090 * we shouldn't block if there are zombies to reap.
2091 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
2092 */
Roland McGrathfccfb942003-10-01 21:59:44 +00002093 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00002094 if (tcp->nzombies > 0 &&
2095 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00002096 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00002097 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00002098 if (tcp->u_arg[0] > 0) {
2099 /*
2100 * If the parent waits for a specified child
2101 * PID, then it must get ECHILD right away
2102 * if that PID is not one of its children.
2103 * Make sure that the requested PID matches
2104 * one of the parent's children that we are
2105 * tracing, and don't suspend it otherwise.
2106 */
2107 if (child == NULL)
2108 child = pid2tcb(tcp->u_arg[0]);
2109 if (child == NULL || child->parent != (
2110#ifdef TCB_CLONE_THREAD
2111 (tcp->flags & TCB_CLONE_THREAD)
2112 ? tcp->parent :
2113#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002114 tcp) ||
2115 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002116 return 0;
2117 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002118 tcp->flags |= TCB_SUSPENDED;
2119 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002120#ifdef TCB_CLONE_THREAD
2121 if (tcp->flags & TCB_CLONE_THREAD)
2122 tcp->parent->nclone_waiting++;
2123#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002124 }
2125 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002126 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002127 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002128 /* We must force a fake result of 0 instead of
2129 the ECHILD error. */
2130 extern int force_result();
2131 return force_result(tcp, 0, 0);
2132 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002133 }
Roland McGrath09623452003-05-23 02:27:13 +00002134 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2135 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2136 /*
2137 * We just reaped a child we don't know about,
2138 * presumably a zombie we already droptcb'd.
2139 */
2140 tcp->nzombies--;
2141 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002142 return 0;
2143}
2144
2145#ifdef SVR4
2146
2147int
2148sys_wait(tcp)
2149struct tcb *tcp;
2150{
2151 if (exiting(tcp)) {
2152 /* The library wrapper stuffs this into the user variable. */
2153 if (!syserror(tcp))
2154 printstatus(getrval2(tcp));
2155 }
2156 return 0;
2157}
2158
2159#endif /* SVR4 */
2160
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002161#ifdef FREEBSD
2162int
2163sys_wait(tcp)
2164struct tcb *tcp;
2165{
2166 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002167
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002168 if (exiting(tcp)) {
2169 if (!syserror(tcp)) {
2170 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2171 tprintf("%#lx", tcp->u_arg[0]);
2172 else
2173 printstatus(status);
2174 }
2175 }
2176 return 0;
2177}
2178#endif
2179
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002180int
2181sys_waitpid(tcp)
2182struct tcb *tcp;
2183{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002184 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002185}
2186
2187int
2188sys_wait4(tcp)
2189struct tcb *tcp;
2190{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002191 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002192}
2193
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002194#ifdef ALPHA
2195int
2196sys_osf_wait4(tcp)
2197struct tcb *tcp;
2198{
2199 return printwaitn(tcp, 4, 1);
2200}
2201#endif
2202
Roland McGrathc74c0b72004-09-01 19:39:46 +00002203#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002204
Roland McGrathd9f816f2004-09-04 03:39:20 +00002205static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002206 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002207#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002208 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002209#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002210 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002211#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002212 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002213#endif
2214#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002215 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002216#endif
2217#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002218 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002219#endif
2220#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002221 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002222#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002223 { P_ALL, "P_ALL" },
2224#ifdef P_LWPID
2225 { P_LWPID, "P_LWPID" },
2226#endif
2227 { 0, NULL },
2228};
2229
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002230int
2231sys_waitid(tcp)
2232struct tcb *tcp;
2233{
2234 siginfo_t si;
2235 int exited;
2236
2237 if (entering(tcp)) {
2238 printxval(waitid_types, tcp->u_arg[0], "P_???");
2239 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002240 }
2241 else {
2242 /* siginfo */
2243 exited = 0;
2244 if (!tcp->u_arg[2])
2245 tprintf("NULL");
2246 else if (syserror(tcp))
2247 tprintf("%#lx", tcp->u_arg[2]);
2248 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2249 tprintf("{???}");
2250 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002251 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002252 /* options */
2253 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002254 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002255 if (tcp->u_nargs > 4) {
2256 /* usage */
2257 tprintf(", ");
2258 if (!tcp->u_arg[4])
2259 tprintf("NULL");
2260 else if (tcp->u_error)
2261 tprintf("%#lx", tcp->u_arg[4]);
2262 else
2263 printrusage(tcp, tcp->u_arg[4]);
2264 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002265 }
2266 return 0;
2267}
2268
Roland McGrathc74c0b72004-09-01 19:39:46 +00002269#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002270
2271int
2272sys_alarm(tcp)
2273struct tcb *tcp;
2274{
2275 if (entering(tcp))
2276 tprintf("%lu", tcp->u_arg[0]);
2277 return 0;
2278}
2279
2280int
2281sys_uname(tcp)
2282struct tcb *tcp;
2283{
2284 struct utsname uname;
2285
2286 if (exiting(tcp)) {
2287 if (syserror(tcp) || !verbose(tcp))
2288 tprintf("%#lx", tcp->u_arg[0]);
2289 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2290 tprintf("{...}");
2291 else if (!abbrev(tcp)) {
2292
2293 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2294 uname.sysname, uname.nodename);
2295 tprintf("release=\"%s\", version=\"%s\", ",
2296 uname.release, uname.version);
2297 tprintf("machine=\"%s\"", uname.machine);
2298#ifdef LINUX
2299#ifndef __GLIBC__
2300 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002301#endif
2302#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002303 tprintf("}");
2304 }
2305 else
2306 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2307 uname.sysname, uname.nodename);
2308 }
2309 return 0;
2310}
2311
2312#ifndef SVR4
2313
Denys Vlasenko4dedd562009-02-24 15:17:53 +00002314const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002315# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002316 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2317 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2318 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2319 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2320 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2321 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2322 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2323 { PTRACE_CONT, "PTRACE_CONT" },
2324 { PTRACE_KILL, "PTRACE_KILL" },
2325 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2326 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2327 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002328# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002329 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002330# endif
2331# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002332 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002333# endif
2334# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002335 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002336# endif
2337# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002338 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002339# endif
2340# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002341 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002342# endif
2343# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002344 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002345# endif
2346# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002347 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002348# endif
2349# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002350 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002351# endif
2352# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002353 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002354# endif
2355# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002356 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002357# endif
2358# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002359 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002360# endif
2361# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002362 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002363# endif
2364# ifdef PTRACE_SET_SYSCALL
2365 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2366# endif
2367# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002368 { PTRACE_READDATA, "PTRACE_READDATA" },
2369 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2370 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2371 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2372 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2373 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002374# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002375 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2376 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002377# else /* !SPARC */
2378 { PTRACE_22, "PTRACE_22" },
2379 { PTRACE_23, "PTRACE_3" },
2380# endif /* !SPARC */
2381# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002382 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002383# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002384 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002385# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002386 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2387 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2388 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002389# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002390 { PTRACE_26, "PTRACE_26" },
2391 { PTRACE_27, "PTRACE_27" },
2392 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002393# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002394 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002395# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002396
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002397# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002398
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002399 { PT_TRACE_ME, "PT_TRACE_ME" },
2400 { PT_READ_I, "PT_READ_I" },
2401 { PT_READ_D, "PT_READ_D" },
2402 { PT_WRITE_I, "PT_WRITE_I" },
2403 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002404# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002405 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002406# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002407 { PT_CONTINUE, "PT_CONTINUE" },
2408 { PT_KILL, "PT_KILL" },
2409 { PT_STEP, "PT_STEP" },
2410 { PT_ATTACH, "PT_ATTACH" },
2411 { PT_DETACH, "PT_DETACH" },
2412 { PT_GETREGS, "PT_GETREGS" },
2413 { PT_SETREGS, "PT_SETREGS" },
2414 { PT_GETFPREGS, "PT_GETFPREGS" },
2415 { PT_SETFPREGS, "PT_SETFPREGS" },
2416 { PT_GETDBREGS, "PT_GETDBREGS" },
2417 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002418# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002419 { 0, NULL },
2420};
2421
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002422# ifndef FREEBSD
2423# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002424static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002425# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002426 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002427# endif
2428# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002429 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002430# endif
2431# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002432 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002433# endif
2434# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002435 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002436# endif
2437# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002438 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002439# endif
2440# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002441 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002442# endif
2443# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002444 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002445# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002446 { 0, NULL },
2447};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002448# endif /* PTRACE_SETOPTIONS */
2449# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002450
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002451# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002452const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002453# ifdef LINUX
2454# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002455 { PT_PSWMASK, "psw_mask" },
2456 { PT_PSWADDR, "psw_addr" },
2457 { PT_GPR0, "gpr0" },
2458 { PT_GPR1, "gpr1" },
2459 { PT_GPR2, "gpr2" },
2460 { PT_GPR3, "gpr3" },
2461 { PT_GPR4, "gpr4" },
2462 { PT_GPR5, "gpr5" },
2463 { PT_GPR6, "gpr6" },
2464 { PT_GPR7, "gpr7" },
2465 { PT_GPR8, "gpr8" },
2466 { PT_GPR9, "gpr9" },
2467 { PT_GPR10, "gpr10" },
2468 { PT_GPR11, "gpr11" },
2469 { PT_GPR12, "gpr12" },
2470 { PT_GPR13, "gpr13" },
2471 { PT_GPR14, "gpr14" },
2472 { PT_GPR15, "gpr15" },
2473 { PT_ACR0, "acr0" },
2474 { PT_ACR1, "acr1" },
2475 { PT_ACR2, "acr2" },
2476 { PT_ACR3, "acr3" },
2477 { PT_ACR4, "acr4" },
2478 { PT_ACR5, "acr5" },
2479 { PT_ACR6, "acr6" },
2480 { PT_ACR7, "acr7" },
2481 { PT_ACR8, "acr8" },
2482 { PT_ACR9, "acr9" },
2483 { PT_ACR10, "acr10" },
2484 { PT_ACR11, "acr11" },
2485 { PT_ACR12, "acr12" },
2486 { PT_ACR13, "acr13" },
2487 { PT_ACR14, "acr14" },
2488 { PT_ACR15, "acr15" },
2489 { PT_ORIGGPR2, "orig_gpr2" },
2490 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002491# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002492 { PT_FPR0_HI, "fpr0.hi" },
2493 { PT_FPR0_LO, "fpr0.lo" },
2494 { PT_FPR1_HI, "fpr1.hi" },
2495 { PT_FPR1_LO, "fpr1.lo" },
2496 { PT_FPR2_HI, "fpr2.hi" },
2497 { PT_FPR2_LO, "fpr2.lo" },
2498 { PT_FPR3_HI, "fpr3.hi" },
2499 { PT_FPR3_LO, "fpr3.lo" },
2500 { PT_FPR4_HI, "fpr4.hi" },
2501 { PT_FPR4_LO, "fpr4.lo" },
2502 { PT_FPR5_HI, "fpr5.hi" },
2503 { PT_FPR5_LO, "fpr5.lo" },
2504 { PT_FPR6_HI, "fpr6.hi" },
2505 { PT_FPR6_LO, "fpr6.lo" },
2506 { PT_FPR7_HI, "fpr7.hi" },
2507 { PT_FPR7_LO, "fpr7.lo" },
2508 { PT_FPR8_HI, "fpr8.hi" },
2509 { PT_FPR8_LO, "fpr8.lo" },
2510 { PT_FPR9_HI, "fpr9.hi" },
2511 { PT_FPR9_LO, "fpr9.lo" },
2512 { PT_FPR10_HI, "fpr10.hi" },
2513 { PT_FPR10_LO, "fpr10.lo" },
2514 { PT_FPR11_HI, "fpr11.hi" },
2515 { PT_FPR11_LO, "fpr11.lo" },
2516 { PT_FPR12_HI, "fpr12.hi" },
2517 { PT_FPR12_LO, "fpr12.lo" },
2518 { PT_FPR13_HI, "fpr13.hi" },
2519 { PT_FPR13_LO, "fpr13.lo" },
2520 { PT_FPR14_HI, "fpr14.hi" },
2521 { PT_FPR14_LO, "fpr14.lo" },
2522 { PT_FPR15_HI, "fpr15.hi" },
2523 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002524# endif
2525# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002526 { PT_FPR0, "fpr0" },
2527 { PT_FPR1, "fpr1" },
2528 { PT_FPR2, "fpr2" },
2529 { PT_FPR3, "fpr3" },
2530 { PT_FPR4, "fpr4" },
2531 { PT_FPR5, "fpr5" },
2532 { PT_FPR6, "fpr6" },
2533 { PT_FPR7, "fpr7" },
2534 { PT_FPR8, "fpr8" },
2535 { PT_FPR9, "fpr9" },
2536 { PT_FPR10, "fpr10" },
2537 { PT_FPR11, "fpr11" },
2538 { PT_FPR12, "fpr12" },
2539 { PT_FPR13, "fpr13" },
2540 { PT_FPR14, "fpr14" },
2541 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002542# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002543 { PT_CR_9, "cr9" },
2544 { PT_CR_10, "cr10" },
2545 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002546 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002547# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002548 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002549# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002550 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002551# elif defined(POWERPC)
2552# ifndef PT_ORIG_R3
2553# define PT_ORIG_R3 34
2554# endif
2555# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002556 { REGSIZE*PT_R0, "r0" },
2557 { REGSIZE*PT_R1, "r1" },
2558 { REGSIZE*PT_R2, "r2" },
2559 { REGSIZE*PT_R3, "r3" },
2560 { REGSIZE*PT_R4, "r4" },
2561 { REGSIZE*PT_R5, "r5" },
2562 { REGSIZE*PT_R6, "r6" },
2563 { REGSIZE*PT_R7, "r7" },
2564 { REGSIZE*PT_R8, "r8" },
2565 { REGSIZE*PT_R9, "r9" },
2566 { REGSIZE*PT_R10, "r10" },
2567 { REGSIZE*PT_R11, "r11" },
2568 { REGSIZE*PT_R12, "r12" },
2569 { REGSIZE*PT_R13, "r13" },
2570 { REGSIZE*PT_R14, "r14" },
2571 { REGSIZE*PT_R15, "r15" },
2572 { REGSIZE*PT_R16, "r16" },
2573 { REGSIZE*PT_R17, "r17" },
2574 { REGSIZE*PT_R18, "r18" },
2575 { REGSIZE*PT_R19, "r19" },
2576 { REGSIZE*PT_R20, "r20" },
2577 { REGSIZE*PT_R21, "r21" },
2578 { REGSIZE*PT_R22, "r22" },
2579 { REGSIZE*PT_R23, "r23" },
2580 { REGSIZE*PT_R24, "r24" },
2581 { REGSIZE*PT_R25, "r25" },
2582 { REGSIZE*PT_R26, "r26" },
2583 { REGSIZE*PT_R27, "r27" },
2584 { REGSIZE*PT_R28, "r28" },
2585 { REGSIZE*PT_R29, "r29" },
2586 { REGSIZE*PT_R30, "r30" },
2587 { REGSIZE*PT_R31, "r31" },
2588 { REGSIZE*PT_NIP, "NIP" },
2589 { REGSIZE*PT_MSR, "MSR" },
2590 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2591 { REGSIZE*PT_CTR, "CTR" },
2592 { REGSIZE*PT_LNK, "LNK" },
2593 { REGSIZE*PT_XER, "XER" },
2594 { REGSIZE*PT_CCR, "CCR" },
2595 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002596# undef REGSIZE
2597# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002598 { 0, "r0" },
2599 { 1, "r1" },
2600 { 2, "r2" },
2601 { 3, "r3" },
2602 { 4, "r4" },
2603 { 5, "r5" },
2604 { 6, "r6" },
2605 { 7, "r7" },
2606 { 8, "r8" },
2607 { 9, "r9" },
2608 { 10, "r10" },
2609 { 11, "r11" },
2610 { 12, "r12" },
2611 { 13, "r13" },
2612 { 14, "r14" },
2613 { 15, "r15" },
2614 { 16, "r16" },
2615 { 17, "r17" },
2616 { 18, "r18" },
2617 { 19, "r19" },
2618 { 20, "r20" },
2619 { 21, "r21" },
2620 { 22, "r22" },
2621 { 23, "r23" },
2622 { 24, "r24" },
2623 { 25, "r25" },
2624 { 26, "r26" },
2625 { 27, "r27" },
2626 { 28, "r28" },
2627 { 29, "gp" },
2628 { 30, "fp" },
2629 { 31, "zero" },
2630 { 32, "fp0" },
2631 { 33, "fp" },
2632 { 34, "fp2" },
2633 { 35, "fp3" },
2634 { 36, "fp4" },
2635 { 37, "fp5" },
2636 { 38, "fp6" },
2637 { 39, "fp7" },
2638 { 40, "fp8" },
2639 { 41, "fp9" },
2640 { 42, "fp10" },
2641 { 43, "fp11" },
2642 { 44, "fp12" },
2643 { 45, "fp13" },
2644 { 46, "fp14" },
2645 { 47, "fp15" },
2646 { 48, "fp16" },
2647 { 49, "fp17" },
2648 { 50, "fp18" },
2649 { 51, "fp19" },
2650 { 52, "fp20" },
2651 { 53, "fp21" },
2652 { 54, "fp22" },
2653 { 55, "fp23" },
2654 { 56, "fp24" },
2655 { 57, "fp25" },
2656 { 58, "fp26" },
2657 { 59, "fp27" },
2658 { 60, "fp28" },
2659 { 61, "fp29" },
2660 { 62, "fp30" },
2661 { 63, "fp31" },
2662 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002663# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002664 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2665 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2666 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2667 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2668 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2669 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2670 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2671 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2672 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2673 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2674 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2675 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2676 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2677 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2678 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2679 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2680 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2681 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2682 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2683 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2684 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2685 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2686 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2687 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2688 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2689 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2690 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2691 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2692 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2693 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2694 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2695 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2696 /* switch stack: */
2697 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2698 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2699 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2700 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2701 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2702 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2703 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2704 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2705 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2706 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002707 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2708 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002709 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002710 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002711 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2712 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002713 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2714 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2715 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2716 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2717 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2718 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2719 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2720 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2721 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2722 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2723 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2724 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2725 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2726 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2727 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002728# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002729 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002730# endif
2731# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002732 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002733# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002734 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002735# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002736 { 4*EBX, "4*EBX" },
2737 { 4*ECX, "4*ECX" },
2738 { 4*EDX, "4*EDX" },
2739 { 4*ESI, "4*ESI" },
2740 { 4*EDI, "4*EDI" },
2741 { 4*EBP, "4*EBP" },
2742 { 4*EAX, "4*EAX" },
2743 { 4*DS, "4*DS" },
2744 { 4*ES, "4*ES" },
2745 { 4*FS, "4*FS" },
2746 { 4*GS, "4*GS" },
2747 { 4*ORIG_EAX, "4*ORIG_EAX" },
2748 { 4*EIP, "4*EIP" },
2749 { 4*CS, "4*CS" },
2750 { 4*EFL, "4*EFL" },
2751 { 4*UESP, "4*UESP" },
2752 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002753# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002754 { 8*R15, "8*R15" },
2755 { 8*R14, "8*R14" },
2756 { 8*R13, "8*R13" },
2757 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002758 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002759 { 8*RBX, "8*RBX" },
2760 { 8*R11, "8*R11" },
2761 { 8*R10, "8*R10" },
2762 { 8*R9, "8*R9" },
2763 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002764 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002765 { 8*RCX, "8*RCX" },
2766 { 8*RDX, "8*RDX" },
2767 { 8*RSI, "8*RSI" },
2768 { 8*RDI, "8*RDI" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002769# if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002770 { DS, "DS" },
2771 { ES, "ES" },
2772 { FS, "FS" },
2773 { GS, "GS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002774# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002775 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002776 { 8*RIP, "8*RIP" },
2777 { 8*CS, "8*CS" },
2778 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002779 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002780 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002781# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002782 { 4*PT_D1, "4*PT_D1" },
2783 { 4*PT_D2, "4*PT_D2" },
2784 { 4*PT_D3, "4*PT_D3" },
2785 { 4*PT_D4, "4*PT_D4" },
2786 { 4*PT_D5, "4*PT_D5" },
2787 { 4*PT_D6, "4*PT_D6" },
2788 { 4*PT_D7, "4*PT_D7" },
2789 { 4*PT_A0, "4*PT_A0" },
2790 { 4*PT_A1, "4*PT_A1" },
2791 { 4*PT_A2, "4*PT_A2" },
2792 { 4*PT_A3, "4*PT_A3" },
2793 { 4*PT_A4, "4*PT_A4" },
2794 { 4*PT_A5, "4*PT_A5" },
2795 { 4*PT_A6, "4*PT_A6" },
2796 { 4*PT_D0, "4*PT_D0" },
2797 { 4*PT_USP, "4*PT_USP" },
2798 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2799 { 4*PT_SR, "4*PT_SR" },
2800 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002801# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002802 { 4*REG_REG0, "4*REG_REG0" },
2803 { 4*(REG_REG0+1), "4*REG_REG1" },
2804 { 4*(REG_REG0+2), "4*REG_REG2" },
2805 { 4*(REG_REG0+3), "4*REG_REG3" },
2806 { 4*(REG_REG0+4), "4*REG_REG4" },
2807 { 4*(REG_REG0+5), "4*REG_REG5" },
2808 { 4*(REG_REG0+6), "4*REG_REG6" },
2809 { 4*(REG_REG0+7), "4*REG_REG7" },
2810 { 4*(REG_REG0+8), "4*REG_REG8" },
2811 { 4*(REG_REG0+9), "4*REG_REG9" },
2812 { 4*(REG_REG0+10), "4*REG_REG10" },
2813 { 4*(REG_REG0+11), "4*REG_REG11" },
2814 { 4*(REG_REG0+12), "4*REG_REG12" },
2815 { 4*(REG_REG0+13), "4*REG_REG13" },
2816 { 4*(REG_REG0+14), "4*REG_REG14" },
2817 { 4*REG_REG15, "4*REG_REG15" },
2818 { 4*REG_PC, "4*REG_PC" },
2819 { 4*REG_PR, "4*REG_PR" },
2820 { 4*REG_SR, "4*REG_SR" },
2821 { 4*REG_GBR, "4*REG_GBR" },
2822 { 4*REG_MACH, "4*REG_MACH" },
2823 { 4*REG_MACL, "4*REG_MACL" },
2824 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2825 { 4*REG_FPUL, "4*REG_FPUL" },
2826 { 4*REG_FPREG0, "4*REG_FPREG0" },
2827 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2828 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2829 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2830 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2831 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2832 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2833 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2834 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2835 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2836 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2837 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2838 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2839 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2840 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2841 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002842# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002843 { 4*REG_XDREG0, "4*REG_XDREG0" },
2844 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2845 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2846 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2847 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2848 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2849 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2850 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002851# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002852 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002853# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002854 { 0, "PC(L)" },
2855 { 4, "PC(U)" },
2856 { 8, "SR(L)" },
2857 { 12, "SR(U)" },
2858 { 16, "syscall no.(L)" },
2859 { 20, "syscall_no.(U)" },
2860 { 24, "R0(L)" },
2861 { 28, "R0(U)" },
2862 { 32, "R1(L)" },
2863 { 36, "R1(U)" },
2864 { 40, "R2(L)" },
2865 { 44, "R2(U)" },
2866 { 48, "R3(L)" },
2867 { 52, "R3(U)" },
2868 { 56, "R4(L)" },
2869 { 60, "R4(U)" },
2870 { 64, "R5(L)" },
2871 { 68, "R5(U)" },
2872 { 72, "R6(L)" },
2873 { 76, "R6(U)" },
2874 { 80, "R7(L)" },
2875 { 84, "R7(U)" },
2876 { 88, "R8(L)" },
2877 { 92, "R8(U)" },
2878 { 96, "R9(L)" },
2879 { 100, "R9(U)" },
2880 { 104, "R10(L)" },
2881 { 108, "R10(U)" },
2882 { 112, "R11(L)" },
2883 { 116, "R11(U)" },
2884 { 120, "R12(L)" },
2885 { 124, "R12(U)" },
2886 { 128, "R13(L)" },
2887 { 132, "R13(U)" },
2888 { 136, "R14(L)" },
2889 { 140, "R14(U)" },
2890 { 144, "R15(L)" },
2891 { 148, "R15(U)" },
2892 { 152, "R16(L)" },
2893 { 156, "R16(U)" },
2894 { 160, "R17(L)" },
2895 { 164, "R17(U)" },
2896 { 168, "R18(L)" },
2897 { 172, "R18(U)" },
2898 { 176, "R19(L)" },
2899 { 180, "R19(U)" },
2900 { 184, "R20(L)" },
2901 { 188, "R20(U)" },
2902 { 192, "R21(L)" },
2903 { 196, "R21(U)" },
2904 { 200, "R22(L)" },
2905 { 204, "R22(U)" },
2906 { 208, "R23(L)" },
2907 { 212, "R23(U)" },
2908 { 216, "R24(L)" },
2909 { 220, "R24(U)" },
2910 { 224, "R25(L)" },
2911 { 228, "R25(U)" },
2912 { 232, "R26(L)" },
2913 { 236, "R26(U)" },
2914 { 240, "R27(L)" },
2915 { 244, "R27(U)" },
2916 { 248, "R28(L)" },
2917 { 252, "R28(U)" },
2918 { 256, "R29(L)" },
2919 { 260, "R29(U)" },
2920 { 264, "R30(L)" },
2921 { 268, "R30(U)" },
2922 { 272, "R31(L)" },
2923 { 276, "R31(U)" },
2924 { 280, "R32(L)" },
2925 { 284, "R32(U)" },
2926 { 288, "R33(L)" },
2927 { 292, "R33(U)" },
2928 { 296, "R34(L)" },
2929 { 300, "R34(U)" },
2930 { 304, "R35(L)" },
2931 { 308, "R35(U)" },
2932 { 312, "R36(L)" },
2933 { 316, "R36(U)" },
2934 { 320, "R37(L)" },
2935 { 324, "R37(U)" },
2936 { 328, "R38(L)" },
2937 { 332, "R38(U)" },
2938 { 336, "R39(L)" },
2939 { 340, "R39(U)" },
2940 { 344, "R40(L)" },
2941 { 348, "R40(U)" },
2942 { 352, "R41(L)" },
2943 { 356, "R41(U)" },
2944 { 360, "R42(L)" },
2945 { 364, "R42(U)" },
2946 { 368, "R43(L)" },
2947 { 372, "R43(U)" },
2948 { 376, "R44(L)" },
2949 { 380, "R44(U)" },
2950 { 384, "R45(L)" },
2951 { 388, "R45(U)" },
2952 { 392, "R46(L)" },
2953 { 396, "R46(U)" },
2954 { 400, "R47(L)" },
2955 { 404, "R47(U)" },
2956 { 408, "R48(L)" },
2957 { 412, "R48(U)" },
2958 { 416, "R49(L)" },
2959 { 420, "R49(U)" },
2960 { 424, "R50(L)" },
2961 { 428, "R50(U)" },
2962 { 432, "R51(L)" },
2963 { 436, "R51(U)" },
2964 { 440, "R52(L)" },
2965 { 444, "R52(U)" },
2966 { 448, "R53(L)" },
2967 { 452, "R53(U)" },
2968 { 456, "R54(L)" },
2969 { 460, "R54(U)" },
2970 { 464, "R55(L)" },
2971 { 468, "R55(U)" },
2972 { 472, "R56(L)" },
2973 { 476, "R56(U)" },
2974 { 480, "R57(L)" },
2975 { 484, "R57(U)" },
2976 { 488, "R58(L)" },
2977 { 492, "R58(U)" },
2978 { 496, "R59(L)" },
2979 { 500, "R59(U)" },
2980 { 504, "R60(L)" },
2981 { 508, "R60(U)" },
2982 { 512, "R61(L)" },
2983 { 516, "R61(U)" },
2984 { 520, "R62(L)" },
2985 { 524, "R62(U)" },
2986 { 528, "TR0(L)" },
2987 { 532, "TR0(U)" },
2988 { 536, "TR1(L)" },
2989 { 540, "TR1(U)" },
2990 { 544, "TR2(L)" },
2991 { 548, "TR2(U)" },
2992 { 552, "TR3(L)" },
2993 { 556, "TR3(U)" },
2994 { 560, "TR4(L)" },
2995 { 564, "TR4(U)" },
2996 { 568, "TR5(L)" },
2997 { 572, "TR5(U)" },
2998 { 576, "TR6(L)" },
2999 { 580, "TR6(U)" },
3000 { 584, "TR7(L)" },
3001 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00003002 /* This entry is in case pt_regs contains dregs (depends on
3003 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00003004 { uoff(regs), "offsetof(struct user, regs)" },
3005 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003006# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00003007 { uoff(regs.ARM_r0), "r0" },
3008 { uoff(regs.ARM_r1), "r1" },
3009 { uoff(regs.ARM_r2), "r2" },
3010 { uoff(regs.ARM_r3), "r3" },
3011 { uoff(regs.ARM_r4), "r4" },
3012 { uoff(regs.ARM_r5), "r5" },
3013 { uoff(regs.ARM_r6), "r6" },
3014 { uoff(regs.ARM_r7), "r7" },
3015 { uoff(regs.ARM_r8), "r8" },
3016 { uoff(regs.ARM_r9), "r9" },
3017 { uoff(regs.ARM_r10), "r10" },
3018 { uoff(regs.ARM_fp), "fp" },
3019 { uoff(regs.ARM_ip), "ip" },
3020 { uoff(regs.ARM_sp), "sp" },
3021 { uoff(regs.ARM_lr), "lr" },
3022 { uoff(regs.ARM_pc), "pc" },
3023 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003024# elif defined(AVR32)
3025 { uoff(regs.sr), "sr" },
3026 { uoff(regs.pc), "pc" },
3027 { uoff(regs.lr), "lr" },
3028 { uoff(regs.sp), "sp" },
3029 { uoff(regs.r12), "r12" },
3030 { uoff(regs.r11), "r11" },
3031 { uoff(regs.r10), "r10" },
3032 { uoff(regs.r9), "r9" },
3033 { uoff(regs.r8), "r8" },
3034 { uoff(regs.r7), "r7" },
3035 { uoff(regs.r6), "r6" },
3036 { uoff(regs.r5), "r5" },
3037 { uoff(regs.r4), "r4" },
3038 { uoff(regs.r3), "r3" },
3039 { uoff(regs.r2), "r2" },
3040 { uoff(regs.r1), "r1" },
3041 { uoff(regs.r0), "r0" },
3042 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003043# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00003044 { 0, "r0" },
3045 { 1, "r1" },
3046 { 2, "r2" },
3047 { 3, "r3" },
3048 { 4, "r4" },
3049 { 5, "r5" },
3050 { 6, "r6" },
3051 { 7, "r7" },
3052 { 8, "r8" },
3053 { 9, "r9" },
3054 { 10, "r10" },
3055 { 11, "r11" },
3056 { 12, "r12" },
3057 { 13, "r13" },
3058 { 14, "r14" },
3059 { 15, "r15" },
3060 { 16, "r16" },
3061 { 17, "r17" },
3062 { 18, "r18" },
3063 { 19, "r19" },
3064 { 20, "r20" },
3065 { 21, "r21" },
3066 { 22, "r22" },
3067 { 23, "r23" },
3068 { 24, "r24" },
3069 { 25, "r25" },
3070 { 26, "r26" },
3071 { 27, "r27" },
3072 { 28, "r28" },
3073 { 29, "r29" },
3074 { 30, "r30" },
3075 { 31, "r31" },
3076 { 32, "f0" },
3077 { 33, "f1" },
3078 { 34, "f2" },
3079 { 35, "f3" },
3080 { 36, "f4" },
3081 { 37, "f5" },
3082 { 38, "f6" },
3083 { 39, "f7" },
3084 { 40, "f8" },
3085 { 41, "f9" },
3086 { 42, "f10" },
3087 { 43, "f11" },
3088 { 44, "f12" },
3089 { 45, "f13" },
3090 { 46, "f14" },
3091 { 47, "f15" },
3092 { 48, "f16" },
3093 { 49, "f17" },
3094 { 50, "f18" },
3095 { 51, "f19" },
3096 { 52, "f20" },
3097 { 53, "f21" },
3098 { 54, "f22" },
3099 { 55, "f23" },
3100 { 56, "f24" },
3101 { 57, "f25" },
3102 { 58, "f26" },
3103 { 59, "f27" },
3104 { 60, "f28" },
3105 { 61, "f29" },
3106 { 62, "f30" },
3107 { 63, "f31" },
3108 { 64, "pc" },
3109 { 65, "cause" },
3110 { 66, "badvaddr" },
3111 { 67, "mmhi" },
3112 { 68, "mmlo" },
3113 { 69, "fpcsr" },
3114 { 70, "fpeir" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003115# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003116# ifdef CRISV10
3117 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3118 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3119 { 4*PT_R13, "4*PT_R13" },
3120 { 4*PT_R12, "4*PT_R12" },
3121 { 4*PT_R11, "4*PT_R11" },
3122 { 4*PT_R10, "4*PT_R10" },
3123 { 4*PT_R9, "4*PT_R9" },
3124 { 4*PT_R8, "4*PT_R8" },
3125 { 4*PT_R7, "4*PT_R7" },
3126 { 4*PT_R6, "4*PT_R6" },
3127 { 4*PT_R5, "4*PT_R5" },
3128 { 4*PT_R4, "4*PT_R4" },
3129 { 4*PT_R3, "4*PT_R3" },
3130 { 4*PT_R2, "4*PT_R2" },
3131 { 4*PT_R1, "4*PT_R1" },
3132 { 4*PT_R0, "4*PT_R0" },
3133 { 4*PT_MOF, "4*PT_MOF" },
3134 { 4*PT_DCCR, "4*PT_DCCR" },
3135 { 4*PT_SRP, "4*PT_SRP" },
3136 { 4*PT_IRP, "4*PT_IRP" },
3137 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3138 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3139 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3140 { 4*PT_USP, "4*PT_USP" },
3141# endif
3142# ifdef CRISV32
3143 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3144 { 4*PT_R0, "4*PT_R0" },
3145 { 4*PT_R1, "4*PT_R1" },
3146 { 4*PT_R2, "4*PT_R2" },
3147 { 4*PT_R3, "4*PT_R3" },
3148 { 4*PT_R4, "4*PT_R4" },
3149 { 4*PT_R5, "4*PT_R5" },
3150 { 4*PT_R6, "4*PT_R6" },
3151 { 4*PT_R7, "4*PT_R7" },
3152 { 4*PT_R8, "4*PT_R8" },
3153 { 4*PT_R9, "4*PT_R9" },
3154 { 4*PT_R10, "4*PT_R10" },
3155 { 4*PT_R11, "4*PT_R11" },
3156 { 4*PT_R12, "4*PT_R12" },
3157 { 4*PT_R13, "4*PT_R13" },
3158 { 4*PT_ACR, "4*PT_ACR" },
3159 { 4*PT_SRS, "4*PT_SRS" },
3160 { 4*PT_MOF, "4*PT_MOF" },
3161 { 4*PT_SPC, "4*PT_SPC" },
3162 { 4*PT_CCS, "4*PT_CCS" },
3163 { 4*PT_SRP, "4*PT_SRP" },
3164 { 4*PT_ERP, "4*PT_ERP" },
3165 { 4*PT_EXS, "4*PT_EXS" },
3166 { 4*PT_EDA, "4*PT_EDA" },
3167 { 4*PT_USP, "4*PT_USP" },
3168 { 4*PT_PPC, "4*PT_PPC" },
3169 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3170 { 4*PT_BP+4, "4*PT_BP+4" },
3171 { 4*PT_BP+8, "4*PT_BP+8" },
3172 { 4*PT_BP+12, "4*PT_BP+12" },
3173 { 4*PT_BP+16, "4*PT_BP+16" },
3174 { 4*PT_BP+20, "4*PT_BP+20" },
3175 { 4*PT_BP+24, "4*PT_BP+24" },
3176 { 4*PT_BP+28, "4*PT_BP+28" },
3177 { 4*PT_BP+32, "4*PT_BP+32" },
3178 { 4*PT_BP+36, "4*PT_BP+36" },
3179 { 4*PT_BP+40, "4*PT_BP+40" },
3180 { 4*PT_BP+44, "4*PT_BP+44" },
3181 { 4*PT_BP+48, "4*PT_BP+48" },
3182 { 4*PT_BP+52, "4*PT_BP+52" },
3183 { 4*PT_BP+56, "4*PT_BP+56" },
3184# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003185
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003186# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3187 && !defined(ALPHA) && !defined(IA64) \
3188 && !defined(CRISV10) && !defined(CRISV32)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003189# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003190 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003191# endif
3192# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003193 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003194# endif
3195# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003196 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003197# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003198 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3199 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3200 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003201# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003202 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003203# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003204# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003205 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003206# endif
3207# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003208 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003209# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003210 { uoff(signal), "offsetof(struct user, signal)" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003211# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003212 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003213# endif
3214# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003215 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003216# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003217# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003218 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003219# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003220 { uoff(magic), "offsetof(struct user, magic)" },
3221 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003222# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003223 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003224# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003225# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003226
3227# endif /* LINUX */
3228
3229# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003230 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3231 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3232 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3233 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3234 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3235 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3236 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3237 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3238 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3239 { uoff(u_error), "offsetof(struct user, u_error)" },
3240 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3241 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3242 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3243 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3244 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3245 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3246 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3247 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3248 { uoff(u_code), "offsetof(struct user, u_code)" },
3249 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3250 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3251 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3252 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3253 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3254 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3255 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3256 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3257 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3258 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3259 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3260 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3261 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3262 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3263 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3264 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3265 { uoff(u_start), "offsetof(struct user, u_start)" },
3266 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3267 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3268 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3269 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3270 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3271 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3272 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3273 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3274 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003275# endif /* SUNOS4 */
3276# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003277 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003278# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003279 { 0, NULL },
3280};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003281# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003282
3283int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003284sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003285{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003286 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003287 long addr;
3288
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003289 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003290 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003291# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003292 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003293# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003294 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003295# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003296 );
3297 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003298 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003299# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003300 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3301 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3302 for (x = struct_user_offsets; x->str; x++) {
3303 if (x->val >= addr)
3304 break;
3305 }
3306 if (!x->str)
3307 tprintf("%#lx, ", addr);
3308 else if (x->val > addr && x != struct_user_offsets) {
3309 x--;
3310 tprintf("%s + %ld, ", x->str, addr - x->val);
3311 }
3312 else
3313 tprintf("%s, ", x->str);
3314 }
3315 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003316# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003317 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003318# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003319 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003320# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003321 case PTRACE_PEEKDATA:
3322 case PTRACE_PEEKTEXT:
3323 case PTRACE_PEEKUSER:
3324 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003325# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003326 case PTRACE_CONT:
3327 case PTRACE_SINGLESTEP:
3328 case PTRACE_SYSCALL:
3329 case PTRACE_DETACH:
3330 printsignal(tcp->u_arg[3]);
3331 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003332# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003333 case PTRACE_SETOPTIONS:
3334 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3335 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003336# endif
3337# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003338 case PTRACE_SETSIGINFO: {
3339 siginfo_t si;
3340 if (!tcp->u_arg[3])
3341 tprintf("NULL");
3342 else if (syserror(tcp))
3343 tprintf("%#lx", tcp->u_arg[3]);
3344 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3345 tprintf("{???}");
3346 else
3347 printsiginfo(&si, verbose(tcp));
3348 break;
3349 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003350# endif
3351# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003352 case PTRACE_GETSIGINFO:
3353 /* Don't print anything, do it at syscall return. */
3354 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003355# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003356 default:
3357 tprintf("%#lx", tcp->u_arg[3]);
3358 break;
3359 }
3360 } else {
3361 switch (tcp->u_arg[0]) {
3362 case PTRACE_PEEKDATA:
3363 case PTRACE_PEEKTEXT:
3364 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003365# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003366 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003367# else
Roland McGratheb285352003-01-14 09:59:00 +00003368 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003369 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003370# endif
3371# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003372 case PTRACE_GETSIGINFO: {
3373 siginfo_t si;
3374 if (!tcp->u_arg[3])
3375 tprintf("NULL");
3376 else if (syserror(tcp))
3377 tprintf("%#lx", tcp->u_arg[3]);
3378 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3379 tprintf("{???}");
3380 else
3381 printsiginfo(&si, verbose(tcp));
3382 break;
3383 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003384# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003385 }
3386 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003387# endif /* LINUX */
3388# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003389 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3390 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3391 tprintf("%lu, ", tcp->u_arg[3]);
3392 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3393 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3394 tcp->u_arg[0] != PTRACE_READTEXT) {
3395 tprintf("%#lx", tcp->u_arg[3]);
3396 }
3397 } else {
3398 if (tcp->u_arg[0] == PTRACE_READDATA ||
3399 tcp->u_arg[0] == PTRACE_READTEXT) {
3400 tprintf("%lu, ", tcp->u_arg[3]);
3401 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3402 }
3403 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003404# endif /* SUNOS4 */
3405# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003406 tprintf("%lu", tcp->u_arg[3]);
3407 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003408# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003409 return 0;
3410}
3411
3412#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003413
3414#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003415# ifndef FUTEX_CMP_REQUEUE
3416# define FUTEX_CMP_REQUEUE 4
3417# endif
3418# ifndef FUTEX_WAKE_OP
3419# define FUTEX_WAKE_OP 5
3420# endif
3421# ifndef FUTEX_LOCK_PI
3422# define FUTEX_LOCK_PI 6
3423# define FUTEX_UNLOCK_PI 7
3424# define FUTEX_TRYLOCK_PI 8
3425# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003426# ifndef FUTEX_WAIT_BITSET
3427# define FUTEX_WAIT_BITSET 9
3428# endif
3429# ifndef FUTEX_WAKE_BITSET
3430# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003431# endif
3432# ifndef FUTEX_PRIVATE_FLAG
3433# define FUTEX_PRIVATE_FLAG 128
3434# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003435static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003436 { FUTEX_WAIT, "FUTEX_WAIT" },
3437 { FUTEX_WAKE, "FUTEX_WAKE" },
3438 { FUTEX_FD, "FUTEX_FD" },
3439 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3440 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3441 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3442 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3443 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3444 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003445 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3446 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Roland McGrath51942a92007-07-05 18:59:11 +00003447 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3448 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3449 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3450 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3451 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3452 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3453 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3454 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3455 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003456 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3457 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Roland McGrath51942a92007-07-05 18:59:11 +00003458 { 0, NULL }
3459};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003460# ifndef FUTEX_OP_SET
3461# define FUTEX_OP_SET 0
3462# define FUTEX_OP_ADD 1
3463# define FUTEX_OP_OR 2
3464# define FUTEX_OP_ANDN 3
3465# define FUTEX_OP_XOR 4
3466# define FUTEX_OP_CMP_EQ 0
3467# define FUTEX_OP_CMP_NE 1
3468# define FUTEX_OP_CMP_LT 2
3469# define FUTEX_OP_CMP_LE 3
3470# define FUTEX_OP_CMP_GT 4
3471# define FUTEX_OP_CMP_GE 5
3472# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003473static const struct xlat futexwakeops[] = {
3474 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3475 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3476 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3477 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3478 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3479 { 0, NULL }
3480};
3481static const struct xlat futexwakecmps[] = {
3482 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3483 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3484 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3485 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3486 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3487 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3488 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003489};
3490
3491int
3492sys_futex(tcp)
3493struct tcb *tcp;
3494{
3495 if (entering(tcp)) {
Roland McGrath1aeaf742008-07-18 01:27:39 +00003496 long int cmd = tcp->u_arg[1] & 127;
Roland McGrath5a223472002-12-15 23:58:26 +00003497 tprintf("%p, ", (void *) tcp->u_arg[0]);
Roland McGrath88812d62003-06-26 22:27:23 +00003498 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003499 tprintf(", %ld", tcp->u_arg[2]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003500 if (cmd == FUTEX_WAKE_BITSET)
3501 tprintf(", %lx", tcp->u_arg[5]);
3502 else if (cmd == FUTEX_WAIT) {
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003503 tprintf(", ");
3504 printtv(tcp, tcp->u_arg[3]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003505 } else if (cmd == FUTEX_WAIT_BITSET) {
3506 tprintf(", ");
3507 printtv(tcp, tcp->u_arg[3]);
3508 tprintf(", %lx", tcp->u_arg[5]);
Roland McGrath51942a92007-07-05 18:59:11 +00003509 } else if (cmd == FUTEX_REQUEUE)
Roland McGrath88812d62003-06-26 22:27:23 +00003510 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Roland McGrath51942a92007-07-05 18:59:11 +00003511 else if (cmd == FUTEX_CMP_REQUEUE)
3512 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3513 else if (cmd == FUTEX_WAKE_OP) {
3514 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3515 if ((tcp->u_arg[5] >> 28) & 8)
3516 tprintf("FUTEX_OP_OPARG_SHIFT|");
3517 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3518 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3519 if ((tcp->u_arg[5] >> 24) & 8)
3520 tprintf("FUTEX_OP_OPARG_SHIFT|");
3521 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3522 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
3523 }
Roland McGrath5a223472002-12-15 23:58:26 +00003524 }
3525 return 0;
3526}
3527
3528static void
Roland McGrath79fbda52004-04-14 02:45:55 +00003529print_affinitylist(tcp, list, len)
3530struct tcb *tcp;
3531long list;
Roland McGrath5a223472002-12-15 23:58:26 +00003532unsigned int len;
3533{
3534 int first = 1;
3535 tprintf(" {");
Roland McGratha2f34962003-05-23 00:14:04 +00003536 while (len >= sizeof (unsigned long)) {
Roland McGrath79fbda52004-04-14 02:45:55 +00003537 unsigned long w;
3538 umove(tcp, list, &w);
3539 tprintf("%s %lx", first ? "" : ",", w);
Roland McGrath5a223472002-12-15 23:58:26 +00003540 first = 0;
3541 len -= sizeof (unsigned long);
Roland McGrath79fbda52004-04-14 02:45:55 +00003542 list += sizeof(unsigned long);
Roland McGrath5a223472002-12-15 23:58:26 +00003543 }
3544 tprintf(" }");
3545}
3546
3547int
3548sys_sched_setaffinity(tcp)
3549struct tcb *tcp;
3550{
3551 if (entering(tcp)) {
3552 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath79fbda52004-04-14 02:45:55 +00003553 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
Roland McGrath5a223472002-12-15 23:58:26 +00003554 }
3555 return 0;
3556}
3557
3558int
3559sys_sched_getaffinity(tcp)
3560struct tcb *tcp;
3561{
3562 if (entering(tcp)) {
3563 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3564 } else {
Roland McGrath79fbda52004-04-14 02:45:55 +00003565 if (tcp->u_rval == -1)
3566 tprintf("%#lx", tcp->u_arg[2]);
3567 else
3568 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
Roland McGrath5a223472002-12-15 23:58:26 +00003569 }
3570 return 0;
3571}
Roland McGrath279d3782004-03-01 20:27:37 +00003572
Roland McGrathd9f816f2004-09-04 03:39:20 +00003573static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003574 { SCHED_OTHER, "SCHED_OTHER" },
3575 { SCHED_RR, "SCHED_RR" },
3576 { SCHED_FIFO, "SCHED_FIFO" },
3577 { 0, NULL }
3578};
3579
3580int
3581sys_sched_getscheduler(tcp)
3582struct tcb *tcp;
3583{
3584 if (entering(tcp)) {
3585 tprintf("%d", (int) tcp->u_arg[0]);
3586 } else if (! syserror(tcp)) {
3587 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3588 if (tcp->auxstr != NULL)
3589 return RVAL_STR;
3590 }
3591 return 0;
3592}
3593
3594int
3595sys_sched_setscheduler(tcp)
3596struct tcb *tcp;
3597{
3598 if (entering(tcp)) {
3599 struct sched_param p;
3600 tprintf("%d, ", (int) tcp->u_arg[0]);
3601 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3602 if (umove(tcp, tcp->u_arg[2], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003603 tprintf(", %#lx", tcp->u_arg[2]);
Roland McGrath279d3782004-03-01 20:27:37 +00003604 else
3605 tprintf(", { %d }", p.__sched_priority);
3606 }
3607 return 0;
3608}
3609
3610int
3611sys_sched_getparam(tcp)
3612struct tcb *tcp;
3613{
3614 if (entering(tcp)) {
3615 tprintf("%d, ", (int) tcp->u_arg[0]);
3616 } else {
3617 struct sched_param p;
3618 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003619 tprintf("%#lx", tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003620 else
3621 tprintf("{ %d }", p.__sched_priority);
3622 }
3623 return 0;
3624}
3625
3626int
3627sys_sched_setparam(tcp)
3628struct tcb *tcp;
3629{
3630 if (entering(tcp)) {
3631 struct sched_param p;
3632 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003633 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003634 else
3635 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3636 }
3637 return 0;
3638}
3639
3640int
3641sys_sched_get_priority_min(tcp)
3642struct tcb *tcp;
3643{
3644 if (entering(tcp)) {
3645 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3646 }
3647 return 0;
3648}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003649
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003650# ifdef X86_64
3651# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003652
3653static const struct xlat archvals[] = {
3654 { ARCH_SET_GS, "ARCH_SET_GS" },
3655 { ARCH_SET_FS, "ARCH_SET_FS" },
3656 { ARCH_GET_FS, "ARCH_GET_FS" },
3657 { ARCH_GET_GS, "ARCH_GET_GS" },
3658 { 0, NULL },
3659};
3660
3661int
3662sys_arch_prctl(tcp)
3663struct tcb *tcp;
3664{
3665 if (entering(tcp)) {
3666 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3667 if (tcp->u_arg[0] == ARCH_SET_GS
3668 || tcp->u_arg[0] == ARCH_SET_FS)
3669 tprintf(", %#lx", tcp->u_arg[1]);
3670 } else {
3671 if (tcp->u_arg[0] == ARCH_GET_GS
3672 || tcp->u_arg[0] == ARCH_GET_FS) {
3673 long int v;
3674 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3675 tprintf(", [%#lx]", v);
3676 else
3677 tprintf(", %#lx", tcp->u_arg[1]);
3678 }
3679 }
3680 return 0;
3681}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003682# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003683
Roland McGrathdb8319f2007-08-02 01:37:55 +00003684
3685int
3686sys_getcpu(tcp)
3687struct tcb *tcp;
3688{
3689 if (exiting(tcp)) {
3690 unsigned u;
3691 if (tcp->u_arg[0] == 0)
3692 tprintf("NULL, ");
3693 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3694 tprintf("%#lx, ", tcp->u_arg[0]);
3695 else
3696 tprintf("[%u], ", u);
3697 if (tcp->u_arg[1] == 0)
3698 tprintf("NULL, ");
3699 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3700 tprintf("%#lx, ", tcp->u_arg[1]);
3701 else
3702 tprintf("[%u], ", u);
3703 tprintf("%#lx", tcp->u_arg[2]);
3704 }
3705 return 0;
3706}
3707
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003708#endif /* LINUX */