blob: 43876394a2a7ecb5c7f9e2f01e14871cf237c2c8 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Linux for s390 port by D.J. Barrow
8 * <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
Wichert Akkermanccef6372002-05-01 16:39:22 +00009 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
11
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000012 *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000013 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 */
39
40#include "defs.h"
41
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <sys/time.h>
45#include <sys/wait.h>
46#include <sys/resource.h>
47#include <sys/utsname.h>
48#include <sys/user.h>
49#include <sys/syscall.h>
50#include <signal.h>
51#ifdef SUNOS4
52#include <machine/reg.h>
53#endif /* SUNOS4 */
54
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000055#ifdef FREEBSD
56#include <sys/ptrace.h>
57#endif
58
Wichert Akkerman36915a11999-07-13 15:45:02 +000059#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000060# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000061#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000062# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000063#endif
64#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000065# define PTRACE_POKEUSR PTRACE_POKEUSER
66#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000067#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000068
Roland McGrath5bd7cf82003-01-24 04:31:18 +000069#ifdef HAVE_LINUX_PTRACE_H
70#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000071# ifdef HAVE_STRUCT_IA64_FPREG
72# define ia64_fpreg XXX_ia64_fpreg
73# endif
74# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
75# define pt_all_user_regs XXX_pt_all_user_regs
76# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000077#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000078# undef ia64_fpreg
79# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000080#endif
81
Roland McGrath6d1a65c2004-07-12 07:44:08 +000082#if defined (LINUX) && defined (SPARC64)
83# define r_pc r_tpc
84# undef PTRACE_GETREGS
85# define PTRACE_GETREGS PTRACE_GETREGS64
86# undef PTRACE_SETREGS
87# define PTRACE_SETREGS PTRACE_SETREGS64
88#endif /* LINUX && SPARC64 */
89
Roland McGrath5a223472002-12-15 23:58:26 +000090#ifdef HAVE_LINUX_FUTEX_H
Dmitry V. Levine5e60852009-12-31 22:50:49 +000091# include <linux/futex.h>
Roland McGrath5a223472002-12-15 23:58:26 +000092#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +000093#ifdef LINUX
Roland McGrath5a223472002-12-15 23:58:26 +000094# ifndef FUTEX_WAIT
95# define FUTEX_WAIT 0
96# endif
97# ifndef FUTEX_WAKE
98# define FUTEX_WAKE 1
99# endif
100# ifndef FUTEX_FD
101# define FUTEX_FD 2
102# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000103# ifndef FUTEX_REQUEUE
104# define FUTEX_REQUEUE 3
105# endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000106#endif /* LINUX */
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000107
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000108#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000109#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000110#include <asm/posix_types.h>
111#undef GETGROUPS_T
112#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000113#undef GETGROUPS32_T
114#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000115#endif /* LINUX */
116
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000117#if defined(LINUX) && defined(IA64)
118# include <asm/ptrace_offsets.h>
119# include <asm/rse.h>
120#endif
121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef HAVE_PRCTL
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000123# include <sys/prctl.h>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000124
Roland McGrathd9f816f2004-09-04 03:39:20 +0000125static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000126#ifdef PR_MAXPROCS
127 { PR_MAXPROCS, "PR_MAXPROCS" },
128#endif
129#ifdef PR_ISBLOCKED
130 { PR_ISBLOCKED, "PR_ISBLOCKED" },
131#endif
132#ifdef PR_SETSTACKSIZE
133 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
134#endif
135#ifdef PR_GETSTACKSIZE
136 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
137#endif
138#ifdef PR_MAXPPROCS
139 { PR_MAXPPROCS, "PR_MAXPPROCS" },
140#endif
141#ifdef PR_UNBLKONEXEC
142 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
143#endif
144#ifdef PR_ATOMICSIM
145 { PR_ATOMICSIM, "PR_ATOMICSIM" },
146#endif
147#ifdef PR_SETEXITSIG
148 { PR_SETEXITSIG, "PR_SETEXITSIG" },
149#endif
150#ifdef PR_RESIDENT
151 { PR_RESIDENT, "PR_RESIDENT" },
152#endif
153#ifdef PR_ATTACHADDR
154 { PR_ATTACHADDR, "PR_ATTACHADDR" },
155#endif
156#ifdef PR_DETACHADDR
157 { PR_DETACHADDR, "PR_DETACHADDR" },
158#endif
159#ifdef PR_TERMCHILD
160 { PR_TERMCHILD, "PR_TERMCHILD" },
161#endif
162#ifdef PR_GETSHMASK
163 { PR_GETSHMASK, "PR_GETSHMASK" },
164#endif
165#ifdef PR_GETNSHARE
166 { PR_GETNSHARE, "PR_GETNSHARE" },
167#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000168#ifdef PR_COREPID
169 { PR_COREPID, "PR_COREPID" },
170#endif
171#ifdef PR_ATTACHADDRPERM
172 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
173#endif
174#ifdef PR_PTHREADEXIT
175 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
176#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000177#ifdef PR_SET_PDEATHSIG
178 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
179#endif
180#ifdef PR_GET_PDEATHSIG
181 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
182#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000183#ifdef PR_GET_DUMPABLE
184 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
185#endif
186#ifdef PR_SET_DUMPABLE
187 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
188#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000189#ifdef PR_GET_UNALIGN
190 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
191#endif
192#ifdef PR_SET_UNALIGN
193 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
194#endif
195#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000196 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000197#endif
198#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000199 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000200#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000201#ifdef PR_GET_FPEMU
202 { PR_GET_FPEMU, "PR_GET_FPEMU" },
203#endif
204#ifdef PR_SET_FPEMU
205 { PR_SET_FPEMU, "PR_SET_FPEMU" },
206#endif
207#ifdef PR_GET_FPEXC
208 { PR_GET_FPEXC, "PR_GET_FPEXC" },
209#endif
210#ifdef PR_SET_FPEXC
211 { PR_SET_FPEXC, "PR_SET_FPEXC" },
212#endif
213#ifdef PR_GET_TIMING
214 { PR_GET_TIMING, "PR_GET_TIMING" },
215#endif
216#ifdef PR_SET_TIMING
217 { PR_SET_TIMING, "PR_SET_TIMING" },
218#endif
219#ifdef PR_SET_NAME
220 { PR_SET_NAME, "PR_SET_NAME" },
221#endif
222#ifdef PR_GET_NAME
223 { PR_GET_NAME, "PR_GET_NAME" },
224#endif
225#ifdef PR_GET_ENDIAN
226 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
227#endif
228#ifdef PR_SET_ENDIAN
229 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
230#endif
231#ifdef PR_GET_SECCOMP
232 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
233#endif
234#ifdef PR_SET_SECCOMP
235 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
236#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000237#ifdef PR_GET_TSC
238 { PR_GET_TSC, "PR_GET_TSC" },
239#endif
240#ifdef PR_SET_TSC
241 { PR_SET_TSC, "PR_SET_TSC" },
242#endif
243#ifdef PR_GET_SECUREBITS
244 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
245#endif
246#ifdef PR_SET_SECUREBITS
247 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
248#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000249 { 0, NULL },
250};
251
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000252
Roland McGratha4d48532005-06-08 20:45:28 +0000253static const char *
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000254unalignctl_string (unsigned int ctl)
255{
256 static char buf[16];
257
258 switch (ctl) {
259#ifdef PR_UNALIGN_NOPRINT
260 case PR_UNALIGN_NOPRINT:
261 return "NOPRINT";
262#endif
263#ifdef PR_UNALIGN_SIGBUS
264 case PR_UNALIGN_SIGBUS:
265 return "SIGBUS";
266#endif
267 default:
268 break;
269 }
270 sprintf(buf, "%x", ctl);
271 return buf;
272}
273
274
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000275int
276sys_prctl(tcp)
277struct tcb *tcp;
278{
279 int i;
280
281 if (entering(tcp)) {
282 printxval(prctl_options, tcp->u_arg[0], "PR_???");
283 switch (tcp->u_arg[0]) {
284#ifdef PR_GETNSHARE
285 case PR_GETNSHARE:
286 break;
287#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000288#ifdef PR_SET_PDEATHSIG
289 case PR_SET_PDEATHSIG:
290 tprintf(", %lu", tcp->u_arg[1]);
291 break;
292#endif
293#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000294 case PR_GET_PDEATHSIG:
295 break;
296#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000297#ifdef PR_SET_DUMPABLE
298 case PR_SET_DUMPABLE:
299 tprintf(", %lu", tcp->u_arg[1]);
300 break;
301#endif
302#ifdef PR_GET_DUMPABLE
303 case PR_GET_DUMPABLE:
304 break;
305#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000306#ifdef PR_SET_UNALIGN
307 case PR_SET_UNALIGN:
308 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
309 break;
310#endif
311#ifdef PR_GET_UNALIGN
312 case PR_GET_UNALIGN:
313 tprintf(", %#lx", tcp->u_arg[1]);
314 break;
315#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000316#ifdef PR_SET_KEEPCAPS
317 case PR_SET_KEEPCAPS:
318 tprintf(", %lu", tcp->u_arg[1]);
319 break;
320#endif
321#ifdef PR_GET_KEEPCAPS
322 case PR_GET_KEEPCAPS:
323 break;
324#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000325 default:
326 for (i = 1; i < tcp->u_nargs; i++)
327 tprintf(", %#lx", tcp->u_arg[i]);
328 break;
329 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000330 } else {
331 switch (tcp->u_arg[0]) {
332#ifdef PR_GET_PDEATHSIG
333 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000334 if (umove(tcp, tcp->u_arg[1], &i) < 0)
335 tprintf(", %#lx", tcp->u_arg[1]);
336 else
337 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000338 break;
339#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000340#ifdef PR_GET_DUMPABLE
341 case PR_GET_DUMPABLE:
342 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000343#endif
344#ifdef PR_GET_UNALIGN
345 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000346 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
347 break;
348 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000349 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000350#endif
351#ifdef PR_GET_KEEPCAPS
352 case PR_GET_KEEPCAPS:
353 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000354#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000355 default:
356 break;
357 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000358 }
359 return 0;
360}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000361#endif /* HAVE_PRCTL */
362
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000363#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000364int
365sys_gethostid(tcp)
366struct tcb *tcp;
367{
368 if (exiting(tcp))
369 return RVAL_HEX;
370 return 0;
371}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000372#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000373
374int
375sys_sethostname(tcp)
376struct tcb *tcp;
377{
378 if (entering(tcp)) {
379 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
380 tprintf(", %lu", tcp->u_arg[1]);
381 }
382 return 0;
383}
384
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000385#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000386int
387sys_gethostname(tcp)
388struct tcb *tcp;
389{
390 if (exiting(tcp)) {
391 if (syserror(tcp))
392 tprintf("%#lx", tcp->u_arg[0]);
393 else
394 printpath(tcp, tcp->u_arg[0]);
395 tprintf(", %lu", tcp->u_arg[1]);
396 }
397 return 0;
398}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000399#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000400
401int
402sys_setdomainname(tcp)
403struct tcb *tcp;
404{
405 if (entering(tcp)) {
406 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
407 tprintf(", %lu", tcp->u_arg[1]);
408 }
409 return 0;
410}
411
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000412#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000413
414int
415sys_getdomainname(tcp)
416struct tcb *tcp;
417{
418 if (exiting(tcp)) {
419 if (syserror(tcp))
420 tprintf("%#lx", tcp->u_arg[0]);
421 else
422 printpath(tcp, tcp->u_arg[0]);
423 tprintf(", %lu", tcp->u_arg[1]);
424 }
425 return 0;
426}
427#endif /* !LINUX */
428
429int
430sys_exit(tcp)
431struct tcb *tcp;
432{
433 if (exiting(tcp)) {
434 fprintf(stderr, "_exit returned!\n");
435 return -1;
436 }
437 /* special case: we stop tracing this process, finish line now */
438 tprintf("%ld) ", tcp->u_arg[0]);
439 tabto(acolumn);
440 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000441 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000442 return 0;
443}
444
445int
446internal_exit(tcp)
447struct tcb *tcp;
448{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000449 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000450 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000451#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000452# ifdef IA64
453 if (ia32) {
454 if (tcp->scno == 252)
455 tcp->flags |= TCB_GROUP_EXITING;
456 } else
457# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000458 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000459 tcp->flags |= TCB_GROUP_EXITING;
460#endif
461 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000462 return 0;
463}
464
Roland McGratheb9e2e82009-06-02 16:49:22 -0700465/* TCP is creating a child we want to follow.
466 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
467 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
468static void
469fork_tcb(struct tcb *tcp)
470{
471 if (nprocs == tcbtabsize)
472 expand_tcbtab();
473
474 tcp->flags |= TCB_FOLLOWFORK;
475}
476
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000477#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000478
479int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000480sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000481{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000482 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000483 if (getrval2(tcp)) {
484 tcp->auxstr = "child process";
485 return RVAL_UDECIMAL | RVAL_STR;
486 }
487 }
488 return 0;
489}
490
John Hughes4e36a812001-04-18 15:11:51 +0000491#if UNIXWARE > 2
492
493int
494sys_rfork(tcp)
495struct tcb *tcp;
496{
497 if (entering(tcp)) {
498 tprintf ("%ld", tcp->u_arg[0]);
499 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000500 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000501 if (getrval2(tcp)) {
502 tcp->auxstr = "child process";
503 return RVAL_UDECIMAL | RVAL_STR;
504 }
505 }
506 return 0;
507}
508
509#endif
510
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000511int
512internal_fork(tcp)
513struct tcb *tcp;
514{
515 struct tcb *tcpchild;
516
517 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000518#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000519 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000520 return 0;
521#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000522 if (getrval2(tcp))
523 return 0;
524 if (!followfork)
525 return 0;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700526 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000527 if (syserror(tcp))
528 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000529 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000530 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000531 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000532 }
533 return 0;
534}
535
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000536#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000537
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000538#ifdef LINUX
539
540/* defines copied from linux/sched.h since we can't include that
541 * ourselves (it conflicts with *lots* of libc includes)
542 */
543#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
544#define CLONE_VM 0x00000100 /* set if VM shared between processes */
545#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
546#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
547#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000548#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000549#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
550#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
551#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000552#define CLONE_THREAD 0x00010000 /* Same thread group? */
553#define CLONE_NEWNS 0x00020000 /* New namespace group? */
554#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
555#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
556#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
557#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
558#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
559#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
560#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000561
Roland McGrathd9f816f2004-09-04 03:39:20 +0000562static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000563 { CLONE_VM, "CLONE_VM" },
564 { CLONE_FS, "CLONE_FS" },
565 { CLONE_FILES, "CLONE_FILES" },
566 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000567 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000568 { CLONE_PTRACE, "CLONE_PTRACE" },
569 { CLONE_VFORK, "CLONE_VFORK" },
570 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000571 { CLONE_THREAD, "CLONE_THREAD" },
572 { CLONE_NEWNS, "CLONE_NEWNS" },
573 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
574 { CLONE_SETTLS, "CLONE_SETTLS" },
575 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
576 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
577 { CLONE_DETACHED, "CLONE_DETACHED" },
578 { CLONE_UNTRACED, "CLONE_UNTRACED" },
579 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000580 { 0, NULL },
581};
582
Roland McGrath909875b2002-12-22 03:34:36 +0000583# ifdef I386
584# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000585# ifdef HAVE_STRUCT_USER_DESC
586# define modify_ldt_ldt_s user_desc
587# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000588extern void print_ldt_entry();
589# endif
590
Roland McGrath9677b3a2003-03-12 09:54:36 +0000591# if defined IA64
592# define ARG_FLAGS 0
593# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000594# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
595# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
596# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
597# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000598# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000599# define ARG_STACK 0
600# define ARG_FLAGS 1
601# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000602# define ARG_CTID 3
603# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000604# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000605# define ARG_FLAGS 0
606# define ARG_STACK 1
607# define ARG_PTID 2
608# define ARG_CTID 3
609# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000610# else
611# define ARG_FLAGS 0
612# define ARG_STACK 1
613# define ARG_PTID 2
614# define ARG_TLS 3
615# define ARG_CTID 4
616# endif
617
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000618int
619sys_clone(tcp)
620struct tcb *tcp;
621{
622 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000623 unsigned long flags = tcp->u_arg[ARG_FLAGS];
624 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
625# ifdef ARG_STACKSIZE
626 if (ARG_STACKSIZE != -1)
627 tprintf("stack_size=%#lx, ",
628 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000629# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000630 tprintf("flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000631 printflags(clone_flags, flags &~ CSIGNAL, NULL);
Roland McGrath984154d2003-05-23 01:08:42 +0000632 if ((flags & CSIGNAL) != 0)
633 tprintf("|%s", signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000634 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000635 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000636 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000637 if (flags & CLONE_PARENT_SETTID)
638 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000639 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000640# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000641 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000642 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000643 tprintf(", {entry_number:%d, ",
644 copy.entry_number);
645 if (!verbose(tcp))
646 tprintf("...}");
647 else
648 print_ldt_entry(&copy);
649 }
650 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000651# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000652 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000653 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000654 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
655 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000656 }
657 return 0;
658}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000659
660int
661sys_unshare(struct tcb *tcp)
662{
663 if (entering(tcp))
664 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
665 return 0;
666}
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000667#endif /* LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000668
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000669int
670sys_fork(tcp)
671struct tcb *tcp;
672{
673 if (exiting(tcp))
674 return RVAL_UDECIMAL;
675 return 0;
676}
677
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000678int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000679change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000680{
Dmitry V. Levine5e60852009-12-31 22:50:49 +0000681#ifdef LINUX
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000682#if defined(I386)
683 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000684 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000685 return -1;
686 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000687#elif defined(X86_64)
688 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000689 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000690 return -1;
691 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000692#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000693 if (ptrace(PTRACE_POKEUSER, tcp->pid,
694 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000695 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000696 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000697#elif defined(S390) || defined(S390X)
698 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
699 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000700 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701 return 0;
702#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000703 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000704 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000705 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000706#elif defined(SPARC) || defined(SPARC64)
Mike Frysinger8566c502009-10-12 11:05:14 -0400707 struct pt_regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000708 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
709 return -1;
Mike Frysinger8566c502009-10-12 11:05:14 -0400710 regs.u_regs[U_REG_G1] = new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000711 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000712 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000713 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000714#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000715 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000716 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000717 return 0;
718#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000719 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000720 return -1;
721 return 0;
722#elif defined(AVR32)
723 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
724 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000725 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000726#elif defined(BFIN)
727 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
728 return -1;
729 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000730#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000731 if (ia32) {
732 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000733 case 2:
734 break; /* x86 SYS_fork */
735 case SYS_clone:
736 new = 120;
737 break;
738 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000739 fprintf(stderr, "%s: unexpected syscall %d\n",
740 __FUNCTION__, new);
741 return -1;
742 }
743 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
744 return -1;
745 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000746 return -1;
747 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000748#elif defined(HPPA)
749 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000750 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000751 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000752#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000753 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
754 return -1;
755 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000756#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000757 /* Top half of reg encodes the no. of args n as 0x1n.
758 Assume 0 args as kernel never actually checks... */
759 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
760 0x100000 | new) < 0)
761 return -1;
762 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000763#elif defined(CRISV10) || defined(CRISV32)
764 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
765 return -1;
766 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000767#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000768 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000769# ifndef PTRACE_SET_SYSCALL
770# define PTRACE_SET_SYSCALL 23
771# endif
772
Dmitry V. Levin76740062009-09-18 11:30:14 +0000773 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000774 return -1;
775
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000776 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000777#else
778#warning Do not know how to handle change_syscall for this architecture
779#endif /* architecture */
780#endif /* LINUX */
781 return -1;
782}
783
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000784#ifdef LINUX
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000785int
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000786internal_fork(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000787{
788 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700789 if (!followfork)
790 return 0;
791 fork_tcb(tcp);
792 if (setbpt(tcp) < 0)
793 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000794 } else {
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000795 struct tcb *tcpchild;
796 int pid;
797 int bpt;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700798
799 if (!(tcp->flags & TCB_FOLLOWFORK))
800 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000801
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000802 bpt = tcp->flags & TCB_BPTSET;
803
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000804 if (syserror(tcp)) {
805 if (bpt)
806 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000807 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000808 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000809
810 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000811
812#ifdef CLONE_PTRACE /* See new setbpt code. */
813 tcpchild = pid2tcb(pid);
814 if (tcpchild != NULL) {
815 /* The child already reported its startup trap
816 before the parent reported its syscall return. */
817 if ((tcpchild->flags
818 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
819 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
820 fprintf(stderr, "\
821[preattached child %d of %d in weird state!]\n",
822 pid, tcp->pid);
823 }
824 else
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000825#endif /* CLONE_PTRACE */
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000826 {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700827 fork_tcb(tcp);
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000828 tcpchild = alloctcb(pid);
829 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000830
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000831#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000832 /* Attach to the new child */
833 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000834 if (bpt)
835 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000836 perror("PTRACE_ATTACH");
837 fprintf(stderr, "Too late?\n");
838 droptcb(tcpchild);
839 return 0;
840 }
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000841#endif /* !CLONE_PTRACE */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000842
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000843 if (bpt)
844 clearbpt(tcp);
845
Ulrich Drepper90512f01999-12-24 07:22:25 +0000846 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000847 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000848 if (bpt) {
849 tcpchild->flags |= TCB_BPTSET;
850 tcpchild->baddr = tcp->baddr;
851 memcpy(tcpchild->inst, tcp->inst,
852 sizeof tcpchild->inst);
853 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000854 tcpchild->parent = tcp;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000855 tcp->nchildren++;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000856 if (tcpchild->flags & TCB_SUSPENDED) {
857 /* The child was born suspended, due to our having
858 forced CLONE_PTRACE. */
859 if (bpt)
860 clearbpt(tcpchild);
861
862 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000863 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000864 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000865
866 if (!qflag)
867 fprintf(stderr, "\
868Process %u resumed (parent %d ready)\n",
869 pid, tcp->pid);
870 }
871 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000872 if (!qflag)
873 fprintf(stderr, "Process %d attached\n", pid);
874 }
875
876#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000877 {
878 /*
879 * Save the flags used in this call,
880 * in case we point TCP to our parent below.
881 */
882 int call_flags = tcp->u_arg[ARG_FLAGS];
883 if ((tcp->flags & TCB_CLONE_THREAD) &&
884 tcp->parent != NULL) {
885 /* The parent in this clone is itself a
886 thread belonging to another process.
887 There is no meaning to the parentage
888 relationship of the new child with the
889 thread, only with the process. We
890 associate the new thread with our
891 parent. Since this is done for every
892 new thread, there will never be a
893 TCB_CLONE_THREAD process that has
894 children. */
895 --tcp->nchildren;
896 tcp = tcp->parent;
897 tcpchild->parent = tcp;
898 ++tcp->nchildren;
899 }
900 if (call_flags & CLONE_THREAD) {
901 tcpchild->flags |= TCB_CLONE_THREAD;
902 ++tcp->nclone_threads;
903 }
904 if (call_flags & CLONE_DETACHED) {
905 tcpchild->flags |= TCB_CLONE_DETACHED;
906 ++tcp->nclone_detached;
907 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000908 }
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000909#endif /* TCB_CLONE_THREAD */
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000910 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000911 return 0;
912}
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000913
914#else /* !LINUX */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000915
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000916int
917internal_fork(tcp)
918struct tcb *tcp;
919{
920 struct tcb *tcpchild;
921 int pid;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700922 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000923
924#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000925 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000926 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +0000927 if (change_syscall(tcp, SYS_fork) < 0)
Roland McGratheb9e2e82009-06-02 16:49:22 -0700928 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000929 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000930#endif
931 if (entering(tcp)) {
Roland McGratheb9e2e82009-06-02 16:49:22 -0700932 if (!followfork || dont_follow)
933 return 0;
934 fork_tcb(tcp);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000935 if (setbpt(tcp) < 0)
936 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000937 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000938 else {
939 int bpt = tcp->flags & TCB_BPTSET;
940
Roland McGratheb9e2e82009-06-02 16:49:22 -0700941 if (!(tcp->flags & TCB_FOLLOWFORK))
942 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000943 if (bpt)
944 clearbpt(tcp);
945
946 if (syserror(tcp))
947 return 0;
948
949 pid = tcp->u_rval;
Roland McGratheb9e2e82009-06-02 16:49:22 -0700950 fork_tcb(tcp);
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000951 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000952#ifdef SUNOS4
953#ifdef oldway
954 /* The child must have run before it can be attached. */
955 {
956 struct timeval tv;
957 tv.tv_sec = 0;
958 tv.tv_usec = 10000;
959 select(0, NULL, NULL, NULL, &tv);
960 }
961 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
962 perror("PTRACE_ATTACH");
963 fprintf(stderr, "Too late?\n");
964 droptcb(tcpchild);
965 return 0;
966 }
967#else /* !oldway */
968 /* Try to catch the new process as soon as possible. */
969 {
970 int i;
971 for (i = 0; i < 1024; i++)
972 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
973 break;
974 if (i == 1024) {
975 perror("PTRACE_ATTACH");
976 fprintf(stderr, "Too late?\n");
977 droptcb(tcpchild);
978 return 0;
979 }
980 }
981#endif /* !oldway */
982#endif /* SUNOS4 */
983 tcpchild->flags |= TCB_ATTACHED;
984 /* Child has BPT too, must be removed on first occasion */
985 if (bpt) {
986 tcpchild->flags |= TCB_BPTSET;
987 tcpchild->baddr = tcp->baddr;
988 memcpy(tcpchild->inst, tcp->inst,
989 sizeof tcpchild->inst);
990 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000991 tcpchild->parent = tcp;
992 tcp->nchildren++;
993 if (!qflag)
994 fprintf(stderr, "Process %d attached\n", pid);
995 }
996 return 0;
997}
998
Dmitry V. Levin257e1572009-12-26 17:55:24 +0000999#endif /* !LINUX */
1000
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001001#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001002
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001003#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001004
1005int
1006sys_vfork(tcp)
1007struct tcb *tcp;
1008{
1009 if (exiting(tcp))
1010 return RVAL_UDECIMAL;
1011 return 0;
1012}
1013
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001014#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001015
1016#ifndef LINUX
1017
1018static char idstr[16];
1019
1020int
1021sys_getpid(tcp)
1022struct tcb *tcp;
1023{
1024 if (exiting(tcp)) {
1025 sprintf(idstr, "ppid %lu", getrval2(tcp));
1026 tcp->auxstr = idstr;
1027 return RVAL_STR;
1028 }
1029 return 0;
1030}
1031
1032int
1033sys_getuid(tcp)
1034struct tcb *tcp;
1035{
1036 if (exiting(tcp)) {
1037 sprintf(idstr, "euid %lu", getrval2(tcp));
1038 tcp->auxstr = idstr;
1039 return RVAL_STR;
1040 }
1041 return 0;
1042}
1043
1044int
1045sys_getgid(tcp)
1046struct tcb *tcp;
1047{
1048 if (exiting(tcp)) {
1049 sprintf(idstr, "egid %lu", getrval2(tcp));
1050 tcp->auxstr = idstr;
1051 return RVAL_STR;
1052 }
1053 return 0;
1054}
1055
1056#endif /* !LINUX */
1057
1058#ifdef LINUX
1059
1060int
1061sys_setuid(tcp)
1062struct tcb *tcp;
1063{
1064 if (entering(tcp)) {
1065 tprintf("%u", (uid_t) tcp->u_arg[0]);
1066 }
1067 return 0;
1068}
1069
1070int
1071sys_setgid(tcp)
1072struct tcb *tcp;
1073{
1074 if (entering(tcp)) {
1075 tprintf("%u", (gid_t) tcp->u_arg[0]);
1076 }
1077 return 0;
1078}
1079
1080int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001081sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001082{
1083 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001084 __kernel_uid_t uid;
1085 if (syserror(tcp))
1086 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1087 tcp->u_arg[1], tcp->u_arg[2]);
1088 else {
1089 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1090 tprintf("%#lx, ", tcp->u_arg[0]);
1091 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001092 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001093 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1094 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001095 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001096 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001097 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1098 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001099 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001100 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001101 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001102 }
1103 return 0;
1104}
1105
1106int
1107sys_getresgid(tcp)
1108struct tcb *tcp;
1109{
1110 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001111 __kernel_gid_t gid;
1112 if (syserror(tcp))
1113 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1114 tcp->u_arg[1], tcp->u_arg[2]);
1115 else {
1116 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1117 tprintf("%#lx, ", tcp->u_arg[0]);
1118 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001119 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001120 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1121 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001122 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001123 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001124 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1125 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001126 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001127 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001128 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001129 }
1130 return 0;
1131}
1132
1133#endif /* LINUX */
1134
1135int
1136sys_setreuid(tcp)
1137struct tcb *tcp;
1138{
1139 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001140 printuid("", tcp->u_arg[0]);
1141 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001142 }
1143 return 0;
1144}
1145
1146int
1147sys_setregid(tcp)
1148struct tcb *tcp;
1149{
1150 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001151 printuid("", tcp->u_arg[0]);
1152 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001153 }
1154 return 0;
1155}
1156
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001157#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001158int
1159sys_setresuid(tcp)
1160 struct tcb *tcp;
1161{
1162 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001163 printuid("", tcp->u_arg[0]);
1164 printuid(", ", tcp->u_arg[1]);
1165 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001166 }
1167 return 0;
1168}
1169int
1170sys_setresgid(tcp)
1171 struct tcb *tcp;
1172{
1173 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001174 printuid("", tcp->u_arg[0]);
1175 printuid(", ", tcp->u_arg[1]);
1176 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001177 }
1178 return 0;
1179}
1180
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001181#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001182
1183int
1184sys_setgroups(tcp)
1185struct tcb *tcp;
1186{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001187 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001188 unsigned long len, size, start, cur, end, abbrev_end;
1189 GETGROUPS_T gid;
1190 int failed = 0;
1191
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001192 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001193 tprintf("%lu, ", len);
1194 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001195 tprintf("[]");
1196 return 0;
1197 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001198 start = tcp->u_arg[1];
1199 if (start == 0) {
1200 tprintf("NULL");
1201 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001202 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001203 size = len * sizeof(gid);
1204 end = start + size;
1205 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1206 tprintf("%#lx", start);
1207 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001208 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001209 if (abbrev(tcp)) {
1210 abbrev_end = start + max_strlen * sizeof(gid);
1211 if (abbrev_end < start)
1212 abbrev_end = end;
1213 } else {
1214 abbrev_end = end;
1215 }
1216 tprintf("[");
1217 for (cur = start; cur < end; cur += sizeof(gid)) {
1218 if (cur > start)
1219 tprintf(", ");
1220 if (cur >= abbrev_end) {
1221 tprintf("...");
1222 break;
1223 }
1224 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1225 tprintf("?");
1226 failed = 1;
1227 break;
1228 }
1229 tprintf("%lu", (unsigned long) gid);
1230 }
1231 tprintf("]");
1232 if (failed)
1233 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001234 }
1235 return 0;
1236}
1237
1238int
1239sys_getgroups(tcp)
1240struct tcb *tcp;
1241{
Roland McGrathaa524c82005-06-01 19:22:06 +00001242 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001243
1244 if (entering(tcp)) {
1245 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001246 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001247 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001248 unsigned long size, start, cur, end, abbrev_end;
1249 GETGROUPS_T gid;
1250 int failed = 0;
1251
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001252 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001253 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001254 tprintf("[]");
1255 return 0;
1256 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001257 start = tcp->u_arg[1];
1258 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001259 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001260 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001261 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001262 if (tcp->u_arg[0] == 0) {
1263 tprintf("%#lx", start);
1264 return 0;
1265 }
1266 size = len * sizeof(gid);
1267 end = start + size;
1268 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1269 size / sizeof(gid) != len || end < start) {
1270 tprintf("%#lx", start);
1271 return 0;
1272 }
1273 if (abbrev(tcp)) {
1274 abbrev_end = start + max_strlen * sizeof(gid);
1275 if (abbrev_end < start)
1276 abbrev_end = end;
1277 } else {
1278 abbrev_end = end;
1279 }
1280 tprintf("[");
1281 for (cur = start; cur < end; cur += sizeof(gid)) {
1282 if (cur > start)
1283 tprintf(", ");
1284 if (cur >= abbrev_end) {
1285 tprintf("...");
1286 break;
1287 }
1288 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1289 tprintf("?");
1290 failed = 1;
1291 break;
1292 }
1293 tprintf("%lu", (unsigned long) gid);
1294 }
1295 tprintf("]");
1296 if (failed)
1297 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001298 }
1299 return 0;
1300}
1301
Roland McGrath83bd47a2003-11-13 22:32:26 +00001302#ifdef LINUX
1303int
1304sys_setgroups32(tcp)
1305struct tcb *tcp;
1306{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001307 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001308 unsigned long len, size, start, cur, end, abbrev_end;
1309 GETGROUPS32_T gid;
1310 int failed = 0;
1311
Roland McGrath83bd47a2003-11-13 22:32:26 +00001312 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001313 tprintf("%lu, ", len);
1314 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001315 tprintf("[]");
1316 return 0;
1317 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001318 start = tcp->u_arg[1];
1319 if (start == 0) {
1320 tprintf("NULL");
1321 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001322 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001323 size = len * sizeof(gid);
1324 end = start + size;
1325 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1326 tprintf("%#lx", start);
1327 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001328 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001329 if (abbrev(tcp)) {
1330 abbrev_end = start + max_strlen * sizeof(gid);
1331 if (abbrev_end < start)
1332 abbrev_end = end;
1333 } else {
1334 abbrev_end = end;
1335 }
1336 tprintf("[");
1337 for (cur = start; cur < end; cur += sizeof(gid)) {
1338 if (cur > start)
1339 tprintf(", ");
1340 if (cur >= abbrev_end) {
1341 tprintf("...");
1342 break;
1343 }
1344 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1345 tprintf("?");
1346 failed = 1;
1347 break;
1348 }
1349 tprintf("%lu", (unsigned long) gid);
1350 }
1351 tprintf("]");
1352 if (failed)
1353 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001354 }
1355 return 0;
1356}
1357
1358int
1359sys_getgroups32(tcp)
1360struct tcb *tcp;
1361{
Roland McGrathaa524c82005-06-01 19:22:06 +00001362 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001363
1364 if (entering(tcp)) {
1365 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001366 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001367 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001368 unsigned long size, start, cur, end, abbrev_end;
1369 GETGROUPS32_T gid;
1370 int failed = 0;
1371
Roland McGrath83bd47a2003-11-13 22:32:26 +00001372 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001373 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001374 tprintf("[]");
1375 return 0;
1376 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001377 start = tcp->u_arg[1];
1378 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001379 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001380 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001381 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001382 size = len * sizeof(gid);
1383 end = start + size;
1384 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1385 size / sizeof(gid) != len || end < start) {
1386 tprintf("%#lx", start);
1387 return 0;
1388 }
1389 if (abbrev(tcp)) {
1390 abbrev_end = start + max_strlen * sizeof(gid);
1391 if (abbrev_end < start)
1392 abbrev_end = end;
1393 } else {
1394 abbrev_end = end;
1395 }
1396 tprintf("[");
1397 for (cur = start; cur < end; cur += sizeof(gid)) {
1398 if (cur > start)
1399 tprintf(", ");
1400 if (cur >= abbrev_end) {
1401 tprintf("...");
1402 break;
1403 }
1404 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1405 tprintf("?");
1406 failed = 1;
1407 break;
1408 }
1409 tprintf("%lu", (unsigned long) gid);
1410 }
1411 tprintf("]");
1412 if (failed)
1413 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001414 }
1415 return 0;
1416}
1417#endif /* LINUX */
1418
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001419#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001420int
1421sys_setpgrp(tcp)
1422struct tcb *tcp;
1423{
1424 if (entering(tcp)) {
1425#ifndef SVR4
1426 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1427#endif /* !SVR4 */
1428 }
1429 return 0;
1430}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001431#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001432
1433int
1434sys_getpgrp(tcp)
1435struct tcb *tcp;
1436{
1437 if (entering(tcp)) {
1438#ifndef SVR4
1439 tprintf("%lu", tcp->u_arg[0]);
1440#endif /* !SVR4 */
1441 }
1442 return 0;
1443}
1444
1445int
1446sys_getsid(tcp)
1447struct tcb *tcp;
1448{
1449 if (entering(tcp)) {
1450 tprintf("%lu", tcp->u_arg[0]);
1451 }
1452 return 0;
1453}
1454
1455int
1456sys_setsid(tcp)
1457struct tcb *tcp;
1458{
1459 return 0;
1460}
1461
1462int
1463sys_getpgid(tcp)
1464struct tcb *tcp;
1465{
1466 if (entering(tcp)) {
1467 tprintf("%lu", tcp->u_arg[0]);
1468 }
1469 return 0;
1470}
1471
1472int
1473sys_setpgid(tcp)
1474struct tcb *tcp;
1475{
1476 if (entering(tcp)) {
1477 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1478 }
1479 return 0;
1480}
1481
John Hughesc61eb3d2002-05-17 11:37:50 +00001482#if UNIXWARE >= 2
1483
1484#include <sys/privilege.h>
1485
1486
Roland McGrathd9f816f2004-09-04 03:39:20 +00001487static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001488 { SETPRV, "SETPRV" },
1489 { CLRPRV, "CLRPRV" },
1490 { PUTPRV, "PUTPRV" },
1491 { GETPRV, "GETPRV" },
1492 { CNTPRV, "CNTPRV" },
1493 { 0, NULL },
1494};
1495
1496
Roland McGrathd9f816f2004-09-04 03:39:20 +00001497static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001498 { P_OWNER, "P_OWNER" },
1499 { P_AUDIT, "P_AUDIT" },
1500 { P_COMPAT, "P_COMPAT" },
1501 { P_DACREAD, "P_DACREAD" },
1502 { P_DACWRITE, "P_DACWRITE" },
1503 { P_DEV, "P_DEV" },
1504 { P_FILESYS, "P_FILESYS" },
1505 { P_MACREAD, "P_MACREAD" },
1506 { P_MACWRITE, "P_MACWRITE" },
1507 { P_MOUNT, "P_MOUNT" },
1508 { P_MULTIDIR, "P_MULTIDIR" },
1509 { P_SETPLEVEL, "P_SETPLEVEL" },
1510 { P_SETSPRIV, "P_SETSPRIV" },
1511 { P_SETUID, "P_SETUID" },
1512 { P_SYSOPS, "P_SYSOPS" },
1513 { P_SETUPRIV, "P_SETUPRIV" },
1514 { P_DRIVER, "P_DRIVER" },
1515 { P_RTIME, "P_RTIME" },
1516 { P_MACUPGRADE, "P_MACUPGRADE" },
1517 { P_FSYSRANGE, "P_FSYSRANGE" },
1518 { P_SETFLEVEL, "P_SETFLEVEL" },
1519 { P_AUDITWR, "P_AUDITWR" },
1520 { P_TSHAR, "P_TSHAR" },
1521 { P_PLOCK, "P_PLOCK" },
1522 { P_CORE, "P_CORE" },
1523 { P_LOADMOD, "P_LOADMOD" },
1524 { P_BIND, "P_BIND" },
1525 { P_ALLPRIVS, "P_ALLPRIVS" },
1526 { 0, NULL },
1527};
1528
1529
Roland McGrathd9f816f2004-09-04 03:39:20 +00001530static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001531 { PS_FIX, "PS_FIX" },
1532 { PS_INH, "PS_INH" },
1533 { PS_MAX, "PS_MAX" },
1534 { PS_WKG, "PS_WKG" },
1535 { 0, NULL },
1536};
1537
1538
1539static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001540printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001541{
1542 priv_t buf [128];
1543 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1544 int dots = len > max;
1545 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001546
John Hughesc61eb3d2002-05-17 11:37:50 +00001547 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001548
John Hughesc61eb3d2002-05-17 11:37:50 +00001549 if (len <= 0 ||
1550 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1551 {
1552 tprintf ("%#lx", addr);
1553 return;
1554 }
1555
1556 tprintf ("[");
1557
1558 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001559 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001560
1561 if (i) tprintf (", ");
1562
1563 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1564 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1565 {
1566 tprintf ("%s|%s", t, p);
1567 }
1568 else {
1569 tprintf ("%#lx", buf [i]);
1570 }
1571 }
1572
1573 if (dots) tprintf (" ...");
1574
1575 tprintf ("]");
1576}
1577
1578
1579int
1580sys_procpriv(tcp)
1581struct tcb *tcp;
1582{
1583 if (entering(tcp)) {
1584 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1585 switch (tcp->u_arg[0]) {
1586 case CNTPRV:
1587 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1588 break;
1589
1590 case GETPRV:
1591 break;
1592
1593 default:
1594 tprintf (", ");
1595 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1596 tprintf (", %ld", tcp->u_arg[2]);
1597 }
1598 }
1599 else if (tcp->u_arg[0] == GETPRV) {
1600 if (syserror (tcp)) {
1601 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1602 }
1603 else {
1604 tprintf (", ");
1605 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1606 tprintf (", %ld", tcp->u_arg[2]);
1607 }
1608 }
Roland McGrath5a223472002-12-15 23:58:26 +00001609
John Hughesc61eb3d2002-05-17 11:37:50 +00001610 return 0;
1611}
1612
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001613#endif /* UNIXWARE */
John Hughesc61eb3d2002-05-17 11:37:50 +00001614
1615
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001616static void
1617printargv(tcp, addr)
1618struct tcb *tcp;
1619long addr;
1620{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001621 union {
Andreas Schwab99c85692009-08-28 19:36:20 +02001622 unsigned int p32;
1623 unsigned long p64;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001624 char data[sizeof(long)];
1625 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001626 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001627 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001628
Roland McGrath85a3bc42007-08-02 02:13:05 +00001629 cp.p64 = 1;
1630 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1631 if (umoven(tcp, addr, personality_wordsize[current_personality],
1632 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001633 tprintf("%#lx", addr);
1634 return;
1635 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001636 if (personality_wordsize[current_personality] == 4)
1637 cp.p64 = cp.p32;
1638 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001639 break;
Dmitry V. Levin4bcd5ef2009-06-01 10:32:27 +00001640 tprintf("%s", sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001641 printstr(tcp, cp.p64, -1);
1642 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001643 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001644 if (cp.p64)
1645 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001646}
1647
1648static void
1649printargc(fmt, tcp, addr)
1650char *fmt;
1651struct tcb *tcp;
1652long addr;
1653{
1654 int count;
1655 char *cp;
1656
1657 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1658 addr += sizeof(char *);
1659 }
1660 tprintf(fmt, count, count == 1 ? "" : "s");
1661}
1662
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001663#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001664int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001665sys_execv(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001666{
1667 if (entering(tcp)) {
1668 printpath(tcp, tcp->u_arg[0]);
1669 if (!verbose(tcp))
1670 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001671 else {
1672 tprintf(", [");
1673 printargv(tcp, tcp->u_arg[1]);
1674 tprintf("]");
1675 }
1676 }
1677 return 0;
1678}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001679#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001680
1681int
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001682sys_execve(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001683{
1684 if (entering(tcp)) {
1685 printpath(tcp, tcp->u_arg[0]);
1686 if (!verbose(tcp))
1687 tprintf(", %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001688 else {
1689 tprintf(", [");
1690 printargv(tcp, tcp->u_arg[1]);
1691 tprintf("]");
1692 }
1693 if (!verbose(tcp))
1694 tprintf(", %#lx", tcp->u_arg[2]);
1695 else if (abbrev(tcp))
1696 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1697 else {
1698 tprintf(", [");
1699 printargv(tcp, tcp->u_arg[2]);
1700 tprintf("]");
1701 }
1702 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001703 return 0;
1704}
1705
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001706#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001707
1708int sys_rexecve(tcp)
1709struct tcb *tcp;
1710{
1711 if (entering (tcp)) {
1712 sys_execve (tcp);
1713 tprintf (", %ld", tcp->u_arg[3]);
1714 }
1715 return 0;
1716}
1717
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001718#endif
John Hughes4e36a812001-04-18 15:11:51 +00001719
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001720int
1721internal_exec(tcp)
1722struct tcb *tcp;
1723{
1724#ifdef SUNOS4
1725 if (exiting(tcp) && !syserror(tcp) && followfork)
1726 fixvfork(tcp);
1727#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001728#if defined LINUX && defined TCB_WAITEXECVE
1729 if (exiting(tcp) && syserror(tcp))
1730 tcp->flags &= ~TCB_WAITEXECVE;
1731 else
1732 tcp->flags |= TCB_WAITEXECVE;
1733#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001734 return 0;
1735}
1736
1737#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001738#ifndef __WNOTHREAD
1739#define __WNOTHREAD 0x20000000
1740#endif
1741#ifndef __WALL
1742#define __WALL 0x40000000
1743#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001744#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001745#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001746#endif
1747#endif /* LINUX */
1748
Roland McGrathd9f816f2004-09-04 03:39:20 +00001749static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001750 { WNOHANG, "WNOHANG" },
1751#ifndef WSTOPPED
1752 { WUNTRACED, "WUNTRACED" },
1753#endif
1754#ifdef WEXITED
1755 { WEXITED, "WEXITED" },
1756#endif
1757#ifdef WTRAPPED
1758 { WTRAPPED, "WTRAPPED" },
1759#endif
1760#ifdef WSTOPPED
1761 { WSTOPPED, "WSTOPPED" },
1762#endif
1763#ifdef WCONTINUED
1764 { WCONTINUED, "WCONTINUED" },
1765#endif
1766#ifdef WNOWAIT
1767 { WNOWAIT, "WNOWAIT" },
1768#endif
1769#ifdef __WCLONE
1770 { __WCLONE, "__WCLONE" },
1771#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001772#ifdef __WALL
1773 { __WALL, "__WALL" },
1774#endif
1775#ifdef __WNOTHREAD
1776 { __WNOTHREAD, "__WNOTHREAD" },
1777#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001778 { 0, NULL },
1779};
1780
Roland McGrath5e02a572004-10-19 23:33:47 +00001781#if !defined WCOREFLAG && defined WCOREFLG
1782# define WCOREFLAG WCOREFLG
1783#endif
1784#ifndef WCOREFLAG
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001785# define WCOREFLAG 0x80
Roland McGrath5e02a572004-10-19 23:33:47 +00001786#endif
Dmitry V. Levine5e60852009-12-31 22:50:49 +00001787#ifndef WCOREDUMP
1788# define WCOREDUMP(status) ((status) & 0200)
1789#endif
1790
Roland McGrath5e02a572004-10-19 23:33:47 +00001791
1792#ifndef W_STOPCODE
1793#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1794#endif
1795#ifndef W_EXITCODE
1796#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1797#endif
1798
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001799static int
1800printstatus(status)
1801int status;
1802{
1803 int exited = 0;
1804
1805 /*
1806 * Here is a tricky presentation problem. This solution
1807 * is still not entirely satisfactory but since there
1808 * are no wait status constructors it will have to do.
1809 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001810 if (WIFSTOPPED(status)) {
1811 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001812 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001813 status &= ~W_STOPCODE(WSTOPSIG(status));
1814 }
1815 else if (WIFSIGNALED(status)) {
1816 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001817 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001818 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001819 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1820 }
1821 else if (WIFEXITED(status)) {
1822 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001823 WEXITSTATUS(status));
1824 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001825 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001826 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001827 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001828 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001829 return 0;
1830 }
1831
1832 if (status == 0)
1833 tprintf("]");
1834 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001835 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001836
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001837 return exited;
1838}
1839
1840static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001841printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001842{
1843 int status;
1844 int exited = 0;
1845
1846 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001847#ifdef LINUX
1848 /* On Linux, kernel-side pid_t is typedef'ed to int
1849 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00001850 * pid argument to int on 64bit arches, producing,
1851 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001852 * in strace. We have to use int here, not long.
1853 */
1854 int pid = tcp->u_arg[0];
1855 tprintf("%d, ", pid);
1856#else
1857 /*
1858 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00001859 */
1860 long pid = tcp->u_arg[0];
1861 if (personality_wordsize[current_personality] < sizeof pid)
1862 pid = (long) (int) pid;
1863 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00001864#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001865 } else {
1866 /* status */
1867 if (!tcp->u_arg[1])
1868 tprintf("NULL");
1869 else if (syserror(tcp) || tcp->u_rval == 0)
1870 tprintf("%#lx", tcp->u_arg[1]);
1871 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1872 tprintf("[?]");
1873 else
1874 exited = printstatus(status);
1875 /* options */
1876 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001877 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001878 if (n == 4) {
1879 tprintf(", ");
1880 /* usage */
1881 if (!tcp->u_arg[3])
1882 tprintf("NULL");
1883#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001884 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00001885#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001886 if (bitness)
1887 printrusage32(tcp, tcp->u_arg[3]);
1888 else
1889#endif
1890 printrusage(tcp, tcp->u_arg[3]);
1891 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001892#endif /* LINUX */
1893#ifdef SUNOS4
1894 else if (tcp->u_rval > 0 && exited)
1895 printrusage(tcp, tcp->u_arg[3]);
1896#endif /* SUNOS4 */
1897 else
1898 tprintf("%#lx", tcp->u_arg[3]);
1899 }
1900 }
1901 return 0;
1902}
1903
1904int
Roland McGrathc74c0b72004-09-01 19:39:46 +00001905internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001906struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00001907int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001908{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001909 int got_kids;
1910
1911#ifdef TCB_CLONE_THREAD
1912 if (tcp->flags & TCB_CLONE_THREAD)
1913 /* The children we wait for are our parent's children. */
1914 got_kids = (tcp->parent->nchildren
1915 > tcp->parent->nclone_detached);
1916 else
1917 got_kids = (tcp->nchildren > tcp->nclone_detached);
1918#else
1919 got_kids = tcp->nchildren > 0;
1920#endif
1921
1922 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001923 /* There are children that this parent should block for.
1924 But ptrace made us the parent of the traced children
1925 and the real parent will get ECHILD from the wait call.
1926
1927 XXX If we attached with strace -f -p PID, then there
1928 may be untraced dead children the parent could be reaping
1929 now, but we make him block. */
1930
1931 /* ??? WTA: fix bug with hanging children */
1932
Roland McGrathc74c0b72004-09-01 19:39:46 +00001933 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001934 /*
1935 * There are traced children. We'll make the parent
1936 * block to avoid a false ECHILD error due to our
1937 * ptrace having stolen the children. However,
1938 * we shouldn't block if there are zombies to reap.
1939 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1940 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001941 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001942 if (tcp->nzombies > 0 &&
1943 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001944 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001945 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001946 if (tcp->u_arg[0] > 0) {
1947 /*
1948 * If the parent waits for a specified child
1949 * PID, then it must get ECHILD right away
1950 * if that PID is not one of its children.
1951 * Make sure that the requested PID matches
1952 * one of the parent's children that we are
1953 * tracing, and don't suspend it otherwise.
1954 */
1955 if (child == NULL)
1956 child = pid2tcb(tcp->u_arg[0]);
1957 if (child == NULL || child->parent != (
1958#ifdef TCB_CLONE_THREAD
1959 (tcp->flags & TCB_CLONE_THREAD)
1960 ? tcp->parent :
1961#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00001962 tcp) ||
1963 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00001964 return 0;
1965 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001966 tcp->flags |= TCB_SUSPENDED;
1967 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001968#ifdef TCB_CLONE_THREAD
1969 if (tcp->flags & TCB_CLONE_THREAD)
1970 tcp->parent->nclone_waiting++;
1971#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001972 }
1973 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001974 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00001975 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001976 /* We must force a fake result of 0 instead of
1977 the ECHILD error. */
1978 extern int force_result();
1979 return force_result(tcp, 0, 0);
1980 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00001981 }
Roland McGrath09623452003-05-23 02:27:13 +00001982 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
1983 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
1984 /*
1985 * We just reaped a child we don't know about,
1986 * presumably a zombie we already droptcb'd.
1987 */
1988 tcp->nzombies--;
1989 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001990 return 0;
1991}
1992
1993#ifdef SVR4
1994
1995int
1996sys_wait(tcp)
1997struct tcb *tcp;
1998{
1999 if (exiting(tcp)) {
2000 /* The library wrapper stuffs this into the user variable. */
2001 if (!syserror(tcp))
2002 printstatus(getrval2(tcp));
2003 }
2004 return 0;
2005}
2006
2007#endif /* SVR4 */
2008
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002009#ifdef FREEBSD
2010int
2011sys_wait(tcp)
2012struct tcb *tcp;
2013{
2014 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002015
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002016 if (exiting(tcp)) {
2017 if (!syserror(tcp)) {
2018 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2019 tprintf("%#lx", tcp->u_arg[0]);
2020 else
2021 printstatus(status);
2022 }
2023 }
2024 return 0;
2025}
2026#endif
2027
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002028int
2029sys_waitpid(tcp)
2030struct tcb *tcp;
2031{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002032 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002033}
2034
2035int
2036sys_wait4(tcp)
2037struct tcb *tcp;
2038{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002039 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002040}
2041
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002042#ifdef ALPHA
2043int
2044sys_osf_wait4(tcp)
2045struct tcb *tcp;
2046{
2047 return printwaitn(tcp, 4, 1);
2048}
2049#endif
2050
Roland McGrathc74c0b72004-09-01 19:39:46 +00002051#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002052
Roland McGrathd9f816f2004-09-04 03:39:20 +00002053static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002054 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002055#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002056 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002057#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002058 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002059#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002060 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002061#endif
2062#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002063 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002064#endif
2065#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002066 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002067#endif
2068#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002069 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002070#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002071 { P_ALL, "P_ALL" },
2072#ifdef P_LWPID
2073 { P_LWPID, "P_LWPID" },
2074#endif
2075 { 0, NULL },
2076};
2077
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002078int
2079sys_waitid(tcp)
2080struct tcb *tcp;
2081{
2082 siginfo_t si;
2083 int exited;
2084
2085 if (entering(tcp)) {
2086 printxval(waitid_types, tcp->u_arg[0], "P_???");
2087 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002088 }
2089 else {
2090 /* siginfo */
2091 exited = 0;
2092 if (!tcp->u_arg[2])
2093 tprintf("NULL");
2094 else if (syserror(tcp))
2095 tprintf("%#lx", tcp->u_arg[2]);
2096 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2097 tprintf("{???}");
2098 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002099 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002100 /* options */
2101 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002102 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002103 if (tcp->u_nargs > 4) {
2104 /* usage */
2105 tprintf(", ");
2106 if (!tcp->u_arg[4])
2107 tprintf("NULL");
2108 else if (tcp->u_error)
2109 tprintf("%#lx", tcp->u_arg[4]);
2110 else
2111 printrusage(tcp, tcp->u_arg[4]);
2112 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002113 }
2114 return 0;
2115}
2116
Roland McGrathc74c0b72004-09-01 19:39:46 +00002117#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002118
2119int
2120sys_alarm(tcp)
2121struct tcb *tcp;
2122{
2123 if (entering(tcp))
2124 tprintf("%lu", tcp->u_arg[0]);
2125 return 0;
2126}
2127
2128int
2129sys_uname(tcp)
2130struct tcb *tcp;
2131{
2132 struct utsname uname;
2133
2134 if (exiting(tcp)) {
2135 if (syserror(tcp) || !verbose(tcp))
2136 tprintf("%#lx", tcp->u_arg[0]);
2137 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2138 tprintf("{...}");
2139 else if (!abbrev(tcp)) {
2140
2141 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2142 uname.sysname, uname.nodename);
2143 tprintf("release=\"%s\", version=\"%s\", ",
2144 uname.release, uname.version);
2145 tprintf("machine=\"%s\"", uname.machine);
2146#ifdef LINUX
2147#ifndef __GLIBC__
2148 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002149#endif
2150#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002151 tprintf("}");
2152 }
2153 else
2154 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2155 uname.sysname, uname.nodename);
2156 }
2157 return 0;
2158}
2159
2160#ifndef SVR4
2161
Roland McGratheb9e2e82009-06-02 16:49:22 -07002162static const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002163# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002164 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2165 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2166 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2167 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2168 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2169 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2170 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2171 { PTRACE_CONT, "PTRACE_CONT" },
2172 { PTRACE_KILL, "PTRACE_KILL" },
2173 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2174 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2175 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002176# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002177 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002178# endif
2179# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002180 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002181# endif
2182# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002183 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002184# endif
2185# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002186 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002187# endif
2188# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002189 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002190# endif
2191# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002192 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002193# endif
2194# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002195 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002196# endif
2197# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002198 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002199# endif
2200# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002201 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002202# endif
2203# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002204 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002205# endif
2206# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002207 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002208# endif
2209# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002210 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002211# endif
2212# ifdef PTRACE_SET_SYSCALL
2213 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2214# endif
2215# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002216 { PTRACE_READDATA, "PTRACE_READDATA" },
2217 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2218 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2219 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2220 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2221 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002222# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002223 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2224 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002225# else /* !SPARC */
2226 { PTRACE_22, "PTRACE_22" },
2227 { PTRACE_23, "PTRACE_3" },
2228# endif /* !SPARC */
2229# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002230 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002231# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002232 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002233# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002234 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2235 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2236 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002237# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002238 { PTRACE_26, "PTRACE_26" },
2239 { PTRACE_27, "PTRACE_27" },
2240 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002241# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002242 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002243# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002244
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002245# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002246
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002247 { PT_TRACE_ME, "PT_TRACE_ME" },
2248 { PT_READ_I, "PT_READ_I" },
2249 { PT_READ_D, "PT_READ_D" },
2250 { PT_WRITE_I, "PT_WRITE_I" },
2251 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002252# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002253 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002254# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002255 { PT_CONTINUE, "PT_CONTINUE" },
2256 { PT_KILL, "PT_KILL" },
2257 { PT_STEP, "PT_STEP" },
2258 { PT_ATTACH, "PT_ATTACH" },
2259 { PT_DETACH, "PT_DETACH" },
2260 { PT_GETREGS, "PT_GETREGS" },
2261 { PT_SETREGS, "PT_SETREGS" },
2262 { PT_GETFPREGS, "PT_GETFPREGS" },
2263 { PT_SETFPREGS, "PT_SETFPREGS" },
2264 { PT_GETDBREGS, "PT_GETDBREGS" },
2265 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002266# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002267 { 0, NULL },
2268};
2269
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002270# ifndef FREEBSD
2271# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002272static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002273# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002274 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002275# endif
2276# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002277 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002278# endif
2279# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002280 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002281# endif
2282# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002283 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002284# endif
2285# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002286 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002287# endif
2288# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002289 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002290# endif
2291# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002292 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002293# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002294 { 0, NULL },
2295};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002296# endif /* PTRACE_SETOPTIONS */
2297# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002298
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002299# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002300const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002301# ifdef LINUX
2302# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002303 { PT_PSWMASK, "psw_mask" },
2304 { PT_PSWADDR, "psw_addr" },
2305 { PT_GPR0, "gpr0" },
2306 { PT_GPR1, "gpr1" },
2307 { PT_GPR2, "gpr2" },
2308 { PT_GPR3, "gpr3" },
2309 { PT_GPR4, "gpr4" },
2310 { PT_GPR5, "gpr5" },
2311 { PT_GPR6, "gpr6" },
2312 { PT_GPR7, "gpr7" },
2313 { PT_GPR8, "gpr8" },
2314 { PT_GPR9, "gpr9" },
2315 { PT_GPR10, "gpr10" },
2316 { PT_GPR11, "gpr11" },
2317 { PT_GPR12, "gpr12" },
2318 { PT_GPR13, "gpr13" },
2319 { PT_GPR14, "gpr14" },
2320 { PT_GPR15, "gpr15" },
2321 { PT_ACR0, "acr0" },
2322 { PT_ACR1, "acr1" },
2323 { PT_ACR2, "acr2" },
2324 { PT_ACR3, "acr3" },
2325 { PT_ACR4, "acr4" },
2326 { PT_ACR5, "acr5" },
2327 { PT_ACR6, "acr6" },
2328 { PT_ACR7, "acr7" },
2329 { PT_ACR8, "acr8" },
2330 { PT_ACR9, "acr9" },
2331 { PT_ACR10, "acr10" },
2332 { PT_ACR11, "acr11" },
2333 { PT_ACR12, "acr12" },
2334 { PT_ACR13, "acr13" },
2335 { PT_ACR14, "acr14" },
2336 { PT_ACR15, "acr15" },
2337 { PT_ORIGGPR2, "orig_gpr2" },
2338 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002339# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002340 { PT_FPR0_HI, "fpr0.hi" },
2341 { PT_FPR0_LO, "fpr0.lo" },
2342 { PT_FPR1_HI, "fpr1.hi" },
2343 { PT_FPR1_LO, "fpr1.lo" },
2344 { PT_FPR2_HI, "fpr2.hi" },
2345 { PT_FPR2_LO, "fpr2.lo" },
2346 { PT_FPR3_HI, "fpr3.hi" },
2347 { PT_FPR3_LO, "fpr3.lo" },
2348 { PT_FPR4_HI, "fpr4.hi" },
2349 { PT_FPR4_LO, "fpr4.lo" },
2350 { PT_FPR5_HI, "fpr5.hi" },
2351 { PT_FPR5_LO, "fpr5.lo" },
2352 { PT_FPR6_HI, "fpr6.hi" },
2353 { PT_FPR6_LO, "fpr6.lo" },
2354 { PT_FPR7_HI, "fpr7.hi" },
2355 { PT_FPR7_LO, "fpr7.lo" },
2356 { PT_FPR8_HI, "fpr8.hi" },
2357 { PT_FPR8_LO, "fpr8.lo" },
2358 { PT_FPR9_HI, "fpr9.hi" },
2359 { PT_FPR9_LO, "fpr9.lo" },
2360 { PT_FPR10_HI, "fpr10.hi" },
2361 { PT_FPR10_LO, "fpr10.lo" },
2362 { PT_FPR11_HI, "fpr11.hi" },
2363 { PT_FPR11_LO, "fpr11.lo" },
2364 { PT_FPR12_HI, "fpr12.hi" },
2365 { PT_FPR12_LO, "fpr12.lo" },
2366 { PT_FPR13_HI, "fpr13.hi" },
2367 { PT_FPR13_LO, "fpr13.lo" },
2368 { PT_FPR14_HI, "fpr14.hi" },
2369 { PT_FPR14_LO, "fpr14.lo" },
2370 { PT_FPR15_HI, "fpr15.hi" },
2371 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002372# endif
2373# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002374 { PT_FPR0, "fpr0" },
2375 { PT_FPR1, "fpr1" },
2376 { PT_FPR2, "fpr2" },
2377 { PT_FPR3, "fpr3" },
2378 { PT_FPR4, "fpr4" },
2379 { PT_FPR5, "fpr5" },
2380 { PT_FPR6, "fpr6" },
2381 { PT_FPR7, "fpr7" },
2382 { PT_FPR8, "fpr8" },
2383 { PT_FPR9, "fpr9" },
2384 { PT_FPR10, "fpr10" },
2385 { PT_FPR11, "fpr11" },
2386 { PT_FPR12, "fpr12" },
2387 { PT_FPR13, "fpr13" },
2388 { PT_FPR14, "fpr14" },
2389 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002390# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002391 { PT_CR_9, "cr9" },
2392 { PT_CR_10, "cr10" },
2393 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002394 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002395# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002396 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002397# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002398 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002399# elif defined(POWERPC)
2400# ifndef PT_ORIG_R3
2401# define PT_ORIG_R3 34
2402# endif
2403# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002404 { REGSIZE*PT_R0, "r0" },
2405 { REGSIZE*PT_R1, "r1" },
2406 { REGSIZE*PT_R2, "r2" },
2407 { REGSIZE*PT_R3, "r3" },
2408 { REGSIZE*PT_R4, "r4" },
2409 { REGSIZE*PT_R5, "r5" },
2410 { REGSIZE*PT_R6, "r6" },
2411 { REGSIZE*PT_R7, "r7" },
2412 { REGSIZE*PT_R8, "r8" },
2413 { REGSIZE*PT_R9, "r9" },
2414 { REGSIZE*PT_R10, "r10" },
2415 { REGSIZE*PT_R11, "r11" },
2416 { REGSIZE*PT_R12, "r12" },
2417 { REGSIZE*PT_R13, "r13" },
2418 { REGSIZE*PT_R14, "r14" },
2419 { REGSIZE*PT_R15, "r15" },
2420 { REGSIZE*PT_R16, "r16" },
2421 { REGSIZE*PT_R17, "r17" },
2422 { REGSIZE*PT_R18, "r18" },
2423 { REGSIZE*PT_R19, "r19" },
2424 { REGSIZE*PT_R20, "r20" },
2425 { REGSIZE*PT_R21, "r21" },
2426 { REGSIZE*PT_R22, "r22" },
2427 { REGSIZE*PT_R23, "r23" },
2428 { REGSIZE*PT_R24, "r24" },
2429 { REGSIZE*PT_R25, "r25" },
2430 { REGSIZE*PT_R26, "r26" },
2431 { REGSIZE*PT_R27, "r27" },
2432 { REGSIZE*PT_R28, "r28" },
2433 { REGSIZE*PT_R29, "r29" },
2434 { REGSIZE*PT_R30, "r30" },
2435 { REGSIZE*PT_R31, "r31" },
2436 { REGSIZE*PT_NIP, "NIP" },
2437 { REGSIZE*PT_MSR, "MSR" },
2438 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2439 { REGSIZE*PT_CTR, "CTR" },
2440 { REGSIZE*PT_LNK, "LNK" },
2441 { REGSIZE*PT_XER, "XER" },
2442 { REGSIZE*PT_CCR, "CCR" },
2443 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002444# undef REGSIZE
2445# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002446 { 0, "r0" },
2447 { 1, "r1" },
2448 { 2, "r2" },
2449 { 3, "r3" },
2450 { 4, "r4" },
2451 { 5, "r5" },
2452 { 6, "r6" },
2453 { 7, "r7" },
2454 { 8, "r8" },
2455 { 9, "r9" },
2456 { 10, "r10" },
2457 { 11, "r11" },
2458 { 12, "r12" },
2459 { 13, "r13" },
2460 { 14, "r14" },
2461 { 15, "r15" },
2462 { 16, "r16" },
2463 { 17, "r17" },
2464 { 18, "r18" },
2465 { 19, "r19" },
2466 { 20, "r20" },
2467 { 21, "r21" },
2468 { 22, "r22" },
2469 { 23, "r23" },
2470 { 24, "r24" },
2471 { 25, "r25" },
2472 { 26, "r26" },
2473 { 27, "r27" },
2474 { 28, "r28" },
2475 { 29, "gp" },
2476 { 30, "fp" },
2477 { 31, "zero" },
2478 { 32, "fp0" },
2479 { 33, "fp" },
2480 { 34, "fp2" },
2481 { 35, "fp3" },
2482 { 36, "fp4" },
2483 { 37, "fp5" },
2484 { 38, "fp6" },
2485 { 39, "fp7" },
2486 { 40, "fp8" },
2487 { 41, "fp9" },
2488 { 42, "fp10" },
2489 { 43, "fp11" },
2490 { 44, "fp12" },
2491 { 45, "fp13" },
2492 { 46, "fp14" },
2493 { 47, "fp15" },
2494 { 48, "fp16" },
2495 { 49, "fp17" },
2496 { 50, "fp18" },
2497 { 51, "fp19" },
2498 { 52, "fp20" },
2499 { 53, "fp21" },
2500 { 54, "fp22" },
2501 { 55, "fp23" },
2502 { 56, "fp24" },
2503 { 57, "fp25" },
2504 { 58, "fp26" },
2505 { 59, "fp27" },
2506 { 60, "fp28" },
2507 { 61, "fp29" },
2508 { 62, "fp30" },
2509 { 63, "fp31" },
2510 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002511# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002512 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2513 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2514 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2515 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2516 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2517 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2518 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2519 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2520 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2521 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2522 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2523 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2524 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2525 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2526 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2527 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2528 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2529 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2530 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2531 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2532 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2533 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2534 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2535 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2536 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2537 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2538 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2539 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2540 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2541 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2542 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2543 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2544 /* switch stack: */
2545 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2546 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2547 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2548 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2549 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2550 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2551 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2552 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2553 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2554 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002555 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2556 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002557 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002558 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002559 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2560 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002561 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2562 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2563 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2564 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2565 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2566 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2567 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2568 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2569 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2570 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2571 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2572 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2573 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2574 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2575 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002576# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002577 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002578# endif
2579# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002580 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002581# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002582 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002583# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002584 { 4*EBX, "4*EBX" },
2585 { 4*ECX, "4*ECX" },
2586 { 4*EDX, "4*EDX" },
2587 { 4*ESI, "4*ESI" },
2588 { 4*EDI, "4*EDI" },
2589 { 4*EBP, "4*EBP" },
2590 { 4*EAX, "4*EAX" },
2591 { 4*DS, "4*DS" },
2592 { 4*ES, "4*ES" },
2593 { 4*FS, "4*FS" },
2594 { 4*GS, "4*GS" },
2595 { 4*ORIG_EAX, "4*ORIG_EAX" },
2596 { 4*EIP, "4*EIP" },
2597 { 4*CS, "4*CS" },
2598 { 4*EFL, "4*EFL" },
2599 { 4*UESP, "4*UESP" },
2600 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002601# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002602 { 8*R15, "8*R15" },
2603 { 8*R14, "8*R14" },
2604 { 8*R13, "8*R13" },
2605 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002606 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002607 { 8*RBX, "8*RBX" },
2608 { 8*R11, "8*R11" },
2609 { 8*R10, "8*R10" },
2610 { 8*R9, "8*R9" },
2611 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002612 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002613 { 8*RCX, "8*RCX" },
2614 { 8*RDX, "8*RDX" },
2615 { 8*RSI, "8*RSI" },
2616 { 8*RDI, "8*RDI" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002617 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002618 { 8*RIP, "8*RIP" },
2619 { 8*CS, "8*CS" },
2620 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002621 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002622 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002623# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002624 { 4*PT_D1, "4*PT_D1" },
2625 { 4*PT_D2, "4*PT_D2" },
2626 { 4*PT_D3, "4*PT_D3" },
2627 { 4*PT_D4, "4*PT_D4" },
2628 { 4*PT_D5, "4*PT_D5" },
2629 { 4*PT_D6, "4*PT_D6" },
2630 { 4*PT_D7, "4*PT_D7" },
2631 { 4*PT_A0, "4*PT_A0" },
2632 { 4*PT_A1, "4*PT_A1" },
2633 { 4*PT_A2, "4*PT_A2" },
2634 { 4*PT_A3, "4*PT_A3" },
2635 { 4*PT_A4, "4*PT_A4" },
2636 { 4*PT_A5, "4*PT_A5" },
2637 { 4*PT_A6, "4*PT_A6" },
2638 { 4*PT_D0, "4*PT_D0" },
2639 { 4*PT_USP, "4*PT_USP" },
2640 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2641 { 4*PT_SR, "4*PT_SR" },
2642 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002643# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002644 { 4*REG_REG0, "4*REG_REG0" },
2645 { 4*(REG_REG0+1), "4*REG_REG1" },
2646 { 4*(REG_REG0+2), "4*REG_REG2" },
2647 { 4*(REG_REG0+3), "4*REG_REG3" },
2648 { 4*(REG_REG0+4), "4*REG_REG4" },
2649 { 4*(REG_REG0+5), "4*REG_REG5" },
2650 { 4*(REG_REG0+6), "4*REG_REG6" },
2651 { 4*(REG_REG0+7), "4*REG_REG7" },
2652 { 4*(REG_REG0+8), "4*REG_REG8" },
2653 { 4*(REG_REG0+9), "4*REG_REG9" },
2654 { 4*(REG_REG0+10), "4*REG_REG10" },
2655 { 4*(REG_REG0+11), "4*REG_REG11" },
2656 { 4*(REG_REG0+12), "4*REG_REG12" },
2657 { 4*(REG_REG0+13), "4*REG_REG13" },
2658 { 4*(REG_REG0+14), "4*REG_REG14" },
2659 { 4*REG_REG15, "4*REG_REG15" },
2660 { 4*REG_PC, "4*REG_PC" },
2661 { 4*REG_PR, "4*REG_PR" },
2662 { 4*REG_SR, "4*REG_SR" },
2663 { 4*REG_GBR, "4*REG_GBR" },
2664 { 4*REG_MACH, "4*REG_MACH" },
2665 { 4*REG_MACL, "4*REG_MACL" },
2666 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2667 { 4*REG_FPUL, "4*REG_FPUL" },
2668 { 4*REG_FPREG0, "4*REG_FPREG0" },
2669 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2670 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2671 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2672 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2673 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2674 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2675 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2676 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2677 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2678 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2679 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2680 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2681 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2682 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2683 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002684# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002685 { 4*REG_XDREG0, "4*REG_XDREG0" },
2686 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2687 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2688 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2689 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2690 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2691 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2692 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002693# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002694 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002695# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002696 { 0, "PC(L)" },
2697 { 4, "PC(U)" },
2698 { 8, "SR(L)" },
2699 { 12, "SR(U)" },
2700 { 16, "syscall no.(L)" },
2701 { 20, "syscall_no.(U)" },
2702 { 24, "R0(L)" },
2703 { 28, "R0(U)" },
2704 { 32, "R1(L)" },
2705 { 36, "R1(U)" },
2706 { 40, "R2(L)" },
2707 { 44, "R2(U)" },
2708 { 48, "R3(L)" },
2709 { 52, "R3(U)" },
2710 { 56, "R4(L)" },
2711 { 60, "R4(U)" },
2712 { 64, "R5(L)" },
2713 { 68, "R5(U)" },
2714 { 72, "R6(L)" },
2715 { 76, "R6(U)" },
2716 { 80, "R7(L)" },
2717 { 84, "R7(U)" },
2718 { 88, "R8(L)" },
2719 { 92, "R8(U)" },
2720 { 96, "R9(L)" },
2721 { 100, "R9(U)" },
2722 { 104, "R10(L)" },
2723 { 108, "R10(U)" },
2724 { 112, "R11(L)" },
2725 { 116, "R11(U)" },
2726 { 120, "R12(L)" },
2727 { 124, "R12(U)" },
2728 { 128, "R13(L)" },
2729 { 132, "R13(U)" },
2730 { 136, "R14(L)" },
2731 { 140, "R14(U)" },
2732 { 144, "R15(L)" },
2733 { 148, "R15(U)" },
2734 { 152, "R16(L)" },
2735 { 156, "R16(U)" },
2736 { 160, "R17(L)" },
2737 { 164, "R17(U)" },
2738 { 168, "R18(L)" },
2739 { 172, "R18(U)" },
2740 { 176, "R19(L)" },
2741 { 180, "R19(U)" },
2742 { 184, "R20(L)" },
2743 { 188, "R20(U)" },
2744 { 192, "R21(L)" },
2745 { 196, "R21(U)" },
2746 { 200, "R22(L)" },
2747 { 204, "R22(U)" },
2748 { 208, "R23(L)" },
2749 { 212, "R23(U)" },
2750 { 216, "R24(L)" },
2751 { 220, "R24(U)" },
2752 { 224, "R25(L)" },
2753 { 228, "R25(U)" },
2754 { 232, "R26(L)" },
2755 { 236, "R26(U)" },
2756 { 240, "R27(L)" },
2757 { 244, "R27(U)" },
2758 { 248, "R28(L)" },
2759 { 252, "R28(U)" },
2760 { 256, "R29(L)" },
2761 { 260, "R29(U)" },
2762 { 264, "R30(L)" },
2763 { 268, "R30(U)" },
2764 { 272, "R31(L)" },
2765 { 276, "R31(U)" },
2766 { 280, "R32(L)" },
2767 { 284, "R32(U)" },
2768 { 288, "R33(L)" },
2769 { 292, "R33(U)" },
2770 { 296, "R34(L)" },
2771 { 300, "R34(U)" },
2772 { 304, "R35(L)" },
2773 { 308, "R35(U)" },
2774 { 312, "R36(L)" },
2775 { 316, "R36(U)" },
2776 { 320, "R37(L)" },
2777 { 324, "R37(U)" },
2778 { 328, "R38(L)" },
2779 { 332, "R38(U)" },
2780 { 336, "R39(L)" },
2781 { 340, "R39(U)" },
2782 { 344, "R40(L)" },
2783 { 348, "R40(U)" },
2784 { 352, "R41(L)" },
2785 { 356, "R41(U)" },
2786 { 360, "R42(L)" },
2787 { 364, "R42(U)" },
2788 { 368, "R43(L)" },
2789 { 372, "R43(U)" },
2790 { 376, "R44(L)" },
2791 { 380, "R44(U)" },
2792 { 384, "R45(L)" },
2793 { 388, "R45(U)" },
2794 { 392, "R46(L)" },
2795 { 396, "R46(U)" },
2796 { 400, "R47(L)" },
2797 { 404, "R47(U)" },
2798 { 408, "R48(L)" },
2799 { 412, "R48(U)" },
2800 { 416, "R49(L)" },
2801 { 420, "R49(U)" },
2802 { 424, "R50(L)" },
2803 { 428, "R50(U)" },
2804 { 432, "R51(L)" },
2805 { 436, "R51(U)" },
2806 { 440, "R52(L)" },
2807 { 444, "R52(U)" },
2808 { 448, "R53(L)" },
2809 { 452, "R53(U)" },
2810 { 456, "R54(L)" },
2811 { 460, "R54(U)" },
2812 { 464, "R55(L)" },
2813 { 468, "R55(U)" },
2814 { 472, "R56(L)" },
2815 { 476, "R56(U)" },
2816 { 480, "R57(L)" },
2817 { 484, "R57(U)" },
2818 { 488, "R58(L)" },
2819 { 492, "R58(U)" },
2820 { 496, "R59(L)" },
2821 { 500, "R59(U)" },
2822 { 504, "R60(L)" },
2823 { 508, "R60(U)" },
2824 { 512, "R61(L)" },
2825 { 516, "R61(U)" },
2826 { 520, "R62(L)" },
2827 { 524, "R62(U)" },
2828 { 528, "TR0(L)" },
2829 { 532, "TR0(U)" },
2830 { 536, "TR1(L)" },
2831 { 540, "TR1(U)" },
2832 { 544, "TR2(L)" },
2833 { 548, "TR2(U)" },
2834 { 552, "TR3(L)" },
2835 { 556, "TR3(U)" },
2836 { 560, "TR4(L)" },
2837 { 564, "TR4(U)" },
2838 { 568, "TR5(L)" },
2839 { 572, "TR5(U)" },
2840 { 576, "TR6(L)" },
2841 { 580, "TR6(U)" },
2842 { 584, "TR7(L)" },
2843 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002844 /* This entry is in case pt_regs contains dregs (depends on
2845 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002846 { uoff(regs), "offsetof(struct user, regs)" },
2847 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002848# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002849 { uoff(regs.ARM_r0), "r0" },
2850 { uoff(regs.ARM_r1), "r1" },
2851 { uoff(regs.ARM_r2), "r2" },
2852 { uoff(regs.ARM_r3), "r3" },
2853 { uoff(regs.ARM_r4), "r4" },
2854 { uoff(regs.ARM_r5), "r5" },
2855 { uoff(regs.ARM_r6), "r6" },
2856 { uoff(regs.ARM_r7), "r7" },
2857 { uoff(regs.ARM_r8), "r8" },
2858 { uoff(regs.ARM_r9), "r9" },
2859 { uoff(regs.ARM_r10), "r10" },
2860 { uoff(regs.ARM_fp), "fp" },
2861 { uoff(regs.ARM_ip), "ip" },
2862 { uoff(regs.ARM_sp), "sp" },
2863 { uoff(regs.ARM_lr), "lr" },
2864 { uoff(regs.ARM_pc), "pc" },
2865 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00002866# elif defined(AVR32)
2867 { uoff(regs.sr), "sr" },
2868 { uoff(regs.pc), "pc" },
2869 { uoff(regs.lr), "lr" },
2870 { uoff(regs.sp), "sp" },
2871 { uoff(regs.r12), "r12" },
2872 { uoff(regs.r11), "r11" },
2873 { uoff(regs.r10), "r10" },
2874 { uoff(regs.r9), "r9" },
2875 { uoff(regs.r8), "r8" },
2876 { uoff(regs.r7), "r7" },
2877 { uoff(regs.r6), "r6" },
2878 { uoff(regs.r5), "r5" },
2879 { uoff(regs.r4), "r4" },
2880 { uoff(regs.r3), "r3" },
2881 { uoff(regs.r2), "r2" },
2882 { uoff(regs.r1), "r1" },
2883 { uoff(regs.r0), "r0" },
2884 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002885# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002886 { 0, "r0" },
2887 { 1, "r1" },
2888 { 2, "r2" },
2889 { 3, "r3" },
2890 { 4, "r4" },
2891 { 5, "r5" },
2892 { 6, "r6" },
2893 { 7, "r7" },
2894 { 8, "r8" },
2895 { 9, "r9" },
2896 { 10, "r10" },
2897 { 11, "r11" },
2898 { 12, "r12" },
2899 { 13, "r13" },
2900 { 14, "r14" },
2901 { 15, "r15" },
2902 { 16, "r16" },
2903 { 17, "r17" },
2904 { 18, "r18" },
2905 { 19, "r19" },
2906 { 20, "r20" },
2907 { 21, "r21" },
2908 { 22, "r22" },
2909 { 23, "r23" },
2910 { 24, "r24" },
2911 { 25, "r25" },
2912 { 26, "r26" },
2913 { 27, "r27" },
2914 { 28, "r28" },
2915 { 29, "r29" },
2916 { 30, "r30" },
2917 { 31, "r31" },
2918 { 32, "f0" },
2919 { 33, "f1" },
2920 { 34, "f2" },
2921 { 35, "f3" },
2922 { 36, "f4" },
2923 { 37, "f5" },
2924 { 38, "f6" },
2925 { 39, "f7" },
2926 { 40, "f8" },
2927 { 41, "f9" },
2928 { 42, "f10" },
2929 { 43, "f11" },
2930 { 44, "f12" },
2931 { 45, "f13" },
2932 { 46, "f14" },
2933 { 47, "f15" },
2934 { 48, "f16" },
2935 { 49, "f17" },
2936 { 50, "f18" },
2937 { 51, "f19" },
2938 { 52, "f20" },
2939 { 53, "f21" },
2940 { 54, "f22" },
2941 { 55, "f23" },
2942 { 56, "f24" },
2943 { 57, "f25" },
2944 { 58, "f26" },
2945 { 59, "f27" },
2946 { 60, "f28" },
2947 { 61, "f29" },
2948 { 62, "f30" },
2949 { 63, "f31" },
2950 { 64, "pc" },
2951 { 65, "cause" },
2952 { 66, "badvaddr" },
2953 { 67, "mmhi" },
2954 { 68, "mmlo" },
2955 { 69, "fpcsr" },
2956 { 70, "fpeir" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002957# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00002958# ifdef CRISV10
2959 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
2960 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2961 { 4*PT_R13, "4*PT_R13" },
2962 { 4*PT_R12, "4*PT_R12" },
2963 { 4*PT_R11, "4*PT_R11" },
2964 { 4*PT_R10, "4*PT_R10" },
2965 { 4*PT_R9, "4*PT_R9" },
2966 { 4*PT_R8, "4*PT_R8" },
2967 { 4*PT_R7, "4*PT_R7" },
2968 { 4*PT_R6, "4*PT_R6" },
2969 { 4*PT_R5, "4*PT_R5" },
2970 { 4*PT_R4, "4*PT_R4" },
2971 { 4*PT_R3, "4*PT_R3" },
2972 { 4*PT_R2, "4*PT_R2" },
2973 { 4*PT_R1, "4*PT_R1" },
2974 { 4*PT_R0, "4*PT_R0" },
2975 { 4*PT_MOF, "4*PT_MOF" },
2976 { 4*PT_DCCR, "4*PT_DCCR" },
2977 { 4*PT_SRP, "4*PT_SRP" },
2978 { 4*PT_IRP, "4*PT_IRP" },
2979 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
2980 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
2981 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
2982 { 4*PT_USP, "4*PT_USP" },
2983# endif
2984# ifdef CRISV32
2985 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
2986 { 4*PT_R0, "4*PT_R0" },
2987 { 4*PT_R1, "4*PT_R1" },
2988 { 4*PT_R2, "4*PT_R2" },
2989 { 4*PT_R3, "4*PT_R3" },
2990 { 4*PT_R4, "4*PT_R4" },
2991 { 4*PT_R5, "4*PT_R5" },
2992 { 4*PT_R6, "4*PT_R6" },
2993 { 4*PT_R7, "4*PT_R7" },
2994 { 4*PT_R8, "4*PT_R8" },
2995 { 4*PT_R9, "4*PT_R9" },
2996 { 4*PT_R10, "4*PT_R10" },
2997 { 4*PT_R11, "4*PT_R11" },
2998 { 4*PT_R12, "4*PT_R12" },
2999 { 4*PT_R13, "4*PT_R13" },
3000 { 4*PT_ACR, "4*PT_ACR" },
3001 { 4*PT_SRS, "4*PT_SRS" },
3002 { 4*PT_MOF, "4*PT_MOF" },
3003 { 4*PT_SPC, "4*PT_SPC" },
3004 { 4*PT_CCS, "4*PT_CCS" },
3005 { 4*PT_SRP, "4*PT_SRP" },
3006 { 4*PT_ERP, "4*PT_ERP" },
3007 { 4*PT_EXS, "4*PT_EXS" },
3008 { 4*PT_EDA, "4*PT_EDA" },
3009 { 4*PT_USP, "4*PT_USP" },
3010 { 4*PT_PPC, "4*PT_PPC" },
3011 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3012 { 4*PT_BP+4, "4*PT_BP+4" },
3013 { 4*PT_BP+8, "4*PT_BP+8" },
3014 { 4*PT_BP+12, "4*PT_BP+12" },
3015 { 4*PT_BP+16, "4*PT_BP+16" },
3016 { 4*PT_BP+20, "4*PT_BP+20" },
3017 { 4*PT_BP+24, "4*PT_BP+24" },
3018 { 4*PT_BP+28, "4*PT_BP+28" },
3019 { 4*PT_BP+32, "4*PT_BP+32" },
3020 { 4*PT_BP+36, "4*PT_BP+36" },
3021 { 4*PT_BP+40, "4*PT_BP+40" },
3022 { 4*PT_BP+44, "4*PT_BP+44" },
3023 { 4*PT_BP+48, "4*PT_BP+48" },
3024 { 4*PT_BP+52, "4*PT_BP+52" },
3025 { 4*PT_BP+56, "4*PT_BP+56" },
3026# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003027
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003028# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3029 && !defined(ALPHA) && !defined(IA64) \
3030 && !defined(CRISV10) && !defined(CRISV32)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003031# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003032 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003033# endif
3034# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003035 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003036# endif
3037# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003038 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003039# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003040 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3041 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3042 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003043# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003044 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003045# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003046# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003047 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003048# endif
3049# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003050 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003051# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003052 { uoff(signal), "offsetof(struct user, signal)" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003053# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003054 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003055# endif
3056# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003057 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003058# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003059# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003060 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003061# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003062 { uoff(magic), "offsetof(struct user, magic)" },
3063 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003064# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003065 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003066# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003067# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003068
3069# endif /* LINUX */
3070
3071# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003072 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3073 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3074 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3075 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3076 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3077 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3078 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3079 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3080 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3081 { uoff(u_error), "offsetof(struct user, u_error)" },
3082 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3083 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3084 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3085 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3086 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3087 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3088 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3089 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3090 { uoff(u_code), "offsetof(struct user, u_code)" },
3091 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3092 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3093 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3094 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3095 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3096 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3097 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3098 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3099 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3100 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3101 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3102 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3103 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3104 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3105 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3106 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3107 { uoff(u_start), "offsetof(struct user, u_start)" },
3108 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3109 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3110 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3111 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3112 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3113 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3114 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3115 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3116 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003117# endif /* SUNOS4 */
3118# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003119 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003120# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003121 { 0, NULL },
3122};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003123# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003124
3125int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003126sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003127{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003128 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003129 long addr;
3130
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003131 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003132 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003133# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003134 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003135# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003136 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003137# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003138 );
3139 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003140 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003141# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003142 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3143 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3144 for (x = struct_user_offsets; x->str; x++) {
3145 if (x->val >= addr)
3146 break;
3147 }
3148 if (!x->str)
3149 tprintf("%#lx, ", addr);
3150 else if (x->val > addr && x != struct_user_offsets) {
3151 x--;
3152 tprintf("%s + %ld, ", x->str, addr - x->val);
3153 }
3154 else
3155 tprintf("%s, ", x->str);
3156 }
3157 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003158# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003159 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003160# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003161 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003162# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003163 case PTRACE_PEEKDATA:
3164 case PTRACE_PEEKTEXT:
3165 case PTRACE_PEEKUSER:
3166 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003167# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003168 case PTRACE_CONT:
3169 case PTRACE_SINGLESTEP:
3170 case PTRACE_SYSCALL:
3171 case PTRACE_DETACH:
3172 printsignal(tcp->u_arg[3]);
3173 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003174# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003175 case PTRACE_SETOPTIONS:
3176 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3177 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003178# endif
3179# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003180 case PTRACE_SETSIGINFO: {
3181 siginfo_t si;
3182 if (!tcp->u_arg[3])
3183 tprintf("NULL");
3184 else if (syserror(tcp))
3185 tprintf("%#lx", tcp->u_arg[3]);
3186 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3187 tprintf("{???}");
3188 else
3189 printsiginfo(&si, verbose(tcp));
3190 break;
3191 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003192# endif
3193# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003194 case PTRACE_GETSIGINFO:
3195 /* Don't print anything, do it at syscall return. */
3196 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003197# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003198 default:
3199 tprintf("%#lx", tcp->u_arg[3]);
3200 break;
3201 }
3202 } else {
3203 switch (tcp->u_arg[0]) {
3204 case PTRACE_PEEKDATA:
3205 case PTRACE_PEEKTEXT:
3206 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003207# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003208 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003209# else
Roland McGratheb285352003-01-14 09:59:00 +00003210 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003211 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003212# endif
3213# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003214 case PTRACE_GETSIGINFO: {
3215 siginfo_t si;
3216 if (!tcp->u_arg[3])
3217 tprintf("NULL");
3218 else if (syserror(tcp))
3219 tprintf("%#lx", tcp->u_arg[3]);
3220 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3221 tprintf("{???}");
3222 else
3223 printsiginfo(&si, verbose(tcp));
3224 break;
3225 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003226# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003227 }
3228 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003229# endif /* LINUX */
3230# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003231 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3232 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3233 tprintf("%lu, ", tcp->u_arg[3]);
3234 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3235 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3236 tcp->u_arg[0] != PTRACE_READTEXT) {
3237 tprintf("%#lx", tcp->u_arg[3]);
3238 }
3239 } else {
3240 if (tcp->u_arg[0] == PTRACE_READDATA ||
3241 tcp->u_arg[0] == PTRACE_READTEXT) {
3242 tprintf("%lu, ", tcp->u_arg[3]);
3243 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3244 }
3245 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003246# endif /* SUNOS4 */
3247# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003248 tprintf("%lu", tcp->u_arg[3]);
3249 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003250# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003251 return 0;
3252}
3253
3254#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003255
3256#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003257# ifndef FUTEX_CMP_REQUEUE
3258# define FUTEX_CMP_REQUEUE 4
3259# endif
3260# ifndef FUTEX_WAKE_OP
3261# define FUTEX_WAKE_OP 5
3262# endif
3263# ifndef FUTEX_LOCK_PI
3264# define FUTEX_LOCK_PI 6
3265# define FUTEX_UNLOCK_PI 7
3266# define FUTEX_TRYLOCK_PI 8
3267# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003268# ifndef FUTEX_WAIT_BITSET
3269# define FUTEX_WAIT_BITSET 9
3270# endif
3271# ifndef FUTEX_WAKE_BITSET
3272# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003273# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003274# ifndef FUTEX_WAIT_REQUEUE_PI
3275# define FUTEX_WAIT_REQUEUE_PI 11
3276# endif
3277# ifndef FUTEX_CMP_REQUEUE_PI
3278# define FUTEX_CMP_REQUEUE_PI 12
3279# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003280# ifndef FUTEX_PRIVATE_FLAG
3281# define FUTEX_PRIVATE_FLAG 128
3282# endif
Andreas Schwab85f58322009-08-12 09:54:42 +02003283# ifndef FUTEX_CLOCK_REALTIME
3284# define FUTEX_CLOCK_REALTIME 256
3285# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003286static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003287 { FUTEX_WAIT, "FUTEX_WAIT" },
3288 { FUTEX_WAKE, "FUTEX_WAKE" },
3289 { FUTEX_FD, "FUTEX_FD" },
3290 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3291 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3292 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3293 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3294 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3295 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003296 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3297 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003298 { FUTEX_WAIT_REQUEUE_PI, "FUTEX_WAIT_REQUEUE_PI" },
3299 { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" },
Roland McGrath51942a92007-07-05 18:59:11 +00003300 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3301 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3302 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3303 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3304 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3305 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3306 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3307 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3308 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003309 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3310 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Andreas Schwab85f58322009-08-12 09:54:42 +02003311 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
3312 { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
3313 { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
3314 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
3315 { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
3316 { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME" },
Roland McGrath51942a92007-07-05 18:59:11 +00003317 { 0, NULL }
3318};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003319# ifndef FUTEX_OP_SET
3320# define FUTEX_OP_SET 0
3321# define FUTEX_OP_ADD 1
3322# define FUTEX_OP_OR 2
3323# define FUTEX_OP_ANDN 3
3324# define FUTEX_OP_XOR 4
3325# define FUTEX_OP_CMP_EQ 0
3326# define FUTEX_OP_CMP_NE 1
3327# define FUTEX_OP_CMP_LT 2
3328# define FUTEX_OP_CMP_LE 3
3329# define FUTEX_OP_CMP_GT 4
3330# define FUTEX_OP_CMP_GE 5
3331# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003332static const struct xlat futexwakeops[] = {
3333 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3334 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3335 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3336 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3337 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3338 { 0, NULL }
3339};
3340static const struct xlat futexwakecmps[] = {
3341 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3342 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3343 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3344 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3345 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3346 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3347 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003348};
3349
3350int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003351sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003352{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003353 if (entering(tcp)) {
3354 long int cmd = tcp->u_arg[1] & 127;
3355 tprintf("%p, ", (void *) tcp->u_arg[0]);
3356 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3357 tprintf(", %ld", tcp->u_arg[2]);
3358 if (cmd == FUTEX_WAKE_BITSET)
3359 tprintf(", %lx", tcp->u_arg[5]);
3360 else if (cmd == FUTEX_WAIT) {
3361 tprintf(", ");
3362 printtv(tcp, tcp->u_arg[3]);
3363 } else if (cmd == FUTEX_WAIT_BITSET) {
3364 tprintf(", ");
3365 printtv(tcp, tcp->u_arg[3]);
3366 tprintf(", %lx", tcp->u_arg[5]);
3367 } else if (cmd == FUTEX_REQUEUE)
3368 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Andreas Schwab85f58322009-08-12 09:54:42 +02003369 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
Denys Vlasenko1d632462009-04-14 12:51:00 +00003370 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3371 else if (cmd == FUTEX_WAKE_OP) {
3372 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3373 if ((tcp->u_arg[5] >> 28) & 8)
3374 tprintf("FUTEX_OP_OPARG_SHIFT|");
3375 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3376 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3377 if ((tcp->u_arg[5] >> 24) & 8)
3378 tprintf("FUTEX_OP_OPARG_SHIFT|");
3379 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3380 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
Andreas Schwab85f58322009-08-12 09:54:42 +02003381 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
3382 tprintf(", ");
3383 printtv(tcp, tcp->u_arg[3]);
3384 tprintf(", %p", (void *) tcp->u_arg[4]);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003385 }
Roland McGrath51942a92007-07-05 18:59:11 +00003386 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003387 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003388}
3389
3390static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003391print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003392{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003393 int first = 1;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003394 unsigned long w, min_len;
3395
3396 if (abbrev(tcp) && len / sizeof(w) > max_strlen)
3397 min_len = len - max_strlen * sizeof(w);
3398 else
3399 min_len = 0;
3400 for (; len >= sizeof(w) && len > min_len;
3401 len -= sizeof(w), list += sizeof(w)) {
3402 if (umove(tcp, list, &w) < 0)
3403 break;
3404 if (first)
3405 tprintf("{");
3406 else
3407 tprintf(", ");
Denys Vlasenko1d632462009-04-14 12:51:00 +00003408 first = 0;
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003409 tprintf("%lx", w);
Denys Vlasenko1d632462009-04-14 12:51:00 +00003410 }
Dmitry V. Levin62e05962009-11-03 14:38:44 +00003411 if (len) {
3412 if (first)
3413 tprintf("%#lx", list);
3414 else
3415 tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
3416 "???" : "..."));
3417 } else {
3418 tprintf(first ? "{}" : "}");
3419 }
Roland McGrath5a223472002-12-15 23:58:26 +00003420}
3421
3422int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003423sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003424{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003425 if (entering(tcp)) {
3426 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3427 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3428 }
3429 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003430}
3431
3432int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003433sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003434{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003435 if (entering(tcp)) {
3436 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3437 } else {
3438 if (tcp->u_rval == -1)
3439 tprintf("%#lx", tcp->u_arg[2]);
3440 else
3441 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3442 }
3443 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003444}
Roland McGrath279d3782004-03-01 20:27:37 +00003445
Roland McGrathd9f816f2004-09-04 03:39:20 +00003446static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003447 { SCHED_OTHER, "SCHED_OTHER" },
3448 { SCHED_RR, "SCHED_RR" },
3449 { SCHED_FIFO, "SCHED_FIFO" },
3450 { 0, NULL }
3451};
3452
3453int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003454sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003455{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003456 if (entering(tcp)) {
3457 tprintf("%d", (int) tcp->u_arg[0]);
3458 } else if (! syserror(tcp)) {
3459 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3460 if (tcp->auxstr != NULL)
3461 return RVAL_STR;
3462 }
3463 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003464}
3465
3466int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003467sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003468{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003469 if (entering(tcp)) {
3470 struct sched_param p;
3471 tprintf("%d, ", (int) tcp->u_arg[0]);
3472 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3473 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3474 tprintf(", %#lx", tcp->u_arg[2]);
3475 else
3476 tprintf(", { %d }", p.__sched_priority);
3477 }
3478 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003479}
3480
3481int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003482sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003483{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003484 if (entering(tcp)) {
3485 tprintf("%d, ", (int) tcp->u_arg[0]);
3486 } else {
3487 struct sched_param p;
3488 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3489 tprintf("%#lx", tcp->u_arg[1]);
3490 else
3491 tprintf("{ %d }", p.__sched_priority);
3492 }
3493 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003494}
3495
3496int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003497sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003498{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003499 if (entering(tcp)) {
3500 struct sched_param p;
3501 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3502 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3503 else
3504 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3505 }
3506 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003507}
3508
3509int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003510sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003511{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003512 if (entering(tcp)) {
3513 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3514 }
3515 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003516}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003517
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003518# ifdef X86_64
3519# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003520
3521static const struct xlat archvals[] = {
3522 { ARCH_SET_GS, "ARCH_SET_GS" },
3523 { ARCH_SET_FS, "ARCH_SET_FS" },
3524 { ARCH_GET_FS, "ARCH_GET_FS" },
3525 { ARCH_GET_GS, "ARCH_GET_GS" },
3526 { 0, NULL },
3527};
3528
3529int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003530sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003531{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003532 if (entering(tcp)) {
3533 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3534 if (tcp->u_arg[0] == ARCH_SET_GS
3535 || tcp->u_arg[0] == ARCH_SET_FS
3536 ) {
3537 tprintf(", %#lx", tcp->u_arg[1]);
3538 }
3539 } else {
3540 if (tcp->u_arg[0] == ARCH_GET_GS
3541 || tcp->u_arg[0] == ARCH_GET_FS
3542 ) {
3543 long int v;
3544 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3545 tprintf(", [%#lx]", v);
3546 else
3547 tprintf(", %#lx", tcp->u_arg[1]);
3548 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003549 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003550 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003551}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003552# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003553
Roland McGrathdb8319f2007-08-02 01:37:55 +00003554
3555int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003556sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003557{
3558 if (exiting(tcp)) {
3559 unsigned u;
3560 if (tcp->u_arg[0] == 0)
3561 tprintf("NULL, ");
3562 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3563 tprintf("%#lx, ", tcp->u_arg[0]);
3564 else
3565 tprintf("[%u], ", u);
3566 if (tcp->u_arg[1] == 0)
3567 tprintf("NULL, ");
3568 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3569 tprintf("%#lx, ", tcp->u_arg[1]);
3570 else
3571 tprintf("[%u], ", u);
3572 tprintf("%#lx", tcp->u_arg[2]);
3573 }
3574 return 0;
3575}
3576
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003577#endif /* LINUX */