blob: 464ef27a331e94331eaa269635ea44166c5e4205 [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
60#ifdef SPARC
61# define fpq kernel_fpq
62# define fq kernel_fq
63# define fpu kernel_fpu
64#endif
65#include <asm/reg.h>
66#ifdef SPARC
67# undef fpq
68# undef fq
Roland McGrath5a223472002-12-15 23:58:26 +000069# undef fpu
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000070#endif
71#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 McGrath5a223472002-12-15 23:58:26 +000096#ifdef HAVE_LINUX_FUTEX_H
97#include <linux/futex.h>
98#endif
99#if defined LINUX
100# ifndef FUTEX_WAIT
101# define FUTEX_WAIT 0
102# endif
103# ifndef FUTEX_WAKE
104# define FUTEX_WAKE 1
105# endif
106# ifndef FUTEX_FD
107# define FUTEX_FD 2
108# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000109# ifndef FUTEX_REQUEUE
110# define FUTEX_REQUEUE 3
111# endif
Roland McGrath5a223472002-12-15 23:58:26 +0000112#endif
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000113
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000114#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000115#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000116#include <asm/posix_types.h>
117#undef GETGROUPS_T
118#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000119#undef GETGROUPS32_T
120#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000121#endif /* LINUX */
122
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000123#if defined(LINUX) && defined(IA64)
124# include <asm/ptrace_offsets.h>
125# include <asm/rse.h>
126#endif
127
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000128#ifdef HAVE_PRCTL
129#include <sys/prctl.h>
130#endif
131
132#ifndef WCOREDUMP
133#define WCOREDUMP(status) ((status) & 0200)
134#endif
135
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000136/* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000137#if defined(HAVE_PRCTL)
138static struct xlat prctl_options[] = {
139#ifdef PR_MAXPROCS
140 { PR_MAXPROCS, "PR_MAXPROCS" },
141#endif
142#ifdef PR_ISBLOCKED
143 { PR_ISBLOCKED, "PR_ISBLOCKED" },
144#endif
145#ifdef PR_SETSTACKSIZE
146 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
147#endif
148#ifdef PR_GETSTACKSIZE
149 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
150#endif
151#ifdef PR_MAXPPROCS
152 { PR_MAXPPROCS, "PR_MAXPPROCS" },
153#endif
154#ifdef PR_UNBLKONEXEC
155 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
156#endif
157#ifdef PR_ATOMICSIM
158 { PR_ATOMICSIM, "PR_ATOMICSIM" },
159#endif
160#ifdef PR_SETEXITSIG
161 { PR_SETEXITSIG, "PR_SETEXITSIG" },
162#endif
163#ifdef PR_RESIDENT
164 { PR_RESIDENT, "PR_RESIDENT" },
165#endif
166#ifdef PR_ATTACHADDR
167 { PR_ATTACHADDR, "PR_ATTACHADDR" },
168#endif
169#ifdef PR_DETACHADDR
170 { PR_DETACHADDR, "PR_DETACHADDR" },
171#endif
172#ifdef PR_TERMCHILD
173 { PR_TERMCHILD, "PR_TERMCHILD" },
174#endif
175#ifdef PR_GETSHMASK
176 { PR_GETSHMASK, "PR_GETSHMASK" },
177#endif
178#ifdef PR_GETNSHARE
179 { PR_GETNSHARE, "PR_GETNSHARE" },
180#endif
181#if defined(PR_SET_PDEATHSIG)
182 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
183#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000184#ifdef PR_COREPID
185 { PR_COREPID, "PR_COREPID" },
186#endif
187#ifdef PR_ATTACHADDRPERM
188 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
189#endif
190#ifdef PR_PTHREADEXIT
191 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
192#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000193#ifdef PR_SET_PDEATHSIG
194 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
195#endif
196#ifdef PR_GET_PDEATHSIG
197 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
198#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000199#ifdef PR_GET_UNALIGN
200 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
201#endif
202#ifdef PR_SET_UNALIGN
203 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
204#endif
205#ifdef PR_GET_KEEPCAPS
206 { PR_GET_KEEPCAPS, "PR_GET_KEEP_CAPS" },
207#endif
208#ifdef PR_SET_KEEPCAPS
209 { PR_SET_KEEPCAPS, "PR_SET_KEEP_CAPS" },
210#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000211 { 0, NULL },
212};
213
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000214
215const char *
216unalignctl_string (unsigned int ctl)
217{
218 static char buf[16];
219
220 switch (ctl) {
221#ifdef PR_UNALIGN_NOPRINT
222 case PR_UNALIGN_NOPRINT:
223 return "NOPRINT";
224#endif
225#ifdef PR_UNALIGN_SIGBUS
226 case PR_UNALIGN_SIGBUS:
227 return "SIGBUS";
228#endif
229 default:
230 break;
231 }
232 sprintf(buf, "%x", ctl);
233 return buf;
234}
235
236
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000237int
238sys_prctl(tcp)
239struct tcb *tcp;
240{
241 int i;
242
243 if (entering(tcp)) {
244 printxval(prctl_options, tcp->u_arg[0], "PR_???");
245 switch (tcp->u_arg[0]) {
246#ifdef PR_GETNSHARE
247 case PR_GETNSHARE:
248 break;
249#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000250#ifdef PR_SET_DEATHSIG
251 case PR_GET_PDEATHSIG:
252 break;
253#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000254#ifdef PR_SET_UNALIGN
255 case PR_SET_UNALIGN:
256 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
257 break;
258#endif
259#ifdef PR_GET_UNALIGN
260 case PR_GET_UNALIGN:
261 tprintf(", %#lx", tcp->u_arg[1]);
262 break;
263#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000264 default:
265 for (i = 1; i < tcp->u_nargs; i++)
266 tprintf(", %#lx", tcp->u_arg[i]);
267 break;
268 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000269 } else {
270 switch (tcp->u_arg[0]) {
271#ifdef PR_GET_PDEATHSIG
272 case PR_GET_PDEATHSIG:
273 for (i=1; i<tcp->u_nargs; i++)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +0000274 tprintf(", %#lx", tcp->u_arg[i]);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000275 break;
276#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000277#ifdef PR_SET_UNALIGN
278 case PR_SET_UNALIGN:
279 break;
280#endif
281#ifdef PR_GET_UNALIGN
282 case PR_GET_UNALIGN:
283 {
284 int ctl;
285
286 umove(tcp, tcp->u_arg[1], &ctl);
287 tcp->auxstr = unalignctl_string(ctl);
288 return RVAL_STR;
289 }
290#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000291 default:
292 break;
293 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000294 }
295 return 0;
296}
297
298#endif /* HAVE_PRCTL */
299
300int
301sys_gethostid(tcp)
302struct tcb *tcp;
303{
304 if (exiting(tcp))
305 return RVAL_HEX;
306 return 0;
307}
308
309int
310sys_sethostname(tcp)
311struct tcb *tcp;
312{
313 if (entering(tcp)) {
314 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
315 tprintf(", %lu", tcp->u_arg[1]);
316 }
317 return 0;
318}
319
320int
321sys_gethostname(tcp)
322struct tcb *tcp;
323{
324 if (exiting(tcp)) {
325 if (syserror(tcp))
326 tprintf("%#lx", tcp->u_arg[0]);
327 else
328 printpath(tcp, tcp->u_arg[0]);
329 tprintf(", %lu", tcp->u_arg[1]);
330 }
331 return 0;
332}
333
334int
335sys_setdomainname(tcp)
336struct tcb *tcp;
337{
338 if (entering(tcp)) {
339 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
340 tprintf(", %lu", tcp->u_arg[1]);
341 }
342 return 0;
343}
344
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000345#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000346
347int
348sys_getdomainname(tcp)
349struct tcb *tcp;
350{
351 if (exiting(tcp)) {
352 if (syserror(tcp))
353 tprintf("%#lx", tcp->u_arg[0]);
354 else
355 printpath(tcp, tcp->u_arg[0]);
356 tprintf(", %lu", tcp->u_arg[1]);
357 }
358 return 0;
359}
360#endif /* !LINUX */
361
362int
363sys_exit(tcp)
364struct tcb *tcp;
365{
366 if (exiting(tcp)) {
367 fprintf(stderr, "_exit returned!\n");
368 return -1;
369 }
370 /* special case: we stop tracing this process, finish line now */
371 tprintf("%ld) ", tcp->u_arg[0]);
372 tabto(acolumn);
373 tprintf("= ?");
374 printtrailer(tcp);
375 return 0;
376}
377
378int
379internal_exit(tcp)
380struct tcb *tcp;
381{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000382 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000383 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000384#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000385# ifdef IA64
386 if (ia32) {
387 if (tcp->scno == 252)
388 tcp->flags |= TCB_GROUP_EXITING;
389 } else
390# endif
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000391 if (tcp->scno == __NR_exit_group)
392 tcp->flags |= TCB_GROUP_EXITING;
393#endif
394 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000395 return 0;
396}
397
Roland McGrathee9d4352002-12-18 04:16:10 +0000398/* TCP is creating a child we want to follow.
399 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
400 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
401static int
402fork_tcb(struct tcb *tcp)
403{
404 if (nprocs == tcbtabsize) {
405 /* Allocate some more TCBs and expand the table.
406 We don't want to relocate the TCBs because our
407 callers have pointers and it would be a pain.
408 So tcbtab is a table of pointers. Since we never
409 free the TCBs, we allocate a single chunk of many. */
410 struct tcb **newtab = (struct tcb **)
411 realloc(tcbtab, 2 * tcbtabsize * sizeof tcbtab[0]);
412 struct tcb *newtcbs = (struct tcb *) calloc(tcbtabsize,
413 sizeof *newtcbs);
414 int i;
415 if (newtab == NULL || newtcbs == NULL) {
416 if (newtab != NULL)
417 free(newtab);
418 tcp->flags &= ~TCB_FOLLOWFORK;
419 fprintf(stderr, "sys_fork: tcb table full\n");
420 return 1;
421 }
422 for (i = tcbtabsize; i < 2 * tcbtabsize; ++i)
423 newtab[i] = &newtcbs[i - tcbtabsize];
424 tcbtabsize *= 2;
425 tcbtab = newtab;
426 }
427
428 tcp->flags |= TCB_FOLLOWFORK;
429 return 0;
430}
431
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000432#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000433
434int
435sys_fork(tcp)
436struct tcb *tcp;
437{
438 if (exiting(tcp)) {
439 if (getrval2(tcp)) {
440 tcp->auxstr = "child process";
441 return RVAL_UDECIMAL | RVAL_STR;
442 }
443 }
444 return 0;
445}
446
John Hughes4e36a812001-04-18 15:11:51 +0000447#if UNIXWARE > 2
448
449int
450sys_rfork(tcp)
451struct tcb *tcp;
452{
453 if (entering(tcp)) {
454 tprintf ("%ld", tcp->u_arg[0]);
455 }
456 else {
457 if (getrval2(tcp)) {
458 tcp->auxstr = "child process";
459 return RVAL_UDECIMAL | RVAL_STR;
460 }
461 }
462 return 0;
463}
464
465#endif
466
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000467int
468internal_fork(tcp)
469struct tcb *tcp;
470{
471 struct tcb *tcpchild;
472
473 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000474#ifdef SYS_rfork
475 if (tcp->scno == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
476 return 0;
477#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000478 if (getrval2(tcp))
479 return 0;
480 if (!followfork)
481 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000482 if (fork_tcb(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000483 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000484 if (syserror(tcp))
485 return 0;
486 if ((tcpchild = alloctcb(tcp->u_rval)) == NULL) {
487 fprintf(stderr, "sys_fork: tcb table full\n");
488 return 0;
489 }
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000490 if (proc_open(tcpchild, 2) < 0)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000491 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000492 }
493 return 0;
494}
495
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000496#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000497
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000498#ifdef LINUX
499
500/* defines copied from linux/sched.h since we can't include that
501 * ourselves (it conflicts with *lots* of libc includes)
502 */
503#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
504#define CLONE_VM 0x00000100 /* set if VM shared between processes */
505#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
506#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
507#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000508#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000509#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
510#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
511#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000512#define CLONE_THREAD 0x00010000 /* Same thread group? */
513#define CLONE_NEWNS 0x00020000 /* New namespace group? */
514#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
515#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
516#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
517#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
518#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
519#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
520#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000521
522static struct xlat clone_flags[] = {
523 { CLONE_VM, "CLONE_VM" },
524 { CLONE_FS, "CLONE_FS" },
525 { CLONE_FILES, "CLONE_FILES" },
526 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000527 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000528 { CLONE_PTRACE, "CLONE_PTRACE" },
529 { CLONE_VFORK, "CLONE_VFORK" },
530 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000531 { CLONE_THREAD, "CLONE_THREAD" },
532 { CLONE_NEWNS, "CLONE_NEWNS" },
533 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
534 { CLONE_SETTLS, "CLONE_SETTLS" },
535 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
536 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
537 { CLONE_DETACHED, "CLONE_DETACHED" },
538 { CLONE_UNTRACED, "CLONE_UNTRACED" },
539 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000540 { 0, NULL },
541};
542
Roland McGrath909875b2002-12-22 03:34:36 +0000543# ifdef I386
544# include <asm/ldt.h>
545extern void print_ldt_entry();
546# endif
547
Roland McGrath9677b3a2003-03-12 09:54:36 +0000548# if defined IA64
549# define ARG_FLAGS 0
550# define ARG_STACK 1
551# define ARG_STACKSIZE (tcp->scno == SYS_clone2 ? 2 : -1)
Roland McGrathc03981d2003-03-14 10:32:36 +0000552# define ARG_PTID (tcp->scno == SYS_clone2 ? 3 : 2)
553# define ARG_CTID (tcp->scno == SYS_clone2 ? 4 : 3)
554# define ARG_TLS (tcp->scno == SYS_clone2 ? 5 : 4)
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000555# elif defined S390 || defined S390X
Roland McGrath9677b3a2003-03-12 09:54:36 +0000556# define ARG_STACK 0
557# define ARG_FLAGS 1
558# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000559# define ARG_CTID 3
560# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000561# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000562# define ARG_FLAGS 0
563# define ARG_STACK 1
564# define ARG_PTID 2
565# define ARG_CTID 3
566# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000567# else
568# define ARG_FLAGS 0
569# define ARG_STACK 1
570# define ARG_PTID 2
571# define ARG_TLS 3
572# define ARG_CTID 4
573# endif
574
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000575int
576sys_clone(tcp)
577struct tcb *tcp;
578{
579 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000580 unsigned long flags = tcp->u_arg[ARG_FLAGS];
581 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
582# ifdef ARG_STACKSIZE
583 if (ARG_STACKSIZE != -1)
584 tprintf("stack_size=%#lx, ",
585 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000586# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000587 tprintf("flags=");
Roland McGrath984154d2003-05-23 01:08:42 +0000588 if (printflags(clone_flags, flags &~ CSIGNAL) == 0)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000589 tprintf("0");
Roland McGrath984154d2003-05-23 01:08:42 +0000590 if ((flags & CSIGNAL) != 0)
591 tprintf("|%s", signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000592 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000593 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000594 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000595 if (flags & CLONE_PARENT_SETTID)
596 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000597 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000598# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000599 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000600 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000601 tprintf(", {entry_number:%d, ",
602 copy.entry_number);
603 if (!verbose(tcp))
604 tprintf("...}");
605 else
606 print_ldt_entry(&copy);
607 }
608 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000609# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000610 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000611 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000612 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
613 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000614 }
615 return 0;
616}
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000617#endif
618
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000619int
620sys_fork(tcp)
621struct tcb *tcp;
622{
623 if (exiting(tcp))
624 return RVAL_UDECIMAL;
625 return 0;
626}
627
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000628int
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000629change_syscall(tcp, new)
630struct tcb *tcp;
631int new;
632{
633#if defined(LINUX)
634#if defined(I386)
635 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000636 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000637 return -1;
638 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000639#elif defined(X86_64)
640 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000641 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000642 return -1;
643 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000644#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000645 if (ptrace(PTRACE_POKEUSER, tcp->pid,
646 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000647 return -1;
Roland McGrath43b286f2003-01-10 11:14:41 +0000648 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000649#elif defined(S390) || defined(S390X)
650 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
651 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
652 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000653 return 0;
654#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000655 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000656 return -1;
657 return 0;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000658#elif defined(SPARC)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000659 struct regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000660 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
661 return -1;
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000662 regs.r_g1=new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000663 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
664 return -1;
665 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000666#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000667 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000668 return -1;
669 return 0;
670#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000671 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000672 return -1;
673 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000674#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000675 if (ia32) {
676 switch (new) {
677 case 2: break; /* x86 SYS_fork */
678 case SYS_clone: new = 120; break;
679 default:
680 fprintf(stderr, "%s: unexpected syscall %d\n",
681 __FUNCTION__, new);
682 return -1;
683 }
684 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
685 return -1;
686 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000687 return -1;
688 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000689#elif defined(HPPA)
690 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
691 return -1;
692 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000693#elif defined(SH)
Roland McGrathac971c22003-03-31 01:03:33 +0000694 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
Wichert Akkermanccef6372002-05-01 16:39:22 +0000695 return -1;
696 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000697#elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +0000698 /* Top half of reg encodes the no. of args n as 0x1n.
699 Assume 0 args as kernel never actually checks... */
700 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
701 0x100000 | new) < 0)
702 return -1;
703 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000704#else
705#warning Do not know how to handle change_syscall for this architecture
706#endif /* architecture */
707#endif /* LINUX */
708 return -1;
709}
710
711int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000712setarg(tcp, argnum)
713 struct tcb *tcp;
714 int argnum;
715{
716#if defined (IA64)
717 {
718 unsigned long *bsp, *ap;
719
720 if (upeek(tcp->pid, PT_AR_BSP, (long *) &bsp) , 0)
721 return -1;
722
723 ap = ia64_rse_skip_regs(bsp, argnum);
724 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000725 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000726 if (errno)
727 return -1;
728
729 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000730#elif defined(I386)
731 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000732 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000733 if (errno)
734 return -1;
735 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000736#elif defined(X86_64)
737 {
738 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
739 if (errno)
740 return -1;
741 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000742#elif defined(POWERPC)
743#ifndef PT_ORIG_R3
744#define PT_ORIG_R3 34
745#endif
746 {
747 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000748 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000749 tcp->u_arg[argnum]);
750 if (errno)
751 return -1;
752 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000753#elif defined(MIPS)
754 {
755 errno = 0;
756 if (argnum < 4)
757 ptrace(PTRACE_POKEUSER, tcp->pid,
758 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
759 else {
760 unsigned long *sp;
761
762 if (upeek(tcp->pid, REG_SP, (long *) &sp) , 0)
763 return -1;
764
765 ptrace(PTRACE_POKEDATA, tcp->pid,
766 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
767 }
768 if (errno)
769 return -1;
770 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000771#elif defined(S390) || defined(S390X)
772 {
773 if(argnum <= 5)
774 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000775 (char *) (argnum==0 ? PT_ORIGGPR2 :
776 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000777 tcp->u_arg[argnum]);
778 else
779 return -E2BIG;
780 if (errno)
781 return -1;
782 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000783#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000784# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000785#endif
786 return 0;
787}
788
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000789#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000790int
791internal_clone(tcp)
792struct tcb *tcp;
793{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000794 struct tcb *tcpchild;
795 int pid;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000796 if (entering(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000797 if (!followfork)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000798 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000799 if (fork_tcb(tcp))
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000800 return 0;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000801 if (setbpt(tcp) < 0)
802 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000803 } else {
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000804 int bpt = tcp->flags & TCB_BPTSET;
805
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000806 if (!(tcp->flags & TCB_FOLLOWFORK))
807 return 0;
808
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000809 if (syserror(tcp)) {
810 if (bpt)
811 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000812 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000813 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000814
815 pid = tcp->u_rval;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000816
817#ifdef CLONE_PTRACE /* See new setbpt code. */
818 tcpchild = pid2tcb(pid);
819 if (tcpchild != NULL) {
820 /* The child already reported its startup trap
821 before the parent reported its syscall return. */
822 if ((tcpchild->flags
823 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
824 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
825 fprintf(stderr, "\
826[preattached child %d of %d in weird state!]\n",
827 pid, tcp->pid);
828 }
829 else
830#endif
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000831 if ((tcpchild = alloctcb(pid)) == NULL) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000832 if (bpt)
833 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000834 fprintf(stderr, " [tcb table full]\n");
835 kill(pid, SIGKILL); /* XXX */
836 return 0;
837 }
838
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000839#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000840 /* Attach to the new child */
841 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000842 if (bpt)
843 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000844 perror("PTRACE_ATTACH");
845 fprintf(stderr, "Too late?\n");
846 droptcb(tcpchild);
847 return 0;
848 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000849#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000850
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000851 if (bpt)
852 clearbpt(tcp);
853
Ulrich Drepper90512f01999-12-24 07:22:25 +0000854 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000855 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000856 if (bpt) {
857 tcpchild->flags |= TCB_BPTSET;
858 tcpchild->baddr = tcp->baddr;
859 memcpy(tcpchild->inst, tcp->inst,
860 sizeof tcpchild->inst);
861 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000862 tcpchild->parent = tcp;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000863 tcp->nchildren++;
864 if (tcpchild->flags & TCB_SUSPENDED) {
865 /* The child was born suspended, due to our having
866 forced CLONE_PTRACE. */
867 if (bpt)
868 clearbpt(tcpchild);
869
870 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
871 if (ptrace(PTRACE_SYSCALL, pid, (char *) 1, 0) < 0) {
872 perror("resume: ptrace(PTRACE_SYSCALL, ...)");
873 return -1;
874 }
875
876 if (!qflag)
877 fprintf(stderr, "\
878Process %u resumed (parent %d ready)\n",
879 pid, tcp->pid);
880 }
881 else {
882 newoutf(tcpchild);
883 if (!qflag)
884 fprintf(stderr, "Process %d attached\n", pid);
885 }
886
887#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000888 {
889 /*
890 * Save the flags used in this call,
891 * in case we point TCP to our parent below.
892 */
893 int call_flags = tcp->u_arg[ARG_FLAGS];
894 if ((tcp->flags & TCB_CLONE_THREAD) &&
895 tcp->parent != NULL) {
896 /* The parent in this clone is itself a
897 thread belonging to another process.
898 There is no meaning to the parentage
899 relationship of the new child with the
900 thread, only with the process. We
901 associate the new thread with our
902 parent. Since this is done for every
903 new thread, there will never be a
904 TCB_CLONE_THREAD process that has
905 children. */
906 --tcp->nchildren;
907 tcp = tcp->parent;
908 tcpchild->parent = tcp;
909 ++tcp->nchildren;
910 }
911 if (call_flags & CLONE_THREAD) {
912 tcpchild->flags |= TCB_CLONE_THREAD;
913 ++tcp->nclone_threads;
914 }
915 if (call_flags & CLONE_DETACHED) {
916 tcpchild->flags |= TCB_CLONE_DETACHED;
917 ++tcp->nclone_detached;
918 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000919 }
920#endif
921
922 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000923 return 0;
924}
925#endif
926
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000927int
928internal_fork(tcp)
929struct tcb *tcp;
930{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000931#ifdef LINUX
932 /* We do special magic with clone for any clone or fork. */
933 return internal_clone(tcp);
934#else
935
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000936 struct tcb *tcpchild;
937 int pid;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000938 int dont_follow = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000939
940#ifdef SYS_vfork
Nate Sammonsccd8f211999-03-29 22:57:54 +0000941 if (tcp->scno == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000942 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000943 if (!followvfork ||
Pavel Machek9a9f10b2000-02-01 16:22:52 +0000944 change_syscall(tcp, SYS_fork) < 0)
Nate Sammonsccd8f211999-03-29 22:57:54 +0000945 dont_follow = 1;
Nate Sammonsccd8f211999-03-29 22:57:54 +0000946 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000947#endif
948 if (entering(tcp)) {
Nate Sammonsccd8f211999-03-29 22:57:54 +0000949 if (!followfork || dont_follow)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000950 return 0;
Roland McGrathee9d4352002-12-18 04:16:10 +0000951 if (fork_tcb(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000952 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000953 if (setbpt(tcp) < 0)
954 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000955 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000956 else {
957 int bpt = tcp->flags & TCB_BPTSET;
958
959 if (!(tcp->flags & TCB_FOLLOWFORK))
960 return 0;
961 if (bpt)
962 clearbpt(tcp);
963
964 if (syserror(tcp))
965 return 0;
966
967 pid = tcp->u_rval;
968 if ((tcpchild = alloctcb(pid)) == NULL) {
969 fprintf(stderr, " [tcb table full]\n");
970 kill(pid, SIGKILL); /* XXX */
971 return 0;
972 }
973#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000974#ifdef HPPA
975 /* The child must have run before it can be attached. */
976 /* This must be a bug in the parisc kernel, but I havn't
977 * identified it yet. Seems to be an issue associated
978 * with attaching to a process (which sends it a signal)
979 * before that process has ever been scheduled. When
980 * debugging, I started seeing crashes in
981 * arch/parisc/kernel/signal.c:do_signal(), apparently
982 * caused by r8 getting corrupt over the dequeue_signal()
983 * call. Didn't make much sense though...
984 */
985 {
986 struct timeval tv;
987 tv.tv_sec = 0;
988 tv.tv_usec = 10000;
989 select(0, NULL, NULL, NULL, &tv);
990 }
991#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000992 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
993 perror("PTRACE_ATTACH");
994 fprintf(stderr, "Too late?\n");
995 droptcb(tcpchild);
996 return 0;
997 }
998#endif /* LINUX */
999#ifdef SUNOS4
1000#ifdef oldway
1001 /* The child must have run before it can be attached. */
1002 {
1003 struct timeval tv;
1004 tv.tv_sec = 0;
1005 tv.tv_usec = 10000;
1006 select(0, NULL, NULL, NULL, &tv);
1007 }
1008 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1009 perror("PTRACE_ATTACH");
1010 fprintf(stderr, "Too late?\n");
1011 droptcb(tcpchild);
1012 return 0;
1013 }
1014#else /* !oldway */
1015 /* Try to catch the new process as soon as possible. */
1016 {
1017 int i;
1018 for (i = 0; i < 1024; i++)
1019 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1020 break;
1021 if (i == 1024) {
1022 perror("PTRACE_ATTACH");
1023 fprintf(stderr, "Too late?\n");
1024 droptcb(tcpchild);
1025 return 0;
1026 }
1027 }
1028#endif /* !oldway */
1029#endif /* SUNOS4 */
1030 tcpchild->flags |= TCB_ATTACHED;
1031 /* Child has BPT too, must be removed on first occasion */
1032 if (bpt) {
1033 tcpchild->flags |= TCB_BPTSET;
1034 tcpchild->baddr = tcp->baddr;
1035 memcpy(tcpchild->inst, tcp->inst,
1036 sizeof tcpchild->inst);
1037 }
1038 newoutf(tcpchild);
1039 tcpchild->parent = tcp;
1040 tcp->nchildren++;
1041 if (!qflag)
1042 fprintf(stderr, "Process %d attached\n", pid);
1043 }
1044 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001045#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001046}
1047
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001048#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001049
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001050#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001051
1052int
1053sys_vfork(tcp)
1054struct tcb *tcp;
1055{
1056 if (exiting(tcp))
1057 return RVAL_UDECIMAL;
1058 return 0;
1059}
1060
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001061#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001062
1063#ifndef LINUX
1064
1065static char idstr[16];
1066
1067int
1068sys_getpid(tcp)
1069struct tcb *tcp;
1070{
1071 if (exiting(tcp)) {
1072 sprintf(idstr, "ppid %lu", getrval2(tcp));
1073 tcp->auxstr = idstr;
1074 return RVAL_STR;
1075 }
1076 return 0;
1077}
1078
1079int
1080sys_getuid(tcp)
1081struct tcb *tcp;
1082{
1083 if (exiting(tcp)) {
1084 sprintf(idstr, "euid %lu", getrval2(tcp));
1085 tcp->auxstr = idstr;
1086 return RVAL_STR;
1087 }
1088 return 0;
1089}
1090
1091int
1092sys_getgid(tcp)
1093struct tcb *tcp;
1094{
1095 if (exiting(tcp)) {
1096 sprintf(idstr, "egid %lu", getrval2(tcp));
1097 tcp->auxstr = idstr;
1098 return RVAL_STR;
1099 }
1100 return 0;
1101}
1102
1103#endif /* !LINUX */
1104
1105#ifdef LINUX
1106
1107int
1108sys_setuid(tcp)
1109struct tcb *tcp;
1110{
1111 if (entering(tcp)) {
1112 tprintf("%u", (uid_t) tcp->u_arg[0]);
1113 }
1114 return 0;
1115}
1116
1117int
1118sys_setgid(tcp)
1119struct tcb *tcp;
1120{
1121 if (entering(tcp)) {
1122 tprintf("%u", (gid_t) tcp->u_arg[0]);
1123 }
1124 return 0;
1125}
1126
1127int
1128sys_getresuid(tcp)
1129 struct tcb *tcp;
1130{
1131 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001132 __kernel_uid_t uid;
1133 if (syserror(tcp))
1134 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1135 tcp->u_arg[1], tcp->u_arg[2]);
1136 else {
1137 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1138 tprintf("%#lx, ", tcp->u_arg[0]);
1139 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001140 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001141 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1142 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001143 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001144 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001145 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1146 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001147 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001148 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001149 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001150 }
1151 return 0;
1152}
1153
1154int
1155sys_getresgid(tcp)
1156struct tcb *tcp;
1157{
1158 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001159 __kernel_gid_t gid;
1160 if (syserror(tcp))
1161 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1162 tcp->u_arg[1], tcp->u_arg[2]);
1163 else {
1164 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1165 tprintf("%#lx, ", tcp->u_arg[0]);
1166 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001167 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001168 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1169 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001170 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001171 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001172 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1173 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001174 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001175 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001176 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001177 }
1178 return 0;
1179}
1180
1181#endif /* LINUX */
1182
1183int
1184sys_setreuid(tcp)
1185struct tcb *tcp;
1186{
1187 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001188 printuid("", tcp->u_arg[0]);
1189 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001190 }
1191 return 0;
1192}
1193
1194int
1195sys_setregid(tcp)
1196struct tcb *tcp;
1197{
1198 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001199 printuid("", tcp->u_arg[0]);
1200 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001201 }
1202 return 0;
1203}
1204
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001205#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001206int
1207sys_setresuid(tcp)
1208 struct tcb *tcp;
1209{
1210 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001211 printuid("", tcp->u_arg[0]);
1212 printuid(", ", tcp->u_arg[1]);
1213 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001214 }
1215 return 0;
1216}
1217int
1218sys_setresgid(tcp)
1219 struct tcb *tcp;
1220{
1221 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001222 printuid("", tcp->u_arg[0]);
1223 printuid(", ", tcp->u_arg[1]);
1224 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001225 }
1226 return 0;
1227}
1228
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001229#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001230
1231int
1232sys_setgroups(tcp)
1233struct tcb *tcp;
1234{
1235 int i, len;
1236 GETGROUPS_T *gidset;
1237
1238 if (entering(tcp)) {
1239 len = tcp->u_arg[0];
1240 tprintf("%u, ", len);
1241 if (len <= 0) {
1242 tprintf("[]");
1243 return 0;
1244 }
1245 gidset = (GETGROUPS_T *) malloc(len * sizeof(GETGROUPS_T));
1246 if (gidset == NULL) {
1247 fprintf(stderr, "sys_setgroups: out of memory\n");
1248 return -1;
1249 }
1250 if (!verbose(tcp))
1251 tprintf("%#lx", tcp->u_arg[1]);
1252 else if (umoven(tcp, tcp->u_arg[1],
1253 len * sizeof(GETGROUPS_T), (char *) gidset) < 0)
1254 tprintf("[?]");
1255 else {
1256 tprintf("[");
1257 for (i = 0; i < len; i++)
1258 tprintf("%s%lu", i ? ", " : "",
1259 (unsigned long) gidset[i]);
1260 tprintf("]");
1261 }
1262 free((char *) gidset);
1263 }
1264 return 0;
1265}
1266
1267int
1268sys_getgroups(tcp)
1269struct tcb *tcp;
1270{
1271 int i, len;
1272 GETGROUPS_T *gidset;
1273
1274 if (entering(tcp)) {
1275 len = tcp->u_arg[0];
1276 tprintf("%u, ", len);
1277 } else {
1278 len = tcp->u_rval;
1279 if (len <= 0) {
1280 tprintf("[]");
1281 return 0;
1282 }
1283 gidset = (GETGROUPS_T *) malloc(len * sizeof(GETGROUPS_T));
1284 if (gidset == NULL) {
1285 fprintf(stderr, "sys_getgroups: out of memory\n");
1286 return -1;
1287 }
1288 if (!tcp->u_arg[1])
1289 tprintf("NULL");
1290 else if (!verbose(tcp) || tcp->u_arg[0] == 0)
1291 tprintf("%#lx", tcp->u_arg[1]);
1292 else if (umoven(tcp, tcp->u_arg[1],
1293 len * sizeof(GETGROUPS_T), (char *) gidset) < 0)
1294 tprintf("[?]");
1295 else {
1296 tprintf("[");
1297 for (i = 0; i < len; i++)
1298 tprintf("%s%lu", i ? ", " : "",
1299 (unsigned long) gidset[i]);
1300 tprintf("]");
1301 }
1302 free((char *)gidset);
1303 }
1304 return 0;
1305}
1306
Roland McGrath83bd47a2003-11-13 22:32:26 +00001307#ifdef LINUX
1308int
1309sys_setgroups32(tcp)
1310struct tcb *tcp;
1311{
1312 int i, len;
1313 GETGROUPS32_T *gidset;
1314
1315 if (entering(tcp)) {
1316 len = tcp->u_arg[0];
1317 tprintf("%u, ", len);
1318 if (len <= 0) {
1319 tprintf("[]");
1320 return 0;
1321 }
1322 gidset = (GETGROUPS32_T *) malloc(len * sizeof(GETGROUPS32_T));
1323 if (gidset == NULL) {
1324 fprintf(stderr, "sys_setgroups32: out of memory\n");
1325 return -1;
1326 }
1327 if (!verbose(tcp))
1328 tprintf("%#lx", tcp->u_arg[1]);
1329 else if (umoven(tcp, tcp->u_arg[1],
1330 len * sizeof(GETGROUPS32_T), (char *) gidset) < 0)
1331 tprintf("[?]");
1332 else {
1333 tprintf("[");
1334 for (i = 0; i < len; i++)
1335 tprintf("%s%lu", i ? ", " : "",
1336 (unsigned long) gidset[i]);
1337 tprintf("]");
1338 }
1339 free((char *) gidset);
1340 }
1341 return 0;
1342}
1343
1344int
1345sys_getgroups32(tcp)
1346struct tcb *tcp;
1347{
1348 int i, len;
1349 GETGROUPS32_T *gidset;
1350
1351 if (entering(tcp)) {
1352 len = tcp->u_arg[0];
1353 tprintf("%u, ", len);
1354 } else {
1355 len = tcp->u_rval;
1356 if (len <= 0) {
1357 tprintf("[]");
1358 return 0;
1359 }
1360 gidset = (GETGROUPS32_T *) malloc(len * sizeof(GETGROUPS32_T));
1361 if (gidset == NULL) {
1362 fprintf(stderr, "sys_getgroups32: out of memory\n");
1363 return -1;
1364 }
1365 if (!tcp->u_arg[1])
1366 tprintf("NULL");
1367 else if (!verbose(tcp) || tcp->u_arg[0] == 0)
1368 tprintf("%#lx", tcp->u_arg[1]);
1369 else if (umoven(tcp, tcp->u_arg[1],
1370 len * sizeof(GETGROUPS32_T), (char *) gidset) < 0)
1371 tprintf("[?]");
1372 else {
1373 tprintf("[");
1374 for (i = 0; i < len; i++)
1375 tprintf("%s%lu", i ? ", " : "",
1376 (unsigned long) gidset[i]);
1377 tprintf("]");
1378 }
1379 free((char *)gidset);
1380 }
1381 return 0;
1382}
1383#endif /* LINUX */
1384
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001385int
1386sys_setpgrp(tcp)
1387struct tcb *tcp;
1388{
1389 if (entering(tcp)) {
1390#ifndef SVR4
1391 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1392#endif /* !SVR4 */
1393 }
1394 return 0;
1395}
1396
1397int
1398sys_getpgrp(tcp)
1399struct tcb *tcp;
1400{
1401 if (entering(tcp)) {
1402#ifndef SVR4
1403 tprintf("%lu", tcp->u_arg[0]);
1404#endif /* !SVR4 */
1405 }
1406 return 0;
1407}
1408
1409int
1410sys_getsid(tcp)
1411struct tcb *tcp;
1412{
1413 if (entering(tcp)) {
1414 tprintf("%lu", tcp->u_arg[0]);
1415 }
1416 return 0;
1417}
1418
1419int
1420sys_setsid(tcp)
1421struct tcb *tcp;
1422{
1423 return 0;
1424}
1425
1426int
1427sys_getpgid(tcp)
1428struct tcb *tcp;
1429{
1430 if (entering(tcp)) {
1431 tprintf("%lu", tcp->u_arg[0]);
1432 }
1433 return 0;
1434}
1435
1436int
1437sys_setpgid(tcp)
1438struct tcb *tcp;
1439{
1440 if (entering(tcp)) {
1441 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1442 }
1443 return 0;
1444}
1445
John Hughesc61eb3d2002-05-17 11:37:50 +00001446#if UNIXWARE >= 2
1447
1448#include <sys/privilege.h>
1449
1450
1451static struct xlat procpriv_cmds [] = {
1452 { SETPRV, "SETPRV" },
1453 { CLRPRV, "CLRPRV" },
1454 { PUTPRV, "PUTPRV" },
1455 { GETPRV, "GETPRV" },
1456 { CNTPRV, "CNTPRV" },
1457 { 0, NULL },
1458};
1459
1460
1461static struct xlat procpriv_priv [] = {
1462 { P_OWNER, "P_OWNER" },
1463 { P_AUDIT, "P_AUDIT" },
1464 { P_COMPAT, "P_COMPAT" },
1465 { P_DACREAD, "P_DACREAD" },
1466 { P_DACWRITE, "P_DACWRITE" },
1467 { P_DEV, "P_DEV" },
1468 { P_FILESYS, "P_FILESYS" },
1469 { P_MACREAD, "P_MACREAD" },
1470 { P_MACWRITE, "P_MACWRITE" },
1471 { P_MOUNT, "P_MOUNT" },
1472 { P_MULTIDIR, "P_MULTIDIR" },
1473 { P_SETPLEVEL, "P_SETPLEVEL" },
1474 { P_SETSPRIV, "P_SETSPRIV" },
1475 { P_SETUID, "P_SETUID" },
1476 { P_SYSOPS, "P_SYSOPS" },
1477 { P_SETUPRIV, "P_SETUPRIV" },
1478 { P_DRIVER, "P_DRIVER" },
1479 { P_RTIME, "P_RTIME" },
1480 { P_MACUPGRADE, "P_MACUPGRADE" },
1481 { P_FSYSRANGE, "P_FSYSRANGE" },
1482 { P_SETFLEVEL, "P_SETFLEVEL" },
1483 { P_AUDITWR, "P_AUDITWR" },
1484 { P_TSHAR, "P_TSHAR" },
1485 { P_PLOCK, "P_PLOCK" },
1486 { P_CORE, "P_CORE" },
1487 { P_LOADMOD, "P_LOADMOD" },
1488 { P_BIND, "P_BIND" },
1489 { P_ALLPRIVS, "P_ALLPRIVS" },
1490 { 0, NULL },
1491};
1492
1493
1494static struct xlat procpriv_type [] = {
1495 { PS_FIX, "PS_FIX" },
1496 { PS_INH, "PS_INH" },
1497 { PS_MAX, "PS_MAX" },
1498 { PS_WKG, "PS_WKG" },
1499 { 0, NULL },
1500};
1501
1502
1503static void
1504printpriv(tcp, addr, len, opt)
1505struct tcb *tcp;
1506long addr;
1507int len;
1508struct xlat *opt;
1509{
1510 priv_t buf [128];
1511 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1512 int dots = len > max;
1513 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001514
John Hughesc61eb3d2002-05-17 11:37:50 +00001515 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001516
John Hughesc61eb3d2002-05-17 11:37:50 +00001517 if (len <= 0 ||
1518 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1519 {
1520 tprintf ("%#lx", addr);
1521 return;
1522 }
1523
1524 tprintf ("[");
1525
1526 for (i = 0; i < len; ++i) {
1527 char *t, *p;
1528
1529 if (i) tprintf (", ");
1530
1531 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1532 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1533 {
1534 tprintf ("%s|%s", t, p);
1535 }
1536 else {
1537 tprintf ("%#lx", buf [i]);
1538 }
1539 }
1540
1541 if (dots) tprintf (" ...");
1542
1543 tprintf ("]");
1544}
1545
1546
1547int
1548sys_procpriv(tcp)
1549struct tcb *tcp;
1550{
1551 if (entering(tcp)) {
1552 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1553 switch (tcp->u_arg[0]) {
1554 case CNTPRV:
1555 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1556 break;
1557
1558 case GETPRV:
1559 break;
1560
1561 default:
1562 tprintf (", ");
1563 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1564 tprintf (", %ld", tcp->u_arg[2]);
1565 }
1566 }
1567 else if (tcp->u_arg[0] == GETPRV) {
1568 if (syserror (tcp)) {
1569 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1570 }
1571 else {
1572 tprintf (", ");
1573 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1574 tprintf (", %ld", tcp->u_arg[2]);
1575 }
1576 }
Roland McGrath5a223472002-12-15 23:58:26 +00001577
John Hughesc61eb3d2002-05-17 11:37:50 +00001578 return 0;
1579}
1580
1581#endif
1582
1583
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001584void
1585fake_execve(tcp, program, argv, envp)
1586struct tcb *tcp;
1587char *program;
1588char *argv[];
1589char *envp[];
1590{
1591 int i;
1592
1593#ifdef ARM
1594 if (!(qual_flags[SYS_execve - __NR_SYSCALL_BASE] & QUAL_TRACE))
1595 return;
1596#else
1597 if (!(qual_flags[SYS_execve] & QUAL_TRACE))
1598 return;
1599#endif /* !ARM */
1600 printleader(tcp);
1601 tprintf("execve(");
1602 string_quote(program);
1603 tprintf(", [");
1604 for (i = 0; argv[i] != NULL; i++) {
1605 if (i != 0)
1606 tprintf(", ");
1607 string_quote(argv[i]);
1608 }
1609 for (i = 0; envp[i] != NULL; i++)
1610 ;
1611 tprintf("], [/* %d var%s */]) ", i, (i != 1) ? "s" : "");
1612 tabto(acolumn);
1613 tprintf("= 0");
1614 printtrailer(tcp);
1615}
1616
1617static void
1618printargv(tcp, addr)
1619struct tcb *tcp;
1620long addr;
1621{
1622 char *cp;
1623 char *sep;
1624 int max = max_strlen / 2;
1625
1626 for (sep = ""; --max >= 0; sep = ", ") {
1627 if (!abbrev(tcp))
1628 max++;
1629 if (umove(tcp, addr, &cp) < 0) {
1630 tprintf("%#lx", addr);
1631 return;
1632 }
1633 if (cp == 0)
1634 break;
1635 tprintf(sep);
1636 printstr(tcp, (long) cp, -1);
1637 addr += sizeof(char *);
1638 }
1639 if (cp)
1640 tprintf(", ...");
1641}
1642
1643static void
1644printargc(fmt, tcp, addr)
1645char *fmt;
1646struct tcb *tcp;
1647long addr;
1648{
1649 int count;
1650 char *cp;
1651
1652 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1653 addr += sizeof(char *);
1654 }
1655 tprintf(fmt, count, count == 1 ? "" : "s");
1656}
1657
1658int
1659sys_execv(tcp)
1660struct tcb *tcp;
1661{
1662 if (entering(tcp)) {
1663 printpath(tcp, tcp->u_arg[0]);
1664 if (!verbose(tcp))
1665 tprintf(", %#lx", tcp->u_arg[1]);
1666#if 0
1667 else if (abbrev(tcp))
1668 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1669#endif
1670 else {
1671 tprintf(", [");
1672 printargv(tcp, tcp->u_arg[1]);
1673 tprintf("]");
1674 }
1675 }
1676 return 0;
1677}
1678
1679int
1680sys_execve(tcp)
1681struct tcb *tcp;
1682{
1683 if (entering(tcp)) {
1684 printpath(tcp, tcp->u_arg[0]);
1685 if (!verbose(tcp))
1686 tprintf(", %#lx", tcp->u_arg[1]);
1687#if 0
1688 else if (abbrev(tcp))
1689 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1690#endif
1691 else {
1692 tprintf(", [");
1693 printargv(tcp, tcp->u_arg[1]);
1694 tprintf("]");
1695 }
1696 if (!verbose(tcp))
1697 tprintf(", %#lx", tcp->u_arg[2]);
1698 else if (abbrev(tcp))
1699 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1700 else {
1701 tprintf(", [");
1702 printargv(tcp, tcp->u_arg[2]);
1703 tprintf("]");
1704 }
1705 }
Roland McGrathb4968be2003-01-20 09:04:33 +00001706#if defined LINUX && defined TCB_WAITEXECVE
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001707 tcp->flags |= TCB_WAITEXECVE;
Roland McGrathb4968be2003-01-20 09:04:33 +00001708#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001709 return 0;
1710}
1711
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001712#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001713
1714int sys_rexecve(tcp)
1715struct tcb *tcp;
1716{
1717 if (entering (tcp)) {
1718 sys_execve (tcp);
1719 tprintf (", %ld", tcp->u_arg[3]);
1720 }
1721 return 0;
1722}
1723
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001724#endif
John Hughes4e36a812001-04-18 15:11:51 +00001725
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001726int
1727internal_exec(tcp)
1728struct tcb *tcp;
1729{
1730#ifdef SUNOS4
1731 if (exiting(tcp) && !syserror(tcp) && followfork)
1732 fixvfork(tcp);
1733#endif /* SUNOS4 */
1734 return 0;
1735}
1736
1737#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001738#ifndef __WNOTHREAD
1739#define __WNOTHREAD 0x20000000
1740#endif
1741#ifndef __WALL
1742#define __WALL 0x40000000
1743#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001744#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001745#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001746#endif
1747#endif /* LINUX */
1748
1749static struct xlat wait4_options[] = {
1750 { WNOHANG, "WNOHANG" },
1751#ifndef WSTOPPED
1752 { WUNTRACED, "WUNTRACED" },
1753#endif
1754#ifdef WEXITED
1755 { WEXITED, "WEXITED" },
1756#endif
1757#ifdef WTRAPPED
1758 { WTRAPPED, "WTRAPPED" },
1759#endif
1760#ifdef WSTOPPED
1761 { WSTOPPED, "WSTOPPED" },
1762#endif
1763#ifdef WCONTINUED
1764 { WCONTINUED, "WCONTINUED" },
1765#endif
1766#ifdef WNOWAIT
1767 { WNOWAIT, "WNOWAIT" },
1768#endif
1769#ifdef __WCLONE
1770 { __WCLONE, "__WCLONE" },
1771#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001772#ifdef __WALL
1773 { __WALL, "__WALL" },
1774#endif
1775#ifdef __WNOTHREAD
1776 { __WNOTHREAD, "__WNOTHREAD" },
1777#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001778 { 0, NULL },
1779};
1780
1781static int
1782printstatus(status)
1783int status;
1784{
1785 int exited = 0;
1786
1787 /*
1788 * Here is a tricky presentation problem. This solution
1789 * is still not entirely satisfactory but since there
1790 * are no wait status constructors it will have to do.
1791 */
1792 if (WIFSTOPPED(status))
1793 tprintf("[WIFSTOPPED(s) && WSTOPSIG(s) == %s]",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001794 signame(WSTOPSIG(status)));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001795 else if WIFSIGNALED(status)
1796 tprintf("[WIFSIGNALED(s) && WTERMSIG(s) == %s%s]",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001797 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001798 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
1799 else if WIFEXITED(status) {
1800 tprintf("[WIFEXITED(s) && WEXITSTATUS(s) == %d]",
1801 WEXITSTATUS(status));
1802 exited = 1;
1803 }
1804 else
1805 tprintf("[%#x]", status);
1806 return exited;
1807}
1808
1809static int
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001810printwaitn(tcp, n, bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001811struct tcb *tcp;
1812int n;
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001813int bitness;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001814{
1815 int status;
1816 int exited = 0;
1817
1818 if (entering(tcp)) {
1819 tprintf("%ld, ", tcp->u_arg[0]);
1820 } else {
1821 /* status */
1822 if (!tcp->u_arg[1])
1823 tprintf("NULL");
1824 else if (syserror(tcp) || tcp->u_rval == 0)
1825 tprintf("%#lx", tcp->u_arg[1]);
1826 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1827 tprintf("[?]");
1828 else
1829 exited = printstatus(status);
1830 /* options */
1831 tprintf(", ");
1832 if (!printflags(wait4_options, tcp->u_arg[2]))
1833 tprintf("0");
1834 if (n == 4) {
1835 tprintf(", ");
1836 /* usage */
1837 if (!tcp->u_arg[3])
1838 tprintf("NULL");
1839#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001840 else if (tcp->u_rval > 0) {
1841#ifdef LINUX_64BIT
1842 if (bitness)
1843 printrusage32(tcp, tcp->u_arg[3]);
1844 else
1845#endif
1846 printrusage(tcp, tcp->u_arg[3]);
1847 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001848#endif /* LINUX */
1849#ifdef SUNOS4
1850 else if (tcp->u_rval > 0 && exited)
1851 printrusage(tcp, tcp->u_arg[3]);
1852#endif /* SUNOS4 */
1853 else
1854 tprintf("%#lx", tcp->u_arg[3]);
1855 }
1856 }
1857 return 0;
1858}
1859
1860int
1861internal_wait(tcp)
1862struct tcb *tcp;
1863{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001864 int got_kids;
1865
1866#ifdef TCB_CLONE_THREAD
1867 if (tcp->flags & TCB_CLONE_THREAD)
1868 /* The children we wait for are our parent's children. */
1869 got_kids = (tcp->parent->nchildren
1870 > tcp->parent->nclone_detached);
1871 else
1872 got_kids = (tcp->nchildren > tcp->nclone_detached);
1873#else
1874 got_kids = tcp->nchildren > 0;
1875#endif
1876
1877 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001878 /* There are children that this parent should block for.
1879 But ptrace made us the parent of the traced children
1880 and the real parent will get ECHILD from the wait call.
1881
1882 XXX If we attached with strace -f -p PID, then there
1883 may be untraced dead children the parent could be reaping
1884 now, but we make him block. */
1885
1886 /* ??? WTA: fix bug with hanging children */
1887
1888 if (!(tcp->u_arg[2] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001889 /*
1890 * There are traced children. We'll make the parent
1891 * block to avoid a false ECHILD error due to our
1892 * ptrace having stolen the children. However,
1893 * we shouldn't block if there are zombies to reap.
1894 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1895 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001896 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001897 if (tcp->nzombies > 0 &&
1898 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001899 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001900 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001901 if (tcp->u_arg[0] > 0) {
1902 /*
1903 * If the parent waits for a specified child
1904 * PID, then it must get ECHILD right away
1905 * if that PID is not one of its children.
1906 * Make sure that the requested PID matches
1907 * one of the parent's children that we are
1908 * tracing, and don't suspend it otherwise.
1909 */
1910 if (child == NULL)
1911 child = pid2tcb(tcp->u_arg[0]);
1912 if (child == NULL || child->parent != (
1913#ifdef TCB_CLONE_THREAD
1914 (tcp->flags & TCB_CLONE_THREAD)
1915 ? tcp->parent :
1916#endif
1917 tcp))
1918 return 0;
1919 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001920 tcp->flags |= TCB_SUSPENDED;
1921 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001922#ifdef TCB_CLONE_THREAD
1923 if (tcp->flags & TCB_CLONE_THREAD)
1924 tcp->parent->nclone_waiting++;
1925#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001926 }
1927 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001928 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001929 if (tcp->u_arg[2] & WNOHANG) {
1930 /* We must force a fake result of 0 instead of
1931 the ECHILD error. */
1932 extern int force_result();
1933 return force_result(tcp, 0, 0);
1934 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00001935 }
Roland McGrath09623452003-05-23 02:27:13 +00001936 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
1937 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
1938 /*
1939 * We just reaped a child we don't know about,
1940 * presumably a zombie we already droptcb'd.
1941 */
1942 tcp->nzombies--;
1943 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001944 return 0;
1945}
1946
1947#ifdef SVR4
1948
1949int
1950sys_wait(tcp)
1951struct tcb *tcp;
1952{
1953 if (exiting(tcp)) {
1954 /* The library wrapper stuffs this into the user variable. */
1955 if (!syserror(tcp))
1956 printstatus(getrval2(tcp));
1957 }
1958 return 0;
1959}
1960
1961#endif /* SVR4 */
1962
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001963#ifdef FREEBSD
1964int
1965sys_wait(tcp)
1966struct tcb *tcp;
1967{
1968 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00001969
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001970 if (exiting(tcp)) {
1971 if (!syserror(tcp)) {
1972 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1973 tprintf("%#lx", tcp->u_arg[0]);
1974 else
1975 printstatus(status);
1976 }
1977 }
1978 return 0;
1979}
1980#endif
1981
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001982int
1983sys_waitpid(tcp)
1984struct tcb *tcp;
1985{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001986 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001987}
1988
1989int
1990sys_wait4(tcp)
1991struct tcb *tcp;
1992{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001993 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001994}
1995
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001996#ifdef ALPHA
1997int
1998sys_osf_wait4(tcp)
1999struct tcb *tcp;
2000{
2001 return printwaitn(tcp, 4, 1);
2002}
2003#endif
2004
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002005#ifdef SVR4
2006
2007static struct xlat waitid_types[] = {
2008 { P_PID, "P_PID" },
2009 { P_PPID, "P_PPID" },
2010 { P_PGID, "P_PGID" },
2011 { P_SID, "P_SID" },
2012 { P_CID, "P_CID" },
2013 { P_UID, "P_UID" },
2014 { P_GID, "P_GID" },
2015 { P_ALL, "P_ALL" },
2016#ifdef P_LWPID
2017 { P_LWPID, "P_LWPID" },
2018#endif
2019 { 0, NULL },
2020};
2021
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002022int
2023sys_waitid(tcp)
2024struct tcb *tcp;
2025{
2026 siginfo_t si;
2027 int exited;
2028
2029 if (entering(tcp)) {
2030 printxval(waitid_types, tcp->u_arg[0], "P_???");
2031 tprintf(", %ld, ", tcp->u_arg[1]);
2032 if (tcp->nchildren > 0) {
2033 /* There are traced children */
2034 tcp->flags |= TCB_SUSPENDED;
2035 tcp->waitpid = tcp->u_arg[0];
2036 }
2037 }
2038 else {
2039 /* siginfo */
2040 exited = 0;
2041 if (!tcp->u_arg[2])
2042 tprintf("NULL");
2043 else if (syserror(tcp))
2044 tprintf("%#lx", tcp->u_arg[2]);
2045 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2046 tprintf("{???}");
2047 else
John Hughes58265892001-10-18 15:13:53 +00002048 printsiginfo(&si, verbose (tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002049 /* options */
2050 tprintf(", ");
2051 if (!printflags(wait4_options, tcp->u_arg[3]))
2052 tprintf("0");
2053 }
2054 return 0;
2055}
2056
2057#endif /* SVR4 */
2058
2059int
2060sys_alarm(tcp)
2061struct tcb *tcp;
2062{
2063 if (entering(tcp))
2064 tprintf("%lu", tcp->u_arg[0]);
2065 return 0;
2066}
2067
2068int
2069sys_uname(tcp)
2070struct tcb *tcp;
2071{
2072 struct utsname uname;
2073
2074 if (exiting(tcp)) {
2075 if (syserror(tcp) || !verbose(tcp))
2076 tprintf("%#lx", tcp->u_arg[0]);
2077 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2078 tprintf("{...}");
2079 else if (!abbrev(tcp)) {
2080
2081 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2082 uname.sysname, uname.nodename);
2083 tprintf("release=\"%s\", version=\"%s\", ",
2084 uname.release, uname.version);
2085 tprintf("machine=\"%s\"", uname.machine);
2086#ifdef LINUX
2087#ifndef __GLIBC__
2088 tprintf(", domainname=\"%s\"", uname.domainname);
2089#endif /* __GLIBC__ */
2090#endif /* LINUX */
2091 tprintf("}");
2092 }
2093 else
2094 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2095 uname.sysname, uname.nodename);
2096 }
2097 return 0;
2098}
2099
2100#ifndef SVR4
2101
2102static struct xlat ptrace_cmds[] = {
Roland McGrath5a223472002-12-15 23:58:26 +00002103#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002104 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2105 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2106 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2107 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2108 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2109 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2110 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2111 { PTRACE_CONT, "PTRACE_CONT" },
2112 { PTRACE_KILL, "PTRACE_KILL" },
2113 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2114 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2115 { PTRACE_DETACH, "PTRACE_DETACH" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002116#ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002117 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002118#endif
2119#ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002120 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002121#endif
2122#ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002123 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002124#endif
2125#ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002126 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002127#endif
2128#ifdef PTRACE_GETFPXREGS
2129 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2130#endif
2131#ifdef PTRACE_SETFPXREGS
2132 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2133#endif
2134#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002135 { PTRACE_READDATA, "PTRACE_READDATA" },
2136 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2137 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2138 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2139 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2140 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2141#ifdef SPARC
2142 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2143 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2144#else /* !SPARC */
2145 { PTRACE_22, "PTRACE_PTRACE_22" },
2146 { PTRACE_23, "PTRACE_PTRACE_23" },
2147#endif /* !SPARC */
2148#endif /* SUNOS4 */
2149 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2150#ifdef SUNOS4
2151 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2152#ifdef I386
2153 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2154 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2155 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2156#else /* !I386 */
2157 { PTRACE_26, "PTRACE_26" },
2158 { PTRACE_27, "PTRACE_27" },
2159 { PTRACE_28, "PTRACE_28" },
2160#endif /* !I386 */
2161 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2162#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002163#else /* FREEBSD */
2164 { PT_TRACE_ME, "PT_TRACE_ME" },
2165 { PT_READ_I, "PT_READ_I" },
2166 { PT_READ_D, "PT_READ_D" },
2167 { PT_WRITE_I, "PT_WRITE_I" },
2168 { PT_WRITE_D, "PT_WRITE_D" },
John Hughesa2278142001-09-28 16:21:30 +00002169#ifdef PT_READ_U
2170 { PT_READ_U, "PT_READ_U" },
2171#endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002172 { PT_CONTINUE, "PT_CONTINUE" },
2173 { PT_KILL, "PT_KILL" },
2174 { PT_STEP, "PT_STEP" },
2175 { PT_ATTACH, "PT_ATTACH" },
2176 { PT_DETACH, "PT_DETACH" },
2177 { PT_GETREGS, "PT_GETREGS" },
2178 { PT_SETREGS, "PT_SETREGS" },
2179 { PT_GETFPREGS, "PT_GETFPREGS" },
2180 { PT_SETFPREGS, "PT_SETFPREGS" },
2181 { PT_GETDBREGS, "PT_GETDBREGS" },
2182 { PT_SETDBREGS, "PT_SETDBREGS" },
2183#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002184 { 0, NULL },
2185};
2186
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002187#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002188#ifndef SUNOS4_KERNEL_ARCH_KLUDGE
2189static
2190#endif /* !SUNOS4_KERNEL_ARCH_KLUDGE */
2191struct xlat struct_user_offsets[] = {
2192#ifdef LINUX
Michal Ludvig10a88d02002-10-07 14:31:00 +00002193#if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002194 { PT_PSWMASK, "psw_mask" },
2195 { PT_PSWADDR, "psw_addr" },
2196 { PT_GPR0, "gpr0" },
2197 { PT_GPR1, "gpr1" },
2198 { PT_GPR2, "gpr2" },
2199 { PT_GPR3, "gpr3" },
2200 { PT_GPR4, "gpr4" },
2201 { PT_GPR5, "gpr5" },
2202 { PT_GPR6, "gpr6" },
2203 { PT_GPR7, "gpr7" },
2204 { PT_GPR8, "gpr8" },
2205 { PT_GPR9, "gpr9" },
2206 { PT_GPR10, "gpr10" },
2207 { PT_GPR11, "gpr11" },
2208 { PT_GPR12, "gpr12" },
2209 { PT_GPR13, "gpr13" },
2210 { PT_GPR14, "gpr14" },
2211 { PT_GPR15, "gpr15" },
2212 { PT_ACR0, "acr0" },
2213 { PT_ACR1, "acr1" },
2214 { PT_ACR2, "acr2" },
2215 { PT_ACR3, "acr3" },
2216 { PT_ACR4, "acr4" },
2217 { PT_ACR5, "acr5" },
2218 { PT_ACR6, "acr6" },
2219 { PT_ACR7, "acr7" },
2220 { PT_ACR8, "acr8" },
2221 { PT_ACR9, "acr9" },
2222 { PT_ACR10, "acr10" },
2223 { PT_ACR11, "acr11" },
2224 { PT_ACR12, "acr12" },
2225 { PT_ACR13, "acr13" },
2226 { PT_ACR14, "acr14" },
2227 { PT_ACR15, "acr15" },
2228 { PT_ORIGGPR2, "orig_gpr2" },
2229 { PT_FPC, "fpc" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002230#if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002231 { PT_FPR0_HI, "fpr0.hi" },
2232 { PT_FPR0_LO, "fpr0.lo" },
2233 { PT_FPR1_HI, "fpr1.hi" },
2234 { PT_FPR1_LO, "fpr1.lo" },
2235 { PT_FPR2_HI, "fpr2.hi" },
2236 { PT_FPR2_LO, "fpr2.lo" },
2237 { PT_FPR3_HI, "fpr3.hi" },
2238 { PT_FPR3_LO, "fpr3.lo" },
2239 { PT_FPR4_HI, "fpr4.hi" },
2240 { PT_FPR4_LO, "fpr4.lo" },
2241 { PT_FPR5_HI, "fpr5.hi" },
2242 { PT_FPR5_LO, "fpr5.lo" },
2243 { PT_FPR6_HI, "fpr6.hi" },
2244 { PT_FPR6_LO, "fpr6.lo" },
2245 { PT_FPR7_HI, "fpr7.hi" },
2246 { PT_FPR7_LO, "fpr7.lo" },
2247 { PT_FPR8_HI, "fpr8.hi" },
2248 { PT_FPR8_LO, "fpr8.lo" },
2249 { PT_FPR9_HI, "fpr9.hi" },
2250 { PT_FPR9_LO, "fpr9.lo" },
2251 { PT_FPR10_HI, "fpr10.hi" },
2252 { PT_FPR10_LO, "fpr10.lo" },
2253 { PT_FPR11_HI, "fpr11.hi" },
2254 { PT_FPR11_LO, "fpr11.lo" },
2255 { PT_FPR12_HI, "fpr12.hi" },
2256 { PT_FPR12_LO, "fpr12.lo" },
2257 { PT_FPR13_HI, "fpr13.hi" },
2258 { PT_FPR13_LO, "fpr13.lo" },
2259 { PT_FPR14_HI, "fpr14.hi" },
2260 { PT_FPR14_LO, "fpr14.lo" },
2261 { PT_FPR15_HI, "fpr15.hi" },
2262 { PT_FPR15_LO, "fpr15.lo" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002263#endif
2264#if defined(S390X)
2265 { PT_FPR0, "fpr0" },
2266 { PT_FPR1, "fpr1" },
2267 { PT_FPR2, "fpr2" },
2268 { PT_FPR3, "fpr3" },
2269 { PT_FPR4, "fpr4" },
2270 { PT_FPR5, "fpr5" },
2271 { PT_FPR6, "fpr6" },
2272 { PT_FPR7, "fpr7" },
2273 { PT_FPR8, "fpr8" },
2274 { PT_FPR9, "fpr9" },
2275 { PT_FPR10, "fpr10" },
2276 { PT_FPR11, "fpr11" },
2277 { PT_FPR12, "fpr12" },
2278 { PT_FPR13, "fpr13" },
2279 { PT_FPR14, "fpr14" },
2280 { PT_FPR15, "fpr15" },
2281#endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002282 { PT_CR_9, "cr9" },
2283 { PT_CR_10, "cr10" },
2284 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002285 { PT_IEEE_IP, "ieee_exception_ip" },
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002286#endif
2287#if defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002288 /* XXX No support for these offsets yet. */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002289#elif defined(HPPA)
2290 /* XXX No support for these offsets yet. */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002291#elif defined(POWERPC)
Roland McGrath5a223472002-12-15 23:58:26 +00002292#ifndef PT_ORIG_R3
2293#define PT_ORIG_R3 34
2294#endif
Roland McGratheb285352003-01-14 09:59:00 +00002295#define REGSIZE (sizeof(unsigned long))
2296 { REGSIZE*PT_R0, "r0" },
2297 { REGSIZE*PT_R1, "r1" },
2298 { REGSIZE*PT_R2, "r2" },
2299 { REGSIZE*PT_R3, "r3" },
2300 { REGSIZE*PT_R4, "r4" },
2301 { REGSIZE*PT_R5, "r5" },
2302 { REGSIZE*PT_R6, "r6" },
2303 { REGSIZE*PT_R7, "r7" },
2304 { REGSIZE*PT_R8, "r8" },
2305 { REGSIZE*PT_R9, "r9" },
2306 { REGSIZE*PT_R10, "r10" },
2307 { REGSIZE*PT_R11, "r11" },
2308 { REGSIZE*PT_R12, "r12" },
2309 { REGSIZE*PT_R13, "r13" },
2310 { REGSIZE*PT_R14, "r14" },
2311 { REGSIZE*PT_R15, "r15" },
2312 { REGSIZE*PT_R16, "r16" },
2313 { REGSIZE*PT_R17, "r17" },
2314 { REGSIZE*PT_R18, "r18" },
2315 { REGSIZE*PT_R19, "r19" },
2316 { REGSIZE*PT_R20, "r20" },
2317 { REGSIZE*PT_R21, "r21" },
2318 { REGSIZE*PT_R22, "r22" },
2319 { REGSIZE*PT_R23, "r23" },
2320 { REGSIZE*PT_R24, "r24" },
2321 { REGSIZE*PT_R25, "r25" },
2322 { REGSIZE*PT_R26, "r26" },
2323 { REGSIZE*PT_R27, "r27" },
2324 { REGSIZE*PT_R28, "r28" },
2325 { REGSIZE*PT_R29, "r29" },
2326 { REGSIZE*PT_R30, "r30" },
2327 { REGSIZE*PT_R31, "r31" },
2328 { REGSIZE*PT_NIP, "NIP" },
2329 { REGSIZE*PT_MSR, "MSR" },
2330 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2331 { REGSIZE*PT_CTR, "CTR" },
2332 { REGSIZE*PT_LNK, "LNK" },
2333 { REGSIZE*PT_XER, "XER" },
2334 { REGSIZE*PT_CCR, "CCR" },
2335 { REGSIZE*PT_FPR0, "FPR0" },
2336#undef REGSIZE
Roland McGrath5a223472002-12-15 23:58:26 +00002337#else
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002338#ifdef ALPHA
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002339 { 0, "r0" },
2340 { 1, "r1" },
2341 { 2, "r2" },
2342 { 3, "r3" },
2343 { 4, "r4" },
2344 { 5, "r5" },
2345 { 6, "r6" },
2346 { 7, "r7" },
2347 { 8, "r8" },
2348 { 9, "r9" },
2349 { 10, "r10" },
2350 { 11, "r11" },
2351 { 12, "r12" },
2352 { 13, "r13" },
2353 { 14, "r14" },
2354 { 15, "r15" },
2355 { 16, "r16" },
2356 { 17, "r17" },
2357 { 18, "r18" },
2358 { 19, "r19" },
2359 { 20, "r20" },
2360 { 21, "r21" },
2361 { 22, "r22" },
2362 { 23, "r23" },
2363 { 24, "r24" },
2364 { 25, "r25" },
2365 { 26, "r26" },
2366 { 27, "r27" },
2367 { 28, "r28" },
2368 { 29, "gp" },
2369 { 30, "fp" },
2370 { 31, "zero" },
2371 { 32, "fp0" },
2372 { 33, "fp" },
2373 { 34, "fp2" },
2374 { 35, "fp3" },
2375 { 36, "fp4" },
2376 { 37, "fp5" },
2377 { 38, "fp6" },
2378 { 39, "fp7" },
2379 { 40, "fp8" },
2380 { 41, "fp9" },
2381 { 42, "fp10" },
2382 { 43, "fp11" },
2383 { 44, "fp12" },
2384 { 45, "fp13" },
2385 { 46, "fp14" },
2386 { 47, "fp15" },
2387 { 48, "fp16" },
2388 { 49, "fp17" },
2389 { 50, "fp18" },
2390 { 51, "fp19" },
2391 { 52, "fp20" },
2392 { 53, "fp21" },
2393 { 54, "fp22" },
2394 { 55, "fp23" },
2395 { 56, "fp24" },
2396 { 57, "fp25" },
2397 { 58, "fp26" },
2398 { 59, "fp27" },
2399 { 60, "fp28" },
2400 { 61, "fp29" },
2401 { 62, "fp30" },
2402 { 63, "fp31" },
2403 { 64, "pc" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002404#else /* !ALPHA */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002405#ifdef IA64
2406 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2407 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2408 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2409 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2410 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2411 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2412 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2413 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2414 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2415 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2416 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2417 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2418 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2419 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2420 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2421 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2422 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2423 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2424 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2425 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2426 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2427 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2428 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2429 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2430 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2431 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2432 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2433 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2434 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2435 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2436 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2437 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2438 /* switch stack: */
2439 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2440 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2441 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2442 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2443 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2444 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2445 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2446 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2447 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2448 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002449 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2450 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002451 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002452 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002453 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2454 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002455 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2456 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2457 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2458 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2459 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2460 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2461 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2462 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2463 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2464 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2465 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2466 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2467 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2468 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2469 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Roland McGrathfb1bc072004-03-01 21:29:24 +00002470# ifdef PT_AR_CSD
2471 { PT_AR_CSD, "ar.csd" },
2472# endif
2473# ifdef PT_AR_SSD
2474 { PT_AR_SSD, "ar.ssd" },
2475# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002476 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002477#else /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002478#ifdef I386
2479 { 4*EBX, "4*EBX" },
2480 { 4*ECX, "4*ECX" },
2481 { 4*EDX, "4*EDX" },
2482 { 4*ESI, "4*ESI" },
2483 { 4*EDI, "4*EDI" },
2484 { 4*EBP, "4*EBP" },
2485 { 4*EAX, "4*EAX" },
2486 { 4*DS, "4*DS" },
2487 { 4*ES, "4*ES" },
2488 { 4*FS, "4*FS" },
2489 { 4*GS, "4*GS" },
2490 { 4*ORIG_EAX, "4*ORIG_EAX" },
2491 { 4*EIP, "4*EIP" },
2492 { 4*CS, "4*CS" },
2493 { 4*EFL, "4*EFL" },
2494 { 4*UESP, "4*UESP" },
2495 { 4*SS, "4*SS" },
2496#else /* !I386 */
Michal Ludvig0e035502002-09-23 15:41:01 +00002497#ifdef X86_64
2498 { 8*RDI, "8*RDI" },
2499 { 8*RSI, "8*RSI" },
2500 { 8*RDX, "8*RDX" },
2501 { 8*R10, "8*R10" },
2502 { 8*R8, "8*R8" },
2503 { 8*R9, "8*R9" },
2504 { 8*RBX, "8*RBX" },
2505 { 8*RCX, "8*RCX" },
2506 { 8*RBP, "8*RBP" },
2507 { 8*RAX, "8*RAX" },
2508#if 0
2509 { 8*DS, "8*DS" },
2510 { 8*ES, "8*ES" },
2511 { 8*FS, "8*FS" },
2512 { 8*GS, "8*GS" },
2513#endif
2514 { 8*ORIG_RAX, "8*ORIG_EAX" },
2515 { 8*RIP, "8*RIP" },
2516 { 8*CS, "8*CS" },
2517 { 8*EFLAGS, "8*EFL" },
2518 { 8*RSP, "8*RSP" },
2519 { 8*SS, "8*SS" },
2520 { 8*R11, "8*R11" },
2521 { 8*R12, "8*R12" },
2522 { 8*R13, "8*R13" },
2523 { 8*R14, "8*R14" },
2524 { 8*R15, "8*R15" },
2525#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002526#ifdef M68K
2527 { 4*PT_D1, "4*PT_D1" },
2528 { 4*PT_D2, "4*PT_D2" },
2529 { 4*PT_D3, "4*PT_D3" },
2530 { 4*PT_D4, "4*PT_D4" },
2531 { 4*PT_D5, "4*PT_D5" },
2532 { 4*PT_D6, "4*PT_D6" },
2533 { 4*PT_D7, "4*PT_D7" },
2534 { 4*PT_A0, "4*PT_A0" },
2535 { 4*PT_A1, "4*PT_A1" },
2536 { 4*PT_A2, "4*PT_A2" },
2537 { 4*PT_A3, "4*PT_A3" },
2538 { 4*PT_A4, "4*PT_A4" },
2539 { 4*PT_A5, "4*PT_A5" },
2540 { 4*PT_A6, "4*PT_A6" },
2541 { 4*PT_D0, "4*PT_D0" },
2542 { 4*PT_USP, "4*PT_USP" },
2543 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2544 { 4*PT_SR, "4*PT_SR" },
2545 { 4*PT_PC, "4*PT_PC" },
2546#endif /* M68K */
2547#endif /* !I386 */
Wichert Akkermanccef6372002-05-01 16:39:22 +00002548#ifdef SH
2549 { 4*REG_REG0, "4*REG_REG0" },
2550 { 4*(REG_REG0+1), "4*REG_REG1" },
2551 { 4*(REG_REG0+2), "4*REG_REG2" },
2552 { 4*(REG_REG0+3), "4*REG_REG3" },
2553 { 4*(REG_REG0+4), "4*REG_REG4" },
2554 { 4*(REG_REG0+5), "4*REG_REG5" },
2555 { 4*(REG_REG0+6), "4*REG_REG6" },
2556 { 4*(REG_REG0+7), "4*REG_REG7" },
2557 { 4*(REG_REG0+8), "4*REG_REG8" },
2558 { 4*(REG_REG0+9), "4*REG_REG9" },
2559 { 4*(REG_REG0+10), "4*REG_REG10" },
2560 { 4*(REG_REG0+11), "4*REG_REG11" },
2561 { 4*(REG_REG0+12), "4*REG_REG12" },
2562 { 4*(REG_REG0+13), "4*REG_REG13" },
2563 { 4*(REG_REG0+14), "4*REG_REG14" },
2564 { 4*REG_REG15, "4*REG_REG15" },
2565 { 4*REG_PC, "4*REG_PC" },
2566 { 4*REG_PR, "4*REG_PR" },
2567 { 4*REG_SR, "4*REG_SR" },
2568 { 4*REG_GBR, "4*REG_GBR" },
2569 { 4*REG_MACH, "4*REG_MACH" },
2570 { 4*REG_MACL, "4*REG_MACL" },
2571 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2572 { 4*REG_FPUL, "4*REG_FPUL" },
2573 { 4*REG_FPREG0, "4*REG_FPREG0" },
2574 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2575 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2576 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2577 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2578 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2579 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2580 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2581 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2582 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2583 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2584 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2585 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2586 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2587 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2588 { 4*REG_FPREG15, "4*REG_FPREG15" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002589#ifdef REG_XDREG0
Wichert Akkermanccef6372002-05-01 16:39:22 +00002590 { 4*REG_XDREG0, "4*REG_XDREG0" },
2591 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2592 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2593 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2594 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2595 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2596 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2597 { 4*REG_XDREG14, "4*REG_XDREG14" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002598#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00002599 { 4*REG_FPSCR, "4*REG_FPSCR" },
2600#endif /* SH */
Roland McGrathf5a47772003-06-26 22:40:42 +00002601#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002602 { 0, "PC(L)" },
2603 { 4, "PC(U)" },
2604 { 8, "SR(L)" },
2605 { 12, "SR(U)" },
2606 { 16, "syscall no.(L)" },
2607 { 20, "syscall_no.(U)" },
2608 { 24, "R0(L)" },
2609 { 28, "R0(U)" },
2610 { 32, "R1(L)" },
2611 { 36, "R1(U)" },
2612 { 40, "R2(L)" },
2613 { 44, "R2(U)" },
2614 { 48, "R3(L)" },
2615 { 52, "R3(U)" },
2616 { 56, "R4(L)" },
2617 { 60, "R4(U)" },
2618 { 64, "R5(L)" },
2619 { 68, "R5(U)" },
2620 { 72, "R6(L)" },
2621 { 76, "R6(U)" },
2622 { 80, "R7(L)" },
2623 { 84, "R7(U)" },
2624 { 88, "R8(L)" },
2625 { 92, "R8(U)" },
2626 { 96, "R9(L)" },
2627 { 100, "R9(U)" },
2628 { 104, "R10(L)" },
2629 { 108, "R10(U)" },
2630 { 112, "R11(L)" },
2631 { 116, "R11(U)" },
2632 { 120, "R12(L)" },
2633 { 124, "R12(U)" },
2634 { 128, "R13(L)" },
2635 { 132, "R13(U)" },
2636 { 136, "R14(L)" },
2637 { 140, "R14(U)" },
2638 { 144, "R15(L)" },
2639 { 148, "R15(U)" },
2640 { 152, "R16(L)" },
2641 { 156, "R16(U)" },
2642 { 160, "R17(L)" },
2643 { 164, "R17(U)" },
2644 { 168, "R18(L)" },
2645 { 172, "R18(U)" },
2646 { 176, "R19(L)" },
2647 { 180, "R19(U)" },
2648 { 184, "R20(L)" },
2649 { 188, "R20(U)" },
2650 { 192, "R21(L)" },
2651 { 196, "R21(U)" },
2652 { 200, "R22(L)" },
2653 { 204, "R22(U)" },
2654 { 208, "R23(L)" },
2655 { 212, "R23(U)" },
2656 { 216, "R24(L)" },
2657 { 220, "R24(U)" },
2658 { 224, "R25(L)" },
2659 { 228, "R25(U)" },
2660 { 232, "R26(L)" },
2661 { 236, "R26(U)" },
2662 { 240, "R27(L)" },
2663 { 244, "R27(U)" },
2664 { 248, "R28(L)" },
2665 { 252, "R28(U)" },
2666 { 256, "R29(L)" },
2667 { 260, "R29(U)" },
2668 { 264, "R30(L)" },
2669 { 268, "R30(U)" },
2670 { 272, "R31(L)" },
2671 { 276, "R31(U)" },
2672 { 280, "R32(L)" },
2673 { 284, "R32(U)" },
2674 { 288, "R33(L)" },
2675 { 292, "R33(U)" },
2676 { 296, "R34(L)" },
2677 { 300, "R34(U)" },
2678 { 304, "R35(L)" },
2679 { 308, "R35(U)" },
2680 { 312, "R36(L)" },
2681 { 316, "R36(U)" },
2682 { 320, "R37(L)" },
2683 { 324, "R37(U)" },
2684 { 328, "R38(L)" },
2685 { 332, "R38(U)" },
2686 { 336, "R39(L)" },
2687 { 340, "R39(U)" },
2688 { 344, "R40(L)" },
2689 { 348, "R40(U)" },
2690 { 352, "R41(L)" },
2691 { 356, "R41(U)" },
2692 { 360, "R42(L)" },
2693 { 364, "R42(U)" },
2694 { 368, "R43(L)" },
2695 { 372, "R43(U)" },
2696 { 376, "R44(L)" },
2697 { 380, "R44(U)" },
2698 { 384, "R45(L)" },
2699 { 388, "R45(U)" },
2700 { 392, "R46(L)" },
2701 { 396, "R46(U)" },
2702 { 400, "R47(L)" },
2703 { 404, "R47(U)" },
2704 { 408, "R48(L)" },
2705 { 412, "R48(U)" },
2706 { 416, "R49(L)" },
2707 { 420, "R49(U)" },
2708 { 424, "R50(L)" },
2709 { 428, "R50(U)" },
2710 { 432, "R51(L)" },
2711 { 436, "R51(U)" },
2712 { 440, "R52(L)" },
2713 { 444, "R52(U)" },
2714 { 448, "R53(L)" },
2715 { 452, "R53(U)" },
2716 { 456, "R54(L)" },
2717 { 460, "R54(U)" },
2718 { 464, "R55(L)" },
2719 { 468, "R55(U)" },
2720 { 472, "R56(L)" },
2721 { 476, "R56(U)" },
2722 { 480, "R57(L)" },
2723 { 484, "R57(U)" },
2724 { 488, "R58(L)" },
2725 { 492, "R58(U)" },
2726 { 496, "R59(L)" },
2727 { 500, "R59(U)" },
2728 { 504, "R60(L)" },
2729 { 508, "R60(U)" },
2730 { 512, "R61(L)" },
2731 { 516, "R61(U)" },
2732 { 520, "R62(L)" },
2733 { 524, "R62(U)" },
2734 { 528, "TR0(L)" },
2735 { 532, "TR0(U)" },
2736 { 536, "TR1(L)" },
2737 { 540, "TR1(U)" },
2738 { 544, "TR2(L)" },
2739 { 548, "TR2(U)" },
2740 { 552, "TR3(L)" },
2741 { 556, "TR3(U)" },
2742 { 560, "TR4(L)" },
2743 { 564, "TR4(U)" },
2744 { 568, "TR5(L)" },
2745 { 572, "TR5(U)" },
2746 { 576, "TR6(L)" },
2747 { 580, "TR6(U)" },
2748 { 584, "TR7(L)" },
2749 { 588, "TR7(U)" },
2750 /* This entry is in case pt_regs contains dregs (depends on
2751 the kernel build options). */
2752 { uoff(regs), "offsetof(struct user, regs)" },
2753 { uoff(fpu), "offsetof(struct user, fpu)" },
2754#endif
Roland McGrath0f87c492003-06-03 23:29:04 +00002755#ifdef ARM
2756 { uoff(regs.ARM_r0), "r0" },
2757 { uoff(regs.ARM_r1), "r1" },
2758 { uoff(regs.ARM_r2), "r2" },
2759 { uoff(regs.ARM_r3), "r3" },
2760 { uoff(regs.ARM_r4), "r4" },
2761 { uoff(regs.ARM_r5), "r5" },
2762 { uoff(regs.ARM_r6), "r6" },
2763 { uoff(regs.ARM_r7), "r7" },
2764 { uoff(regs.ARM_r8), "r8" },
2765 { uoff(regs.ARM_r9), "r9" },
2766 { uoff(regs.ARM_r10), "r10" },
2767 { uoff(regs.ARM_fp), "fp" },
2768 { uoff(regs.ARM_ip), "ip" },
2769 { uoff(regs.ARM_sp), "sp" },
2770 { uoff(regs.ARM_lr), "lr" },
2771 { uoff(regs.ARM_pc), "pc" },
2772 { uoff(regs.ARM_cpsr), "cpsr" },
2773#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00002774
Michal Ludvig10a88d02002-10-07 14:31:00 +00002775#if !defined(S390) && !defined(S390X) && !defined(MIPS)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002776 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00002777#endif
Michal Ludvig0e035502002-09-23 15:41:01 +00002778#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002779 { uoff(i387), "offsetof(struct user, i387)" },
2780#else /* !I386 */
2781#ifdef M68K
2782 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
2783#endif /* M68K */
2784#endif /* !I386 */
2785 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
2786 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
2787 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
2788 { uoff(start_code), "offsetof(struct user, start_code)" },
Roland McGrathf5a47772003-06-26 22:40:42 +00002789#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002790 { uoff(start_data), "offsetof(struct user, start_data)" },
2791#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002792 { uoff(start_stack), "offsetof(struct user, start_stack)" },
2793 { uoff(signal), "offsetof(struct user, signal)" },
Roland McGrathf5a47772003-06-26 22:40:42 +00002794#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002795 { uoff(reserved), "offsetof(struct user, reserved)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00002796#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002797 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002798#if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002799 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
2800#endif
2801 { uoff(magic), "offsetof(struct user, magic)" },
2802 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002803#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002804 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
2805#endif /* I386 */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002806#endif /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002807#endif /* !ALPHA */
2808#endif /* !POWERPC/!SPARC */
2809#endif /* LINUX */
2810#ifdef SUNOS4
2811 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
2812 { uoff(u_procp), "offsetof(struct user, u_procp)" },
2813 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2814 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
2815 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
2816 { uoff(u_ap), "offsetof(struct user, u_ap)" },
2817 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
2818 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
2819 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
2820 { uoff(u_error), "offsetof(struct user, u_error)" },
2821 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
2822 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
2823 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
2824 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
2825 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
2826 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
2827 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
2828 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
2829 { uoff(u_code), "offsetof(struct user, u_code)" },
2830 { uoff(u_addr), "offsetof(struct user, u_addr)" },
2831 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
2832 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
2833 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
2834 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
2835 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
2836 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
2837 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
2838 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
2839 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
2840 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
2841 { uoff(u_ru), "offsetof(struct user, u_ru)" },
2842 { uoff(u_cru), "offsetof(struct user, u_cru)" },
2843 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
2844 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
2845 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
2846 { uoff(u_start), "offsetof(struct user, u_start)" },
2847 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
2848 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
2849 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
2850 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
2851 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
2852 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
2853 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
2854 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
2855 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
2856#endif /* SUNOS4 */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002857#ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002858 { sizeof(struct user), "sizeof(struct user)" },
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002859#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002860 { 0, NULL },
2861};
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002862#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002863
2864int
2865sys_ptrace(tcp)
2866struct tcb *tcp;
2867{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002868 struct xlat *x;
2869 long addr;
2870
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002871 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00002872 printxval(ptrace_cmds, tcp->u_arg[0],
2873#ifndef FREEBSD
2874 "PTRACE_???"
2875#else
2876 "PT_???"
2877#endif
2878 );
2879 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002880 addr = tcp->u_arg[2];
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002881#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002882 if (tcp->u_arg[0] == PTRACE_PEEKUSER
2883 || tcp->u_arg[0] == PTRACE_POKEUSER) {
2884 for (x = struct_user_offsets; x->str; x++) {
2885 if (x->val >= addr)
2886 break;
2887 }
2888 if (!x->str)
2889 tprintf("%#lx, ", addr);
2890 else if (x->val > addr && x != struct_user_offsets) {
2891 x--;
2892 tprintf("%s + %ld, ", x->str, addr - x->val);
2893 }
2894 else
2895 tprintf("%s, ", x->str);
2896 }
2897 else
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002898#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002899 tprintf("%#lx, ", tcp->u_arg[2]);
2900#ifdef LINUX
2901 switch (tcp->u_arg[0]) {
2902 case PTRACE_PEEKDATA:
2903 case PTRACE_PEEKTEXT:
2904 case PTRACE_PEEKUSER:
2905 break;
2906 case PTRACE_CONT:
2907 case PTRACE_SINGLESTEP:
2908 case PTRACE_SYSCALL:
2909 case PTRACE_DETACH:
2910 printsignal(tcp->u_arg[3]);
2911 break;
2912 default:
2913 tprintf("%#lx", tcp->u_arg[3]);
2914 break;
2915 }
2916 } else {
2917 switch (tcp->u_arg[0]) {
2918 case PTRACE_PEEKDATA:
2919 case PTRACE_PEEKTEXT:
2920 case PTRACE_PEEKUSER:
Roland McGratheb285352003-01-14 09:59:00 +00002921 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002922 break;
2923 }
2924 }
2925#endif /* LINUX */
2926#ifdef SUNOS4
2927 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
2928 tcp->u_arg[0] == PTRACE_WRITETEXT) {
2929 tprintf("%lu, ", tcp->u_arg[3]);
2930 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2931 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
2932 tcp->u_arg[0] != PTRACE_READTEXT) {
2933 tprintf("%#lx", tcp->u_arg[3]);
2934 }
2935 } else {
2936 if (tcp->u_arg[0] == PTRACE_READDATA ||
2937 tcp->u_arg[0] == PTRACE_READTEXT) {
2938 tprintf("%lu, ", tcp->u_arg[3]);
2939 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2940 }
2941 }
2942#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002943#ifdef FREEBSD
2944 tprintf("%lu", tcp->u_arg[3]);
2945 }
2946#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002947 return 0;
2948}
2949
2950#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00002951
2952#ifdef LINUX
2953static struct xlat futexops[] = {
2954 { FUTEX_WAIT, "FUTEX_WAIT" },
2955 { FUTEX_WAKE, "FUTEX_WAKE" },
2956 { FUTEX_FD, "FUTEX_FD" },
Roland McGrath88812d62003-06-26 22:27:23 +00002957 { FUTEX_REQUEUE,"FUTEX_REQUEUE" },
Roland McGrath5a223472002-12-15 23:58:26 +00002958 { 0, NULL }
2959};
2960
2961int
2962sys_futex(tcp)
2963struct tcb *tcp;
2964{
2965 if (entering(tcp)) {
2966 tprintf("%p, ", (void *) tcp->u_arg[0]);
Roland McGrath88812d62003-06-26 22:27:23 +00002967 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
Roland McGrath8dfa04a2003-03-05 04:07:55 +00002968 tprintf(", %ld", tcp->u_arg[2]);
2969 if (tcp->u_arg[1] == FUTEX_WAIT) {
2970 tprintf(", ");
2971 printtv(tcp, tcp->u_arg[3]);
Roland McGrath88812d62003-06-26 22:27:23 +00002972 } else if (tcp->u_arg[1] == FUTEX_REQUEUE)
2973 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Roland McGrath5a223472002-12-15 23:58:26 +00002974 }
2975 return 0;
2976}
2977
2978static void
2979print_affinitylist(list, len)
2980unsigned long *list;
2981unsigned int len;
2982{
2983 int first = 1;
2984 tprintf(" {");
Roland McGratha2f34962003-05-23 00:14:04 +00002985 while (len >= sizeof (unsigned long)) {
Roland McGrath5a223472002-12-15 23:58:26 +00002986 tprintf("%s %lx", first ? "" : ",", *list++);
2987 first = 0;
2988 len -= sizeof (unsigned long);
2989 }
2990 tprintf(" }");
2991}
2992
2993int
2994sys_sched_setaffinity(tcp)
2995struct tcb *tcp;
2996{
2997 if (entering(tcp)) {
2998 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
2999 print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_arg[1]);
3000 }
3001 return 0;
3002}
3003
3004int
3005sys_sched_getaffinity(tcp)
3006struct tcb *tcp;
3007{
3008 if (entering(tcp)) {
3009 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3010 } else {
3011 print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_rval);
3012 }
3013 return 0;
3014}
Roland McGrath279d3782004-03-01 20:27:37 +00003015
3016static struct xlat schedulers[] = {
3017 { SCHED_OTHER, "SCHED_OTHER" },
3018 { SCHED_RR, "SCHED_RR" },
3019 { SCHED_FIFO, "SCHED_FIFO" },
3020 { 0, NULL }
3021};
3022
3023int
3024sys_sched_getscheduler(tcp)
3025struct tcb *tcp;
3026{
3027 if (entering(tcp)) {
3028 tprintf("%d", (int) tcp->u_arg[0]);
3029 } else if (! syserror(tcp)) {
3030 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3031 if (tcp->auxstr != NULL)
3032 return RVAL_STR;
3033 }
3034 return 0;
3035}
3036
3037int
3038sys_sched_setscheduler(tcp)
3039struct tcb *tcp;
3040{
3041 if (entering(tcp)) {
3042 struct sched_param p;
3043 tprintf("%d, ", (int) tcp->u_arg[0]);
3044 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3045 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3046 tprintf(", %lx", tcp->u_arg[2]);
3047 else
3048 tprintf(", { %d }", p.__sched_priority);
3049 }
3050 return 0;
3051}
3052
3053int
3054sys_sched_getparam(tcp)
3055struct tcb *tcp;
3056{
3057 if (entering(tcp)) {
3058 tprintf("%d, ", (int) tcp->u_arg[0]);
3059 } else {
3060 struct sched_param p;
3061 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3062 tprintf("%lx", tcp->u_arg[1]);
3063 else
3064 tprintf("{ %d }", p.__sched_priority);
3065 }
3066 return 0;
3067}
3068
3069int
3070sys_sched_setparam(tcp)
3071struct tcb *tcp;
3072{
3073 if (entering(tcp)) {
3074 struct sched_param p;
3075 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3076 tprintf("%d, %lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3077 else
3078 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3079 }
3080 return 0;
3081}
3082
3083int
3084sys_sched_get_priority_min(tcp)
3085struct tcb *tcp;
3086{
3087 if (entering(tcp)) {
3088 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3089 }
3090 return 0;
3091}
Roland McGrath5a223472002-12-15 23:58:26 +00003092#endif