blob: 6d503afaaba4b007545c91a58e0a0dabc2f460b7 [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
Roland McGrathb09e33a2004-03-01 22:03:58 +00001707 if (exiting(tcp) && syserror(tcp))
1708 tcp->flags &= ~TCB_WAITEXECVE;
1709 else
1710 tcp->flags |= TCB_WAITEXECVE;
Roland McGrathb4968be2003-01-20 09:04:33 +00001711#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001712 return 0;
1713}
1714
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001715#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001716
1717int sys_rexecve(tcp)
1718struct tcb *tcp;
1719{
1720 if (entering (tcp)) {
1721 sys_execve (tcp);
1722 tprintf (", %ld", tcp->u_arg[3]);
1723 }
1724 return 0;
1725}
1726
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001727#endif
John Hughes4e36a812001-04-18 15:11:51 +00001728
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001729int
1730internal_exec(tcp)
1731struct tcb *tcp;
1732{
1733#ifdef SUNOS4
1734 if (exiting(tcp) && !syserror(tcp) && followfork)
1735 fixvfork(tcp);
1736#endif /* SUNOS4 */
1737 return 0;
1738}
1739
1740#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001741#ifndef __WNOTHREAD
1742#define __WNOTHREAD 0x20000000
1743#endif
1744#ifndef __WALL
1745#define __WALL 0x40000000
1746#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001747#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001748#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001749#endif
1750#endif /* LINUX */
1751
1752static struct xlat wait4_options[] = {
1753 { WNOHANG, "WNOHANG" },
1754#ifndef WSTOPPED
1755 { WUNTRACED, "WUNTRACED" },
1756#endif
1757#ifdef WEXITED
1758 { WEXITED, "WEXITED" },
1759#endif
1760#ifdef WTRAPPED
1761 { WTRAPPED, "WTRAPPED" },
1762#endif
1763#ifdef WSTOPPED
1764 { WSTOPPED, "WSTOPPED" },
1765#endif
1766#ifdef WCONTINUED
1767 { WCONTINUED, "WCONTINUED" },
1768#endif
1769#ifdef WNOWAIT
1770 { WNOWAIT, "WNOWAIT" },
1771#endif
1772#ifdef __WCLONE
1773 { __WCLONE, "__WCLONE" },
1774#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001775#ifdef __WALL
1776 { __WALL, "__WALL" },
1777#endif
1778#ifdef __WNOTHREAD
1779 { __WNOTHREAD, "__WNOTHREAD" },
1780#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001781 { 0, NULL },
1782};
1783
1784static int
1785printstatus(status)
1786int status;
1787{
1788 int exited = 0;
1789
1790 /*
1791 * Here is a tricky presentation problem. This solution
1792 * is still not entirely satisfactory but since there
1793 * are no wait status constructors it will have to do.
1794 */
1795 if (WIFSTOPPED(status))
1796 tprintf("[WIFSTOPPED(s) && WSTOPSIG(s) == %s]",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001797 signame(WSTOPSIG(status)));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001798 else if WIFSIGNALED(status)
1799 tprintf("[WIFSIGNALED(s) && WTERMSIG(s) == %s%s]",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001800 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001801 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
1802 else if WIFEXITED(status) {
1803 tprintf("[WIFEXITED(s) && WEXITSTATUS(s) == %d]",
1804 WEXITSTATUS(status));
1805 exited = 1;
1806 }
1807 else
1808 tprintf("[%#x]", status);
1809 return exited;
1810}
1811
1812static int
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001813printwaitn(tcp, n, bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001814struct tcb *tcp;
1815int n;
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001816int bitness;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001817{
1818 int status;
1819 int exited = 0;
1820
1821 if (entering(tcp)) {
1822 tprintf("%ld, ", tcp->u_arg[0]);
1823 } else {
1824 /* status */
1825 if (!tcp->u_arg[1])
1826 tprintf("NULL");
1827 else if (syserror(tcp) || tcp->u_rval == 0)
1828 tprintf("%#lx", tcp->u_arg[1]);
1829 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1830 tprintf("[?]");
1831 else
1832 exited = printstatus(status);
1833 /* options */
1834 tprintf(", ");
1835 if (!printflags(wait4_options, tcp->u_arg[2]))
1836 tprintf("0");
1837 if (n == 4) {
1838 tprintf(", ");
1839 /* usage */
1840 if (!tcp->u_arg[3])
1841 tprintf("NULL");
1842#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001843 else if (tcp->u_rval > 0) {
1844#ifdef LINUX_64BIT
1845 if (bitness)
1846 printrusage32(tcp, tcp->u_arg[3]);
1847 else
1848#endif
1849 printrusage(tcp, tcp->u_arg[3]);
1850 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001851#endif /* LINUX */
1852#ifdef SUNOS4
1853 else if (tcp->u_rval > 0 && exited)
1854 printrusage(tcp, tcp->u_arg[3]);
1855#endif /* SUNOS4 */
1856 else
1857 tprintf("%#lx", tcp->u_arg[3]);
1858 }
1859 }
1860 return 0;
1861}
1862
1863int
1864internal_wait(tcp)
1865struct tcb *tcp;
1866{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001867 int got_kids;
1868
1869#ifdef TCB_CLONE_THREAD
1870 if (tcp->flags & TCB_CLONE_THREAD)
1871 /* The children we wait for are our parent's children. */
1872 got_kids = (tcp->parent->nchildren
1873 > tcp->parent->nclone_detached);
1874 else
1875 got_kids = (tcp->nchildren > tcp->nclone_detached);
1876#else
1877 got_kids = tcp->nchildren > 0;
1878#endif
1879
1880 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001881 /* There are children that this parent should block for.
1882 But ptrace made us the parent of the traced children
1883 and the real parent will get ECHILD from the wait call.
1884
1885 XXX If we attached with strace -f -p PID, then there
1886 may be untraced dead children the parent could be reaping
1887 now, but we make him block. */
1888
1889 /* ??? WTA: fix bug with hanging children */
1890
1891 if (!(tcp->u_arg[2] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00001892 /*
1893 * There are traced children. We'll make the parent
1894 * block to avoid a false ECHILD error due to our
1895 * ptrace having stolen the children. However,
1896 * we shouldn't block if there are zombies to reap.
1897 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1898 */
Roland McGrathfccfb942003-10-01 21:59:44 +00001899 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00001900 if (tcp->nzombies > 0 &&
1901 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00001902 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00001903 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00001904 if (tcp->u_arg[0] > 0) {
1905 /*
1906 * If the parent waits for a specified child
1907 * PID, then it must get ECHILD right away
1908 * if that PID is not one of its children.
1909 * Make sure that the requested PID matches
1910 * one of the parent's children that we are
1911 * tracing, and don't suspend it otherwise.
1912 */
1913 if (child == NULL)
1914 child = pid2tcb(tcp->u_arg[0]);
1915 if (child == NULL || child->parent != (
1916#ifdef TCB_CLONE_THREAD
1917 (tcp->flags & TCB_CLONE_THREAD)
1918 ? tcp->parent :
1919#endif
1920 tcp))
1921 return 0;
1922 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001923 tcp->flags |= TCB_SUSPENDED;
1924 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001925#ifdef TCB_CLONE_THREAD
1926 if (tcp->flags & TCB_CLONE_THREAD)
1927 tcp->parent->nclone_waiting++;
1928#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001929 }
1930 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001931 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00001932 if (tcp->u_arg[2] & WNOHANG) {
1933 /* We must force a fake result of 0 instead of
1934 the ECHILD error. */
1935 extern int force_result();
1936 return force_result(tcp, 0, 0);
1937 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00001938 }
Roland McGrath09623452003-05-23 02:27:13 +00001939 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
1940 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
1941 /*
1942 * We just reaped a child we don't know about,
1943 * presumably a zombie we already droptcb'd.
1944 */
1945 tcp->nzombies--;
1946 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001947 return 0;
1948}
1949
1950#ifdef SVR4
1951
1952int
1953sys_wait(tcp)
1954struct tcb *tcp;
1955{
1956 if (exiting(tcp)) {
1957 /* The library wrapper stuffs this into the user variable. */
1958 if (!syserror(tcp))
1959 printstatus(getrval2(tcp));
1960 }
1961 return 0;
1962}
1963
1964#endif /* SVR4 */
1965
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001966#ifdef FREEBSD
1967int
1968sys_wait(tcp)
1969struct tcb *tcp;
1970{
1971 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00001972
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001973 if (exiting(tcp)) {
1974 if (!syserror(tcp)) {
1975 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1976 tprintf("%#lx", tcp->u_arg[0]);
1977 else
1978 printstatus(status);
1979 }
1980 }
1981 return 0;
1982}
1983#endif
1984
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001985int
1986sys_waitpid(tcp)
1987struct tcb *tcp;
1988{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001989 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001990}
1991
1992int
1993sys_wait4(tcp)
1994struct tcb *tcp;
1995{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001996 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001997}
1998
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001999#ifdef ALPHA
2000int
2001sys_osf_wait4(tcp)
2002struct tcb *tcp;
2003{
2004 return printwaitn(tcp, 4, 1);
2005}
2006#endif
2007
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002008#ifdef SVR4
2009
2010static struct xlat waitid_types[] = {
2011 { P_PID, "P_PID" },
2012 { P_PPID, "P_PPID" },
2013 { P_PGID, "P_PGID" },
2014 { P_SID, "P_SID" },
2015 { P_CID, "P_CID" },
2016 { P_UID, "P_UID" },
2017 { P_GID, "P_GID" },
2018 { P_ALL, "P_ALL" },
2019#ifdef P_LWPID
2020 { P_LWPID, "P_LWPID" },
2021#endif
2022 { 0, NULL },
2023};
2024
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002025int
2026sys_waitid(tcp)
2027struct tcb *tcp;
2028{
2029 siginfo_t si;
2030 int exited;
2031
2032 if (entering(tcp)) {
2033 printxval(waitid_types, tcp->u_arg[0], "P_???");
2034 tprintf(", %ld, ", tcp->u_arg[1]);
2035 if (tcp->nchildren > 0) {
2036 /* There are traced children */
2037 tcp->flags |= TCB_SUSPENDED;
2038 tcp->waitpid = tcp->u_arg[0];
2039 }
2040 }
2041 else {
2042 /* siginfo */
2043 exited = 0;
2044 if (!tcp->u_arg[2])
2045 tprintf("NULL");
2046 else if (syserror(tcp))
2047 tprintf("%#lx", tcp->u_arg[2]);
2048 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2049 tprintf("{???}");
2050 else
John Hughes58265892001-10-18 15:13:53 +00002051 printsiginfo(&si, verbose (tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002052 /* options */
2053 tprintf(", ");
2054 if (!printflags(wait4_options, tcp->u_arg[3]))
2055 tprintf("0");
2056 }
2057 return 0;
2058}
2059
2060#endif /* SVR4 */
2061
2062int
2063sys_alarm(tcp)
2064struct tcb *tcp;
2065{
2066 if (entering(tcp))
2067 tprintf("%lu", tcp->u_arg[0]);
2068 return 0;
2069}
2070
2071int
2072sys_uname(tcp)
2073struct tcb *tcp;
2074{
2075 struct utsname uname;
2076
2077 if (exiting(tcp)) {
2078 if (syserror(tcp) || !verbose(tcp))
2079 tprintf("%#lx", tcp->u_arg[0]);
2080 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2081 tprintf("{...}");
2082 else if (!abbrev(tcp)) {
2083
2084 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2085 uname.sysname, uname.nodename);
2086 tprintf("release=\"%s\", version=\"%s\", ",
2087 uname.release, uname.version);
2088 tprintf("machine=\"%s\"", uname.machine);
2089#ifdef LINUX
2090#ifndef __GLIBC__
2091 tprintf(", domainname=\"%s\"", uname.domainname);
2092#endif /* __GLIBC__ */
2093#endif /* LINUX */
2094 tprintf("}");
2095 }
2096 else
2097 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2098 uname.sysname, uname.nodename);
2099 }
2100 return 0;
2101}
2102
2103#ifndef SVR4
2104
2105static struct xlat ptrace_cmds[] = {
Roland McGrath5a223472002-12-15 23:58:26 +00002106#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002107 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2108 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2109 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2110 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2111 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2112 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2113 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2114 { PTRACE_CONT, "PTRACE_CONT" },
2115 { PTRACE_KILL, "PTRACE_KILL" },
2116 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2117 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2118 { PTRACE_DETACH, "PTRACE_DETACH" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002119#ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002120 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002121#endif
2122#ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002123 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Roland McGrathbf621d42003-01-14 09:46:21 +00002124#endif
2125#ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002126 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002127#endif
2128#ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002129 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Roland McGrathbf621d42003-01-14 09:46:21 +00002130#endif
2131#ifdef PTRACE_GETFPXREGS
2132 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2133#endif
2134#ifdef PTRACE_SETFPXREGS
2135 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2136#endif
2137#ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002138 { PTRACE_READDATA, "PTRACE_READDATA" },
2139 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2140 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2141 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2142 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2143 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2144#ifdef SPARC
2145 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2146 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2147#else /* !SPARC */
2148 { PTRACE_22, "PTRACE_PTRACE_22" },
2149 { PTRACE_23, "PTRACE_PTRACE_23" },
2150#endif /* !SPARC */
2151#endif /* SUNOS4 */
2152 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2153#ifdef SUNOS4
2154 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2155#ifdef I386
2156 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2157 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2158 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2159#else /* !I386 */
2160 { PTRACE_26, "PTRACE_26" },
2161 { PTRACE_27, "PTRACE_27" },
2162 { PTRACE_28, "PTRACE_28" },
2163#endif /* !I386 */
2164 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2165#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002166#else /* FREEBSD */
2167 { PT_TRACE_ME, "PT_TRACE_ME" },
2168 { PT_READ_I, "PT_READ_I" },
2169 { PT_READ_D, "PT_READ_D" },
2170 { PT_WRITE_I, "PT_WRITE_I" },
2171 { PT_WRITE_D, "PT_WRITE_D" },
John Hughesa2278142001-09-28 16:21:30 +00002172#ifdef PT_READ_U
2173 { PT_READ_U, "PT_READ_U" },
2174#endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002175 { PT_CONTINUE, "PT_CONTINUE" },
2176 { PT_KILL, "PT_KILL" },
2177 { PT_STEP, "PT_STEP" },
2178 { PT_ATTACH, "PT_ATTACH" },
2179 { PT_DETACH, "PT_DETACH" },
2180 { PT_GETREGS, "PT_GETREGS" },
2181 { PT_SETREGS, "PT_SETREGS" },
2182 { PT_GETFPREGS, "PT_GETFPREGS" },
2183 { PT_SETFPREGS, "PT_SETFPREGS" },
2184 { PT_GETDBREGS, "PT_GETDBREGS" },
2185 { PT_SETDBREGS, "PT_SETDBREGS" },
2186#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002187 { 0, NULL },
2188};
2189
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002190#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002191#ifndef SUNOS4_KERNEL_ARCH_KLUDGE
2192static
2193#endif /* !SUNOS4_KERNEL_ARCH_KLUDGE */
2194struct xlat struct_user_offsets[] = {
2195#ifdef LINUX
Michal Ludvig10a88d02002-10-07 14:31:00 +00002196#if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002197 { PT_PSWMASK, "psw_mask" },
2198 { PT_PSWADDR, "psw_addr" },
2199 { PT_GPR0, "gpr0" },
2200 { PT_GPR1, "gpr1" },
2201 { PT_GPR2, "gpr2" },
2202 { PT_GPR3, "gpr3" },
2203 { PT_GPR4, "gpr4" },
2204 { PT_GPR5, "gpr5" },
2205 { PT_GPR6, "gpr6" },
2206 { PT_GPR7, "gpr7" },
2207 { PT_GPR8, "gpr8" },
2208 { PT_GPR9, "gpr9" },
2209 { PT_GPR10, "gpr10" },
2210 { PT_GPR11, "gpr11" },
2211 { PT_GPR12, "gpr12" },
2212 { PT_GPR13, "gpr13" },
2213 { PT_GPR14, "gpr14" },
2214 { PT_GPR15, "gpr15" },
2215 { PT_ACR0, "acr0" },
2216 { PT_ACR1, "acr1" },
2217 { PT_ACR2, "acr2" },
2218 { PT_ACR3, "acr3" },
2219 { PT_ACR4, "acr4" },
2220 { PT_ACR5, "acr5" },
2221 { PT_ACR6, "acr6" },
2222 { PT_ACR7, "acr7" },
2223 { PT_ACR8, "acr8" },
2224 { PT_ACR9, "acr9" },
2225 { PT_ACR10, "acr10" },
2226 { PT_ACR11, "acr11" },
2227 { PT_ACR12, "acr12" },
2228 { PT_ACR13, "acr13" },
2229 { PT_ACR14, "acr14" },
2230 { PT_ACR15, "acr15" },
2231 { PT_ORIGGPR2, "orig_gpr2" },
2232 { PT_FPC, "fpc" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002233#if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002234 { PT_FPR0_HI, "fpr0.hi" },
2235 { PT_FPR0_LO, "fpr0.lo" },
2236 { PT_FPR1_HI, "fpr1.hi" },
2237 { PT_FPR1_LO, "fpr1.lo" },
2238 { PT_FPR2_HI, "fpr2.hi" },
2239 { PT_FPR2_LO, "fpr2.lo" },
2240 { PT_FPR3_HI, "fpr3.hi" },
2241 { PT_FPR3_LO, "fpr3.lo" },
2242 { PT_FPR4_HI, "fpr4.hi" },
2243 { PT_FPR4_LO, "fpr4.lo" },
2244 { PT_FPR5_HI, "fpr5.hi" },
2245 { PT_FPR5_LO, "fpr5.lo" },
2246 { PT_FPR6_HI, "fpr6.hi" },
2247 { PT_FPR6_LO, "fpr6.lo" },
2248 { PT_FPR7_HI, "fpr7.hi" },
2249 { PT_FPR7_LO, "fpr7.lo" },
2250 { PT_FPR8_HI, "fpr8.hi" },
2251 { PT_FPR8_LO, "fpr8.lo" },
2252 { PT_FPR9_HI, "fpr9.hi" },
2253 { PT_FPR9_LO, "fpr9.lo" },
2254 { PT_FPR10_HI, "fpr10.hi" },
2255 { PT_FPR10_LO, "fpr10.lo" },
2256 { PT_FPR11_HI, "fpr11.hi" },
2257 { PT_FPR11_LO, "fpr11.lo" },
2258 { PT_FPR12_HI, "fpr12.hi" },
2259 { PT_FPR12_LO, "fpr12.lo" },
2260 { PT_FPR13_HI, "fpr13.hi" },
2261 { PT_FPR13_LO, "fpr13.lo" },
2262 { PT_FPR14_HI, "fpr14.hi" },
2263 { PT_FPR14_LO, "fpr14.lo" },
2264 { PT_FPR15_HI, "fpr15.hi" },
2265 { PT_FPR15_LO, "fpr15.lo" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002266#endif
2267#if defined(S390X)
2268 { PT_FPR0, "fpr0" },
2269 { PT_FPR1, "fpr1" },
2270 { PT_FPR2, "fpr2" },
2271 { PT_FPR3, "fpr3" },
2272 { PT_FPR4, "fpr4" },
2273 { PT_FPR5, "fpr5" },
2274 { PT_FPR6, "fpr6" },
2275 { PT_FPR7, "fpr7" },
2276 { PT_FPR8, "fpr8" },
2277 { PT_FPR9, "fpr9" },
2278 { PT_FPR10, "fpr10" },
2279 { PT_FPR11, "fpr11" },
2280 { PT_FPR12, "fpr12" },
2281 { PT_FPR13, "fpr13" },
2282 { PT_FPR14, "fpr14" },
2283 { PT_FPR15, "fpr15" },
2284#endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002285 { PT_CR_9, "cr9" },
2286 { PT_CR_10, "cr10" },
2287 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002288 { PT_IEEE_IP, "ieee_exception_ip" },
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002289#endif
2290#if defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002291 /* XXX No support for these offsets yet. */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002292#elif defined(HPPA)
2293 /* XXX No support for these offsets yet. */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002294#elif defined(POWERPC)
Roland McGrath5a223472002-12-15 23:58:26 +00002295#ifndef PT_ORIG_R3
2296#define PT_ORIG_R3 34
2297#endif
Roland McGratheb285352003-01-14 09:59:00 +00002298#define REGSIZE (sizeof(unsigned long))
2299 { REGSIZE*PT_R0, "r0" },
2300 { REGSIZE*PT_R1, "r1" },
2301 { REGSIZE*PT_R2, "r2" },
2302 { REGSIZE*PT_R3, "r3" },
2303 { REGSIZE*PT_R4, "r4" },
2304 { REGSIZE*PT_R5, "r5" },
2305 { REGSIZE*PT_R6, "r6" },
2306 { REGSIZE*PT_R7, "r7" },
2307 { REGSIZE*PT_R8, "r8" },
2308 { REGSIZE*PT_R9, "r9" },
2309 { REGSIZE*PT_R10, "r10" },
2310 { REGSIZE*PT_R11, "r11" },
2311 { REGSIZE*PT_R12, "r12" },
2312 { REGSIZE*PT_R13, "r13" },
2313 { REGSIZE*PT_R14, "r14" },
2314 { REGSIZE*PT_R15, "r15" },
2315 { REGSIZE*PT_R16, "r16" },
2316 { REGSIZE*PT_R17, "r17" },
2317 { REGSIZE*PT_R18, "r18" },
2318 { REGSIZE*PT_R19, "r19" },
2319 { REGSIZE*PT_R20, "r20" },
2320 { REGSIZE*PT_R21, "r21" },
2321 { REGSIZE*PT_R22, "r22" },
2322 { REGSIZE*PT_R23, "r23" },
2323 { REGSIZE*PT_R24, "r24" },
2324 { REGSIZE*PT_R25, "r25" },
2325 { REGSIZE*PT_R26, "r26" },
2326 { REGSIZE*PT_R27, "r27" },
2327 { REGSIZE*PT_R28, "r28" },
2328 { REGSIZE*PT_R29, "r29" },
2329 { REGSIZE*PT_R30, "r30" },
2330 { REGSIZE*PT_R31, "r31" },
2331 { REGSIZE*PT_NIP, "NIP" },
2332 { REGSIZE*PT_MSR, "MSR" },
2333 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2334 { REGSIZE*PT_CTR, "CTR" },
2335 { REGSIZE*PT_LNK, "LNK" },
2336 { REGSIZE*PT_XER, "XER" },
2337 { REGSIZE*PT_CCR, "CCR" },
2338 { REGSIZE*PT_FPR0, "FPR0" },
2339#undef REGSIZE
Roland McGrath5a223472002-12-15 23:58:26 +00002340#else
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002341#ifdef ALPHA
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002342 { 0, "r0" },
2343 { 1, "r1" },
2344 { 2, "r2" },
2345 { 3, "r3" },
2346 { 4, "r4" },
2347 { 5, "r5" },
2348 { 6, "r6" },
2349 { 7, "r7" },
2350 { 8, "r8" },
2351 { 9, "r9" },
2352 { 10, "r10" },
2353 { 11, "r11" },
2354 { 12, "r12" },
2355 { 13, "r13" },
2356 { 14, "r14" },
2357 { 15, "r15" },
2358 { 16, "r16" },
2359 { 17, "r17" },
2360 { 18, "r18" },
2361 { 19, "r19" },
2362 { 20, "r20" },
2363 { 21, "r21" },
2364 { 22, "r22" },
2365 { 23, "r23" },
2366 { 24, "r24" },
2367 { 25, "r25" },
2368 { 26, "r26" },
2369 { 27, "r27" },
2370 { 28, "r28" },
2371 { 29, "gp" },
2372 { 30, "fp" },
2373 { 31, "zero" },
2374 { 32, "fp0" },
2375 { 33, "fp" },
2376 { 34, "fp2" },
2377 { 35, "fp3" },
2378 { 36, "fp4" },
2379 { 37, "fp5" },
2380 { 38, "fp6" },
2381 { 39, "fp7" },
2382 { 40, "fp8" },
2383 { 41, "fp9" },
2384 { 42, "fp10" },
2385 { 43, "fp11" },
2386 { 44, "fp12" },
2387 { 45, "fp13" },
2388 { 46, "fp14" },
2389 { 47, "fp15" },
2390 { 48, "fp16" },
2391 { 49, "fp17" },
2392 { 50, "fp18" },
2393 { 51, "fp19" },
2394 { 52, "fp20" },
2395 { 53, "fp21" },
2396 { 54, "fp22" },
2397 { 55, "fp23" },
2398 { 56, "fp24" },
2399 { 57, "fp25" },
2400 { 58, "fp26" },
2401 { 59, "fp27" },
2402 { 60, "fp28" },
2403 { 61, "fp29" },
2404 { 62, "fp30" },
2405 { 63, "fp31" },
2406 { 64, "pc" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002407#else /* !ALPHA */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002408#ifdef IA64
2409 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2410 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2411 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2412 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2413 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2414 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2415 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2416 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2417 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2418 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2419 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2420 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2421 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2422 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2423 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2424 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2425 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2426 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2427 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2428 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2429 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2430 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2431 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2432 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2433 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2434 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2435 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2436 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2437 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2438 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2439 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2440 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2441 /* switch stack: */
2442 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2443 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2444 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2445 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2446 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2447 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2448 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2449 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2450 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2451 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002452 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2453 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002454 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002455 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002456 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2457 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002458 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2459 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2460 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2461 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2462 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2463 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2464 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2465 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2466 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2467 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2468 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2469 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2470 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2471 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2472 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Roland McGrathfb1bc072004-03-01 21:29:24 +00002473# ifdef PT_AR_CSD
2474 { PT_AR_CSD, "ar.csd" },
2475# endif
2476# ifdef PT_AR_SSD
2477 { PT_AR_SSD, "ar.ssd" },
2478# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002479 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002480#else /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002481#ifdef I386
2482 { 4*EBX, "4*EBX" },
2483 { 4*ECX, "4*ECX" },
2484 { 4*EDX, "4*EDX" },
2485 { 4*ESI, "4*ESI" },
2486 { 4*EDI, "4*EDI" },
2487 { 4*EBP, "4*EBP" },
2488 { 4*EAX, "4*EAX" },
2489 { 4*DS, "4*DS" },
2490 { 4*ES, "4*ES" },
2491 { 4*FS, "4*FS" },
2492 { 4*GS, "4*GS" },
2493 { 4*ORIG_EAX, "4*ORIG_EAX" },
2494 { 4*EIP, "4*EIP" },
2495 { 4*CS, "4*CS" },
2496 { 4*EFL, "4*EFL" },
2497 { 4*UESP, "4*UESP" },
2498 { 4*SS, "4*SS" },
2499#else /* !I386 */
Michal Ludvig0e035502002-09-23 15:41:01 +00002500#ifdef X86_64
2501 { 8*RDI, "8*RDI" },
2502 { 8*RSI, "8*RSI" },
2503 { 8*RDX, "8*RDX" },
2504 { 8*R10, "8*R10" },
2505 { 8*R8, "8*R8" },
2506 { 8*R9, "8*R9" },
2507 { 8*RBX, "8*RBX" },
2508 { 8*RCX, "8*RCX" },
2509 { 8*RBP, "8*RBP" },
2510 { 8*RAX, "8*RAX" },
2511#if 0
2512 { 8*DS, "8*DS" },
2513 { 8*ES, "8*ES" },
2514 { 8*FS, "8*FS" },
2515 { 8*GS, "8*GS" },
2516#endif
2517 { 8*ORIG_RAX, "8*ORIG_EAX" },
2518 { 8*RIP, "8*RIP" },
2519 { 8*CS, "8*CS" },
2520 { 8*EFLAGS, "8*EFL" },
2521 { 8*RSP, "8*RSP" },
2522 { 8*SS, "8*SS" },
2523 { 8*R11, "8*R11" },
2524 { 8*R12, "8*R12" },
2525 { 8*R13, "8*R13" },
2526 { 8*R14, "8*R14" },
2527 { 8*R15, "8*R15" },
2528#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002529#ifdef M68K
2530 { 4*PT_D1, "4*PT_D1" },
2531 { 4*PT_D2, "4*PT_D2" },
2532 { 4*PT_D3, "4*PT_D3" },
2533 { 4*PT_D4, "4*PT_D4" },
2534 { 4*PT_D5, "4*PT_D5" },
2535 { 4*PT_D6, "4*PT_D6" },
2536 { 4*PT_D7, "4*PT_D7" },
2537 { 4*PT_A0, "4*PT_A0" },
2538 { 4*PT_A1, "4*PT_A1" },
2539 { 4*PT_A2, "4*PT_A2" },
2540 { 4*PT_A3, "4*PT_A3" },
2541 { 4*PT_A4, "4*PT_A4" },
2542 { 4*PT_A5, "4*PT_A5" },
2543 { 4*PT_A6, "4*PT_A6" },
2544 { 4*PT_D0, "4*PT_D0" },
2545 { 4*PT_USP, "4*PT_USP" },
2546 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2547 { 4*PT_SR, "4*PT_SR" },
2548 { 4*PT_PC, "4*PT_PC" },
2549#endif /* M68K */
2550#endif /* !I386 */
Wichert Akkermanccef6372002-05-01 16:39:22 +00002551#ifdef SH
2552 { 4*REG_REG0, "4*REG_REG0" },
2553 { 4*(REG_REG0+1), "4*REG_REG1" },
2554 { 4*(REG_REG0+2), "4*REG_REG2" },
2555 { 4*(REG_REG0+3), "4*REG_REG3" },
2556 { 4*(REG_REG0+4), "4*REG_REG4" },
2557 { 4*(REG_REG0+5), "4*REG_REG5" },
2558 { 4*(REG_REG0+6), "4*REG_REG6" },
2559 { 4*(REG_REG0+7), "4*REG_REG7" },
2560 { 4*(REG_REG0+8), "4*REG_REG8" },
2561 { 4*(REG_REG0+9), "4*REG_REG9" },
2562 { 4*(REG_REG0+10), "4*REG_REG10" },
2563 { 4*(REG_REG0+11), "4*REG_REG11" },
2564 { 4*(REG_REG0+12), "4*REG_REG12" },
2565 { 4*(REG_REG0+13), "4*REG_REG13" },
2566 { 4*(REG_REG0+14), "4*REG_REG14" },
2567 { 4*REG_REG15, "4*REG_REG15" },
2568 { 4*REG_PC, "4*REG_PC" },
2569 { 4*REG_PR, "4*REG_PR" },
2570 { 4*REG_SR, "4*REG_SR" },
2571 { 4*REG_GBR, "4*REG_GBR" },
2572 { 4*REG_MACH, "4*REG_MACH" },
2573 { 4*REG_MACL, "4*REG_MACL" },
2574 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2575 { 4*REG_FPUL, "4*REG_FPUL" },
2576 { 4*REG_FPREG0, "4*REG_FPREG0" },
2577 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2578 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2579 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2580 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2581 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2582 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2583 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2584 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2585 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2586 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2587 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2588 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2589 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2590 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2591 { 4*REG_FPREG15, "4*REG_FPREG15" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002592#ifdef REG_XDREG0
Wichert Akkermanccef6372002-05-01 16:39:22 +00002593 { 4*REG_XDREG0, "4*REG_XDREG0" },
2594 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2595 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2596 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2597 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2598 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2599 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2600 { 4*REG_XDREG14, "4*REG_XDREG14" },
Roland McGrathc0f8bbd2003-08-21 09:58:00 +00002601#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00002602 { 4*REG_FPSCR, "4*REG_FPSCR" },
2603#endif /* SH */
Roland McGrathf5a47772003-06-26 22:40:42 +00002604#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002605 { 0, "PC(L)" },
2606 { 4, "PC(U)" },
2607 { 8, "SR(L)" },
2608 { 12, "SR(U)" },
2609 { 16, "syscall no.(L)" },
2610 { 20, "syscall_no.(U)" },
2611 { 24, "R0(L)" },
2612 { 28, "R0(U)" },
2613 { 32, "R1(L)" },
2614 { 36, "R1(U)" },
2615 { 40, "R2(L)" },
2616 { 44, "R2(U)" },
2617 { 48, "R3(L)" },
2618 { 52, "R3(U)" },
2619 { 56, "R4(L)" },
2620 { 60, "R4(U)" },
2621 { 64, "R5(L)" },
2622 { 68, "R5(U)" },
2623 { 72, "R6(L)" },
2624 { 76, "R6(U)" },
2625 { 80, "R7(L)" },
2626 { 84, "R7(U)" },
2627 { 88, "R8(L)" },
2628 { 92, "R8(U)" },
2629 { 96, "R9(L)" },
2630 { 100, "R9(U)" },
2631 { 104, "R10(L)" },
2632 { 108, "R10(U)" },
2633 { 112, "R11(L)" },
2634 { 116, "R11(U)" },
2635 { 120, "R12(L)" },
2636 { 124, "R12(U)" },
2637 { 128, "R13(L)" },
2638 { 132, "R13(U)" },
2639 { 136, "R14(L)" },
2640 { 140, "R14(U)" },
2641 { 144, "R15(L)" },
2642 { 148, "R15(U)" },
2643 { 152, "R16(L)" },
2644 { 156, "R16(U)" },
2645 { 160, "R17(L)" },
2646 { 164, "R17(U)" },
2647 { 168, "R18(L)" },
2648 { 172, "R18(U)" },
2649 { 176, "R19(L)" },
2650 { 180, "R19(U)" },
2651 { 184, "R20(L)" },
2652 { 188, "R20(U)" },
2653 { 192, "R21(L)" },
2654 { 196, "R21(U)" },
2655 { 200, "R22(L)" },
2656 { 204, "R22(U)" },
2657 { 208, "R23(L)" },
2658 { 212, "R23(U)" },
2659 { 216, "R24(L)" },
2660 { 220, "R24(U)" },
2661 { 224, "R25(L)" },
2662 { 228, "R25(U)" },
2663 { 232, "R26(L)" },
2664 { 236, "R26(U)" },
2665 { 240, "R27(L)" },
2666 { 244, "R27(U)" },
2667 { 248, "R28(L)" },
2668 { 252, "R28(U)" },
2669 { 256, "R29(L)" },
2670 { 260, "R29(U)" },
2671 { 264, "R30(L)" },
2672 { 268, "R30(U)" },
2673 { 272, "R31(L)" },
2674 { 276, "R31(U)" },
2675 { 280, "R32(L)" },
2676 { 284, "R32(U)" },
2677 { 288, "R33(L)" },
2678 { 292, "R33(U)" },
2679 { 296, "R34(L)" },
2680 { 300, "R34(U)" },
2681 { 304, "R35(L)" },
2682 { 308, "R35(U)" },
2683 { 312, "R36(L)" },
2684 { 316, "R36(U)" },
2685 { 320, "R37(L)" },
2686 { 324, "R37(U)" },
2687 { 328, "R38(L)" },
2688 { 332, "R38(U)" },
2689 { 336, "R39(L)" },
2690 { 340, "R39(U)" },
2691 { 344, "R40(L)" },
2692 { 348, "R40(U)" },
2693 { 352, "R41(L)" },
2694 { 356, "R41(U)" },
2695 { 360, "R42(L)" },
2696 { 364, "R42(U)" },
2697 { 368, "R43(L)" },
2698 { 372, "R43(U)" },
2699 { 376, "R44(L)" },
2700 { 380, "R44(U)" },
2701 { 384, "R45(L)" },
2702 { 388, "R45(U)" },
2703 { 392, "R46(L)" },
2704 { 396, "R46(U)" },
2705 { 400, "R47(L)" },
2706 { 404, "R47(U)" },
2707 { 408, "R48(L)" },
2708 { 412, "R48(U)" },
2709 { 416, "R49(L)" },
2710 { 420, "R49(U)" },
2711 { 424, "R50(L)" },
2712 { 428, "R50(U)" },
2713 { 432, "R51(L)" },
2714 { 436, "R51(U)" },
2715 { 440, "R52(L)" },
2716 { 444, "R52(U)" },
2717 { 448, "R53(L)" },
2718 { 452, "R53(U)" },
2719 { 456, "R54(L)" },
2720 { 460, "R54(U)" },
2721 { 464, "R55(L)" },
2722 { 468, "R55(U)" },
2723 { 472, "R56(L)" },
2724 { 476, "R56(U)" },
2725 { 480, "R57(L)" },
2726 { 484, "R57(U)" },
2727 { 488, "R58(L)" },
2728 { 492, "R58(U)" },
2729 { 496, "R59(L)" },
2730 { 500, "R59(U)" },
2731 { 504, "R60(L)" },
2732 { 508, "R60(U)" },
2733 { 512, "R61(L)" },
2734 { 516, "R61(U)" },
2735 { 520, "R62(L)" },
2736 { 524, "R62(U)" },
2737 { 528, "TR0(L)" },
2738 { 532, "TR0(U)" },
2739 { 536, "TR1(L)" },
2740 { 540, "TR1(U)" },
2741 { 544, "TR2(L)" },
2742 { 548, "TR2(U)" },
2743 { 552, "TR3(L)" },
2744 { 556, "TR3(U)" },
2745 { 560, "TR4(L)" },
2746 { 564, "TR4(U)" },
2747 { 568, "TR5(L)" },
2748 { 572, "TR5(U)" },
2749 { 576, "TR6(L)" },
2750 { 580, "TR6(U)" },
2751 { 584, "TR7(L)" },
2752 { 588, "TR7(U)" },
2753 /* This entry is in case pt_regs contains dregs (depends on
2754 the kernel build options). */
2755 { uoff(regs), "offsetof(struct user, regs)" },
2756 { uoff(fpu), "offsetof(struct user, fpu)" },
2757#endif
Roland McGrath0f87c492003-06-03 23:29:04 +00002758#ifdef ARM
2759 { uoff(regs.ARM_r0), "r0" },
2760 { uoff(regs.ARM_r1), "r1" },
2761 { uoff(regs.ARM_r2), "r2" },
2762 { uoff(regs.ARM_r3), "r3" },
2763 { uoff(regs.ARM_r4), "r4" },
2764 { uoff(regs.ARM_r5), "r5" },
2765 { uoff(regs.ARM_r6), "r6" },
2766 { uoff(regs.ARM_r7), "r7" },
2767 { uoff(regs.ARM_r8), "r8" },
2768 { uoff(regs.ARM_r9), "r9" },
2769 { uoff(regs.ARM_r10), "r10" },
2770 { uoff(regs.ARM_fp), "fp" },
2771 { uoff(regs.ARM_ip), "ip" },
2772 { uoff(regs.ARM_sp), "sp" },
2773 { uoff(regs.ARM_lr), "lr" },
2774 { uoff(regs.ARM_pc), "pc" },
2775 { uoff(regs.ARM_cpsr), "cpsr" },
2776#endif
Wichert Akkermanccef6372002-05-01 16:39:22 +00002777
Michal Ludvig10a88d02002-10-07 14:31:00 +00002778#if !defined(S390) && !defined(S390X) && !defined(MIPS)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002779 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00002780#endif
Michal Ludvig0e035502002-09-23 15:41:01 +00002781#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002782 { uoff(i387), "offsetof(struct user, i387)" },
2783#else /* !I386 */
2784#ifdef M68K
2785 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
2786#endif /* M68K */
2787#endif /* !I386 */
2788 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
2789 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
2790 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
2791 { uoff(start_code), "offsetof(struct user, start_code)" },
Roland McGrathf5a47772003-06-26 22:40:42 +00002792#ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00002793 { uoff(start_data), "offsetof(struct user, start_data)" },
2794#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002795 { uoff(start_stack), "offsetof(struct user, start_stack)" },
2796 { uoff(signal), "offsetof(struct user, signal)" },
Roland McGrathf5a47772003-06-26 22:40:42 +00002797#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002798 { uoff(reserved), "offsetof(struct user, reserved)" },
Wichert Akkermanf90da011999-10-31 21:15:38 +00002799#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002800 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002801#if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002802 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
2803#endif
2804 { uoff(magic), "offsetof(struct user, magic)" },
2805 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002806#if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002807 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
2808#endif /* I386 */
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002809#endif /* !IA64 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002810#endif /* !ALPHA */
2811#endif /* !POWERPC/!SPARC */
2812#endif /* LINUX */
2813#ifdef SUNOS4
2814 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
2815 { uoff(u_procp), "offsetof(struct user, u_procp)" },
2816 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2817 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
2818 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
2819 { uoff(u_ap), "offsetof(struct user, u_ap)" },
2820 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
2821 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
2822 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
2823 { uoff(u_error), "offsetof(struct user, u_error)" },
2824 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
2825 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
2826 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
2827 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
2828 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
2829 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
2830 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
2831 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
2832 { uoff(u_code), "offsetof(struct user, u_code)" },
2833 { uoff(u_addr), "offsetof(struct user, u_addr)" },
2834 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
2835 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
2836 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
2837 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
2838 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
2839 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
2840 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
2841 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
2842 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
2843 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
2844 { uoff(u_ru), "offsetof(struct user, u_ru)" },
2845 { uoff(u_cru), "offsetof(struct user, u_cru)" },
2846 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
2847 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
2848 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
2849 { uoff(u_start), "offsetof(struct user, u_start)" },
2850 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
2851 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
2852 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
2853 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
2854 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
2855 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
2856 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
2857 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
2858 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
2859#endif /* SUNOS4 */
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002860#ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002861 { sizeof(struct user), "sizeof(struct user)" },
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002862#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002863 { 0, NULL },
2864};
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002865#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002866
2867int
2868sys_ptrace(tcp)
2869struct tcb *tcp;
2870{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002871 struct xlat *x;
2872 long addr;
2873
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002874 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00002875 printxval(ptrace_cmds, tcp->u_arg[0],
2876#ifndef FREEBSD
2877 "PTRACE_???"
2878#else
2879 "PT_???"
2880#endif
2881 );
2882 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002883 addr = tcp->u_arg[2];
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002884#ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002885 if (tcp->u_arg[0] == PTRACE_PEEKUSER
2886 || tcp->u_arg[0] == PTRACE_POKEUSER) {
2887 for (x = struct_user_offsets; x->str; x++) {
2888 if (x->val >= addr)
2889 break;
2890 }
2891 if (!x->str)
2892 tprintf("%#lx, ", addr);
2893 else if (x->val > addr && x != struct_user_offsets) {
2894 x--;
2895 tprintf("%s + %ld, ", x->str, addr - x->val);
2896 }
2897 else
2898 tprintf("%s, ", x->str);
2899 }
2900 else
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002901#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002902 tprintf("%#lx, ", tcp->u_arg[2]);
2903#ifdef LINUX
2904 switch (tcp->u_arg[0]) {
2905 case PTRACE_PEEKDATA:
2906 case PTRACE_PEEKTEXT:
2907 case PTRACE_PEEKUSER:
2908 break;
2909 case PTRACE_CONT:
2910 case PTRACE_SINGLESTEP:
2911 case PTRACE_SYSCALL:
2912 case PTRACE_DETACH:
2913 printsignal(tcp->u_arg[3]);
2914 break;
2915 default:
2916 tprintf("%#lx", tcp->u_arg[3]);
2917 break;
2918 }
2919 } else {
2920 switch (tcp->u_arg[0]) {
2921 case PTRACE_PEEKDATA:
2922 case PTRACE_PEEKTEXT:
2923 case PTRACE_PEEKUSER:
Roland McGratheb285352003-01-14 09:59:00 +00002924 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002925 break;
2926 }
2927 }
2928#endif /* LINUX */
2929#ifdef SUNOS4
2930 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
2931 tcp->u_arg[0] == PTRACE_WRITETEXT) {
2932 tprintf("%lu, ", tcp->u_arg[3]);
2933 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2934 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
2935 tcp->u_arg[0] != PTRACE_READTEXT) {
2936 tprintf("%#lx", tcp->u_arg[3]);
2937 }
2938 } else {
2939 if (tcp->u_arg[0] == PTRACE_READDATA ||
2940 tcp->u_arg[0] == PTRACE_READTEXT) {
2941 tprintf("%lu, ", tcp->u_arg[3]);
2942 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2943 }
2944 }
2945#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002946#ifdef FREEBSD
2947 tprintf("%lu", tcp->u_arg[3]);
2948 }
2949#endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002950 return 0;
2951}
2952
2953#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00002954
2955#ifdef LINUX
2956static struct xlat futexops[] = {
2957 { FUTEX_WAIT, "FUTEX_WAIT" },
2958 { FUTEX_WAKE, "FUTEX_WAKE" },
2959 { FUTEX_FD, "FUTEX_FD" },
Roland McGrath88812d62003-06-26 22:27:23 +00002960 { FUTEX_REQUEUE,"FUTEX_REQUEUE" },
Roland McGrath5a223472002-12-15 23:58:26 +00002961 { 0, NULL }
2962};
2963
2964int
2965sys_futex(tcp)
2966struct tcb *tcp;
2967{
2968 if (entering(tcp)) {
2969 tprintf("%p, ", (void *) tcp->u_arg[0]);
Roland McGrath88812d62003-06-26 22:27:23 +00002970 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
Roland McGrath8dfa04a2003-03-05 04:07:55 +00002971 tprintf(", %ld", tcp->u_arg[2]);
2972 if (tcp->u_arg[1] == FUTEX_WAIT) {
2973 tprintf(", ");
2974 printtv(tcp, tcp->u_arg[3]);
Roland McGrath88812d62003-06-26 22:27:23 +00002975 } else if (tcp->u_arg[1] == FUTEX_REQUEUE)
2976 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Roland McGrath5a223472002-12-15 23:58:26 +00002977 }
2978 return 0;
2979}
2980
2981static void
2982print_affinitylist(list, len)
2983unsigned long *list;
2984unsigned int len;
2985{
2986 int first = 1;
2987 tprintf(" {");
Roland McGratha2f34962003-05-23 00:14:04 +00002988 while (len >= sizeof (unsigned long)) {
Roland McGrath5a223472002-12-15 23:58:26 +00002989 tprintf("%s %lx", first ? "" : ",", *list++);
2990 first = 0;
2991 len -= sizeof (unsigned long);
2992 }
2993 tprintf(" }");
2994}
2995
2996int
2997sys_sched_setaffinity(tcp)
2998struct tcb *tcp;
2999{
3000 if (entering(tcp)) {
3001 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3002 print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_arg[1]);
3003 }
3004 return 0;
3005}
3006
3007int
3008sys_sched_getaffinity(tcp)
3009struct tcb *tcp;
3010{
3011 if (entering(tcp)) {
3012 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3013 } else {
3014 print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_rval);
3015 }
3016 return 0;
3017}
Roland McGrath279d3782004-03-01 20:27:37 +00003018
3019static struct xlat schedulers[] = {
3020 { SCHED_OTHER, "SCHED_OTHER" },
3021 { SCHED_RR, "SCHED_RR" },
3022 { SCHED_FIFO, "SCHED_FIFO" },
3023 { 0, NULL }
3024};
3025
3026int
3027sys_sched_getscheduler(tcp)
3028struct tcb *tcp;
3029{
3030 if (entering(tcp)) {
3031 tprintf("%d", (int) tcp->u_arg[0]);
3032 } else if (! syserror(tcp)) {
3033 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3034 if (tcp->auxstr != NULL)
3035 return RVAL_STR;
3036 }
3037 return 0;
3038}
3039
3040int
3041sys_sched_setscheduler(tcp)
3042struct tcb *tcp;
3043{
3044 if (entering(tcp)) {
3045 struct sched_param p;
3046 tprintf("%d, ", (int) tcp->u_arg[0]);
3047 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3048 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3049 tprintf(", %lx", tcp->u_arg[2]);
3050 else
3051 tprintf(", { %d }", p.__sched_priority);
3052 }
3053 return 0;
3054}
3055
3056int
3057sys_sched_getparam(tcp)
3058struct tcb *tcp;
3059{
3060 if (entering(tcp)) {
3061 tprintf("%d, ", (int) tcp->u_arg[0]);
3062 } else {
3063 struct sched_param p;
3064 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3065 tprintf("%lx", tcp->u_arg[1]);
3066 else
3067 tprintf("{ %d }", p.__sched_priority);
3068 }
3069 return 0;
3070}
3071
3072int
3073sys_sched_setparam(tcp)
3074struct tcb *tcp;
3075{
3076 if (entering(tcp)) {
3077 struct sched_param p;
3078 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3079 tprintf("%d, %lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3080 else
3081 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3082 }
3083 return 0;
3084}
3085
3086int
3087sys_sched_get_priority_min(tcp)
3088struct tcb *tcp;
3089{
3090 if (entering(tcp)) {
3091 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3092 }
3093 return 0;
3094}
Roland McGrath5a223472002-12-15 23:58:26 +00003095#endif