blob: 1e03ff5ccd642365c36697a4978c958bff887c26 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Linux for s390 port by D.J. Barrow
8 * <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
Wichert Akkermanccef6372002-05-01 16:39:22 +00009 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
11
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000012 *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000013 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 */
39
40#include "defs.h"
41
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <sys/time.h>
45#include <sys/wait.h>
46#include <sys/resource.h>
47#include <sys/utsname.h>
48#include <sys/user.h>
49#include <sys/syscall.h>
50#include <signal.h>
51#ifdef SUNOS4
52#include <machine/reg.h>
53#endif /* SUNOS4 */
54
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000055#ifdef FREEBSD
56#include <sys/ptrace.h>
57#endif
58
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000059#if HAVE_ASM_REG_H
Roland McGrath6d1a65c2004-07-12 07:44:08 +000060#if defined (SPARC) || defined (SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000061# define fpq kernel_fpq
62# define fq kernel_fq
63# define fpu kernel_fpu
Roland McGrath6d1a65c2004-07-12 07:44:08 +000064#endif /* SPARC || SPARC64 */
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000065#include <asm/reg.h>
Roland McGrath6d1a65c2004-07-12 07:44:08 +000066#if defined (SPARC) || defined (SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000067# undef fpq
68# undef fq
Roland McGrath5a223472002-12-15 23:58:26 +000069# undef fpu
Roland McGrath6d1a65c2004-07-12 07:44:08 +000070#endif /* SPARC || SPARC64 */
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000071#endif /* HAVE_ASM_REG_H */
72
Wichert Akkerman36915a11999-07-13 15:45:02 +000073#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000074# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000075#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000076# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000077#endif
78#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000079# define PTRACE_POKEUSR PTRACE_POKEUSER
80#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000081#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000082
Roland McGrath5bd7cf82003-01-24 04:31:18 +000083#ifdef HAVE_LINUX_PTRACE_H
84#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000085# ifdef HAVE_STRUCT_IA64_FPREG
86# define ia64_fpreg XXX_ia64_fpreg
87# endif
88# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
89# define pt_all_user_regs XXX_pt_all_user_regs
90# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000091#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000092# undef ia64_fpreg
93# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000094#endif
95
Roland McGrath6d1a65c2004-07-12 07:44:08 +000096#if defined (LINUX) && defined (SPARC64)
97# define r_pc r_tpc
98# undef PTRACE_GETREGS
99# define PTRACE_GETREGS PTRACE_GETREGS64
100# undef PTRACE_SETREGS
101# define PTRACE_SETREGS PTRACE_SETREGS64
102#endif /* LINUX && SPARC64 */
103
Roland McGrath5a223472002-12-15 23:58:26 +0000104#ifdef HAVE_LINUX_FUTEX_H
105#include <linux/futex.h>
106#endif
107#if defined LINUX
108# ifndef FUTEX_WAIT
109# define FUTEX_WAIT 0
110# endif
111# ifndef FUTEX_WAKE
112# define FUTEX_WAKE 1
113# endif
114# ifndef FUTEX_FD
115# define FUTEX_FD 2
116# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000117# ifndef FUTEX_REQUEUE
118# define FUTEX_REQUEUE 3
119# endif
Roland McGrath5a223472002-12-15 23:58:26 +0000120#endif
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000123#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000124#include <asm/posix_types.h>
125#undef GETGROUPS_T
126#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000127#undef GETGROUPS32_T
128#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000129#endif /* LINUX */
130
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000131#if defined(LINUX) && defined(IA64)
132# include <asm/ptrace_offsets.h>
133# include <asm/rse.h>
134#endif
135
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000136#ifdef HAVE_PRCTL
137#include <sys/prctl.h>
138#endif
139
140#ifndef WCOREDUMP
141#define WCOREDUMP(status) ((status) & 0200)
142#endif
143
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000144/* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000145#if defined(HAVE_PRCTL)
Roland McGrathd9f816f2004-09-04 03:39:20 +0000146static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000147#ifdef PR_MAXPROCS
148 { PR_MAXPROCS, "PR_MAXPROCS" },
149#endif
150#ifdef PR_ISBLOCKED
151 { PR_ISBLOCKED, "PR_ISBLOCKED" },
152#endif
153#ifdef PR_SETSTACKSIZE
154 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
155#endif
156#ifdef PR_GETSTACKSIZE
157 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
158#endif
159#ifdef PR_MAXPPROCS
160 { PR_MAXPPROCS, "PR_MAXPPROCS" },
161#endif
162#ifdef PR_UNBLKONEXEC
163 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
164#endif
165#ifdef PR_ATOMICSIM
166 { PR_ATOMICSIM, "PR_ATOMICSIM" },
167#endif
168#ifdef PR_SETEXITSIG
169 { PR_SETEXITSIG, "PR_SETEXITSIG" },
170#endif
171#ifdef PR_RESIDENT
172 { PR_RESIDENT, "PR_RESIDENT" },
173#endif
174#ifdef PR_ATTACHADDR
175 { PR_ATTACHADDR, "PR_ATTACHADDR" },
176#endif
177#ifdef PR_DETACHADDR
178 { PR_DETACHADDR, "PR_DETACHADDR" },
179#endif
180#ifdef PR_TERMCHILD
181 { PR_TERMCHILD, "PR_TERMCHILD" },
182#endif
183#ifdef PR_GETSHMASK
184 { PR_GETSHMASK, "PR_GETSHMASK" },
185#endif
186#ifdef PR_GETNSHARE
187 { PR_GETNSHARE, "PR_GETNSHARE" },
188#endif
189#if defined(PR_SET_PDEATHSIG)
190 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
191#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000192#ifdef PR_COREPID
193 { PR_COREPID, "PR_COREPID" },
194#endif
195#ifdef PR_ATTACHADDRPERM
196 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
197#endif
198#ifdef PR_PTHREADEXIT
199 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
200#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000201#ifdef PR_SET_PDEATHSIG
202 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
203#endif
204#ifdef PR_GET_PDEATHSIG
205 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
206#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000207#ifdef PR_GET_UNALIGN
208 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
209#endif
210#ifdef PR_SET_UNALIGN
211 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
212#endif
213#ifdef PR_GET_KEEPCAPS
214 { PR_GET_KEEPCAPS, "PR_GET_KEEP_CAPS" },
215#endif
216#ifdef PR_SET_KEEPCAPS
217 { PR_SET_KEEPCAPS, "PR_SET_KEEP_CAPS" },
218#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000219 { 0, NULL },
220};
221
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000222
Roland McGratha4d48532005-06-08 20:45:28 +0000223static const char *
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000224unalignctl_string (unsigned int ctl)
225{
226 static char buf[16];
227
228 switch (ctl) {
229#ifdef PR_UNALIGN_NOPRINT
230 case PR_UNALIGN_NOPRINT:
231 return "NOPRINT";
232#endif
233#ifdef PR_UNALIGN_SIGBUS
234 case PR_UNALIGN_SIGBUS:
235 return "SIGBUS";
236#endif
237 default:
238 break;
239 }
240 sprintf(buf, "%x", ctl);
241 return buf;
242}
243
244
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000245int
246sys_prctl(tcp)
247struct tcb *tcp;
248{
249 int i;
250
251 if (entering(tcp)) {
252 printxval(prctl_options, tcp->u_arg[0], "PR_???");
253 switch (tcp->u_arg[0]) {
254#ifdef PR_GETNSHARE
255 case PR_GETNSHARE:
256 break;
257#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000258#ifdef PR_SET_DEATHSIG
259 case PR_GET_PDEATHSIG:
260 break;
261#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000262#ifdef PR_SET_UNALIGN
263 case PR_SET_UNALIGN:
264 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
265 break;
266#endif
267#ifdef PR_GET_UNALIGN
268 case PR_GET_UNALIGN:
269 tprintf(", %#lx", tcp->u_arg[1]);
270 break;
271#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000272 default:
273 for (i = 1; i < tcp->u_nargs; i++)
274 tprintf(", %#lx", tcp->u_arg[i]);
275 break;
276 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000277 } else {
278 switch (tcp->u_arg[0]) {
279#ifdef PR_GET_PDEATHSIG
280 case PR_GET_PDEATHSIG:
281 for (i=1; i<tcp->u_nargs; i++)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +0000282 tprintf(", %#lx", tcp->u_arg[i]);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000283 break;
284#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000285#ifdef PR_SET_UNALIGN
286 case PR_SET_UNALIGN:
287 break;
288#endif
289#ifdef PR_GET_UNALIGN
290 case PR_GET_UNALIGN:
291 {
292 int ctl;
293
294 umove(tcp, tcp->u_arg[1], &ctl);
295 tcp->auxstr = unalignctl_string(ctl);
296 return RVAL_STR;
297 }
298#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000299 default:
300 break;
301 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000302 }
303 return 0;
304}
305
306#endif /* HAVE_PRCTL */
307
308int
309sys_gethostid(tcp)
310struct tcb *tcp;
311{
312 if (exiting(tcp))
313 return RVAL_HEX;
314 return 0;
315}
316
317int
318sys_sethostname(tcp)
319struct tcb *tcp;
320{
321 if (entering(tcp)) {
322 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
323 tprintf(", %lu", tcp->u_arg[1]);
324 }
325 return 0;
326}
327
328int
329sys_gethostname(tcp)
330struct tcb *tcp;
331{
332 if (exiting(tcp)) {
333 if (syserror(tcp))
334 tprintf("%#lx", tcp->u_arg[0]);
335 else
336 printpath(tcp, tcp->u_arg[0]);
337 tprintf(", %lu", tcp->u_arg[1]);
338 }
339 return 0;
340}
341
342int
343sys_setdomainname(tcp)
344struct tcb *tcp;
345{
346 if (entering(tcp)) {
347 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
348 tprintf(", %lu", tcp->u_arg[1]);
349 }
350 return 0;
351}
352
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000353#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000354
355int
356sys_getdomainname(tcp)
357struct tcb *tcp;
358{
359 if (exiting(tcp)) {
360 if (syserror(tcp))
361 tprintf("%#lx", tcp->u_arg[0]);
362 else
363 printpath(tcp, tcp->u_arg[0]);
364 tprintf(", %lu", tcp->u_arg[1]);
365 }
366 return 0;
367}
368#endif /* !LINUX */
369
370int
371sys_exit(tcp)
372struct tcb *tcp;
373{
374 if (exiting(tcp)) {
375 fprintf(stderr, "_exit returned!\n");
376 return -1;
377 }
378 /* special case: we stop tracing this process, finish line now */
379 tprintf("%ld) ", tcp->u_arg[0]);
380 tabto(acolumn);
381 tprintf("= ?");
382 printtrailer(tcp);
383 return 0;
384}
385
386int
387internal_exit(tcp)
388struct tcb *tcp;
389{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000390 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000391 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000392#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000393# ifdef IA64
394 if (ia32) {
395 if (tcp->scno == 252)
396 tcp->flags |= TCB_GROUP_EXITING;
397 } else
398# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000399 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000400 tcp->flags |= TCB_GROUP_EXITING;
401#endif
402 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000403 return 0;
404}
405
Roland McGrathee9d4352002-12-18 04:16:10 +0000406/* TCP is creating a child we want to follow.
407 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
408 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
409static int
410fork_tcb(struct tcb *tcp)
411{
412 if (nprocs == tcbtabsize) {
Roland McGrath7b54a7a2004-06-04 01:50:45 +0000413 if (expand_tcbtab()) {
Roland McGrathee9d4352002-12-18 04:16:10 +0000414 tcp->flags &= ~TCB_FOLLOWFORK;
415 fprintf(stderr, "sys_fork: tcb table full\n");
Roland McGrathee9d4352002-12-18 04:16:10 +0000416 }
Roland McGrathee9d4352002-12-18 04:16:10 +0000417 }
418
419 tcp->flags |= TCB_FOLLOWFORK;
420 return 0;
421}
422
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000423#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000424
425int
426sys_fork(tcp)
427struct tcb *tcp;
428{
429 if (exiting(tcp)) {
430 if (getrval2(tcp)) {
431 tcp->auxstr = "child process";
432 return RVAL_UDECIMAL | RVAL_STR;
433 }
434 }
435 return 0;
436}
437
John Hughes4e36a812001-04-18 15:11:51 +0000438#if UNIXWARE > 2
439
440int
441sys_rfork(tcp)
442struct tcb *tcp;
443{
444 if (entering(tcp)) {
445 tprintf ("%ld", tcp->u_arg[0]);
446 }
447 else {
448 if (getrval2(tcp)) {
449 tcp->auxstr = "child process";
450 return RVAL_UDECIMAL | RVAL_STR;
451 }
452 }
453 return 0;
454}
455
456#endif
457
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000458int
459internal_fork(tcp)
460struct tcb *tcp;
461{
462 struct tcb *tcpchild;
463
464 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000465#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000466 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000467 return 0;
468#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000469 if (getrval2(tcp))
470 return 0;
471 if (!followfork)
472 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000473 if (fork_tcb(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000474 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000475 if (syserror(tcp))
476 return 0;
477 if ((tcpchild = alloctcb(tcp->u_rval)) == NULL) {
478 fprintf(stderr, "sys_fork: tcb table full\n");
479 return 0;
480 }
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000481 if (proc_open(tcpchild, 2) < 0)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000482 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000483 }
484 return 0;
485}
486
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000487#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000488
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000489#ifdef LINUX
490
491/* defines copied from linux/sched.h since we can't include that
492 * ourselves (it conflicts with *lots* of libc includes)
493 */
494#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
495#define CLONE_VM 0x00000100 /* set if VM shared between processes */
496#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
497#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
498#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000499#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000500#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
501#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
502#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000503#define CLONE_THREAD 0x00010000 /* Same thread group? */
504#define CLONE_NEWNS 0x00020000 /* New namespace group? */
505#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
506#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
507#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
508#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
509#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
510#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
511#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000512
Roland McGrathd9f816f2004-09-04 03:39:20 +0000513static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000514 { CLONE_VM, "CLONE_VM" },
515 { CLONE_FS, "CLONE_FS" },
516 { CLONE_FILES, "CLONE_FILES" },
517 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000518 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000519 { CLONE_PTRACE, "CLONE_PTRACE" },
520 { CLONE_VFORK, "CLONE_VFORK" },
521 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000522 { CLONE_THREAD, "CLONE_THREAD" },
523 { CLONE_NEWNS, "CLONE_NEWNS" },
524 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
525 { CLONE_SETTLS, "CLONE_SETTLS" },
526 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
527 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
528 { CLONE_DETACHED, "CLONE_DETACHED" },
529 { CLONE_UNTRACED, "CLONE_UNTRACED" },
530 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000531 { 0, NULL },
532};
533
Roland McGrath909875b2002-12-22 03:34:36 +0000534# ifdef I386
535# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000536# ifdef HAVE_STRUCT_USER_DESC
537# define modify_ldt_ldt_s user_desc
538# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000539extern void print_ldt_entry();
540# endif
541
Roland McGrath9677b3a2003-03-12 09:54:36 +0000542# if defined IA64
543# define ARG_FLAGS 0
544# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000545# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
546# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
547# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
548# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000549# elif defined S390 || defined S390X
Roland McGrath9677b3a2003-03-12 09:54:36 +0000550# define ARG_STACK 0
551# define ARG_FLAGS 1
552# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000553# define ARG_CTID 3
554# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000555# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000556# define ARG_FLAGS 0
557# define ARG_STACK 1
558# define ARG_PTID 2
559# define ARG_CTID 3
560# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000561# else
562# define ARG_FLAGS 0
563# define ARG_STACK 1
564# define ARG_PTID 2
565# define ARG_TLS 3
566# define ARG_CTID 4
567# endif
568
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000569int
570sys_clone(tcp)
571struct tcb *tcp;
572{
573 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000574 unsigned long flags = tcp->u_arg[ARG_FLAGS];
575 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
576# ifdef ARG_STACKSIZE
577 if (ARG_STACKSIZE != -1)
578 tprintf("stack_size=%#lx, ",
579 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000580# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000581 tprintf("flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000582 printflags(clone_flags, flags &~ CSIGNAL, NULL);
Roland McGrath984154d2003-05-23 01:08:42 +0000583 if ((flags & CSIGNAL) != 0)
584 tprintf("|%s", signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000585 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000586 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000587 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000588 if (flags & CLONE_PARENT_SETTID)
589 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000590 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000591# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000592 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000593 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000594 tprintf(", {entry_number:%d, ",
595 copy.entry_number);
596 if (!verbose(tcp))
597 tprintf("...}");
598 else
599 print_ldt_entry(&copy);
600 }
601 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000602# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000603 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000604 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000605 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
606 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000607 }
608 return 0;
609}
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000610#endif
611
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000612int
613sys_fork(tcp)
614struct tcb *tcp;
615{
616 if (exiting(tcp))
617 return RVAL_UDECIMAL;
618 return 0;
619}
620
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000621int
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000622change_syscall(tcp, new)
623struct tcb *tcp;
624int new;
625{
626#if defined(LINUX)
627#if defined(I386)
628 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000629 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000630 return -1;
631 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000632#elif defined(X86_64)
633 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000634 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000635 return -1;
636 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000637#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000638 if (ptrace(PTRACE_POKEUSER, tcp->pid,
639 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000640 return -1;
Roland McGrath43b286f2003-01-10 11:14:41 +0000641 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000642#elif defined(S390) || defined(S390X)
643 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
644 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
645 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000646 return 0;
647#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000648 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000649 return -1;
650 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000651#elif defined(SPARC) || defined(SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000652 struct regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000653 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
654 return -1;
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000655 regs.r_g1=new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000656 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
657 return -1;
658 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000659#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000660 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000661 return -1;
662 return 0;
663#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000664 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000665 return -1;
666 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000667#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000668 if (ia32) {
669 switch (new) {
670 case 2: break; /* x86 SYS_fork */
671 case SYS_clone: new = 120; break;
672 default:
673 fprintf(stderr, "%s: unexpected syscall %d\n",
674 __FUNCTION__, new);
675 return -1;
676 }
677 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
678 return -1;
679 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000680 return -1;
681 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000682#elif defined(HPPA)
683 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
684 return -1;
685 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000686#elif defined(SH)
Roland McGrathac971c22003-03-31 01:03:33 +0000687 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
Wichert Akkermanccef6372002-05-01 16:39:22 +0000688 return -1;
689 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000690#elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +0000691 /* Top half of reg encodes the no. of args n as 0x1n.
692 Assume 0 args as kernel never actually checks... */
693 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
694 0x100000 | new) < 0)
695 return -1;
696 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000697#elif defined(ARM)
698 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
699# ifndef PTRACE_SET_SYSCALL
700# define PTRACE_SET_SYSCALL 23
701# endif
702
703 if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new) != 0)
704 return -1;
705
706 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000707#else
708#warning Do not know how to handle change_syscall for this architecture
709#endif /* architecture */
710#endif /* LINUX */
711 return -1;
712}
713
Roland McGratha4d48532005-06-08 20:45:28 +0000714#if 0
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000715int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000716setarg(tcp, argnum)
717 struct tcb *tcp;
718 int argnum;
719{
720#if defined (IA64)
721 {
722 unsigned long *bsp, *ap;
723
724 if (upeek(tcp->pid, PT_AR_BSP, (long *) &bsp) , 0)
725 return -1;
726
727 ap = ia64_rse_skip_regs(bsp, argnum);
728 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000729 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000730 if (errno)
731 return -1;
732
733 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000734#elif defined(I386)
735 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000736 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000737 if (errno)
738 return -1;
739 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000740#elif defined(X86_64)
741 {
742 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
743 if (errno)
744 return -1;
745 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000746#elif defined(POWERPC)
747#ifndef PT_ORIG_R3
748#define PT_ORIG_R3 34
749#endif
750 {
751 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000752 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000753 tcp->u_arg[argnum]);
754 if (errno)
755 return -1;
756 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000757#elif defined(MIPS)
758 {
759 errno = 0;
760 if (argnum < 4)
761 ptrace(PTRACE_POKEUSER, tcp->pid,
762 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
763 else {
764 unsigned long *sp;
765
766 if (upeek(tcp->pid, REG_SP, (long *) &sp) , 0)
767 return -1;
768
769 ptrace(PTRACE_POKEDATA, tcp->pid,
770 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
771 }
772 if (errno)
773 return -1;
774 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000775#elif defined(S390) || defined(S390X)
776 {
777 if(argnum <= 5)
778 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000779 (char *) (argnum==0 ? PT_ORIGGPR2 :
780 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000781 tcp->u_arg[argnum]);
782 else
783 return -E2BIG;
784 if (errno)
785 return -1;
786 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000787#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000788# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000789#endif
790 return 0;
791}
Roland McGratha4d48532005-06-08 20:45:28 +0000792#endif
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000793
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000794#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000795int
796internal_clone(tcp)
797struct tcb *tcp;
798{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000799 struct tcb *tcpchild;
800 int pid;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000801 if (entering(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000802 if (!followfork)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000803 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000804 if (fork_tcb(tcp))
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000805 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000806 if (setbpt(tcp) < 0)
807 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000808 } else {
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000809 int bpt = tcp->flags & TCB_BPTSET;
810
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000811 if (!(tcp->flags & TCB_FOLLOWFORK))
812 return 0;
813
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000814 if (syserror(tcp)) {
815 if (bpt)
816 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000817 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000818 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000819
820 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000821
822#ifdef CLONE_PTRACE /* See new setbpt code. */
823 tcpchild = pid2tcb(pid);
824 if (tcpchild != NULL) {
825 /* The child already reported its startup trap
826 before the parent reported its syscall return. */
827 if ((tcpchild->flags
828 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
829 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
830 fprintf(stderr, "\
831[preattached child %d of %d in weird state!]\n",
832 pid, tcp->pid);
833 }
834 else
835#endif
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000836 if ((tcpchild = alloctcb(pid)) == NULL) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000837 if (bpt)
838 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000839 fprintf(stderr, " [tcb table full]\n");
840 kill(pid, SIGKILL); /* XXX */
841 return 0;
842 }
843
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000844#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000845 /* Attach to the new child */
846 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000847 if (bpt)
848 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000849 perror("PTRACE_ATTACH");
850 fprintf(stderr, "Too late?\n");
851 droptcb(tcpchild);
852 return 0;
853 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000854#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000855
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000856 if (bpt)
857 clearbpt(tcp);
858
Ulrich Drepper90512f01999-12-24 07:22:25 +0000859 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000860 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000861 if (bpt) {
862 tcpchild->flags |= TCB_BPTSET;
863 tcpchild->baddr = tcp->baddr;
864 memcpy(tcpchild->inst, tcp->inst,
865 sizeof tcpchild->inst);
866 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000867 tcpchild->parent = tcp;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000868 tcp->nchildren++;
869 if (tcpchild->flags & TCB_SUSPENDED) {
870 /* The child was born suspended, due to our having
871 forced CLONE_PTRACE. */
872 if (bpt)
873 clearbpt(tcpchild);
874
875 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
876 if (ptrace(PTRACE_SYSCALL, pid, (char *) 1, 0) < 0) {
877 perror("resume: ptrace(PTRACE_SYSCALL, ...)");
878 return -1;
879 }
880
881 if (!qflag)
882 fprintf(stderr, "\
883Process %u resumed (parent %d ready)\n",
884 pid, tcp->pid);
885 }
886 else {
887 newoutf(tcpchild);
888 if (!qflag)
889 fprintf(stderr, "Process %d attached\n", pid);
890 }
891
892#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000893 {
894 /*
895 * Save the flags used in this call,
896 * in case we point TCP to our parent below.
897 */
898 int call_flags = tcp->u_arg[ARG_FLAGS];
899 if ((tcp->flags & TCB_CLONE_THREAD) &&
900 tcp->parent != NULL) {
901 /* The parent in this clone is itself a
902 thread belonging to another process.
903 There is no meaning to the parentage
904 relationship of the new child with the
905 thread, only with the process. We
906 associate the new thread with our
907 parent. Since this is done for every
908 new thread, there will never be a
909 TCB_CLONE_THREAD process that has
910 children. */
911 --tcp->nchildren;
912 tcp = tcp->parent;
913 tcpchild->parent = tcp;
914 ++tcp->nchildren;
915 }
916 if (call_flags & CLONE_THREAD) {
917 tcpchild->flags |= TCB_CLONE_THREAD;
918 ++tcp->nclone_threads;
919 }
920 if (call_flags & CLONE_DETACHED) {
921 tcpchild->flags |= TCB_CLONE_DETACHED;
922 ++tcp->nclone_detached;
923 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000924 }
925#endif
926
927 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000928 return 0;
929}
930#endif
931
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000932int
933internal_fork(tcp)
934struct tcb *tcp;
935{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000936#ifdef LINUX
937 /* We do special magic with clone for any clone or fork. */
938 return internal_clone(tcp);
939#else
940
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000941 struct tcb *tcpchild;
942 int pid;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000943 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000944
945#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000946 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000947 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000948 if (!followvfork ||
Pavel Machek9a9f10b2000-02-01 16:22:52 +0000949 change_syscall(tcp, SYS_fork) < 0)
Nate Sammonsccd8f211999-03-29 22:57:54 +0000950 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000951 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000952#endif
953 if (entering(tcp)) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000954 if (!followfork || dont_follow)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000955 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000956 if (fork_tcb(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000957 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000958 if (setbpt(tcp) < 0)
959 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000960 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000961 else {
962 int bpt = tcp->flags & TCB_BPTSET;
963
964 if (!(tcp->flags & TCB_FOLLOWFORK))
965 return 0;
966 if (bpt)
967 clearbpt(tcp);
968
969 if (syserror(tcp))
970 return 0;
971
972 pid = tcp->u_rval;
973 if ((tcpchild = alloctcb(pid)) == NULL) {
974 fprintf(stderr, " [tcb table full]\n");
975 kill(pid, SIGKILL); /* XXX */
976 return 0;
977 }
978#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000979#ifdef HPPA
980 /* The child must have run before it can be attached. */
981 /* This must be a bug in the parisc kernel, but I havn't
982 * identified it yet. Seems to be an issue associated
983 * with attaching to a process (which sends it a signal)
984 * before that process has ever been scheduled. When
985 * debugging, I started seeing crashes in
986 * arch/parisc/kernel/signal.c:do_signal(), apparently
987 * caused by r8 getting corrupt over the dequeue_signal()
988 * call. Didn't make much sense though...
989 */
990 {
991 struct timeval tv;
992 tv.tv_sec = 0;
993 tv.tv_usec = 10000;
994 select(0, NULL, NULL, NULL, &tv);
995 }
996#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000997 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
998 perror("PTRACE_ATTACH");
999 fprintf(stderr, "Too late?\n");
1000 droptcb(tcpchild);
1001 return 0;
1002 }
1003#endif /* LINUX */
1004#ifdef SUNOS4
1005#ifdef oldway
1006 /* The child must have run before it can be attached. */
1007 {
1008 struct timeval tv;
1009 tv.tv_sec = 0;
1010 tv.tv_usec = 10000;
1011 select(0, NULL, NULL, NULL, &tv);
1012 }
1013 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1014 perror("PTRACE_ATTACH");
1015 fprintf(stderr, "Too late?\n");
1016 droptcb(tcpchild);
1017 return 0;
1018 }
1019#else /* !oldway */
1020 /* Try to catch the new process as soon as possible. */
1021 {
1022 int i;
1023 for (i = 0; i < 1024; i++)
1024 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1025 break;
1026 if (i == 1024) {
1027 perror("PTRACE_ATTACH");
1028 fprintf(stderr, "Too late?\n");
1029 droptcb(tcpchild);
1030 return 0;
1031 }
1032 }
1033#endif /* !oldway */
1034#endif /* SUNOS4 */
1035 tcpchild->flags |= TCB_ATTACHED;
1036 /* Child has BPT too, must be removed on first occasion */
1037 if (bpt) {
1038 tcpchild->flags |= TCB_BPTSET;
1039 tcpchild->baddr = tcp->baddr;
1040 memcpy(tcpchild->inst, tcp->inst,
1041 sizeof tcpchild->inst);
1042 }
1043 newoutf(tcpchild);
1044 tcpchild->parent = tcp;
1045 tcp->nchildren++;
1046 if (!qflag)
1047 fprintf(stderr, "Process %d attached\n", pid);
1048 }
1049 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001050#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001051}
1052
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001053#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001054
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001055#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001056
1057int
1058sys_vfork(tcp)
1059struct tcb *tcp;
1060{
1061 if (exiting(tcp))
1062 return RVAL_UDECIMAL;
1063 return 0;
1064}
1065
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001066#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001067
1068#ifndef LINUX
1069
1070static char idstr[16];
1071
1072int
1073sys_getpid(tcp)
1074struct tcb *tcp;
1075{
1076 if (exiting(tcp)) {
1077 sprintf(idstr, "ppid %lu", getrval2(tcp));
1078 tcp->auxstr = idstr;
1079 return RVAL_STR;
1080 }
1081 return 0;
1082}
1083
1084int
1085sys_getuid(tcp)
1086struct tcb *tcp;
1087{
1088 if (exiting(tcp)) {
1089 sprintf(idstr, "euid %lu", getrval2(tcp));
1090 tcp->auxstr = idstr;
1091 return RVAL_STR;
1092 }
1093 return 0;
1094}
1095
1096int
1097sys_getgid(tcp)
1098struct tcb *tcp;
1099{
1100 if (exiting(tcp)) {
1101 sprintf(idstr, "egid %lu", getrval2(tcp));
1102 tcp->auxstr = idstr;
1103 return RVAL_STR;
1104 }
1105 return 0;
1106}
1107
1108#endif /* !LINUX */
1109
1110#ifdef LINUX
1111
1112int
1113sys_setuid(tcp)
1114struct tcb *tcp;
1115{
1116 if (entering(tcp)) {
1117 tprintf("%u", (uid_t) tcp->u_arg[0]);
1118 }
1119 return 0;
1120}
1121
1122int
1123sys_setgid(tcp)
1124struct tcb *tcp;
1125{
1126 if (entering(tcp)) {
1127 tprintf("%u", (gid_t) tcp->u_arg[0]);
1128 }
1129 return 0;
1130}
1131
1132int
1133sys_getresuid(tcp)
1134 struct tcb *tcp;
1135{
1136 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001137 __kernel_uid_t uid;
1138 if (syserror(tcp))
1139 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1140 tcp->u_arg[1], tcp->u_arg[2]);
1141 else {
1142 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1143 tprintf("%#lx, ", tcp->u_arg[0]);
1144 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001145 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001146 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1147 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001148 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001149 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001150 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1151 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001152 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001153 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001154 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001155 }
1156 return 0;
1157}
1158
1159int
1160sys_getresgid(tcp)
1161struct tcb *tcp;
1162{
1163 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001164 __kernel_gid_t gid;
1165 if (syserror(tcp))
1166 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1167 tcp->u_arg[1], tcp->u_arg[2]);
1168 else {
1169 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1170 tprintf("%#lx, ", tcp->u_arg[0]);
1171 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001172 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001173 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1174 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001175 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001176 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001177 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1178 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001179 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001180 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001181 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001182 }
1183 return 0;
1184}
1185
1186#endif /* LINUX */
1187
1188int
1189sys_setreuid(tcp)
1190struct tcb *tcp;
1191{
1192 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001193 printuid("", tcp->u_arg[0]);
1194 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001195 }
1196 return 0;
1197}
1198
1199int
1200sys_setregid(tcp)
1201struct tcb *tcp;
1202{
1203 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001204 printuid("", tcp->u_arg[0]);
1205 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001206 }
1207 return 0;
1208}
1209
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001210#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001211int
1212sys_setresuid(tcp)
1213 struct tcb *tcp;
1214{
1215 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001216 printuid("", tcp->u_arg[0]);
1217 printuid(", ", tcp->u_arg[1]);
1218 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001219 }
1220 return 0;
1221}
1222int
1223sys_setresgid(tcp)
1224 struct tcb *tcp;
1225{
1226 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001227 printuid("", tcp->u_arg[0]);
1228 printuid(", ", tcp->u_arg[1]);
1229 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001230 }
1231 return 0;
1232}
1233
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001234#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001235
1236int
1237sys_setgroups(tcp)
1238struct tcb *tcp;
1239{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001240 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001241 unsigned long len, size, start, cur, end, abbrev_end;
1242 GETGROUPS_T gid;
1243 int failed = 0;
1244
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001245 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001246 tprintf("%lu, ", len);
1247 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001248 tprintf("[]");
1249 return 0;
1250 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001251 start = tcp->u_arg[1];
1252 if (start == 0) {
1253 tprintf("NULL");
1254 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001255 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001256 size = len * sizeof(gid);
1257 end = start + size;
1258 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1259 tprintf("%#lx", start);
1260 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001261 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001262 if (abbrev(tcp)) {
1263 abbrev_end = start + max_strlen * sizeof(gid);
1264 if (abbrev_end < start)
1265 abbrev_end = end;
1266 } else {
1267 abbrev_end = end;
1268 }
1269 tprintf("[");
1270 for (cur = start; cur < end; cur += sizeof(gid)) {
1271 if (cur > start)
1272 tprintf(", ");
1273 if (cur >= abbrev_end) {
1274 tprintf("...");
1275 break;
1276 }
1277 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1278 tprintf("?");
1279 failed = 1;
1280 break;
1281 }
1282 tprintf("%lu", (unsigned long) gid);
1283 }
1284 tprintf("]");
1285 if (failed)
1286 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001287 }
1288 return 0;
1289}
1290
1291int
1292sys_getgroups(tcp)
1293struct tcb *tcp;
1294{
Roland McGrathaa524c82005-06-01 19:22:06 +00001295 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001296
1297 if (entering(tcp)) {
1298 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001299 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001300 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001301 unsigned long size, start, cur, end, abbrev_end;
1302 GETGROUPS_T gid;
1303 int failed = 0;
1304
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001305 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001306 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001307 tprintf("[]");
1308 return 0;
1309 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001310 start = tcp->u_arg[1];
1311 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001312 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001313 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001314 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001315 if (tcp->u_arg[0] == 0) {
1316 tprintf("%#lx", start);
1317 return 0;
1318 }
1319 size = len * sizeof(gid);
1320 end = start + size;
1321 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1322 size / sizeof(gid) != len || end < start) {
1323 tprintf("%#lx", start);
1324 return 0;
1325 }
1326 if (abbrev(tcp)) {
1327 abbrev_end = start + max_strlen * sizeof(gid);
1328 if (abbrev_end < start)
1329 abbrev_end = end;
1330 } else {
1331 abbrev_end = end;
1332 }
1333 tprintf("[");
1334 for (cur = start; cur < end; cur += sizeof(gid)) {
1335 if (cur > start)
1336 tprintf(", ");
1337 if (cur >= abbrev_end) {
1338 tprintf("...");
1339 break;
1340 }
1341 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1342 tprintf("?");
1343 failed = 1;
1344 break;
1345 }
1346 tprintf("%lu", (unsigned long) gid);
1347 }
1348 tprintf("]");
1349 if (failed)
1350 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001351 }
1352 return 0;
1353}
1354
Roland McGrath83bd47a2003-11-13 22:32:26 +00001355#ifdef LINUX
1356int
1357sys_setgroups32(tcp)
1358struct tcb *tcp;
1359{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001360 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001361 unsigned long len, size, start, cur, end, abbrev_end;
1362 GETGROUPS32_T gid;
1363 int failed = 0;
1364
Roland McGrath83bd47a2003-11-13 22:32:26 +00001365 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001366 tprintf("%lu, ", len);
1367 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001368 tprintf("[]");
1369 return 0;
1370 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001371 start = tcp->u_arg[1];
1372 if (start == 0) {
1373 tprintf("NULL");
1374 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001375 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001376 size = len * sizeof(gid);
1377 end = start + size;
1378 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1379 tprintf("%#lx", start);
1380 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001381 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001382 if (abbrev(tcp)) {
1383 abbrev_end = start + max_strlen * sizeof(gid);
1384 if (abbrev_end < start)
1385 abbrev_end = end;
1386 } else {
1387 abbrev_end = end;
1388 }
1389 tprintf("[");
1390 for (cur = start; cur < end; cur += sizeof(gid)) {
1391 if (cur > start)
1392 tprintf(", ");
1393 if (cur >= abbrev_end) {
1394 tprintf("...");
1395 break;
1396 }
1397 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1398 tprintf("?");
1399 failed = 1;
1400 break;
1401 }
1402 tprintf("%lu", (unsigned long) gid);
1403 }
1404 tprintf("]");
1405 if (failed)
1406 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001407 }
1408 return 0;
1409}
1410
1411int
1412sys_getgroups32(tcp)
1413struct tcb *tcp;
1414{
Roland McGrathaa524c82005-06-01 19:22:06 +00001415 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001416
1417 if (entering(tcp)) {
1418 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001419 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001420 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001421 unsigned long size, start, cur, end, abbrev_end;
1422 GETGROUPS32_T gid;
1423 int failed = 0;
1424
Roland McGrath83bd47a2003-11-13 22:32:26 +00001425 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001426 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001427 tprintf("[]");
1428 return 0;
1429 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001430 start = tcp->u_arg[1];
1431 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001432 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001433 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001434 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001435 size = len * sizeof(gid);
1436 end = start + size;
1437 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1438 size / sizeof(gid) != len || end < start) {
1439 tprintf("%#lx", start);
1440 return 0;
1441 }
1442 if (abbrev(tcp)) {
1443 abbrev_end = start + max_strlen * sizeof(gid);
1444 if (abbrev_end < start)
1445 abbrev_end = end;
1446 } else {
1447 abbrev_end = end;
1448 }
1449 tprintf("[");
1450 for (cur = start; cur < end; cur += sizeof(gid)) {
1451 if (cur > start)
1452 tprintf(", ");
1453 if (cur >= abbrev_end) {
1454 tprintf("...");
1455 break;
1456 }
1457 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1458 tprintf("?");
1459 failed = 1;
1460 break;
1461 }
1462 tprintf("%lu", (unsigned long) gid);
1463 }
1464 tprintf("]");
1465 if (failed)
1466 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001467 }
1468 return 0;
1469}
1470#endif /* LINUX */
1471
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001472int
1473sys_setpgrp(tcp)
1474struct tcb *tcp;
1475{
1476 if (entering(tcp)) {
1477#ifndef SVR4
1478 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1479#endif /* !SVR4 */
1480 }
1481 return 0;
1482}
1483
1484int
1485sys_getpgrp(tcp)
1486struct tcb *tcp;
1487{
1488 if (entering(tcp)) {
1489#ifndef SVR4
1490 tprintf("%lu", tcp->u_arg[0]);
1491#endif /* !SVR4 */
1492 }
1493 return 0;
1494}
1495
1496int
1497sys_getsid(tcp)
1498struct tcb *tcp;
1499{
1500 if (entering(tcp)) {
1501 tprintf("%lu", tcp->u_arg[0]);
1502 }
1503 return 0;
1504}
1505
1506int
1507sys_setsid(tcp)
1508struct tcb *tcp;
1509{
1510 return 0;
1511}
1512
1513int
1514sys_getpgid(tcp)
1515struct tcb *tcp;
1516{
1517 if (entering(tcp)) {
1518 tprintf("%lu", tcp->u_arg[0]);
1519 }
1520 return 0;
1521}
1522
1523int
1524sys_setpgid(tcp)
1525struct tcb *tcp;
1526{
1527 if (entering(tcp)) {
1528 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1529 }
1530 return 0;
1531}
1532
John Hughesc61eb3d2002-05-17 11:37:50 +00001533#if UNIXWARE >= 2
1534
1535#include <sys/privilege.h>
1536
1537
Roland McGrathd9f816f2004-09-04 03:39:20 +00001538static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001539 { SETPRV, "SETPRV" },
1540 { CLRPRV, "CLRPRV" },
1541 { PUTPRV, "PUTPRV" },
1542 { GETPRV, "GETPRV" },
1543 { CNTPRV, "CNTPRV" },
1544 { 0, NULL },
1545};
1546
1547
Roland McGrathd9f816f2004-09-04 03:39:20 +00001548static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001549 { P_OWNER, "P_OWNER" },
1550 { P_AUDIT, "P_AUDIT" },
1551 { P_COMPAT, "P_COMPAT" },
1552 { P_DACREAD, "P_DACREAD" },
1553 { P_DACWRITE, "P_DACWRITE" },
1554 { P_DEV, "P_DEV" },
1555 { P_FILESYS, "P_FILESYS" },
1556 { P_MACREAD, "P_MACREAD" },
1557 { P_MACWRITE, "P_MACWRITE" },
1558 { P_MOUNT, "P_MOUNT" },
1559 { P_MULTIDIR, "P_MULTIDIR" },
1560 { P_SETPLEVEL, "P_SETPLEVEL" },
1561 { P_SETSPRIV, "P_SETSPRIV" },
1562 { P_SETUID, "P_SETUID" },
1563 { P_SYSOPS, "P_SYSOPS" },
1564 { P_SETUPRIV, "P_SETUPRIV" },
1565 { P_DRIVER, "P_DRIVER" },
1566 { P_RTIME, "P_RTIME" },
1567 { P_MACUPGRADE, "P_MACUPGRADE" },
1568 { P_FSYSRANGE, "P_FSYSRANGE" },
1569 { P_SETFLEVEL, "P_SETFLEVEL" },
1570 { P_AUDITWR, "P_AUDITWR" },
1571 { P_TSHAR, "P_TSHAR" },
1572 { P_PLOCK, "P_PLOCK" },
1573 { P_CORE, "P_CORE" },
1574 { P_LOADMOD, "P_LOADMOD" },
1575 { P_BIND, "P_BIND" },
1576 { P_ALLPRIVS, "P_ALLPRIVS" },
1577 { 0, NULL },
1578};
1579
1580
Roland McGrathd9f816f2004-09-04 03:39:20 +00001581static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001582 { PS_FIX, "PS_FIX" },
1583 { PS_INH, "PS_INH" },
1584 { PS_MAX, "PS_MAX" },
1585 { PS_WKG, "PS_WKG" },
1586 { 0, NULL },
1587};
1588
1589
1590static void
1591printpriv(tcp, addr, len, opt)
1592struct tcb *tcp;
1593long addr;
1594int len;
Roland McGrathd9f816f2004-09-04 03:39:20 +00001595const struct xlat *opt;
John Hughesc61eb3d2002-05-17 11:37:50 +00001596{
1597 priv_t buf [128];
1598 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1599 int dots = len > max;
1600 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001601
John Hughesc61eb3d2002-05-17 11:37:50 +00001602 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001603
John Hughesc61eb3d2002-05-17 11:37:50 +00001604 if (len <= 0 ||
1605 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1606 {
1607 tprintf ("%#lx", addr);
1608 return;
1609 }
1610
1611 tprintf ("[");
1612
1613 for (i = 0; i < len; ++i) {
1614 char *t, *p;
1615
1616 if (i) tprintf (", ");
1617
1618 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1619 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1620 {
1621 tprintf ("%s|%s", t, p);
1622 }
1623 else {
1624 tprintf ("%#lx", buf [i]);
1625 }
1626 }
1627
1628 if (dots) tprintf (" ...");
1629
1630 tprintf ("]");
1631}
1632
1633
1634int
1635sys_procpriv(tcp)
1636struct tcb *tcp;
1637{
1638 if (entering(tcp)) {
1639 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1640 switch (tcp->u_arg[0]) {
1641 case CNTPRV:
1642 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1643 break;
1644
1645 case GETPRV:
1646 break;
1647
1648 default:
1649 tprintf (", ");
1650 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1651 tprintf (", %ld", tcp->u_arg[2]);
1652 }
1653 }
1654 else if (tcp->u_arg[0] == GETPRV) {
1655 if (syserror (tcp)) {
1656 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1657 }
1658 else {
1659 tprintf (", ");
1660 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1661 tprintf (", %ld", tcp->u_arg[2]);
1662 }
1663 }
Roland McGrath5a223472002-12-15 23:58:26 +00001664
John Hughesc61eb3d2002-05-17 11:37:50 +00001665 return 0;
1666}
1667
1668#endif
1669
1670
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001671static void
1672printargv(tcp, addr)
1673struct tcb *tcp;
1674long addr;
1675{
1676 char *cp;
1677 char *sep;
1678 int max = max_strlen / 2;
1679
1680 for (sep = ""; --max >= 0; sep = ", ") {
1681 if (!abbrev(tcp))
1682 max++;
1683 if (umove(tcp, addr, &cp) < 0) {
1684 tprintf("%#lx", addr);
1685 return;
1686 }
1687 if (cp == 0)
1688 break;
1689 tprintf(sep);
1690 printstr(tcp, (long) cp, -1);
1691 addr += sizeof(char *);
1692 }
1693 if (cp)
1694 tprintf(", ...");
1695}
1696
1697static void
1698printargc(fmt, tcp, addr)
1699char *fmt;
1700struct tcb *tcp;
1701long addr;
1702{
1703 int count;
1704 char *cp;
1705
1706 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1707 addr += sizeof(char *);
1708 }
1709 tprintf(fmt, count, count == 1 ? "" : "s");
1710}
1711
1712int
1713sys_execv(tcp)
1714struct tcb *tcp;
1715{
1716 if (entering(tcp)) {
1717 printpath(tcp, tcp->u_arg[0]);
1718 if (!verbose(tcp))
1719 tprintf(", %#lx", tcp->u_arg[1]);
1720#if 0
1721 else if (abbrev(tcp))
1722 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1723#endif
1724 else {
1725 tprintf(", [");
1726 printargv(tcp, tcp->u_arg[1]);
1727 tprintf("]");
1728 }
1729 }
1730 return 0;
1731}
1732
1733int
1734sys_execve(tcp)
1735struct tcb *tcp;
1736{
1737 if (entering(tcp)) {
1738 printpath(tcp, tcp->u_arg[0]);
1739 if (!verbose(tcp))
1740 tprintf(", %#lx", tcp->u_arg[1]);
1741#if 0
1742 else if (abbrev(tcp))
1743 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1744#endif
1745 else {
1746 tprintf(", [");
1747 printargv(tcp, tcp->u_arg[1]);
1748 tprintf("]");
1749 }
1750 if (!verbose(tcp))
1751 tprintf(", %#lx", tcp->u_arg[2]);
1752 else if (abbrev(tcp))
1753 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1754 else {
1755 tprintf(", [");
1756 printargv(tcp, tcp->u_arg[2]);
1757 tprintf("]");
1758 }
1759 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001760 return 0;
1761}
1762
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001763#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001764
1765int sys_rexecve(tcp)
1766struct tcb *tcp;
1767{
1768 if (entering (tcp)) {
1769 sys_execve (tcp);
1770 tprintf (", %ld", tcp->u_arg[3]);
1771 }
1772 return 0;
1773}
1774
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001775#endif
John Hughes4e36a812001-04-18 15:11:51 +00001776
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001777int
1778internal_exec(tcp)
1779struct tcb *tcp;
1780{
1781#ifdef SUNOS4
1782 if (exiting(tcp) && !syserror(tcp) && followfork)
1783 fixvfork(tcp);
1784#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001785#if defined LINUX && defined TCB_WAITEXECVE
1786 if (exiting(tcp) && syserror(tcp))
1787 tcp->flags &= ~TCB_WAITEXECVE;
1788 else
1789 tcp->flags |= TCB_WAITEXECVE;
1790#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001791 return 0;
1792}
1793
1794#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001795#ifndef __WNOTHREAD
1796#define __WNOTHREAD 0x20000000
1797#endif
1798#ifndef __WALL
1799#define __WALL 0x40000000
1800#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001801#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001802#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001803#endif
1804#endif /* LINUX */
1805
Roland McGrathd9f816f2004-09-04 03:39:20 +00001806static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001807 { WNOHANG, "WNOHANG" },
1808#ifndef WSTOPPED
1809 { WUNTRACED, "WUNTRACED" },
1810#endif
1811#ifdef WEXITED
1812 { WEXITED, "WEXITED" },
1813#endif
1814#ifdef WTRAPPED
1815 { WTRAPPED, "WTRAPPED" },
1816#endif
1817#ifdef WSTOPPED
1818 { WSTOPPED, "WSTOPPED" },
1819#endif
1820#ifdef WCONTINUED
1821 { WCONTINUED, "WCONTINUED" },
1822#endif
1823#ifdef WNOWAIT
1824 { WNOWAIT, "WNOWAIT" },
1825#endif
1826#ifdef __WCLONE
1827 { __WCLONE, "__WCLONE" },
1828#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001829#ifdef __WALL
1830 { __WALL, "__WALL" },
1831#endif
1832#ifdef __WNOTHREAD
1833 { __WNOTHREAD, "__WNOTHREAD" },
1834#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001835 { 0, NULL },
1836};
1837
Roland McGrath5e02a572004-10-19 23:33:47 +00001838#if !defined WCOREFLAG && defined WCOREFLG
1839# define WCOREFLAG WCOREFLG
1840#endif
1841#ifndef WCOREFLAG
1842#define WCOREFLAG 0x80
1843#endif
1844
1845#ifndef W_STOPCODE
1846#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1847#endif
1848#ifndef W_EXITCODE
1849#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1850#endif
1851
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001852static int
1853printstatus(status)
1854int status;
1855{
1856 int exited = 0;
1857
1858 /*
1859 * Here is a tricky presentation problem. This solution
1860 * is still not entirely satisfactory but since there
1861 * are no wait status constructors it will have to do.
1862 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001863 if (WIFSTOPPED(status)) {
1864 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001865 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001866 status &= ~W_STOPCODE(WSTOPSIG(status));
1867 }
1868 else if (WIFSIGNALED(status)) {
1869 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001870 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001871 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001872 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1873 }
1874 else if (WIFEXITED(status)) {
1875 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001876 WEXITSTATUS(status));
1877 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001878 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001879 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001880 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001881 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001882 return 0;
1883 }
1884
1885 if (status == 0)
1886 tprintf("]");
1887 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001888 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001889
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001890 return exited;
1891}
1892
1893static int
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001894printwaitn(tcp, n, bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001895struct tcb *tcp;
1896int n;
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001897int bitness;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001898{
1899 int status;
1900 int exited = 0;
1901
1902 if (entering(tcp)) {
1903 tprintf("%ld, ", tcp->u_arg[0]);
1904 } else {
1905 /* status */
1906 if (!tcp->u_arg[1])
1907 tprintf("NULL");
1908 else if (syserror(tcp) || tcp->u_rval == 0)
1909 tprintf("%#lx", tcp->u_arg[1]);
1910 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1911 tprintf("[?]");
1912 else
1913 exited = printstatus(status);
1914 /* options */
1915 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001916 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001917 if (n == 4) {
1918 tprintf(", ");
1919 /* usage */
1920 if (!tcp->u_arg[3])
1921 tprintf("NULL");
1922#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001923 else if (tcp->u_rval > 0) {
1924#ifdef LINUX_64BIT
1925 if (bitness)
1926 printrusage32(tcp, tcp->u_arg[3]);
1927 else
1928#endif
1929 printrusage(tcp, tcp->u_arg[3]);
1930 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001931#endif /* LINUX */
1932#ifdef SUNOS4
1933 else if (tcp->u_rval > 0 && exited)
1934 printrusage(tcp, tcp->u_arg[3]);
1935#endif /* SUNOS4 */
1936 else
1937 tprintf("%#lx", tcp->u_arg[3]);
1938 }
1939 }
1940 return 0;
1941}
1942
1943int
Roland McGrathc74c0b72004-09-01 19:39:46 +00001944internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001945struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00001946int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001947{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001948 int got_kids;
1949
1950#ifdef TCB_CLONE_THREAD
1951 if (tcp->flags & TCB_CLONE_THREAD)
1952 /* The children we wait for are our parent's children. */
1953 got_kids = (tcp->parent->nchildren
1954 > tcp->parent->nclone_detached);
1955 else
1956 got_kids = (tcp->nchildren > tcp->nclone_detached);
1957#else
1958 got_kids = tcp->nchildren > 0;
1959#endif
1960
1961 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001962 /* There are children that this parent should block for.
1963 But ptrace made us the parent of the traced children
1964 and the real parent will get ECHILD from the wait call.
1965
1966 XXX If we attached with strace -f -p PID, then there
1967 may be untraced dead children the parent could be reaping
1968 now, but we make him block. */
1969
1970 /* ??? WTA: fix bug with hanging children */
1971
Roland McGrathc74c0b72004-09-01 19:39:46 +00001972 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001973 /*
1974 * There are traced children. We'll make the parent
1975 * block to avoid a false ECHILD error due to our
1976 * ptrace having stolen the children. However,
1977 * we shouldn't block if there are zombies to reap.
1978 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1979 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001980 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001981 if (tcp->nzombies > 0 &&
1982 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001983 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001984 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001985 if (tcp->u_arg[0] > 0) {
1986 /*
1987 * If the parent waits for a specified child
1988 * PID, then it must get ECHILD right away
1989 * if that PID is not one of its children.
1990 * Make sure that the requested PID matches
1991 * one of the parent's children that we are
1992 * tracing, and don't suspend it otherwise.
1993 */
1994 if (child == NULL)
1995 child = pid2tcb(tcp->u_arg[0]);
1996 if (child == NULL || child->parent != (
1997#ifdef TCB_CLONE_THREAD
1998 (tcp->flags & TCB_CLONE_THREAD)
1999 ? tcp->parent :
2000#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002001 tcp) ||
2002 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002003 return 0;
2004 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002005 tcp->flags |= TCB_SUSPENDED;
2006 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002007#ifdef TCB_CLONE_THREAD
2008 if (tcp->flags & TCB_CLONE_THREAD)
2009 tcp->parent->nclone_waiting++;
2010#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002011 }
2012 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002013 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002014 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002015 /* We must force a fake result of 0 instead of
2016 the ECHILD error. */
2017 extern int force_result();
2018 return force_result(tcp, 0, 0);
2019 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002020 }
Roland McGrath09623452003-05-23 02:27:13 +00002021 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2022 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2023 /*
2024 * We just reaped a child we don't know about,
2025 * presumably a zombie we already droptcb'd.
2026 */
2027 tcp->nzombies--;
2028 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002029 return 0;
2030}
2031
2032#ifdef SVR4
2033
2034int
2035sys_wait(tcp)
2036struct tcb *tcp;
2037{
2038 if (exiting(tcp)) {
2039 /* The library wrapper stuffs this into the user variable. */
2040 if (!syserror(tcp))
2041 printstatus(getrval2(tcp));
2042 }
2043 return 0;
2044}
2045
2046#endif /* SVR4 */
2047
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002048#ifdef FREEBSD
2049int
2050sys_wait(tcp)
2051struct tcb *tcp;
2052{
2053 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002054
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002055 if (exiting(tcp)) {
2056 if (!syserror(tcp)) {
2057 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2058 tprintf("%#lx", tcp->u_arg[0]);
2059 else
2060 printstatus(status);
2061 }
2062 }
2063 return 0;
2064}
2065#endif
2066
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002067int
2068sys_waitpid(tcp)
2069struct tcb *tcp;
2070{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002071 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002072}
2073
2074int
2075sys_wait4(tcp)
2076struct tcb *tcp;
2077{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002078 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002079}
2080
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002081#ifdef ALPHA
2082int
2083sys_osf_wait4(tcp)
2084struct tcb *tcp;
2085{
2086 return printwaitn(tcp, 4, 1);
2087}
2088#endif
2089
Roland McGrathc74c0b72004-09-01 19:39:46 +00002090#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002091
Roland McGrathd9f816f2004-09-04 03:39:20 +00002092static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002093 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002094#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002095 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002096#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002097 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002098#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002099 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002100#endif
2101#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002102 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002103#endif
2104#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002105 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002106#endif
2107#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002108 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002109#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002110 { P_ALL, "P_ALL" },
2111#ifdef P_LWPID
2112 { P_LWPID, "P_LWPID" },
2113#endif
2114 { 0, NULL },
2115};
2116
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002117int
2118sys_waitid(tcp)
2119struct tcb *tcp;
2120{
2121 siginfo_t si;
2122 int exited;
2123
2124 if (entering(tcp)) {
2125 printxval(waitid_types, tcp->u_arg[0], "P_???");
2126 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002127 }
2128 else {
2129 /* siginfo */
2130 exited = 0;
2131 if (!tcp->u_arg[2])
2132 tprintf("NULL");
2133 else if (syserror(tcp))
2134 tprintf("%#lx", tcp->u_arg[2]);
2135 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2136 tprintf("{???}");
2137 else
John Hughes58265892001-10-18 15:13:53 +00002138 printsiginfo(&si, verbose (tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002139 /* options */
2140 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002141 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002142 if (tcp->u_nargs > 4) {
2143 /* usage */
2144 tprintf(", ");
2145 if (!tcp->u_arg[4])
2146 tprintf("NULL");
2147 else if (tcp->u_error)
2148 tprintf("%#lx", tcp->u_arg[4]);
2149 else
2150 printrusage(tcp, tcp->u_arg[4]);
2151 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002152 }
2153 return 0;
2154}
2155
Roland McGrathc74c0b72004-09-01 19:39:46 +00002156#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002157
2158int
2159sys_alarm(tcp)
2160struct tcb *tcp;
2161{
2162 if (entering(tcp))
2163 tprintf("%lu", tcp->u_arg[0]);
2164 return 0;
2165}
2166
2167int
2168sys_uname(tcp)
2169struct tcb *tcp;
2170{
2171 struct utsname uname;
2172
2173 if (exiting(tcp)) {
2174 if (syserror(tcp) || !verbose(tcp))
2175 tprintf("%#lx", tcp->u_arg[0]);
2176 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2177 tprintf("{...}");
2178 else if (!abbrev(tcp)) {
2179
2180 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2181 uname.sysname, uname.nodename);
2182 tprintf("release=\"%s\", version=\"%s\", ",
2183 uname.release, uname.version);
2184 tprintf("machine=\"%s\"", uname.machine);
2185#ifdef LINUX
2186#ifndef __GLIBC__
2187 tprintf(", domainname=\"%s\"", uname.domainname);
2188#endif /* __GLIBC__ */
2189#endif /* LINUX */
2190 tprintf("}");
2191 }
2192 else
2193 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2194 uname.sysname, uname.nodename);
2195 }
2196 return 0;
2197}
2198
2199#ifndef SVR4
2200
Roland McGrathd9f816f2004-09-04 03:39:20 +00002201static const struct xlat ptrace_cmds[] = {
Roland McGrath5a223472002-12-15 23:58:26 +00002202#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002203 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2204 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2205 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2206 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2207 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2208 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2209 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2210 { PTRACE_CONT, "PTRACE_CONT" },
2211 { PTRACE_KILL, "PTRACE_KILL" },
2212 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2213 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2214 { PTRACE_DETACH, "PTRACE_DETACH" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002215#ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002216 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002217#endif
2218#ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002219 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002220#endif
2221#ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002222 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002223#endif
2224#ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002225 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002226#endif
2227#ifdef PTRACE_GETFPXREGS
2228 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2229#endif
2230#ifdef PTRACE_SETFPXREGS
2231 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2232#endif
Roland McGrathf04bb482005-05-09 07:45:33 +00002233#ifdef PTRACE_GETVRREGS
2234 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
2235#endif
2236#ifdef PTRACE_SETVRREGS
2237 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
2238#endif
Roland McGrathbf621d42003-01-14 09:46:21 +00002239#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002240 { PTRACE_READDATA, "PTRACE_READDATA" },
2241 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2242 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2243 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2244 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2245 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2246#ifdef SPARC
2247 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2248 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2249#else /* !SPARC */
2250 { PTRACE_22, "PTRACE_PTRACE_22" },
2251 { PTRACE_23, "PTRACE_PTRACE_23" },
2252#endif /* !SPARC */
2253#endif /* SUNOS4 */
2254 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2255#ifdef SUNOS4
2256 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2257#ifdef I386
2258 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2259 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2260 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2261#else /* !I386 */
2262 { PTRACE_26, "PTRACE_26" },
2263 { PTRACE_27, "PTRACE_27" },
2264 { PTRACE_28, "PTRACE_28" },
2265#endif /* !I386 */
2266 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2267#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002268#else /* FREEBSD */
2269 { PT_TRACE_ME, "PT_TRACE_ME" },
2270 { PT_READ_I, "PT_READ_I" },
2271 { PT_READ_D, "PT_READ_D" },
2272 { PT_WRITE_I, "PT_WRITE_I" },
2273 { PT_WRITE_D, "PT_WRITE_D" },
John Hughesa2278142001-09-28 16:21:30 +00002274#ifdef PT_READ_U
2275 { PT_READ_U, "PT_READ_U" },
2276#endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002277 { PT_CONTINUE, "PT_CONTINUE" },
2278 { PT_KILL, "PT_KILL" },
2279 { PT_STEP, "PT_STEP" },
2280 { PT_ATTACH, "PT_ATTACH" },
2281 { PT_DETACH, "PT_DETACH" },
2282 { PT_GETREGS, "PT_GETREGS" },
2283 { PT_SETREGS, "PT_SETREGS" },
2284 { PT_GETFPREGS, "PT_GETFPREGS" },
2285 { PT_SETFPREGS, "PT_SETFPREGS" },
2286 { PT_GETDBREGS, "PT_GETDBREGS" },
2287 { PT_SETDBREGS, "PT_SETDBREGS" },
2288#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002289 { 0, NULL },
2290};
2291
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002292#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002293#ifndef SUNOS4_KERNEL_ARCH_KLUDGE
2294static
2295#endif /* !SUNOS4_KERNEL_ARCH_KLUDGE */
Roland McGrathd9f816f2004-09-04 03:39:20 +00002296const struct xlat struct_user_offsets[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002297#ifdef LINUX
Michal Ludvig10a88d02002-10-07 14:31:00 +00002298#if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002299 { PT_PSWMASK, "psw_mask" },
2300 { PT_PSWADDR, "psw_addr" },
2301 { PT_GPR0, "gpr0" },
2302 { PT_GPR1, "gpr1" },
2303 { PT_GPR2, "gpr2" },
2304 { PT_GPR3, "gpr3" },
2305 { PT_GPR4, "gpr4" },
2306 { PT_GPR5, "gpr5" },
2307 { PT_GPR6, "gpr6" },
2308 { PT_GPR7, "gpr7" },
2309 { PT_GPR8, "gpr8" },
2310 { PT_GPR9, "gpr9" },
2311 { PT_GPR10, "gpr10" },
2312 { PT_GPR11, "gpr11" },
2313 { PT_GPR12, "gpr12" },
2314 { PT_GPR13, "gpr13" },
2315 { PT_GPR14, "gpr14" },
2316 { PT_GPR15, "gpr15" },
2317 { PT_ACR0, "acr0" },
2318 { PT_ACR1, "acr1" },
2319 { PT_ACR2, "acr2" },
2320 { PT_ACR3, "acr3" },
2321 { PT_ACR4, "acr4" },
2322 { PT_ACR5, "acr5" },
2323 { PT_ACR6, "acr6" },
2324 { PT_ACR7, "acr7" },
2325 { PT_ACR8, "acr8" },
2326 { PT_ACR9, "acr9" },
2327 { PT_ACR10, "acr10" },
2328 { PT_ACR11, "acr11" },
2329 { PT_ACR12, "acr12" },
2330 { PT_ACR13, "acr13" },
2331 { PT_ACR14, "acr14" },
2332 { PT_ACR15, "acr15" },
2333 { PT_ORIGGPR2, "orig_gpr2" },
2334 { PT_FPC, "fpc" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002335#if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002336 { PT_FPR0_HI, "fpr0.hi" },
2337 { PT_FPR0_LO, "fpr0.lo" },
2338 { PT_FPR1_HI, "fpr1.hi" },
2339 { PT_FPR1_LO, "fpr1.lo" },
2340 { PT_FPR2_HI, "fpr2.hi" },
2341 { PT_FPR2_LO, "fpr2.lo" },
2342 { PT_FPR3_HI, "fpr3.hi" },
2343 { PT_FPR3_LO, "fpr3.lo" },
2344 { PT_FPR4_HI, "fpr4.hi" },
2345 { PT_FPR4_LO, "fpr4.lo" },
2346 { PT_FPR5_HI, "fpr5.hi" },
2347 { PT_FPR5_LO, "fpr5.lo" },
2348 { PT_FPR6_HI, "fpr6.hi" },
2349 { PT_FPR6_LO, "fpr6.lo" },
2350 { PT_FPR7_HI, "fpr7.hi" },
2351 { PT_FPR7_LO, "fpr7.lo" },
2352 { PT_FPR8_HI, "fpr8.hi" },
2353 { PT_FPR8_LO, "fpr8.lo" },
2354 { PT_FPR9_HI, "fpr9.hi" },
2355 { PT_FPR9_LO, "fpr9.lo" },
2356 { PT_FPR10_HI, "fpr10.hi" },
2357 { PT_FPR10_LO, "fpr10.lo" },
2358 { PT_FPR11_HI, "fpr11.hi" },
2359 { PT_FPR11_LO, "fpr11.lo" },
2360 { PT_FPR12_HI, "fpr12.hi" },
2361 { PT_FPR12_LO, "fpr12.lo" },
2362 { PT_FPR13_HI, "fpr13.hi" },
2363 { PT_FPR13_LO, "fpr13.lo" },
2364 { PT_FPR14_HI, "fpr14.hi" },
2365 { PT_FPR14_LO, "fpr14.lo" },
2366 { PT_FPR15_HI, "fpr15.hi" },
2367 { PT_FPR15_LO, "fpr15.lo" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002368#endif
2369#if defined(S390X)
2370 { PT_FPR0, "fpr0" },
2371 { PT_FPR1, "fpr1" },
2372 { PT_FPR2, "fpr2" },
2373 { PT_FPR3, "fpr3" },
2374 { PT_FPR4, "fpr4" },
2375 { PT_FPR5, "fpr5" },
2376 { PT_FPR6, "fpr6" },
2377 { PT_FPR7, "fpr7" },
2378 { PT_FPR8, "fpr8" },
2379 { PT_FPR9, "fpr9" },
2380 { PT_FPR10, "fpr10" },
2381 { PT_FPR11, "fpr11" },
2382 { PT_FPR12, "fpr12" },
2383 { PT_FPR13, "fpr13" },
2384 { PT_FPR14, "fpr14" },
2385 { PT_FPR15, "fpr15" },
2386#endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002387 { PT_CR_9, "cr9" },
2388 { PT_CR_10, "cr10" },
2389 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002390 { PT_IEEE_IP, "ieee_exception_ip" },
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002391#endif
2392#if defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002393 /* XXX No support for these offsets yet. */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002394#elif defined(HPPA)
2395 /* XXX No support for these offsets yet. */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002396#elif defined(POWERPC)
Roland McGrath5a223472002-12-15 23:58:26 +00002397#ifndef PT_ORIG_R3
2398#define PT_ORIG_R3 34
2399#endif
Roland McGratheb285352003-01-14 09:59:00 +00002400#define REGSIZE (sizeof(unsigned long))
2401 { REGSIZE*PT_R0, "r0" },
2402 { REGSIZE*PT_R1, "r1" },
2403 { REGSIZE*PT_R2, "r2" },
2404 { REGSIZE*PT_R3, "r3" },
2405 { REGSIZE*PT_R4, "r4" },
2406 { REGSIZE*PT_R5, "r5" },
2407 { REGSIZE*PT_R6, "r6" },
2408 { REGSIZE*PT_R7, "r7" },
2409 { REGSIZE*PT_R8, "r8" },
2410 { REGSIZE*PT_R9, "r9" },
2411 { REGSIZE*PT_R10, "r10" },
2412 { REGSIZE*PT_R11, "r11" },
2413 { REGSIZE*PT_R12, "r12" },
2414 { REGSIZE*PT_R13, "r13" },
2415 { REGSIZE*PT_R14, "r14" },
2416 { REGSIZE*PT_R15, "r15" },
2417 { REGSIZE*PT_R16, "r16" },
2418 { REGSIZE*PT_R17, "r17" },
2419 { REGSIZE*PT_R18, "r18" },
2420 { REGSIZE*PT_R19, "r19" },
2421 { REGSIZE*PT_R20, "r20" },
2422 { REGSIZE*PT_R21, "r21" },
2423 { REGSIZE*PT_R22, "r22" },
2424 { REGSIZE*PT_R23, "r23" },
2425 { REGSIZE*PT_R24, "r24" },
2426 { REGSIZE*PT_R25, "r25" },
2427 { REGSIZE*PT_R26, "r26" },
2428 { REGSIZE*PT_R27, "r27" },
2429 { REGSIZE*PT_R28, "r28" },
2430 { REGSIZE*PT_R29, "r29" },
2431 { REGSIZE*PT_R30, "r30" },
2432 { REGSIZE*PT_R31, "r31" },
2433 { REGSIZE*PT_NIP, "NIP" },
2434 { REGSIZE*PT_MSR, "MSR" },
2435 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2436 { REGSIZE*PT_CTR, "CTR" },
2437 { REGSIZE*PT_LNK, "LNK" },
2438 { REGSIZE*PT_XER, "XER" },
2439 { REGSIZE*PT_CCR, "CCR" },
2440 { REGSIZE*PT_FPR0, "FPR0" },
2441#undef REGSIZE
Roland McGrath5a223472002-12-15 23:58:26 +00002442#else
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002443#ifdef ALPHA
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002444 { 0, "r0" },
2445 { 1, "r1" },
2446 { 2, "r2" },
2447 { 3, "r3" },
2448 { 4, "r4" },
2449 { 5, "r5" },
2450 { 6, "r6" },
2451 { 7, "r7" },
2452 { 8, "r8" },
2453 { 9, "r9" },
2454 { 10, "r10" },
2455 { 11, "r11" },
2456 { 12, "r12" },
2457 { 13, "r13" },
2458 { 14, "r14" },
2459 { 15, "r15" },
2460 { 16, "r16" },
2461 { 17, "r17" },
2462 { 18, "r18" },
2463 { 19, "r19" },
2464 { 20, "r20" },
2465 { 21, "r21" },
2466 { 22, "r22" },
2467 { 23, "r23" },
2468 { 24, "r24" },
2469 { 25, "r25" },
2470 { 26, "r26" },
2471 { 27, "r27" },
2472 { 28, "r28" },
2473 { 29, "gp" },
2474 { 30, "fp" },
2475 { 31, "zero" },
2476 { 32, "fp0" },
2477 { 33, "fp" },
2478 { 34, "fp2" },
2479 { 35, "fp3" },
2480 { 36, "fp4" },
2481 { 37, "fp5" },
2482 { 38, "fp6" },
2483 { 39, "fp7" },
2484 { 40, "fp8" },
2485 { 41, "fp9" },
2486 { 42, "fp10" },
2487 { 43, "fp11" },
2488 { 44, "fp12" },
2489 { 45, "fp13" },
2490 { 46, "fp14" },
2491 { 47, "fp15" },
2492 { 48, "fp16" },
2493 { 49, "fp17" },
2494 { 50, "fp18" },
2495 { 51, "fp19" },
2496 { 52, "fp20" },
2497 { 53, "fp21" },
2498 { 54, "fp22" },
2499 { 55, "fp23" },
2500 { 56, "fp24" },
2501 { 57, "fp25" },
2502 { 58, "fp26" },
2503 { 59, "fp27" },
2504 { 60, "fp28" },
2505 { 61, "fp29" },
2506 { 62, "fp30" },
2507 { 63, "fp31" },
2508 { 64, "pc" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002509#else /* !ALPHA */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002510#ifdef IA64
2511 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2512 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2513 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2514 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2515 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2516 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2517 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2518 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2519 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2520 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2521 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2522 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2523 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2524 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2525 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2526 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2527 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2528 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2529 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2530 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2531 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2532 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2533 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2534 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2535 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2536 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2537 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2538 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2539 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2540 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2541 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2542 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2543 /* switch stack: */
2544 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2545 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2546 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2547 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2548 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2549 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2550 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2551 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2552 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2553 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002554 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2555 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002556 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002557 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002558 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2559 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002560 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2561 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2562 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2563 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2564 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2565 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2566 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2567 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2568 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2569 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2570 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2571 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2572 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2573 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2574 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Roland McGrathfb1bc072004-03-01 21:29:24 +00002575# ifdef PT_AR_CSD
2576 { PT_AR_CSD, "ar.csd" },
2577# endif
2578# ifdef PT_AR_SSD
2579 { PT_AR_SSD, "ar.ssd" },
2580# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002581 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002582#else /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002583#ifdef I386
2584 { 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" },
2601#else /* !I386 */
Michal Ludvig0e035502002-09-23 15:41:01 +00002602#ifdef X86_64
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002603 { 8*R15, "8*R15" },
2604 { 8*R14, "8*R14" },
2605 { 8*R13, "8*R13" },
2606 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002607 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002608 { 8*RBX, "8*RBX" },
2609 { 8*R11, "8*R11" },
2610 { 8*R10, "8*R10" },
2611 { 8*R9, "8*R9" },
2612 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002613 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002614 { 8*RCX, "8*RCX" },
2615 { 8*RDX, "8*RDX" },
2616 { 8*RSI, "8*RSI" },
2617 { 8*RDI, "8*RDI" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002618#if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002619 { DS, "DS" },
2620 { ES, "ES" },
2621 { FS, "FS" },
2622 { GS, "GS" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002623#endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002624 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002625 { 8*RIP, "8*RIP" },
2626 { 8*CS, "8*CS" },
2627 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002628 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002629 { 8*SS, "8*SS" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002630#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002631#ifdef M68K
2632 { 4*PT_D1, "4*PT_D1" },
2633 { 4*PT_D2, "4*PT_D2" },
2634 { 4*PT_D3, "4*PT_D3" },
2635 { 4*PT_D4, "4*PT_D4" },
2636 { 4*PT_D5, "4*PT_D5" },
2637 { 4*PT_D6, "4*PT_D6" },
2638 { 4*PT_D7, "4*PT_D7" },
2639 { 4*PT_A0, "4*PT_A0" },
2640 { 4*PT_A1, "4*PT_A1" },
2641 { 4*PT_A2, "4*PT_A2" },
2642 { 4*PT_A3, "4*PT_A3" },
2643 { 4*PT_A4, "4*PT_A4" },
2644 { 4*PT_A5, "4*PT_A5" },
2645 { 4*PT_A6, "4*PT_A6" },
2646 { 4*PT_D0, "4*PT_D0" },
2647 { 4*PT_USP, "4*PT_USP" },
2648 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2649 { 4*PT_SR, "4*PT_SR" },
2650 { 4*PT_PC, "4*PT_PC" },
2651#endif /* M68K */
2652#endif /* !I386 */
Wichert Akkermanccef6372002-05-01 16:39:22 +00002653#ifdef SH
2654 { 4*REG_REG0, "4*REG_REG0" },
2655 { 4*(REG_REG0+1), "4*REG_REG1" },
2656 { 4*(REG_REG0+2), "4*REG_REG2" },
2657 { 4*(REG_REG0+3), "4*REG_REG3" },
2658 { 4*(REG_REG0+4), "4*REG_REG4" },
2659 { 4*(REG_REG0+5), "4*REG_REG5" },
2660 { 4*(REG_REG0+6), "4*REG_REG6" },
2661 { 4*(REG_REG0+7), "4*REG_REG7" },
2662 { 4*(REG_REG0+8), "4*REG_REG8" },
2663 { 4*(REG_REG0+9), "4*REG_REG9" },
2664 { 4*(REG_REG0+10), "4*REG_REG10" },
2665 { 4*(REG_REG0+11), "4*REG_REG11" },
2666 { 4*(REG_REG0+12), "4*REG_REG12" },
2667 { 4*(REG_REG0+13), "4*REG_REG13" },
2668 { 4*(REG_REG0+14), "4*REG_REG14" },
2669 { 4*REG_REG15, "4*REG_REG15" },
2670 { 4*REG_PC, "4*REG_PC" },
2671 { 4*REG_PR, "4*REG_PR" },
2672 { 4*REG_SR, "4*REG_SR" },
2673 { 4*REG_GBR, "4*REG_GBR" },
2674 { 4*REG_MACH, "4*REG_MACH" },
2675 { 4*REG_MACL, "4*REG_MACL" },
2676 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2677 { 4*REG_FPUL, "4*REG_FPUL" },
2678 { 4*REG_FPREG0, "4*REG_FPREG0" },
2679 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2680 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2681 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2682 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2683 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2684 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2685 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2686 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2687 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2688 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2689 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2690 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2691 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2692 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2693 { 4*REG_FPREG15, "4*REG_FPREG15" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002694#ifdef REG_XDREG0
Wichert Akkermanccef6372002-05-01 16:39:22 +00002695 { 4*REG_XDREG0, "4*REG_XDREG0" },
2696 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2697 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2698 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2699 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2700 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2701 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2702 { 4*REG_XDREG14, "4*REG_XDREG14" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002703#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00002704 { 4*REG_FPSCR, "4*REG_FPSCR" },
2705#endif /* SH */
Roland McGrathf5a47772003-06-26 22:40:42 +00002706#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002707 { 0, "PC(L)" },
2708 { 4, "PC(U)" },
2709 { 8, "SR(L)" },
2710 { 12, "SR(U)" },
2711 { 16, "syscall no.(L)" },
2712 { 20, "syscall_no.(U)" },
2713 { 24, "R0(L)" },
2714 { 28, "R0(U)" },
2715 { 32, "R1(L)" },
2716 { 36, "R1(U)" },
2717 { 40, "R2(L)" },
2718 { 44, "R2(U)" },
2719 { 48, "R3(L)" },
2720 { 52, "R3(U)" },
2721 { 56, "R4(L)" },
2722 { 60, "R4(U)" },
2723 { 64, "R5(L)" },
2724 { 68, "R5(U)" },
2725 { 72, "R6(L)" },
2726 { 76, "R6(U)" },
2727 { 80, "R7(L)" },
2728 { 84, "R7(U)" },
2729 { 88, "R8(L)" },
2730 { 92, "R8(U)" },
2731 { 96, "R9(L)" },
2732 { 100, "R9(U)" },
2733 { 104, "R10(L)" },
2734 { 108, "R10(U)" },
2735 { 112, "R11(L)" },
2736 { 116, "R11(U)" },
2737 { 120, "R12(L)" },
2738 { 124, "R12(U)" },
2739 { 128, "R13(L)" },
2740 { 132, "R13(U)" },
2741 { 136, "R14(L)" },
2742 { 140, "R14(U)" },
2743 { 144, "R15(L)" },
2744 { 148, "R15(U)" },
2745 { 152, "R16(L)" },
2746 { 156, "R16(U)" },
2747 { 160, "R17(L)" },
2748 { 164, "R17(U)" },
2749 { 168, "R18(L)" },
2750 { 172, "R18(U)" },
2751 { 176, "R19(L)" },
2752 { 180, "R19(U)" },
2753 { 184, "R20(L)" },
2754 { 188, "R20(U)" },
2755 { 192, "R21(L)" },
2756 { 196, "R21(U)" },
2757 { 200, "R22(L)" },
2758 { 204, "R22(U)" },
2759 { 208, "R23(L)" },
2760 { 212, "R23(U)" },
2761 { 216, "R24(L)" },
2762 { 220, "R24(U)" },
2763 { 224, "R25(L)" },
2764 { 228, "R25(U)" },
2765 { 232, "R26(L)" },
2766 { 236, "R26(U)" },
2767 { 240, "R27(L)" },
2768 { 244, "R27(U)" },
2769 { 248, "R28(L)" },
2770 { 252, "R28(U)" },
2771 { 256, "R29(L)" },
2772 { 260, "R29(U)" },
2773 { 264, "R30(L)" },
2774 { 268, "R30(U)" },
2775 { 272, "R31(L)" },
2776 { 276, "R31(U)" },
2777 { 280, "R32(L)" },
2778 { 284, "R32(U)" },
2779 { 288, "R33(L)" },
2780 { 292, "R33(U)" },
2781 { 296, "R34(L)" },
2782 { 300, "R34(U)" },
2783 { 304, "R35(L)" },
2784 { 308, "R35(U)" },
2785 { 312, "R36(L)" },
2786 { 316, "R36(U)" },
2787 { 320, "R37(L)" },
2788 { 324, "R37(U)" },
2789 { 328, "R38(L)" },
2790 { 332, "R38(U)" },
2791 { 336, "R39(L)" },
2792 { 340, "R39(U)" },
2793 { 344, "R40(L)" },
2794 { 348, "R40(U)" },
2795 { 352, "R41(L)" },
2796 { 356, "R41(U)" },
2797 { 360, "R42(L)" },
2798 { 364, "R42(U)" },
2799 { 368, "R43(L)" },
2800 { 372, "R43(U)" },
2801 { 376, "R44(L)" },
2802 { 380, "R44(U)" },
2803 { 384, "R45(L)" },
2804 { 388, "R45(U)" },
2805 { 392, "R46(L)" },
2806 { 396, "R46(U)" },
2807 { 400, "R47(L)" },
2808 { 404, "R47(U)" },
2809 { 408, "R48(L)" },
2810 { 412, "R48(U)" },
2811 { 416, "R49(L)" },
2812 { 420, "R49(U)" },
2813 { 424, "R50(L)" },
2814 { 428, "R50(U)" },
2815 { 432, "R51(L)" },
2816 { 436, "R51(U)" },
2817 { 440, "R52(L)" },
2818 { 444, "R52(U)" },
2819 { 448, "R53(L)" },
2820 { 452, "R53(U)" },
2821 { 456, "R54(L)" },
2822 { 460, "R54(U)" },
2823 { 464, "R55(L)" },
2824 { 468, "R55(U)" },
2825 { 472, "R56(L)" },
2826 { 476, "R56(U)" },
2827 { 480, "R57(L)" },
2828 { 484, "R57(U)" },
2829 { 488, "R58(L)" },
2830 { 492, "R58(U)" },
2831 { 496, "R59(L)" },
2832 { 500, "R59(U)" },
2833 { 504, "R60(L)" },
2834 { 508, "R60(U)" },
2835 { 512, "R61(L)" },
2836 { 516, "R61(U)" },
2837 { 520, "R62(L)" },
2838 { 524, "R62(U)" },
2839 { 528, "TR0(L)" },
2840 { 532, "TR0(U)" },
2841 { 536, "TR1(L)" },
2842 { 540, "TR1(U)" },
2843 { 544, "TR2(L)" },
2844 { 548, "TR2(U)" },
2845 { 552, "TR3(L)" },
2846 { 556, "TR3(U)" },
2847 { 560, "TR4(L)" },
2848 { 564, "TR4(U)" },
2849 { 568, "TR5(L)" },
2850 { 572, "TR5(U)" },
2851 { 576, "TR6(L)" },
2852 { 580, "TR6(U)" },
2853 { 584, "TR7(L)" },
2854 { 588, "TR7(U)" },
2855 /* This entry is in case pt_regs contains dregs (depends on
2856 the kernel build options). */
2857 { uoff(regs), "offsetof(struct user, regs)" },
2858 { uoff(fpu), "offsetof(struct user, fpu)" },
2859#endif
Roland McGrath0f87c492003-06-03 23:29:04 +00002860#ifdef ARM
2861 { uoff(regs.ARM_r0), "r0" },
2862 { uoff(regs.ARM_r1), "r1" },
2863 { uoff(regs.ARM_r2), "r2" },
2864 { uoff(regs.ARM_r3), "r3" },
2865 { uoff(regs.ARM_r4), "r4" },
2866 { uoff(regs.ARM_r5), "r5" },
2867 { uoff(regs.ARM_r6), "r6" },
2868 { uoff(regs.ARM_r7), "r7" },
2869 { uoff(regs.ARM_r8), "r8" },
2870 { uoff(regs.ARM_r9), "r9" },
2871 { uoff(regs.ARM_r10), "r10" },
2872 { uoff(regs.ARM_fp), "fp" },
2873 { uoff(regs.ARM_ip), "ip" },
2874 { uoff(regs.ARM_sp), "sp" },
2875 { uoff(regs.ARM_lr), "lr" },
2876 { uoff(regs.ARM_pc), "pc" },
2877 { uoff(regs.ARM_cpsr), "cpsr" },
2878#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00002879
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002880#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002881 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00002882#endif
Michal Ludvig0e035502002-09-23 15:41:01 +00002883#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002884 { uoff(i387), "offsetof(struct user, i387)" },
2885#else /* !I386 */
2886#ifdef M68K
2887 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
2888#endif /* M68K */
2889#endif /* !I386 */
2890 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
2891 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
2892 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002893#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002894 { uoff(start_code), "offsetof(struct user, start_code)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002895#endif
Roland McGrathf5a47772003-06-26 22:40:42 +00002896#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002897 { uoff(start_data), "offsetof(struct user, start_data)" },
2898#endif
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002899#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002900 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002901#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002902 { uoff(signal), "offsetof(struct user, signal)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002903#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002904 { uoff(reserved), "offsetof(struct user, reserved)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00002905#endif
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002906#if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002907 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Roland McGrath6d1a65c2004-07-12 07:44:08 +00002908#endif
2909#if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002910 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
2911#endif
2912 { uoff(magic), "offsetof(struct user, magic)" },
2913 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002914#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002915 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
2916#endif /* I386 */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002917#endif /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002918#endif /* !ALPHA */
2919#endif /* !POWERPC/!SPARC */
2920#endif /* LINUX */
2921#ifdef SUNOS4
2922 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
2923 { uoff(u_procp), "offsetof(struct user, u_procp)" },
2924 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2925 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
2926 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
2927 { uoff(u_ap), "offsetof(struct user, u_ap)" },
2928 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
2929 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
2930 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
2931 { uoff(u_error), "offsetof(struct user, u_error)" },
2932 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
2933 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
2934 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
2935 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
2936 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
2937 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
2938 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
2939 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
2940 { uoff(u_code), "offsetof(struct user, u_code)" },
2941 { uoff(u_addr), "offsetof(struct user, u_addr)" },
2942 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
2943 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
2944 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
2945 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
2946 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
2947 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
2948 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
2949 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
2950 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
2951 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
2952 { uoff(u_ru), "offsetof(struct user, u_ru)" },
2953 { uoff(u_cru), "offsetof(struct user, u_cru)" },
2954 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
2955 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
2956 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
2957 { uoff(u_start), "offsetof(struct user, u_start)" },
2958 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
2959 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
2960 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
2961 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
2962 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
2963 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
2964 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
2965 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
2966 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
2967#endif /* SUNOS4 */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002968#ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002969 { sizeof(struct user), "sizeof(struct user)" },
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002970#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002971 { 0, NULL },
2972};
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002973#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002974
2975int
2976sys_ptrace(tcp)
2977struct tcb *tcp;
2978{
Roland McGrathd9f816f2004-09-04 03:39:20 +00002979 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002980 long addr;
2981
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002982 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00002983 printxval(ptrace_cmds, tcp->u_arg[0],
2984#ifndef FREEBSD
2985 "PTRACE_???"
2986#else
2987 "PT_???"
2988#endif
2989 );
2990 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002991 addr = tcp->u_arg[2];
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002992#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002993 if (tcp->u_arg[0] == PTRACE_PEEKUSER
2994 || tcp->u_arg[0] == PTRACE_POKEUSER) {
2995 for (x = struct_user_offsets; x->str; x++) {
2996 if (x->val >= addr)
2997 break;
2998 }
2999 if (!x->str)
3000 tprintf("%#lx, ", addr);
3001 else if (x->val > addr && x != struct_user_offsets) {
3002 x--;
3003 tprintf("%s + %ld, ", x->str, addr - x->val);
3004 }
3005 else
3006 tprintf("%s, ", x->str);
3007 }
3008 else
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003009#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003010 tprintf("%#lx, ", tcp->u_arg[2]);
3011#ifdef LINUX
3012 switch (tcp->u_arg[0]) {
3013 case PTRACE_PEEKDATA:
3014 case PTRACE_PEEKTEXT:
3015 case PTRACE_PEEKUSER:
3016 break;
3017 case PTRACE_CONT:
3018 case PTRACE_SINGLESTEP:
3019 case PTRACE_SYSCALL:
3020 case PTRACE_DETACH:
3021 printsignal(tcp->u_arg[3]);
3022 break;
3023 default:
3024 tprintf("%#lx", tcp->u_arg[3]);
3025 break;
3026 }
3027 } else {
3028 switch (tcp->u_arg[0]) {
3029 case PTRACE_PEEKDATA:
3030 case PTRACE_PEEKTEXT:
3031 case PTRACE_PEEKUSER:
Roland McGratheb285352003-01-14 09:59:00 +00003032 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003033 break;
3034 }
3035 }
3036#endif /* LINUX */
3037#ifdef SUNOS4
3038 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3039 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3040 tprintf("%lu, ", tcp->u_arg[3]);
3041 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3042 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3043 tcp->u_arg[0] != PTRACE_READTEXT) {
3044 tprintf("%#lx", tcp->u_arg[3]);
3045 }
3046 } else {
3047 if (tcp->u_arg[0] == PTRACE_READDATA ||
3048 tcp->u_arg[0] == PTRACE_READTEXT) {
3049 tprintf("%lu, ", tcp->u_arg[3]);
3050 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3051 }
3052 }
3053#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003054#ifdef FREEBSD
3055 tprintf("%lu", tcp->u_arg[3]);
3056 }
3057#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003058 return 0;
3059}
3060
3061#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003062
3063#ifdef LINUX
Roland McGrathd9f816f2004-09-04 03:39:20 +00003064static const struct xlat futexops[] = {
Roland McGrath5a223472002-12-15 23:58:26 +00003065 { FUTEX_WAIT, "FUTEX_WAIT" },
3066 { FUTEX_WAKE, "FUTEX_WAKE" },
3067 { FUTEX_FD, "FUTEX_FD" },
Roland McGrath88812d62003-06-26 22:27:23 +00003068 { FUTEX_REQUEUE,"FUTEX_REQUEUE" },
Roland McGrath5a223472002-12-15 23:58:26 +00003069 { 0, NULL }
3070};
3071
3072int
3073sys_futex(tcp)
3074struct tcb *tcp;
3075{
3076 if (entering(tcp)) {
3077 tprintf("%p, ", (void *) tcp->u_arg[0]);
Roland McGrath88812d62003-06-26 22:27:23 +00003078 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003079 tprintf(", %ld", tcp->u_arg[2]);
3080 if (tcp->u_arg[1] == FUTEX_WAIT) {
3081 tprintf(", ");
3082 printtv(tcp, tcp->u_arg[3]);
Roland McGrath88812d62003-06-26 22:27:23 +00003083 } else if (tcp->u_arg[1] == FUTEX_REQUEUE)
3084 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Roland McGrath5a223472002-12-15 23:58:26 +00003085 }
3086 return 0;
3087}
3088
3089static void
Roland McGrath79fbda52004-04-14 02:45:55 +00003090print_affinitylist(tcp, list, len)
3091struct tcb *tcp;
3092long list;
Roland McGrath5a223472002-12-15 23:58:26 +00003093unsigned int len;
3094{
3095 int first = 1;
3096 tprintf(" {");
Roland McGratha2f34962003-05-23 00:14:04 +00003097 while (len >= sizeof (unsigned long)) {
Roland McGrath79fbda52004-04-14 02:45:55 +00003098 unsigned long w;
3099 umove(tcp, list, &w);
3100 tprintf("%s %lx", first ? "" : ",", w);
Roland McGrath5a223472002-12-15 23:58:26 +00003101 first = 0;
3102 len -= sizeof (unsigned long);
Roland McGrath79fbda52004-04-14 02:45:55 +00003103 list += sizeof(unsigned long);
Roland McGrath5a223472002-12-15 23:58:26 +00003104 }
3105 tprintf(" }");
3106}
3107
3108int
3109sys_sched_setaffinity(tcp)
3110struct tcb *tcp;
3111{
3112 if (entering(tcp)) {
3113 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath79fbda52004-04-14 02:45:55 +00003114 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
Roland McGrath5a223472002-12-15 23:58:26 +00003115 }
3116 return 0;
3117}
3118
3119int
3120sys_sched_getaffinity(tcp)
3121struct tcb *tcp;
3122{
3123 if (entering(tcp)) {
3124 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3125 } else {
Roland McGrath79fbda52004-04-14 02:45:55 +00003126 if (tcp->u_rval == -1)
3127 tprintf("%#lx", tcp->u_arg[2]);
3128 else
3129 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
Roland McGrath5a223472002-12-15 23:58:26 +00003130 }
3131 return 0;
3132}
Roland McGrath279d3782004-03-01 20:27:37 +00003133
Roland McGrathd9f816f2004-09-04 03:39:20 +00003134static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003135 { SCHED_OTHER, "SCHED_OTHER" },
3136 { SCHED_RR, "SCHED_RR" },
3137 { SCHED_FIFO, "SCHED_FIFO" },
3138 { 0, NULL }
3139};
3140
3141int
3142sys_sched_getscheduler(tcp)
3143struct tcb *tcp;
3144{
3145 if (entering(tcp)) {
3146 tprintf("%d", (int) tcp->u_arg[0]);
3147 } else if (! syserror(tcp)) {
3148 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3149 if (tcp->auxstr != NULL)
3150 return RVAL_STR;
3151 }
3152 return 0;
3153}
3154
3155int
3156sys_sched_setscheduler(tcp)
3157struct tcb *tcp;
3158{
3159 if (entering(tcp)) {
3160 struct sched_param p;
3161 tprintf("%d, ", (int) tcp->u_arg[0]);
3162 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3163 if (umove(tcp, tcp->u_arg[2], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003164 tprintf(", %#lx", tcp->u_arg[2]);
Roland McGrath279d3782004-03-01 20:27:37 +00003165 else
3166 tprintf(", { %d }", p.__sched_priority);
3167 }
3168 return 0;
3169}
3170
3171int
3172sys_sched_getparam(tcp)
3173struct tcb *tcp;
3174{
3175 if (entering(tcp)) {
3176 tprintf("%d, ", (int) tcp->u_arg[0]);
3177 } else {
3178 struct sched_param p;
3179 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003180 tprintf("%#lx", tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003181 else
3182 tprintf("{ %d }", p.__sched_priority);
3183 }
3184 return 0;
3185}
3186
3187int
3188sys_sched_setparam(tcp)
3189struct tcb *tcp;
3190{
3191 if (entering(tcp)) {
3192 struct sched_param p;
3193 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003194 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003195 else
3196 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3197 }
3198 return 0;
3199}
3200
3201int
3202sys_sched_get_priority_min(tcp)
3203struct tcb *tcp;
3204{
3205 if (entering(tcp)) {
3206 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3207 }
3208 return 0;
3209}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003210
3211#ifdef X86_64
3212#include <asm/prctl.h>
3213
3214static const struct xlat archvals[] = {
3215 { ARCH_SET_GS, "ARCH_SET_GS" },
3216 { ARCH_SET_FS, "ARCH_SET_FS" },
3217 { ARCH_GET_FS, "ARCH_GET_FS" },
3218 { ARCH_GET_GS, "ARCH_GET_GS" },
3219 { 0, NULL },
3220};
3221
3222int
3223sys_arch_prctl(tcp)
3224struct tcb *tcp;
3225{
3226 if (entering(tcp)) {
3227 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3228 if (tcp->u_arg[0] == ARCH_SET_GS
3229 || tcp->u_arg[0] == ARCH_SET_FS)
3230 tprintf(", %#lx", tcp->u_arg[1]);
3231 } else {
3232 if (tcp->u_arg[0] == ARCH_GET_GS
3233 || tcp->u_arg[0] == ARCH_GET_FS) {
3234 long int v;
3235 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3236 tprintf(", [%#lx]", v);
3237 else
3238 tprintf(", %#lx", tcp->u_arg[1]);
3239 }
3240 }
3241 return 0;
3242}
3243#endif
3244
Roland McGrath5a223472002-12-15 23:58:26 +00003245#endif