blob: 9ddae086069d84d030b6da3d48661d51aa4fe3e0 [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
Denys Vlasenko1d632462009-04-14 12:51:00 +00001229sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001230{
1231 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001232 __kernel_uid_t uid;
1233 if (syserror(tcp))
1234 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1235 tcp->u_arg[1], tcp->u_arg[2]);
1236 else {
1237 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1238 tprintf("%#lx, ", tcp->u_arg[0]);
1239 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001240 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001241 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1242 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001243 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001244 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001245 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1246 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001247 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001248 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001249 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001250 }
1251 return 0;
1252}
1253
1254int
1255sys_getresgid(tcp)
1256struct tcb *tcp;
1257{
1258 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001259 __kernel_gid_t gid;
1260 if (syserror(tcp))
1261 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1262 tcp->u_arg[1], tcp->u_arg[2]);
1263 else {
1264 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1265 tprintf("%#lx, ", tcp->u_arg[0]);
1266 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001267 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001268 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1269 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001270 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001271 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001272 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1273 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001274 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001275 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001276 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001277 }
1278 return 0;
1279}
1280
1281#endif /* LINUX */
1282
1283int
1284sys_setreuid(tcp)
1285struct tcb *tcp;
1286{
1287 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001288 printuid("", tcp->u_arg[0]);
1289 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001290 }
1291 return 0;
1292}
1293
1294int
1295sys_setregid(tcp)
1296struct tcb *tcp;
1297{
1298 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001299 printuid("", tcp->u_arg[0]);
1300 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001301 }
1302 return 0;
1303}
1304
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001305#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001306int
1307sys_setresuid(tcp)
1308 struct tcb *tcp;
1309{
1310 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001311 printuid("", tcp->u_arg[0]);
1312 printuid(", ", tcp->u_arg[1]);
1313 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001314 }
1315 return 0;
1316}
1317int
1318sys_setresgid(tcp)
1319 struct tcb *tcp;
1320{
1321 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001322 printuid("", tcp->u_arg[0]);
1323 printuid(", ", tcp->u_arg[1]);
1324 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001325 }
1326 return 0;
1327}
1328
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001329#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001330
1331int
1332sys_setgroups(tcp)
1333struct tcb *tcp;
1334{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001335 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001336 unsigned long len, size, start, cur, end, abbrev_end;
1337 GETGROUPS_T gid;
1338 int failed = 0;
1339
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001340 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001341 tprintf("%lu, ", len);
1342 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001343 tprintf("[]");
1344 return 0;
1345 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001346 start = tcp->u_arg[1];
1347 if (start == 0) {
1348 tprintf("NULL");
1349 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001350 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001351 size = len * sizeof(gid);
1352 end = start + size;
1353 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1354 tprintf("%#lx", start);
1355 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001356 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001357 if (abbrev(tcp)) {
1358 abbrev_end = start + max_strlen * sizeof(gid);
1359 if (abbrev_end < start)
1360 abbrev_end = end;
1361 } else {
1362 abbrev_end = end;
1363 }
1364 tprintf("[");
1365 for (cur = start; cur < end; cur += sizeof(gid)) {
1366 if (cur > start)
1367 tprintf(", ");
1368 if (cur >= abbrev_end) {
1369 tprintf("...");
1370 break;
1371 }
1372 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1373 tprintf("?");
1374 failed = 1;
1375 break;
1376 }
1377 tprintf("%lu", (unsigned long) gid);
1378 }
1379 tprintf("]");
1380 if (failed)
1381 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001382 }
1383 return 0;
1384}
1385
1386int
1387sys_getgroups(tcp)
1388struct tcb *tcp;
1389{
Roland McGrathaa524c82005-06-01 19:22:06 +00001390 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001391
1392 if (entering(tcp)) {
1393 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001394 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001395 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001396 unsigned long size, start, cur, end, abbrev_end;
1397 GETGROUPS_T gid;
1398 int failed = 0;
1399
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001400 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001401 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001402 tprintf("[]");
1403 return 0;
1404 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001405 start = tcp->u_arg[1];
1406 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001407 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001408 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001409 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001410 if (tcp->u_arg[0] == 0) {
1411 tprintf("%#lx", start);
1412 return 0;
1413 }
1414 size = len * sizeof(gid);
1415 end = start + size;
1416 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1417 size / sizeof(gid) != len || end < start) {
1418 tprintf("%#lx", start);
1419 return 0;
1420 }
1421 if (abbrev(tcp)) {
1422 abbrev_end = start + max_strlen * sizeof(gid);
1423 if (abbrev_end < start)
1424 abbrev_end = end;
1425 } else {
1426 abbrev_end = end;
1427 }
1428 tprintf("[");
1429 for (cur = start; cur < end; cur += sizeof(gid)) {
1430 if (cur > start)
1431 tprintf(", ");
1432 if (cur >= abbrev_end) {
1433 tprintf("...");
1434 break;
1435 }
1436 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1437 tprintf("?");
1438 failed = 1;
1439 break;
1440 }
1441 tprintf("%lu", (unsigned long) gid);
1442 }
1443 tprintf("]");
1444 if (failed)
1445 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001446 }
1447 return 0;
1448}
1449
Roland McGrath83bd47a2003-11-13 22:32:26 +00001450#ifdef LINUX
1451int
1452sys_setgroups32(tcp)
1453struct tcb *tcp;
1454{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001455 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001456 unsigned long len, size, start, cur, end, abbrev_end;
1457 GETGROUPS32_T gid;
1458 int failed = 0;
1459
Roland McGrath83bd47a2003-11-13 22:32:26 +00001460 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001461 tprintf("%lu, ", len);
1462 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001463 tprintf("[]");
1464 return 0;
1465 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001466 start = tcp->u_arg[1];
1467 if (start == 0) {
1468 tprintf("NULL");
1469 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001470 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001471 size = len * sizeof(gid);
1472 end = start + size;
1473 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1474 tprintf("%#lx", start);
1475 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001476 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001477 if (abbrev(tcp)) {
1478 abbrev_end = start + max_strlen * sizeof(gid);
1479 if (abbrev_end < start)
1480 abbrev_end = end;
1481 } else {
1482 abbrev_end = end;
1483 }
1484 tprintf("[");
1485 for (cur = start; cur < end; cur += sizeof(gid)) {
1486 if (cur > start)
1487 tprintf(", ");
1488 if (cur >= abbrev_end) {
1489 tprintf("...");
1490 break;
1491 }
1492 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1493 tprintf("?");
1494 failed = 1;
1495 break;
1496 }
1497 tprintf("%lu", (unsigned long) gid);
1498 }
1499 tprintf("]");
1500 if (failed)
1501 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001502 }
1503 return 0;
1504}
1505
1506int
1507sys_getgroups32(tcp)
1508struct tcb *tcp;
1509{
Roland McGrathaa524c82005-06-01 19:22:06 +00001510 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001511
1512 if (entering(tcp)) {
1513 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001514 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001515 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001516 unsigned long size, start, cur, end, abbrev_end;
1517 GETGROUPS32_T gid;
1518 int failed = 0;
1519
Roland McGrath83bd47a2003-11-13 22:32:26 +00001520 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001521 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001522 tprintf("[]");
1523 return 0;
1524 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001525 start = tcp->u_arg[1];
1526 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001527 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001528 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001529 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001530 size = len * sizeof(gid);
1531 end = start + size;
1532 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1533 size / sizeof(gid) != len || end < start) {
1534 tprintf("%#lx", start);
1535 return 0;
1536 }
1537 if (abbrev(tcp)) {
1538 abbrev_end = start + max_strlen * sizeof(gid);
1539 if (abbrev_end < start)
1540 abbrev_end = end;
1541 } else {
1542 abbrev_end = end;
1543 }
1544 tprintf("[");
1545 for (cur = start; cur < end; cur += sizeof(gid)) {
1546 if (cur > start)
1547 tprintf(", ");
1548 if (cur >= abbrev_end) {
1549 tprintf("...");
1550 break;
1551 }
1552 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1553 tprintf("?");
1554 failed = 1;
1555 break;
1556 }
1557 tprintf("%lu", (unsigned long) gid);
1558 }
1559 tprintf("]");
1560 if (failed)
1561 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001562 }
1563 return 0;
1564}
1565#endif /* LINUX */
1566
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001567#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001568int
1569sys_setpgrp(tcp)
1570struct tcb *tcp;
1571{
1572 if (entering(tcp)) {
1573#ifndef SVR4
1574 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1575#endif /* !SVR4 */
1576 }
1577 return 0;
1578}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001579#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001580
1581int
1582sys_getpgrp(tcp)
1583struct tcb *tcp;
1584{
1585 if (entering(tcp)) {
1586#ifndef SVR4
1587 tprintf("%lu", tcp->u_arg[0]);
1588#endif /* !SVR4 */
1589 }
1590 return 0;
1591}
1592
1593int
1594sys_getsid(tcp)
1595struct tcb *tcp;
1596{
1597 if (entering(tcp)) {
1598 tprintf("%lu", tcp->u_arg[0]);
1599 }
1600 return 0;
1601}
1602
1603int
1604sys_setsid(tcp)
1605struct tcb *tcp;
1606{
1607 return 0;
1608}
1609
1610int
1611sys_getpgid(tcp)
1612struct tcb *tcp;
1613{
1614 if (entering(tcp)) {
1615 tprintf("%lu", tcp->u_arg[0]);
1616 }
1617 return 0;
1618}
1619
1620int
1621sys_setpgid(tcp)
1622struct tcb *tcp;
1623{
1624 if (entering(tcp)) {
1625 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1626 }
1627 return 0;
1628}
1629
John Hughesc61eb3d2002-05-17 11:37:50 +00001630#if UNIXWARE >= 2
1631
1632#include <sys/privilege.h>
1633
1634
Roland McGrathd9f816f2004-09-04 03:39:20 +00001635static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001636 { SETPRV, "SETPRV" },
1637 { CLRPRV, "CLRPRV" },
1638 { PUTPRV, "PUTPRV" },
1639 { GETPRV, "GETPRV" },
1640 { CNTPRV, "CNTPRV" },
1641 { 0, NULL },
1642};
1643
1644
Roland McGrathd9f816f2004-09-04 03:39:20 +00001645static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001646 { P_OWNER, "P_OWNER" },
1647 { P_AUDIT, "P_AUDIT" },
1648 { P_COMPAT, "P_COMPAT" },
1649 { P_DACREAD, "P_DACREAD" },
1650 { P_DACWRITE, "P_DACWRITE" },
1651 { P_DEV, "P_DEV" },
1652 { P_FILESYS, "P_FILESYS" },
1653 { P_MACREAD, "P_MACREAD" },
1654 { P_MACWRITE, "P_MACWRITE" },
1655 { P_MOUNT, "P_MOUNT" },
1656 { P_MULTIDIR, "P_MULTIDIR" },
1657 { P_SETPLEVEL, "P_SETPLEVEL" },
1658 { P_SETSPRIV, "P_SETSPRIV" },
1659 { P_SETUID, "P_SETUID" },
1660 { P_SYSOPS, "P_SYSOPS" },
1661 { P_SETUPRIV, "P_SETUPRIV" },
1662 { P_DRIVER, "P_DRIVER" },
1663 { P_RTIME, "P_RTIME" },
1664 { P_MACUPGRADE, "P_MACUPGRADE" },
1665 { P_FSYSRANGE, "P_FSYSRANGE" },
1666 { P_SETFLEVEL, "P_SETFLEVEL" },
1667 { P_AUDITWR, "P_AUDITWR" },
1668 { P_TSHAR, "P_TSHAR" },
1669 { P_PLOCK, "P_PLOCK" },
1670 { P_CORE, "P_CORE" },
1671 { P_LOADMOD, "P_LOADMOD" },
1672 { P_BIND, "P_BIND" },
1673 { P_ALLPRIVS, "P_ALLPRIVS" },
1674 { 0, NULL },
1675};
1676
1677
Roland McGrathd9f816f2004-09-04 03:39:20 +00001678static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001679 { PS_FIX, "PS_FIX" },
1680 { PS_INH, "PS_INH" },
1681 { PS_MAX, "PS_MAX" },
1682 { PS_WKG, "PS_WKG" },
1683 { 0, NULL },
1684};
1685
1686
1687static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001688printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001689{
1690 priv_t buf [128];
1691 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1692 int dots = len > max;
1693 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001694
John Hughesc61eb3d2002-05-17 11:37:50 +00001695 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001696
John Hughesc61eb3d2002-05-17 11:37:50 +00001697 if (len <= 0 ||
1698 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1699 {
1700 tprintf ("%#lx", addr);
1701 return;
1702 }
1703
1704 tprintf ("[");
1705
1706 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001707 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001708
1709 if (i) tprintf (", ");
1710
1711 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1712 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1713 {
1714 tprintf ("%s|%s", t, p);
1715 }
1716 else {
1717 tprintf ("%#lx", buf [i]);
1718 }
1719 }
1720
1721 if (dots) tprintf (" ...");
1722
1723 tprintf ("]");
1724}
1725
1726
1727int
1728sys_procpriv(tcp)
1729struct tcb *tcp;
1730{
1731 if (entering(tcp)) {
1732 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1733 switch (tcp->u_arg[0]) {
1734 case CNTPRV:
1735 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1736 break;
1737
1738 case GETPRV:
1739 break;
1740
1741 default:
1742 tprintf (", ");
1743 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1744 tprintf (", %ld", tcp->u_arg[2]);
1745 }
1746 }
1747 else if (tcp->u_arg[0] == GETPRV) {
1748 if (syserror (tcp)) {
1749 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1750 }
1751 else {
1752 tprintf (", ");
1753 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1754 tprintf (", %ld", tcp->u_arg[2]);
1755 }
1756 }
Roland McGrath5a223472002-12-15 23:58:26 +00001757
John Hughesc61eb3d2002-05-17 11:37:50 +00001758 return 0;
1759}
1760
1761#endif
1762
1763
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001764static void
1765printargv(tcp, addr)
1766struct tcb *tcp;
1767long addr;
1768{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001769 union {
1770 int p32;
1771 long p64;
1772 char data[sizeof(long)];
1773 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001774 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001775 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001776
Roland McGrath85a3bc42007-08-02 02:13:05 +00001777 cp.p64 = 1;
1778 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1779 if (umoven(tcp, addr, personality_wordsize[current_personality],
1780 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001781 tprintf("%#lx", addr);
1782 return;
1783 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001784 if (personality_wordsize[current_personality] == 4)
1785 cp.p64 = cp.p32;
1786 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001787 break;
1788 tprintf(sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001789 printstr(tcp, cp.p64, -1);
1790 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001791 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001792 if (cp.p64)
1793 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001794}
1795
1796static void
1797printargc(fmt, tcp, addr)
1798char *fmt;
1799struct tcb *tcp;
1800long addr;
1801{
1802 int count;
1803 char *cp;
1804
1805 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1806 addr += sizeof(char *);
1807 }
1808 tprintf(fmt, count, count == 1 ? "" : "s");
1809}
1810
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001811#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001812int
1813sys_execv(tcp)
1814struct tcb *tcp;
1815{
1816 if (entering(tcp)) {
1817 printpath(tcp, tcp->u_arg[0]);
1818 if (!verbose(tcp))
1819 tprintf(", %#lx", tcp->u_arg[1]);
1820#if 0
1821 else if (abbrev(tcp))
1822 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1823#endif
1824 else {
1825 tprintf(", [");
1826 printargv(tcp, tcp->u_arg[1]);
1827 tprintf("]");
1828 }
1829 }
1830 return 0;
1831}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001832#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001833
1834int
1835sys_execve(tcp)
1836struct tcb *tcp;
1837{
1838 if (entering(tcp)) {
1839 printpath(tcp, tcp->u_arg[0]);
1840 if (!verbose(tcp))
1841 tprintf(", %#lx", tcp->u_arg[1]);
1842#if 0
1843 else if (abbrev(tcp))
1844 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1845#endif
1846 else {
1847 tprintf(", [");
1848 printargv(tcp, tcp->u_arg[1]);
1849 tprintf("]");
1850 }
1851 if (!verbose(tcp))
1852 tprintf(", %#lx", tcp->u_arg[2]);
1853 else if (abbrev(tcp))
1854 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1855 else {
1856 tprintf(", [");
1857 printargv(tcp, tcp->u_arg[2]);
1858 tprintf("]");
1859 }
1860 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001861 return 0;
1862}
1863
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001864#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001865
1866int sys_rexecve(tcp)
1867struct tcb *tcp;
1868{
1869 if (entering (tcp)) {
1870 sys_execve (tcp);
1871 tprintf (", %ld", tcp->u_arg[3]);
1872 }
1873 return 0;
1874}
1875
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001876#endif
John Hughes4e36a812001-04-18 15:11:51 +00001877
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001878int
1879internal_exec(tcp)
1880struct tcb *tcp;
1881{
1882#ifdef SUNOS4
1883 if (exiting(tcp) && !syserror(tcp) && followfork)
1884 fixvfork(tcp);
1885#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001886#if defined LINUX && defined TCB_WAITEXECVE
1887 if (exiting(tcp) && syserror(tcp))
1888 tcp->flags &= ~TCB_WAITEXECVE;
1889 else
1890 tcp->flags |= TCB_WAITEXECVE;
1891#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001892 return 0;
1893}
1894
1895#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001896#ifndef __WNOTHREAD
1897#define __WNOTHREAD 0x20000000
1898#endif
1899#ifndef __WALL
1900#define __WALL 0x40000000
1901#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001902#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001903#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001904#endif
1905#endif /* LINUX */
1906
Roland McGrathd9f816f2004-09-04 03:39:20 +00001907static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001908 { WNOHANG, "WNOHANG" },
1909#ifndef WSTOPPED
1910 { WUNTRACED, "WUNTRACED" },
1911#endif
1912#ifdef WEXITED
1913 { WEXITED, "WEXITED" },
1914#endif
1915#ifdef WTRAPPED
1916 { WTRAPPED, "WTRAPPED" },
1917#endif
1918#ifdef WSTOPPED
1919 { WSTOPPED, "WSTOPPED" },
1920#endif
1921#ifdef WCONTINUED
1922 { WCONTINUED, "WCONTINUED" },
1923#endif
1924#ifdef WNOWAIT
1925 { WNOWAIT, "WNOWAIT" },
1926#endif
1927#ifdef __WCLONE
1928 { __WCLONE, "__WCLONE" },
1929#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001930#ifdef __WALL
1931 { __WALL, "__WALL" },
1932#endif
1933#ifdef __WNOTHREAD
1934 { __WNOTHREAD, "__WNOTHREAD" },
1935#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001936 { 0, NULL },
1937};
1938
Roland McGrath5e02a572004-10-19 23:33:47 +00001939#if !defined WCOREFLAG && defined WCOREFLG
1940# define WCOREFLAG WCOREFLG
1941#endif
1942#ifndef WCOREFLAG
1943#define WCOREFLAG 0x80
1944#endif
1945
1946#ifndef W_STOPCODE
1947#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1948#endif
1949#ifndef W_EXITCODE
1950#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1951#endif
1952
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001953static int
1954printstatus(status)
1955int status;
1956{
1957 int exited = 0;
1958
1959 /*
1960 * Here is a tricky presentation problem. This solution
1961 * is still not entirely satisfactory but since there
1962 * are no wait status constructors it will have to do.
1963 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001964 if (WIFSTOPPED(status)) {
1965 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001966 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001967 status &= ~W_STOPCODE(WSTOPSIG(status));
1968 }
1969 else if (WIFSIGNALED(status)) {
1970 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001971 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001972 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001973 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1974 }
1975 else if (WIFEXITED(status)) {
1976 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001977 WEXITSTATUS(status));
1978 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001979 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001980 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001981 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001982 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001983 return 0;
1984 }
1985
1986 if (status == 0)
1987 tprintf("]");
1988 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001989 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001990
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001991 return exited;
1992}
1993
1994static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001995printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001996{
1997 int status;
1998 int exited = 0;
1999
2000 if (entering(tcp)) {
Roland McGrath5b63d962008-07-18 02:16:47 +00002001 /*
2002 * Sign-extend a 32-bit value when that's what it is.
Denys Vlasenko59432db2009-01-26 19:09:35 +00002003 *
2004 * NB: On Linux, kernel-side pid_t is typedef'ed to int
2005 * on all arches; also, glibc-2.8 truncates wait3 and wait4
2006 * pid argument to int on 64bit arches, producing,
2007 * for example, wait4(4294967295, ...) instead of -1
2008 * in strace.
2009 * Therefore, maybe it makes sense to *unconditionally*
2010 * widen int to long here...
Roland McGrath5b63d962008-07-18 02:16:47 +00002011 */
2012 long pid = tcp->u_arg[0];
2013 if (personality_wordsize[current_personality] < sizeof pid)
2014 pid = (long) (int) pid;
2015 tprintf("%ld, ", pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002016 } else {
2017 /* status */
2018 if (!tcp->u_arg[1])
2019 tprintf("NULL");
2020 else if (syserror(tcp) || tcp->u_rval == 0)
2021 tprintf("%#lx", tcp->u_arg[1]);
2022 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
2023 tprintf("[?]");
2024 else
2025 exited = printstatus(status);
2026 /* options */
2027 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002028 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002029 if (n == 4) {
2030 tprintf(", ");
2031 /* usage */
2032 if (!tcp->u_arg[3])
2033 tprintf("NULL");
2034#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002035 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00002036#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002037 if (bitness)
2038 printrusage32(tcp, tcp->u_arg[3]);
2039 else
2040#endif
2041 printrusage(tcp, tcp->u_arg[3]);
2042 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002043#endif /* LINUX */
2044#ifdef SUNOS4
2045 else if (tcp->u_rval > 0 && exited)
2046 printrusage(tcp, tcp->u_arg[3]);
2047#endif /* SUNOS4 */
2048 else
2049 tprintf("%#lx", tcp->u_arg[3]);
2050 }
2051 }
2052 return 0;
2053}
2054
2055int
Roland McGrathc74c0b72004-09-01 19:39:46 +00002056internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002057struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00002058int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002059{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002060 int got_kids;
2061
2062#ifdef TCB_CLONE_THREAD
2063 if (tcp->flags & TCB_CLONE_THREAD)
2064 /* The children we wait for are our parent's children. */
2065 got_kids = (tcp->parent->nchildren
2066 > tcp->parent->nclone_detached);
2067 else
2068 got_kids = (tcp->nchildren > tcp->nclone_detached);
2069#else
2070 got_kids = tcp->nchildren > 0;
2071#endif
2072
2073 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002074 /* There are children that this parent should block for.
2075 But ptrace made us the parent of the traced children
2076 and the real parent will get ECHILD from the wait call.
2077
2078 XXX If we attached with strace -f -p PID, then there
2079 may be untraced dead children the parent could be reaping
2080 now, but we make him block. */
2081
2082 /* ??? WTA: fix bug with hanging children */
2083
Roland McGrathc74c0b72004-09-01 19:39:46 +00002084 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00002085 /*
2086 * There are traced children. We'll make the parent
2087 * block to avoid a false ECHILD error due to our
2088 * ptrace having stolen the children. However,
2089 * we shouldn't block if there are zombies to reap.
2090 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
2091 */
Roland McGrathfccfb942003-10-01 21:59:44 +00002092 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00002093 if (tcp->nzombies > 0 &&
2094 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00002095 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00002096 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00002097 if (tcp->u_arg[0] > 0) {
2098 /*
2099 * If the parent waits for a specified child
2100 * PID, then it must get ECHILD right away
2101 * if that PID is not one of its children.
2102 * Make sure that the requested PID matches
2103 * one of the parent's children that we are
2104 * tracing, and don't suspend it otherwise.
2105 */
2106 if (child == NULL)
2107 child = pid2tcb(tcp->u_arg[0]);
2108 if (child == NULL || child->parent != (
2109#ifdef TCB_CLONE_THREAD
2110 (tcp->flags & TCB_CLONE_THREAD)
2111 ? tcp->parent :
2112#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002113 tcp) ||
2114 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002115 return 0;
2116 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002117 tcp->flags |= TCB_SUSPENDED;
2118 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002119#ifdef TCB_CLONE_THREAD
2120 if (tcp->flags & TCB_CLONE_THREAD)
2121 tcp->parent->nclone_waiting++;
2122#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002123 }
2124 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002125 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002126 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002127 /* We must force a fake result of 0 instead of
2128 the ECHILD error. */
2129 extern int force_result();
2130 return force_result(tcp, 0, 0);
2131 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002132 }
Roland McGrath09623452003-05-23 02:27:13 +00002133 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2134 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2135 /*
2136 * We just reaped a child we don't know about,
2137 * presumably a zombie we already droptcb'd.
2138 */
2139 tcp->nzombies--;
2140 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002141 return 0;
2142}
2143
2144#ifdef SVR4
2145
2146int
2147sys_wait(tcp)
2148struct tcb *tcp;
2149{
2150 if (exiting(tcp)) {
2151 /* The library wrapper stuffs this into the user variable. */
2152 if (!syserror(tcp))
2153 printstatus(getrval2(tcp));
2154 }
2155 return 0;
2156}
2157
2158#endif /* SVR4 */
2159
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002160#ifdef FREEBSD
2161int
2162sys_wait(tcp)
2163struct tcb *tcp;
2164{
2165 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002166
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002167 if (exiting(tcp)) {
2168 if (!syserror(tcp)) {
2169 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2170 tprintf("%#lx", tcp->u_arg[0]);
2171 else
2172 printstatus(status);
2173 }
2174 }
2175 return 0;
2176}
2177#endif
2178
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002179int
2180sys_waitpid(tcp)
2181struct tcb *tcp;
2182{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002183 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002184}
2185
2186int
2187sys_wait4(tcp)
2188struct tcb *tcp;
2189{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002190 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002191}
2192
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002193#ifdef ALPHA
2194int
2195sys_osf_wait4(tcp)
2196struct tcb *tcp;
2197{
2198 return printwaitn(tcp, 4, 1);
2199}
2200#endif
2201
Roland McGrathc74c0b72004-09-01 19:39:46 +00002202#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002203
Roland McGrathd9f816f2004-09-04 03:39:20 +00002204static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002205 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002206#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002207 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002208#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002209 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002210#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002211 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002212#endif
2213#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002214 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002215#endif
2216#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002217 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002218#endif
2219#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002220 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002221#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002222 { P_ALL, "P_ALL" },
2223#ifdef P_LWPID
2224 { P_LWPID, "P_LWPID" },
2225#endif
2226 { 0, NULL },
2227};
2228
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002229int
2230sys_waitid(tcp)
2231struct tcb *tcp;
2232{
2233 siginfo_t si;
2234 int exited;
2235
2236 if (entering(tcp)) {
2237 printxval(waitid_types, tcp->u_arg[0], "P_???");
2238 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002239 }
2240 else {
2241 /* siginfo */
2242 exited = 0;
2243 if (!tcp->u_arg[2])
2244 tprintf("NULL");
2245 else if (syserror(tcp))
2246 tprintf("%#lx", tcp->u_arg[2]);
2247 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2248 tprintf("{???}");
2249 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002250 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002251 /* options */
2252 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002253 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002254 if (tcp->u_nargs > 4) {
2255 /* usage */
2256 tprintf(", ");
2257 if (!tcp->u_arg[4])
2258 tprintf("NULL");
2259 else if (tcp->u_error)
2260 tprintf("%#lx", tcp->u_arg[4]);
2261 else
2262 printrusage(tcp, tcp->u_arg[4]);
2263 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002264 }
2265 return 0;
2266}
2267
Roland McGrathc74c0b72004-09-01 19:39:46 +00002268#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002269
2270int
2271sys_alarm(tcp)
2272struct tcb *tcp;
2273{
2274 if (entering(tcp))
2275 tprintf("%lu", tcp->u_arg[0]);
2276 return 0;
2277}
2278
2279int
2280sys_uname(tcp)
2281struct tcb *tcp;
2282{
2283 struct utsname uname;
2284
2285 if (exiting(tcp)) {
2286 if (syserror(tcp) || !verbose(tcp))
2287 tprintf("%#lx", tcp->u_arg[0]);
2288 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2289 tprintf("{...}");
2290 else if (!abbrev(tcp)) {
2291
2292 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2293 uname.sysname, uname.nodename);
2294 tprintf("release=\"%s\", version=\"%s\", ",
2295 uname.release, uname.version);
2296 tprintf("machine=\"%s\"", uname.machine);
2297#ifdef LINUX
2298#ifndef __GLIBC__
2299 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002300#endif
2301#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002302 tprintf("}");
2303 }
2304 else
2305 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2306 uname.sysname, uname.nodename);
2307 }
2308 return 0;
2309}
2310
2311#ifndef SVR4
2312
Denys Vlasenko4dedd562009-02-24 15:17:53 +00002313const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002314# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002315 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2316 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2317 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2318 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2319 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2320 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2321 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2322 { PTRACE_CONT, "PTRACE_CONT" },
2323 { PTRACE_KILL, "PTRACE_KILL" },
2324 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2325 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2326 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002327# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002328 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002329# endif
2330# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002331 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002332# endif
2333# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002334 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002335# endif
2336# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002337 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002338# endif
2339# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002340 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002341# endif
2342# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002343 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002344# endif
2345# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002346 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002347# endif
2348# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002349 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002350# endif
2351# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002352 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002353# endif
2354# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002355 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002356# endif
2357# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002358 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002359# endif
2360# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002361 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002362# endif
2363# ifdef PTRACE_SET_SYSCALL
2364 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2365# endif
2366# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002367 { PTRACE_READDATA, "PTRACE_READDATA" },
2368 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2369 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2370 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2371 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2372 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002373# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002374 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2375 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002376# else /* !SPARC */
2377 { PTRACE_22, "PTRACE_22" },
2378 { PTRACE_23, "PTRACE_3" },
2379# endif /* !SPARC */
2380# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002381 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002382# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002383 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002384# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002385 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2386 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2387 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002388# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002389 { PTRACE_26, "PTRACE_26" },
2390 { PTRACE_27, "PTRACE_27" },
2391 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002392# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002393 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002394# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002395
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002396# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002397
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002398 { PT_TRACE_ME, "PT_TRACE_ME" },
2399 { PT_READ_I, "PT_READ_I" },
2400 { PT_READ_D, "PT_READ_D" },
2401 { PT_WRITE_I, "PT_WRITE_I" },
2402 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002403# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002404 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002405# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002406 { PT_CONTINUE, "PT_CONTINUE" },
2407 { PT_KILL, "PT_KILL" },
2408 { PT_STEP, "PT_STEP" },
2409 { PT_ATTACH, "PT_ATTACH" },
2410 { PT_DETACH, "PT_DETACH" },
2411 { PT_GETREGS, "PT_GETREGS" },
2412 { PT_SETREGS, "PT_SETREGS" },
2413 { PT_GETFPREGS, "PT_GETFPREGS" },
2414 { PT_SETFPREGS, "PT_SETFPREGS" },
2415 { PT_GETDBREGS, "PT_GETDBREGS" },
2416 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002417# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002418 { 0, NULL },
2419};
2420
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002421# ifndef FREEBSD
2422# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002423static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002424# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002425 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002426# endif
2427# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002428 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002429# endif
2430# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002431 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002432# endif
2433# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002434 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002435# endif
2436# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002437 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002438# endif
2439# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002440 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002441# endif
2442# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002443 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002444# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002445 { 0, NULL },
2446};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002447# endif /* PTRACE_SETOPTIONS */
2448# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002449
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002450# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002451const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002452# ifdef LINUX
2453# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002454 { PT_PSWMASK, "psw_mask" },
2455 { PT_PSWADDR, "psw_addr" },
2456 { PT_GPR0, "gpr0" },
2457 { PT_GPR1, "gpr1" },
2458 { PT_GPR2, "gpr2" },
2459 { PT_GPR3, "gpr3" },
2460 { PT_GPR4, "gpr4" },
2461 { PT_GPR5, "gpr5" },
2462 { PT_GPR6, "gpr6" },
2463 { PT_GPR7, "gpr7" },
2464 { PT_GPR8, "gpr8" },
2465 { PT_GPR9, "gpr9" },
2466 { PT_GPR10, "gpr10" },
2467 { PT_GPR11, "gpr11" },
2468 { PT_GPR12, "gpr12" },
2469 { PT_GPR13, "gpr13" },
2470 { PT_GPR14, "gpr14" },
2471 { PT_GPR15, "gpr15" },
2472 { PT_ACR0, "acr0" },
2473 { PT_ACR1, "acr1" },
2474 { PT_ACR2, "acr2" },
2475 { PT_ACR3, "acr3" },
2476 { PT_ACR4, "acr4" },
2477 { PT_ACR5, "acr5" },
2478 { PT_ACR6, "acr6" },
2479 { PT_ACR7, "acr7" },
2480 { PT_ACR8, "acr8" },
2481 { PT_ACR9, "acr9" },
2482 { PT_ACR10, "acr10" },
2483 { PT_ACR11, "acr11" },
2484 { PT_ACR12, "acr12" },
2485 { PT_ACR13, "acr13" },
2486 { PT_ACR14, "acr14" },
2487 { PT_ACR15, "acr15" },
2488 { PT_ORIGGPR2, "orig_gpr2" },
2489 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002490# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002491 { PT_FPR0_HI, "fpr0.hi" },
2492 { PT_FPR0_LO, "fpr0.lo" },
2493 { PT_FPR1_HI, "fpr1.hi" },
2494 { PT_FPR1_LO, "fpr1.lo" },
2495 { PT_FPR2_HI, "fpr2.hi" },
2496 { PT_FPR2_LO, "fpr2.lo" },
2497 { PT_FPR3_HI, "fpr3.hi" },
2498 { PT_FPR3_LO, "fpr3.lo" },
2499 { PT_FPR4_HI, "fpr4.hi" },
2500 { PT_FPR4_LO, "fpr4.lo" },
2501 { PT_FPR5_HI, "fpr5.hi" },
2502 { PT_FPR5_LO, "fpr5.lo" },
2503 { PT_FPR6_HI, "fpr6.hi" },
2504 { PT_FPR6_LO, "fpr6.lo" },
2505 { PT_FPR7_HI, "fpr7.hi" },
2506 { PT_FPR7_LO, "fpr7.lo" },
2507 { PT_FPR8_HI, "fpr8.hi" },
2508 { PT_FPR8_LO, "fpr8.lo" },
2509 { PT_FPR9_HI, "fpr9.hi" },
2510 { PT_FPR9_LO, "fpr9.lo" },
2511 { PT_FPR10_HI, "fpr10.hi" },
2512 { PT_FPR10_LO, "fpr10.lo" },
2513 { PT_FPR11_HI, "fpr11.hi" },
2514 { PT_FPR11_LO, "fpr11.lo" },
2515 { PT_FPR12_HI, "fpr12.hi" },
2516 { PT_FPR12_LO, "fpr12.lo" },
2517 { PT_FPR13_HI, "fpr13.hi" },
2518 { PT_FPR13_LO, "fpr13.lo" },
2519 { PT_FPR14_HI, "fpr14.hi" },
2520 { PT_FPR14_LO, "fpr14.lo" },
2521 { PT_FPR15_HI, "fpr15.hi" },
2522 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002523# endif
2524# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002525 { PT_FPR0, "fpr0" },
2526 { PT_FPR1, "fpr1" },
2527 { PT_FPR2, "fpr2" },
2528 { PT_FPR3, "fpr3" },
2529 { PT_FPR4, "fpr4" },
2530 { PT_FPR5, "fpr5" },
2531 { PT_FPR6, "fpr6" },
2532 { PT_FPR7, "fpr7" },
2533 { PT_FPR8, "fpr8" },
2534 { PT_FPR9, "fpr9" },
2535 { PT_FPR10, "fpr10" },
2536 { PT_FPR11, "fpr11" },
2537 { PT_FPR12, "fpr12" },
2538 { PT_FPR13, "fpr13" },
2539 { PT_FPR14, "fpr14" },
2540 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002541# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002542 { PT_CR_9, "cr9" },
2543 { PT_CR_10, "cr10" },
2544 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002545 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002546# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002547 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002548# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002549 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002550# elif defined(POWERPC)
2551# ifndef PT_ORIG_R3
2552# define PT_ORIG_R3 34
2553# endif
2554# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002555 { REGSIZE*PT_R0, "r0" },
2556 { REGSIZE*PT_R1, "r1" },
2557 { REGSIZE*PT_R2, "r2" },
2558 { REGSIZE*PT_R3, "r3" },
2559 { REGSIZE*PT_R4, "r4" },
2560 { REGSIZE*PT_R5, "r5" },
2561 { REGSIZE*PT_R6, "r6" },
2562 { REGSIZE*PT_R7, "r7" },
2563 { REGSIZE*PT_R8, "r8" },
2564 { REGSIZE*PT_R9, "r9" },
2565 { REGSIZE*PT_R10, "r10" },
2566 { REGSIZE*PT_R11, "r11" },
2567 { REGSIZE*PT_R12, "r12" },
2568 { REGSIZE*PT_R13, "r13" },
2569 { REGSIZE*PT_R14, "r14" },
2570 { REGSIZE*PT_R15, "r15" },
2571 { REGSIZE*PT_R16, "r16" },
2572 { REGSIZE*PT_R17, "r17" },
2573 { REGSIZE*PT_R18, "r18" },
2574 { REGSIZE*PT_R19, "r19" },
2575 { REGSIZE*PT_R20, "r20" },
2576 { REGSIZE*PT_R21, "r21" },
2577 { REGSIZE*PT_R22, "r22" },
2578 { REGSIZE*PT_R23, "r23" },
2579 { REGSIZE*PT_R24, "r24" },
2580 { REGSIZE*PT_R25, "r25" },
2581 { REGSIZE*PT_R26, "r26" },
2582 { REGSIZE*PT_R27, "r27" },
2583 { REGSIZE*PT_R28, "r28" },
2584 { REGSIZE*PT_R29, "r29" },
2585 { REGSIZE*PT_R30, "r30" },
2586 { REGSIZE*PT_R31, "r31" },
2587 { REGSIZE*PT_NIP, "NIP" },
2588 { REGSIZE*PT_MSR, "MSR" },
2589 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2590 { REGSIZE*PT_CTR, "CTR" },
2591 { REGSIZE*PT_LNK, "LNK" },
2592 { REGSIZE*PT_XER, "XER" },
2593 { REGSIZE*PT_CCR, "CCR" },
2594 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002595# undef REGSIZE
2596# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002597 { 0, "r0" },
2598 { 1, "r1" },
2599 { 2, "r2" },
2600 { 3, "r3" },
2601 { 4, "r4" },
2602 { 5, "r5" },
2603 { 6, "r6" },
2604 { 7, "r7" },
2605 { 8, "r8" },
2606 { 9, "r9" },
2607 { 10, "r10" },
2608 { 11, "r11" },
2609 { 12, "r12" },
2610 { 13, "r13" },
2611 { 14, "r14" },
2612 { 15, "r15" },
2613 { 16, "r16" },
2614 { 17, "r17" },
2615 { 18, "r18" },
2616 { 19, "r19" },
2617 { 20, "r20" },
2618 { 21, "r21" },
2619 { 22, "r22" },
2620 { 23, "r23" },
2621 { 24, "r24" },
2622 { 25, "r25" },
2623 { 26, "r26" },
2624 { 27, "r27" },
2625 { 28, "r28" },
2626 { 29, "gp" },
2627 { 30, "fp" },
2628 { 31, "zero" },
2629 { 32, "fp0" },
2630 { 33, "fp" },
2631 { 34, "fp2" },
2632 { 35, "fp3" },
2633 { 36, "fp4" },
2634 { 37, "fp5" },
2635 { 38, "fp6" },
2636 { 39, "fp7" },
2637 { 40, "fp8" },
2638 { 41, "fp9" },
2639 { 42, "fp10" },
2640 { 43, "fp11" },
2641 { 44, "fp12" },
2642 { 45, "fp13" },
2643 { 46, "fp14" },
2644 { 47, "fp15" },
2645 { 48, "fp16" },
2646 { 49, "fp17" },
2647 { 50, "fp18" },
2648 { 51, "fp19" },
2649 { 52, "fp20" },
2650 { 53, "fp21" },
2651 { 54, "fp22" },
2652 { 55, "fp23" },
2653 { 56, "fp24" },
2654 { 57, "fp25" },
2655 { 58, "fp26" },
2656 { 59, "fp27" },
2657 { 60, "fp28" },
2658 { 61, "fp29" },
2659 { 62, "fp30" },
2660 { 63, "fp31" },
2661 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002662# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002663 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2664 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2665 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2666 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2667 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2668 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2669 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2670 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2671 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2672 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2673 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2674 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2675 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2676 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2677 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2678 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2679 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2680 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2681 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2682 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2683 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2684 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2685 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2686 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2687 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2688 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2689 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2690 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2691 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2692 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2693 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2694 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2695 /* switch stack: */
2696 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2697 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2698 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2699 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2700 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2701 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2702 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2703 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2704 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2705 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002706 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2707 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002708 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002709 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002710 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2711 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002712 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2713 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2714 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2715 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2716 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2717 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2718 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2719 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2720 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2721 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2722 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2723 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2724 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2725 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2726 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002727# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002728 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002729# endif
2730# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002731 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002732# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002733 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002734# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002735 { 4*EBX, "4*EBX" },
2736 { 4*ECX, "4*ECX" },
2737 { 4*EDX, "4*EDX" },
2738 { 4*ESI, "4*ESI" },
2739 { 4*EDI, "4*EDI" },
2740 { 4*EBP, "4*EBP" },
2741 { 4*EAX, "4*EAX" },
2742 { 4*DS, "4*DS" },
2743 { 4*ES, "4*ES" },
2744 { 4*FS, "4*FS" },
2745 { 4*GS, "4*GS" },
2746 { 4*ORIG_EAX, "4*ORIG_EAX" },
2747 { 4*EIP, "4*EIP" },
2748 { 4*CS, "4*CS" },
2749 { 4*EFL, "4*EFL" },
2750 { 4*UESP, "4*UESP" },
2751 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002752# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002753 { 8*R15, "8*R15" },
2754 { 8*R14, "8*R14" },
2755 { 8*R13, "8*R13" },
2756 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002757 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002758 { 8*RBX, "8*RBX" },
2759 { 8*R11, "8*R11" },
2760 { 8*R10, "8*R10" },
2761 { 8*R9, "8*R9" },
2762 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002763 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002764 { 8*RCX, "8*RCX" },
2765 { 8*RDX, "8*RDX" },
2766 { 8*RSI, "8*RSI" },
2767 { 8*RDI, "8*RDI" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002768# if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002769 { DS, "DS" },
2770 { ES, "ES" },
2771 { FS, "FS" },
2772 { GS, "GS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002773# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002774 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002775 { 8*RIP, "8*RIP" },
2776 { 8*CS, "8*CS" },
2777 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002778 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002779 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002780# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002781 { 4*PT_D1, "4*PT_D1" },
2782 { 4*PT_D2, "4*PT_D2" },
2783 { 4*PT_D3, "4*PT_D3" },
2784 { 4*PT_D4, "4*PT_D4" },
2785 { 4*PT_D5, "4*PT_D5" },
2786 { 4*PT_D6, "4*PT_D6" },
2787 { 4*PT_D7, "4*PT_D7" },
2788 { 4*PT_A0, "4*PT_A0" },
2789 { 4*PT_A1, "4*PT_A1" },
2790 { 4*PT_A2, "4*PT_A2" },
2791 { 4*PT_A3, "4*PT_A3" },
2792 { 4*PT_A4, "4*PT_A4" },
2793 { 4*PT_A5, "4*PT_A5" },
2794 { 4*PT_A6, "4*PT_A6" },
2795 { 4*PT_D0, "4*PT_D0" },
2796 { 4*PT_USP, "4*PT_USP" },
2797 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2798 { 4*PT_SR, "4*PT_SR" },
2799 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002800# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002801 { 4*REG_REG0, "4*REG_REG0" },
2802 { 4*(REG_REG0+1), "4*REG_REG1" },
2803 { 4*(REG_REG0+2), "4*REG_REG2" },
2804 { 4*(REG_REG0+3), "4*REG_REG3" },
2805 { 4*(REG_REG0+4), "4*REG_REG4" },
2806 { 4*(REG_REG0+5), "4*REG_REG5" },
2807 { 4*(REG_REG0+6), "4*REG_REG6" },
2808 { 4*(REG_REG0+7), "4*REG_REG7" },
2809 { 4*(REG_REG0+8), "4*REG_REG8" },
2810 { 4*(REG_REG0+9), "4*REG_REG9" },
2811 { 4*(REG_REG0+10), "4*REG_REG10" },
2812 { 4*(REG_REG0+11), "4*REG_REG11" },
2813 { 4*(REG_REG0+12), "4*REG_REG12" },
2814 { 4*(REG_REG0+13), "4*REG_REG13" },
2815 { 4*(REG_REG0+14), "4*REG_REG14" },
2816 { 4*REG_REG15, "4*REG_REG15" },
2817 { 4*REG_PC, "4*REG_PC" },
2818 { 4*REG_PR, "4*REG_PR" },
2819 { 4*REG_SR, "4*REG_SR" },
2820 { 4*REG_GBR, "4*REG_GBR" },
2821 { 4*REG_MACH, "4*REG_MACH" },
2822 { 4*REG_MACL, "4*REG_MACL" },
2823 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2824 { 4*REG_FPUL, "4*REG_FPUL" },
2825 { 4*REG_FPREG0, "4*REG_FPREG0" },
2826 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2827 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2828 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2829 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2830 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2831 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2832 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2833 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2834 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2835 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2836 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2837 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2838 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2839 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2840 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002841# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002842 { 4*REG_XDREG0, "4*REG_XDREG0" },
2843 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2844 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2845 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2846 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2847 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2848 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2849 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002850# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002851 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002852# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002853 { 0, "PC(L)" },
2854 { 4, "PC(U)" },
2855 { 8, "SR(L)" },
2856 { 12, "SR(U)" },
2857 { 16, "syscall no.(L)" },
2858 { 20, "syscall_no.(U)" },
2859 { 24, "R0(L)" },
2860 { 28, "R0(U)" },
2861 { 32, "R1(L)" },
2862 { 36, "R1(U)" },
2863 { 40, "R2(L)" },
2864 { 44, "R2(U)" },
2865 { 48, "R3(L)" },
2866 { 52, "R3(U)" },
2867 { 56, "R4(L)" },
2868 { 60, "R4(U)" },
2869 { 64, "R5(L)" },
2870 { 68, "R5(U)" },
2871 { 72, "R6(L)" },
2872 { 76, "R6(U)" },
2873 { 80, "R7(L)" },
2874 { 84, "R7(U)" },
2875 { 88, "R8(L)" },
2876 { 92, "R8(U)" },
2877 { 96, "R9(L)" },
2878 { 100, "R9(U)" },
2879 { 104, "R10(L)" },
2880 { 108, "R10(U)" },
2881 { 112, "R11(L)" },
2882 { 116, "R11(U)" },
2883 { 120, "R12(L)" },
2884 { 124, "R12(U)" },
2885 { 128, "R13(L)" },
2886 { 132, "R13(U)" },
2887 { 136, "R14(L)" },
2888 { 140, "R14(U)" },
2889 { 144, "R15(L)" },
2890 { 148, "R15(U)" },
2891 { 152, "R16(L)" },
2892 { 156, "R16(U)" },
2893 { 160, "R17(L)" },
2894 { 164, "R17(U)" },
2895 { 168, "R18(L)" },
2896 { 172, "R18(U)" },
2897 { 176, "R19(L)" },
2898 { 180, "R19(U)" },
2899 { 184, "R20(L)" },
2900 { 188, "R20(U)" },
2901 { 192, "R21(L)" },
2902 { 196, "R21(U)" },
2903 { 200, "R22(L)" },
2904 { 204, "R22(U)" },
2905 { 208, "R23(L)" },
2906 { 212, "R23(U)" },
2907 { 216, "R24(L)" },
2908 { 220, "R24(U)" },
2909 { 224, "R25(L)" },
2910 { 228, "R25(U)" },
2911 { 232, "R26(L)" },
2912 { 236, "R26(U)" },
2913 { 240, "R27(L)" },
2914 { 244, "R27(U)" },
2915 { 248, "R28(L)" },
2916 { 252, "R28(U)" },
2917 { 256, "R29(L)" },
2918 { 260, "R29(U)" },
2919 { 264, "R30(L)" },
2920 { 268, "R30(U)" },
2921 { 272, "R31(L)" },
2922 { 276, "R31(U)" },
2923 { 280, "R32(L)" },
2924 { 284, "R32(U)" },
2925 { 288, "R33(L)" },
2926 { 292, "R33(U)" },
2927 { 296, "R34(L)" },
2928 { 300, "R34(U)" },
2929 { 304, "R35(L)" },
2930 { 308, "R35(U)" },
2931 { 312, "R36(L)" },
2932 { 316, "R36(U)" },
2933 { 320, "R37(L)" },
2934 { 324, "R37(U)" },
2935 { 328, "R38(L)" },
2936 { 332, "R38(U)" },
2937 { 336, "R39(L)" },
2938 { 340, "R39(U)" },
2939 { 344, "R40(L)" },
2940 { 348, "R40(U)" },
2941 { 352, "R41(L)" },
2942 { 356, "R41(U)" },
2943 { 360, "R42(L)" },
2944 { 364, "R42(U)" },
2945 { 368, "R43(L)" },
2946 { 372, "R43(U)" },
2947 { 376, "R44(L)" },
2948 { 380, "R44(U)" },
2949 { 384, "R45(L)" },
2950 { 388, "R45(U)" },
2951 { 392, "R46(L)" },
2952 { 396, "R46(U)" },
2953 { 400, "R47(L)" },
2954 { 404, "R47(U)" },
2955 { 408, "R48(L)" },
2956 { 412, "R48(U)" },
2957 { 416, "R49(L)" },
2958 { 420, "R49(U)" },
2959 { 424, "R50(L)" },
2960 { 428, "R50(U)" },
2961 { 432, "R51(L)" },
2962 { 436, "R51(U)" },
2963 { 440, "R52(L)" },
2964 { 444, "R52(U)" },
2965 { 448, "R53(L)" },
2966 { 452, "R53(U)" },
2967 { 456, "R54(L)" },
2968 { 460, "R54(U)" },
2969 { 464, "R55(L)" },
2970 { 468, "R55(U)" },
2971 { 472, "R56(L)" },
2972 { 476, "R56(U)" },
2973 { 480, "R57(L)" },
2974 { 484, "R57(U)" },
2975 { 488, "R58(L)" },
2976 { 492, "R58(U)" },
2977 { 496, "R59(L)" },
2978 { 500, "R59(U)" },
2979 { 504, "R60(L)" },
2980 { 508, "R60(U)" },
2981 { 512, "R61(L)" },
2982 { 516, "R61(U)" },
2983 { 520, "R62(L)" },
2984 { 524, "R62(U)" },
2985 { 528, "TR0(L)" },
2986 { 532, "TR0(U)" },
2987 { 536, "TR1(L)" },
2988 { 540, "TR1(U)" },
2989 { 544, "TR2(L)" },
2990 { 548, "TR2(U)" },
2991 { 552, "TR3(L)" },
2992 { 556, "TR3(U)" },
2993 { 560, "TR4(L)" },
2994 { 564, "TR4(U)" },
2995 { 568, "TR5(L)" },
2996 { 572, "TR5(U)" },
2997 { 576, "TR6(L)" },
2998 { 580, "TR6(U)" },
2999 { 584, "TR7(L)" },
3000 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00003001 /* This entry is in case pt_regs contains dregs (depends on
3002 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00003003 { uoff(regs), "offsetof(struct user, regs)" },
3004 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003005# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00003006 { uoff(regs.ARM_r0), "r0" },
3007 { uoff(regs.ARM_r1), "r1" },
3008 { uoff(regs.ARM_r2), "r2" },
3009 { uoff(regs.ARM_r3), "r3" },
3010 { uoff(regs.ARM_r4), "r4" },
3011 { uoff(regs.ARM_r5), "r5" },
3012 { uoff(regs.ARM_r6), "r6" },
3013 { uoff(regs.ARM_r7), "r7" },
3014 { uoff(regs.ARM_r8), "r8" },
3015 { uoff(regs.ARM_r9), "r9" },
3016 { uoff(regs.ARM_r10), "r10" },
3017 { uoff(regs.ARM_fp), "fp" },
3018 { uoff(regs.ARM_ip), "ip" },
3019 { uoff(regs.ARM_sp), "sp" },
3020 { uoff(regs.ARM_lr), "lr" },
3021 { uoff(regs.ARM_pc), "pc" },
3022 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003023# elif defined(AVR32)
3024 { uoff(regs.sr), "sr" },
3025 { uoff(regs.pc), "pc" },
3026 { uoff(regs.lr), "lr" },
3027 { uoff(regs.sp), "sp" },
3028 { uoff(regs.r12), "r12" },
3029 { uoff(regs.r11), "r11" },
3030 { uoff(regs.r10), "r10" },
3031 { uoff(regs.r9), "r9" },
3032 { uoff(regs.r8), "r8" },
3033 { uoff(regs.r7), "r7" },
3034 { uoff(regs.r6), "r6" },
3035 { uoff(regs.r5), "r5" },
3036 { uoff(regs.r4), "r4" },
3037 { uoff(regs.r3), "r3" },
3038 { uoff(regs.r2), "r2" },
3039 { uoff(regs.r1), "r1" },
3040 { uoff(regs.r0), "r0" },
3041 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003042# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00003043 { 0, "r0" },
3044 { 1, "r1" },
3045 { 2, "r2" },
3046 { 3, "r3" },
3047 { 4, "r4" },
3048 { 5, "r5" },
3049 { 6, "r6" },
3050 { 7, "r7" },
3051 { 8, "r8" },
3052 { 9, "r9" },
3053 { 10, "r10" },
3054 { 11, "r11" },
3055 { 12, "r12" },
3056 { 13, "r13" },
3057 { 14, "r14" },
3058 { 15, "r15" },
3059 { 16, "r16" },
3060 { 17, "r17" },
3061 { 18, "r18" },
3062 { 19, "r19" },
3063 { 20, "r20" },
3064 { 21, "r21" },
3065 { 22, "r22" },
3066 { 23, "r23" },
3067 { 24, "r24" },
3068 { 25, "r25" },
3069 { 26, "r26" },
3070 { 27, "r27" },
3071 { 28, "r28" },
3072 { 29, "r29" },
3073 { 30, "r30" },
3074 { 31, "r31" },
3075 { 32, "f0" },
3076 { 33, "f1" },
3077 { 34, "f2" },
3078 { 35, "f3" },
3079 { 36, "f4" },
3080 { 37, "f5" },
3081 { 38, "f6" },
3082 { 39, "f7" },
3083 { 40, "f8" },
3084 { 41, "f9" },
3085 { 42, "f10" },
3086 { 43, "f11" },
3087 { 44, "f12" },
3088 { 45, "f13" },
3089 { 46, "f14" },
3090 { 47, "f15" },
3091 { 48, "f16" },
3092 { 49, "f17" },
3093 { 50, "f18" },
3094 { 51, "f19" },
3095 { 52, "f20" },
3096 { 53, "f21" },
3097 { 54, "f22" },
3098 { 55, "f23" },
3099 { 56, "f24" },
3100 { 57, "f25" },
3101 { 58, "f26" },
3102 { 59, "f27" },
3103 { 60, "f28" },
3104 { 61, "f29" },
3105 { 62, "f30" },
3106 { 63, "f31" },
3107 { 64, "pc" },
3108 { 65, "cause" },
3109 { 66, "badvaddr" },
3110 { 67, "mmhi" },
3111 { 68, "mmlo" },
3112 { 69, "fpcsr" },
3113 { 70, "fpeir" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003114# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003115# ifdef CRISV10
3116 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3117 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3118 { 4*PT_R13, "4*PT_R13" },
3119 { 4*PT_R12, "4*PT_R12" },
3120 { 4*PT_R11, "4*PT_R11" },
3121 { 4*PT_R10, "4*PT_R10" },
3122 { 4*PT_R9, "4*PT_R9" },
3123 { 4*PT_R8, "4*PT_R8" },
3124 { 4*PT_R7, "4*PT_R7" },
3125 { 4*PT_R6, "4*PT_R6" },
3126 { 4*PT_R5, "4*PT_R5" },
3127 { 4*PT_R4, "4*PT_R4" },
3128 { 4*PT_R3, "4*PT_R3" },
3129 { 4*PT_R2, "4*PT_R2" },
3130 { 4*PT_R1, "4*PT_R1" },
3131 { 4*PT_R0, "4*PT_R0" },
3132 { 4*PT_MOF, "4*PT_MOF" },
3133 { 4*PT_DCCR, "4*PT_DCCR" },
3134 { 4*PT_SRP, "4*PT_SRP" },
3135 { 4*PT_IRP, "4*PT_IRP" },
3136 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3137 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3138 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3139 { 4*PT_USP, "4*PT_USP" },
3140# endif
3141# ifdef CRISV32
3142 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3143 { 4*PT_R0, "4*PT_R0" },
3144 { 4*PT_R1, "4*PT_R1" },
3145 { 4*PT_R2, "4*PT_R2" },
3146 { 4*PT_R3, "4*PT_R3" },
3147 { 4*PT_R4, "4*PT_R4" },
3148 { 4*PT_R5, "4*PT_R5" },
3149 { 4*PT_R6, "4*PT_R6" },
3150 { 4*PT_R7, "4*PT_R7" },
3151 { 4*PT_R8, "4*PT_R8" },
3152 { 4*PT_R9, "4*PT_R9" },
3153 { 4*PT_R10, "4*PT_R10" },
3154 { 4*PT_R11, "4*PT_R11" },
3155 { 4*PT_R12, "4*PT_R12" },
3156 { 4*PT_R13, "4*PT_R13" },
3157 { 4*PT_ACR, "4*PT_ACR" },
3158 { 4*PT_SRS, "4*PT_SRS" },
3159 { 4*PT_MOF, "4*PT_MOF" },
3160 { 4*PT_SPC, "4*PT_SPC" },
3161 { 4*PT_CCS, "4*PT_CCS" },
3162 { 4*PT_SRP, "4*PT_SRP" },
3163 { 4*PT_ERP, "4*PT_ERP" },
3164 { 4*PT_EXS, "4*PT_EXS" },
3165 { 4*PT_EDA, "4*PT_EDA" },
3166 { 4*PT_USP, "4*PT_USP" },
3167 { 4*PT_PPC, "4*PT_PPC" },
3168 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3169 { 4*PT_BP+4, "4*PT_BP+4" },
3170 { 4*PT_BP+8, "4*PT_BP+8" },
3171 { 4*PT_BP+12, "4*PT_BP+12" },
3172 { 4*PT_BP+16, "4*PT_BP+16" },
3173 { 4*PT_BP+20, "4*PT_BP+20" },
3174 { 4*PT_BP+24, "4*PT_BP+24" },
3175 { 4*PT_BP+28, "4*PT_BP+28" },
3176 { 4*PT_BP+32, "4*PT_BP+32" },
3177 { 4*PT_BP+36, "4*PT_BP+36" },
3178 { 4*PT_BP+40, "4*PT_BP+40" },
3179 { 4*PT_BP+44, "4*PT_BP+44" },
3180 { 4*PT_BP+48, "4*PT_BP+48" },
3181 { 4*PT_BP+52, "4*PT_BP+52" },
3182 { 4*PT_BP+56, "4*PT_BP+56" },
3183# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003184
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003185# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3186 && !defined(ALPHA) && !defined(IA64) \
3187 && !defined(CRISV10) && !defined(CRISV32)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003188# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003189 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003190# endif
3191# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003192 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003193# endif
3194# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003195 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003196# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003197 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3198 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3199 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003200# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003201 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003202# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003203# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003204 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003205# endif
3206# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003207 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003208# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003209 { uoff(signal), "offsetof(struct user, signal)" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003210# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003211 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003212# endif
3213# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003214 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003215# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003216# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003217 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003218# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003219 { uoff(magic), "offsetof(struct user, magic)" },
3220 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003221# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003222 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003223# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003224# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003225
3226# endif /* LINUX */
3227
3228# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003229 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3230 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3231 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3232 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3233 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3234 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3235 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3236 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3237 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3238 { uoff(u_error), "offsetof(struct user, u_error)" },
3239 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3240 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3241 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3242 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3243 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3244 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3245 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3246 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3247 { uoff(u_code), "offsetof(struct user, u_code)" },
3248 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3249 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3250 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3251 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3252 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3253 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3254 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3255 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3256 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3257 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3258 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3259 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3260 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3261 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3262 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3263 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3264 { uoff(u_start), "offsetof(struct user, u_start)" },
3265 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3266 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3267 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3268 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3269 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3270 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3271 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3272 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3273 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003274# endif /* SUNOS4 */
3275# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003276 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003277# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003278 { 0, NULL },
3279};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003280# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003281
3282int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003283sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003284{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003285 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003286 long addr;
3287
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003288 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003289 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003290# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003291 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003292# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003293 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003294# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003295 );
3296 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003297 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003298# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003299 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3300 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3301 for (x = struct_user_offsets; x->str; x++) {
3302 if (x->val >= addr)
3303 break;
3304 }
3305 if (!x->str)
3306 tprintf("%#lx, ", addr);
3307 else if (x->val > addr && x != struct_user_offsets) {
3308 x--;
3309 tprintf("%s + %ld, ", x->str, addr - x->val);
3310 }
3311 else
3312 tprintf("%s, ", x->str);
3313 }
3314 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003315# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003316 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003317# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003318 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003319# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003320 case PTRACE_PEEKDATA:
3321 case PTRACE_PEEKTEXT:
3322 case PTRACE_PEEKUSER:
3323 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003324# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003325 case PTRACE_CONT:
3326 case PTRACE_SINGLESTEP:
3327 case PTRACE_SYSCALL:
3328 case PTRACE_DETACH:
3329 printsignal(tcp->u_arg[3]);
3330 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003331# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003332 case PTRACE_SETOPTIONS:
3333 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3334 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003335# endif
3336# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003337 case PTRACE_SETSIGINFO: {
3338 siginfo_t si;
3339 if (!tcp->u_arg[3])
3340 tprintf("NULL");
3341 else if (syserror(tcp))
3342 tprintf("%#lx", tcp->u_arg[3]);
3343 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3344 tprintf("{???}");
3345 else
3346 printsiginfo(&si, verbose(tcp));
3347 break;
3348 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003349# endif
3350# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003351 case PTRACE_GETSIGINFO:
3352 /* Don't print anything, do it at syscall return. */
3353 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003354# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003355 default:
3356 tprintf("%#lx", tcp->u_arg[3]);
3357 break;
3358 }
3359 } else {
3360 switch (tcp->u_arg[0]) {
3361 case PTRACE_PEEKDATA:
3362 case PTRACE_PEEKTEXT:
3363 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003364# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003365 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003366# else
Roland McGratheb285352003-01-14 09:59:00 +00003367 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003368 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003369# endif
3370# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003371 case PTRACE_GETSIGINFO: {
3372 siginfo_t si;
3373 if (!tcp->u_arg[3])
3374 tprintf("NULL");
3375 else if (syserror(tcp))
3376 tprintf("%#lx", tcp->u_arg[3]);
3377 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3378 tprintf("{???}");
3379 else
3380 printsiginfo(&si, verbose(tcp));
3381 break;
3382 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003383# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003384 }
3385 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003386# endif /* LINUX */
3387# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003388 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3389 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3390 tprintf("%lu, ", tcp->u_arg[3]);
3391 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3392 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3393 tcp->u_arg[0] != PTRACE_READTEXT) {
3394 tprintf("%#lx", tcp->u_arg[3]);
3395 }
3396 } else {
3397 if (tcp->u_arg[0] == PTRACE_READDATA ||
3398 tcp->u_arg[0] == PTRACE_READTEXT) {
3399 tprintf("%lu, ", tcp->u_arg[3]);
3400 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3401 }
3402 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003403# endif /* SUNOS4 */
3404# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003405 tprintf("%lu", tcp->u_arg[3]);
3406 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003407# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003408 return 0;
3409}
3410
3411#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003412
3413#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003414# ifndef FUTEX_CMP_REQUEUE
3415# define FUTEX_CMP_REQUEUE 4
3416# endif
3417# ifndef FUTEX_WAKE_OP
3418# define FUTEX_WAKE_OP 5
3419# endif
3420# ifndef FUTEX_LOCK_PI
3421# define FUTEX_LOCK_PI 6
3422# define FUTEX_UNLOCK_PI 7
3423# define FUTEX_TRYLOCK_PI 8
3424# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003425# ifndef FUTEX_WAIT_BITSET
3426# define FUTEX_WAIT_BITSET 9
3427# endif
3428# ifndef FUTEX_WAKE_BITSET
3429# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003430# endif
3431# ifndef FUTEX_PRIVATE_FLAG
3432# define FUTEX_PRIVATE_FLAG 128
3433# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003434static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003435 { FUTEX_WAIT, "FUTEX_WAIT" },
3436 { FUTEX_WAKE, "FUTEX_WAKE" },
3437 { FUTEX_FD, "FUTEX_FD" },
3438 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3439 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3440 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3441 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3442 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3443 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003444 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3445 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Roland McGrath51942a92007-07-05 18:59:11 +00003446 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3447 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3448 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3449 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3450 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3451 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3452 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3453 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3454 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003455 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3456 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Roland McGrath51942a92007-07-05 18:59:11 +00003457 { 0, NULL }
3458};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003459# ifndef FUTEX_OP_SET
3460# define FUTEX_OP_SET 0
3461# define FUTEX_OP_ADD 1
3462# define FUTEX_OP_OR 2
3463# define FUTEX_OP_ANDN 3
3464# define FUTEX_OP_XOR 4
3465# define FUTEX_OP_CMP_EQ 0
3466# define FUTEX_OP_CMP_NE 1
3467# define FUTEX_OP_CMP_LT 2
3468# define FUTEX_OP_CMP_LE 3
3469# define FUTEX_OP_CMP_GT 4
3470# define FUTEX_OP_CMP_GE 5
3471# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003472static const struct xlat futexwakeops[] = {
3473 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3474 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3475 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3476 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3477 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3478 { 0, NULL }
3479};
3480static const struct xlat futexwakecmps[] = {
3481 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3482 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3483 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3484 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3485 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3486 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3487 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003488};
3489
3490int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003491sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003492{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003493 if (entering(tcp)) {
3494 long int cmd = tcp->u_arg[1] & 127;
3495 tprintf("%p, ", (void *) tcp->u_arg[0]);
3496 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3497 tprintf(", %ld", tcp->u_arg[2]);
3498 if (cmd == FUTEX_WAKE_BITSET)
3499 tprintf(", %lx", tcp->u_arg[5]);
3500 else if (cmd == FUTEX_WAIT) {
3501 tprintf(", ");
3502 printtv(tcp, tcp->u_arg[3]);
3503 } else if (cmd == FUTEX_WAIT_BITSET) {
3504 tprintf(", ");
3505 printtv(tcp, tcp->u_arg[3]);
3506 tprintf(", %lx", tcp->u_arg[5]);
3507 } else if (cmd == FUTEX_REQUEUE)
3508 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3509 else if (cmd == FUTEX_CMP_REQUEUE)
3510 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3511 else if (cmd == FUTEX_WAKE_OP) {
3512 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3513 if ((tcp->u_arg[5] >> 28) & 8)
3514 tprintf("FUTEX_OP_OPARG_SHIFT|");
3515 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3516 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3517 if ((tcp->u_arg[5] >> 24) & 8)
3518 tprintf("FUTEX_OP_OPARG_SHIFT|");
3519 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3520 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
3521 }
Roland McGrath51942a92007-07-05 18:59:11 +00003522 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003523 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003524}
3525
3526static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003527print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003528{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003529 int first = 1;
3530 tprintf(" {");
3531 while (len >= sizeof (unsigned long)) {
3532 unsigned long w;
3533 umove(tcp, list, &w);
3534 tprintf("%s %lx", first ? "" : ",", w);
3535 first = 0;
3536 len -= sizeof (unsigned long);
3537 list += sizeof(unsigned long);
3538 }
3539 tprintf(" }");
Roland McGrath5a223472002-12-15 23:58:26 +00003540}
3541
3542int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003543sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003544{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003545 if (entering(tcp)) {
3546 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3547 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3548 }
3549 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003550}
3551
3552int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003553sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003554{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003555 if (entering(tcp)) {
3556 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3557 } else {
3558 if (tcp->u_rval == -1)
3559 tprintf("%#lx", tcp->u_arg[2]);
3560 else
3561 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3562 }
3563 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003564}
Roland McGrath279d3782004-03-01 20:27:37 +00003565
Roland McGrathd9f816f2004-09-04 03:39:20 +00003566static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003567 { SCHED_OTHER, "SCHED_OTHER" },
3568 { SCHED_RR, "SCHED_RR" },
3569 { SCHED_FIFO, "SCHED_FIFO" },
3570 { 0, NULL }
3571};
3572
3573int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003574sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003575{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003576 if (entering(tcp)) {
3577 tprintf("%d", (int) tcp->u_arg[0]);
3578 } else if (! syserror(tcp)) {
3579 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3580 if (tcp->auxstr != NULL)
3581 return RVAL_STR;
3582 }
3583 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003584}
3585
3586int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003587sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003588{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003589 if (entering(tcp)) {
3590 struct sched_param p;
3591 tprintf("%d, ", (int) tcp->u_arg[0]);
3592 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3593 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3594 tprintf(", %#lx", tcp->u_arg[2]);
3595 else
3596 tprintf(", { %d }", p.__sched_priority);
3597 }
3598 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003599}
3600
3601int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003602sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003603{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003604 if (entering(tcp)) {
3605 tprintf("%d, ", (int) tcp->u_arg[0]);
3606 } else {
3607 struct sched_param p;
3608 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3609 tprintf("%#lx", tcp->u_arg[1]);
3610 else
3611 tprintf("{ %d }", p.__sched_priority);
3612 }
3613 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003614}
3615
3616int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003617sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003618{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003619 if (entering(tcp)) {
3620 struct sched_param p;
3621 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3622 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3623 else
3624 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3625 }
3626 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003627}
3628
3629int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003630sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003631{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003632 if (entering(tcp)) {
3633 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3634 }
3635 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003636}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003637
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003638# ifdef X86_64
3639# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003640
3641static const struct xlat archvals[] = {
3642 { ARCH_SET_GS, "ARCH_SET_GS" },
3643 { ARCH_SET_FS, "ARCH_SET_FS" },
3644 { ARCH_GET_FS, "ARCH_GET_FS" },
3645 { ARCH_GET_GS, "ARCH_GET_GS" },
3646 { 0, NULL },
3647};
3648
3649int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003650sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003651{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003652 if (entering(tcp)) {
3653 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3654 if (tcp->u_arg[0] == ARCH_SET_GS
3655 || tcp->u_arg[0] == ARCH_SET_FS
3656 ) {
3657 tprintf(", %#lx", tcp->u_arg[1]);
3658 }
3659 } else {
3660 if (tcp->u_arg[0] == ARCH_GET_GS
3661 || tcp->u_arg[0] == ARCH_GET_FS
3662 ) {
3663 long int v;
3664 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3665 tprintf(", [%#lx]", v);
3666 else
3667 tprintf(", %#lx", tcp->u_arg[1]);
3668 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003669 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003670 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003671}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003672# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003673
Roland McGrathdb8319f2007-08-02 01:37:55 +00003674
3675int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003676sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003677{
3678 if (exiting(tcp)) {
3679 unsigned u;
3680 if (tcp->u_arg[0] == 0)
3681 tprintf("NULL, ");
3682 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3683 tprintf("%#lx, ", tcp->u_arg[0]);
3684 else
3685 tprintf("[%u], ", u);
3686 if (tcp->u_arg[1] == 0)
3687 tprintf("NULL, ");
3688 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3689 tprintf("%#lx, ", tcp->u_arg[1]);
3690 else
3691 tprintf("[%u], ", u);
3692 tprintf("%#lx", tcp->u_arg[2]);
3693 }
3694 return 0;
3695}
3696
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003697#endif /* LINUX */