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>
5 * 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>
9 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
13 * All rights reserved.
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
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.
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.
46 #include <sys/resource.h>
47 #include <sys/utsname.h>
49 #include <sys/syscall.h>
52 #include <machine/reg.h>
56 #include <sys/ptrace.h>
61 # define fpq kernel_fpq
63 # define fpu kernel_fpu
71 #endif /* HAVE_ASM_REG_H */
75 #ifndef PTRACE_PEEKUSR
76 # define PTRACE_PEEKUSR PTRACE_PEEKUSER
78 #ifndef PTRACE_POKEUSR
79 # define PTRACE_POKEUSR PTRACE_POKEUSER
83 #ifdef HAVE_LINUX_PTRACE_H
85 #include <linux/ptrace.h>
88 #ifdef HAVE_LINUX_FUTEX_H
89 #include <linux/futex.h>
101 # ifndef FUTEX_REQUEUE
102 # define FUTEX_REQUEUE 3
107 #include <asm/posix_types.h>
109 #define GETGROUPS_T __kernel_gid_t
111 #define GETGROUPS32_T __kernel_gid32_t
114 #if defined(LINUX) && defined(IA64)
115 # include <asm/ptrace_offsets.h>
116 # include <asm/rse.h>
120 #include <sys/prctl.h>
124 #define WCOREDUMP(status) ((status) & 0200)
127 /* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
128 #if defined(HAVE_PRCTL)
129 static struct xlat prctl_options[] = {
131 { PR_MAXPROCS, "PR_MAXPROCS" },
134 { PR_ISBLOCKED, "PR_ISBLOCKED" },
136 #ifdef PR_SETSTACKSIZE
137 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
139 #ifdef PR_GETSTACKSIZE
140 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
143 { PR_MAXPPROCS, "PR_MAXPPROCS" },
145 #ifdef PR_UNBLKONEXEC
146 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
149 { PR_ATOMICSIM, "PR_ATOMICSIM" },
152 { PR_SETEXITSIG, "PR_SETEXITSIG" },
155 { PR_RESIDENT, "PR_RESIDENT" },
158 { PR_ATTACHADDR, "PR_ATTACHADDR" },
161 { PR_DETACHADDR, "PR_DETACHADDR" },
164 { PR_TERMCHILD, "PR_TERMCHILD" },
167 { PR_GETSHMASK, "PR_GETSHMASK" },
170 { PR_GETNSHARE, "PR_GETNSHARE" },
172 #if defined(PR_SET_PDEATHSIG)
173 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
176 { PR_COREPID, "PR_COREPID" },
178 #ifdef PR_ATTACHADDRPERM
179 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
181 #ifdef PR_PTHREADEXIT
182 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
184 #ifdef PR_SET_PDEATHSIG
185 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
187 #ifdef PR_GET_PDEATHSIG
188 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
190 #ifdef PR_GET_UNALIGN
191 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
193 #ifdef PR_SET_UNALIGN
194 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
196 #ifdef PR_GET_KEEPCAPS
197 { PR_GET_KEEPCAPS, "PR_GET_KEEP_CAPS" },
199 #ifdef PR_SET_KEEPCAPS
200 { PR_SET_KEEPCAPS, "PR_SET_KEEP_CAPS" },
207 unalignctl_string (unsigned int ctl)
212 #ifdef PR_UNALIGN_NOPRINT
213 case PR_UNALIGN_NOPRINT:
216 #ifdef PR_UNALIGN_SIGBUS
217 case PR_UNALIGN_SIGBUS:
223 sprintf(buf, "%x", ctl);
235 printxval(prctl_options, tcp->u_arg[0], "PR_???");
236 switch (tcp->u_arg[0]) {
241 #ifdef PR_SET_DEATHSIG
242 case PR_GET_PDEATHSIG:
245 #ifdef PR_SET_UNALIGN
247 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
250 #ifdef PR_GET_UNALIGN
252 tprintf(", %#lx", tcp->u_arg[1]);
256 for (i = 1; i < tcp->u_nargs; i++)
257 tprintf(", %#lx", tcp->u_arg[i]);
261 switch (tcp->u_arg[0]) {
262 #ifdef PR_GET_PDEATHSIG
263 case PR_GET_PDEATHSIG:
264 for (i=1; i<tcp->u_nargs; i++)
265 tprintf(", %#lx", tcp->u_arg[i]);
268 #ifdef PR_SET_UNALIGN
272 #ifdef PR_GET_UNALIGN
277 umove(tcp, tcp->u_arg[1], &ctl);
278 tcp->auxstr = unalignctl_string(ctl);
289 #endif /* HAVE_PRCTL */
305 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
306 tprintf(", %lu", tcp->u_arg[1]);
317 tprintf("%#lx", tcp->u_arg[0]);
319 printpath(tcp, tcp->u_arg[0]);
320 tprintf(", %lu", tcp->u_arg[1]);
326 sys_setdomainname(tcp)
330 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
331 tprintf(", %lu", tcp->u_arg[1]);
339 sys_getdomainname(tcp)
344 tprintf("%#lx", tcp->u_arg[0]);
346 printpath(tcp, tcp->u_arg[0]);
347 tprintf(", %lu", tcp->u_arg[1]);
358 fprintf(stderr, "_exit returned!\n");
361 /* special case: we stop tracing this process, finish line now */
362 tprintf("%ld) ", tcp->u_arg[0]);
374 tcp->flags |= TCB_EXITING;
375 #ifdef __NR_exit_group
376 if (tcp->scno == __NR_exit_group)
377 tcp->flags |= TCB_GROUP_EXITING;
383 /* TCP is creating a child we want to follow.
384 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
385 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
387 fork_tcb(struct tcb *tcp)
389 if (nprocs == tcbtabsize) {
390 /* Allocate some more TCBs and expand the table.
391 We don't want to relocate the TCBs because our
392 callers have pointers and it would be a pain.
393 So tcbtab is a table of pointers. Since we never
394 free the TCBs, we allocate a single chunk of many. */
395 struct tcb **newtab = (struct tcb **)
396 realloc(tcbtab, 2 * tcbtabsize * sizeof tcbtab[0]);
397 struct tcb *newtcbs = (struct tcb *) calloc(tcbtabsize,
400 if (newtab == NULL || newtcbs == NULL) {
403 tcp->flags &= ~TCB_FOLLOWFORK;
404 fprintf(stderr, "sys_fork: tcb table full\n");
407 for (i = tcbtabsize; i < 2 * tcbtabsize; ++i)
408 newtab[i] = &newtcbs[i - tcbtabsize];
413 tcp->flags |= TCB_FOLLOWFORK;
425 tcp->auxstr = "child process";
426 return RVAL_UDECIMAL | RVAL_STR;
439 tprintf ("%ld", tcp->u_arg[0]);
443 tcp->auxstr = "child process";
444 return RVAL_UDECIMAL | RVAL_STR;
456 struct tcb *tcpchild;
460 if (tcp->scno == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
471 if ((tcpchild = alloctcb(tcp->u_rval)) == NULL) {
472 fprintf(stderr, "sys_fork: tcb table full\n");
475 if (proc_open(tcpchild, 2) < 0)
481 #else /* !USE_PROCFS */
485 /* defines copied from linux/sched.h since we can't include that
486 * ourselves (it conflicts with *lots* of libc includes)
488 #define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
489 #define CLONE_VM 0x00000100 /* set if VM shared between processes */
490 #define CLONE_FS 0x00000200 /* set if fs info shared between processes */
491 #define CLONE_FILES 0x00000400 /* set if open files shared between processes */
492 #define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
493 #define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
494 #define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
495 #define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
496 #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
497 #define CLONE_THREAD 0x00010000 /* Same thread group? */
498 #define CLONE_NEWNS 0x00020000 /* New namespace group? */
499 #define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
500 #define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
501 #define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
502 #define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
503 #define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
504 #define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
505 #define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
507 static struct xlat clone_flags[] = {
508 { CLONE_VM, "CLONE_VM" },
509 { CLONE_FS, "CLONE_FS" },
510 { CLONE_FILES, "CLONE_FILES" },
511 { CLONE_SIGHAND, "CLONE_SIGHAND" },
512 { CLONE_IDLETASK, "CLONE_IDLETASK"},
513 { CLONE_PTRACE, "CLONE_PTRACE" },
514 { CLONE_VFORK, "CLONE_VFORK" },
515 { CLONE_PARENT, "CLONE_PARENT" },
516 { CLONE_THREAD, "CLONE_THREAD" },
517 { CLONE_NEWNS, "CLONE_NEWNS" },
518 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
519 { CLONE_SETTLS, "CLONE_SETTLS" },
520 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
521 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
522 { CLONE_DETACHED, "CLONE_DETACHED" },
523 { CLONE_UNTRACED, "CLONE_UNTRACED" },
524 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
529 # include <asm/ldt.h>
530 extern void print_ldt_entry();
536 # define ARG_STACKSIZE (tcp->scno == SYS_clone2 ? 2 : -1)
537 # define ARG_PTID (tcp->scno == SYS_clone2 ? 3 : 2)
538 # define ARG_CTID (tcp->scno == SYS_clone2 ? 4 : 3)
539 # define ARG_TLS (tcp->scno == SYS_clone2 ? 5 : 4)
540 # elif defined S390 || defined S390X
546 # elif defined X86_64 || defined ALPHA
565 unsigned long flags = tcp->u_arg[ARG_FLAGS];
566 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
567 # ifdef ARG_STACKSIZE
568 if (ARG_STACKSIZE != -1)
569 tprintf("stack_size=%#lx, ",
570 tcp->u_arg[ARG_STACKSIZE]);
573 if (printflags(clone_flags, flags &~ CSIGNAL) == 0)
575 if ((flags & CSIGNAL) != 0)
576 tprintf("|%s", signame(flags & CSIGNAL));
577 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
578 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
580 if (flags & CLONE_PARENT_SETTID)
581 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
582 if (flags & CLONE_SETTLS) {
584 struct modify_ldt_ldt_s copy;
585 if (umove(tcp, tcp->u_arg[ARG_TLS], ©) != -1) {
586 tprintf(", {entry_number:%d, ",
591 print_ldt_entry(©);
595 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
597 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
598 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
609 return RVAL_UDECIMAL;
614 change_syscall(tcp, new)
620 /* Attempt to make vfork into fork, which we can follow. */
621 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
624 #elif defined(X86_64)
625 /* Attempt to make vfork into fork, which we can follow. */
626 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
629 #elif defined(POWERPC)
630 if (ptrace(PTRACE_POKEUSER, tcp->pid,
631 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
634 #elif defined(S390) || defined(S390X)
635 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
636 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
640 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
645 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)®s, 0)<0)
648 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)®s, 0)<0)
652 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
656 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
660 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
664 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
668 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
672 /* Top half of reg encodes the no. of args n as 0x1n.
673 Assume 0 args as kernel never actually checks... */
674 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
679 #warning Do not know how to handle change_syscall for this architecture
680 #endif /* architecture */
692 unsigned long *bsp, *ap;
694 if (upeek(tcp->pid, PT_AR_BSP, (long *) &bsp) , 0)
697 ap = ia64_rse_skip_regs(bsp, argnum);
699 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
706 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
710 #elif defined(X86_64)
712 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
716 #elif defined(POWERPC)
718 #define PT_ORIG_R3 34
721 ptrace(PTRACE_POKEUSER, tcp->pid,
722 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
731 ptrace(PTRACE_POKEUSER, tcp->pid,
732 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
736 if (upeek(tcp->pid, REG_SP, (long *) &sp) , 0)
739 ptrace(PTRACE_POKEDATA, tcp->pid,
740 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
745 #elif defined(S390) || defined(S390X)
748 ptrace(PTRACE_POKEUSER, tcp->pid,
749 (char *) (argnum==0 ? PT_ORIGGPR2 :
750 PT_GPR2 + argnum*sizeof(long)),
758 # warning Sorry, setargs not implemented for this architecture.
763 #if defined SYS_clone || defined SYS_clone2
768 struct tcb *tcpchild;
778 int bpt = tcp->flags & TCB_BPTSET;
780 if (!(tcp->flags & TCB_FOLLOWFORK))
791 #ifdef CLONE_PTRACE /* See new setbpt code. */
792 tcpchild = pid2tcb(pid);
793 if (tcpchild != NULL) {
794 /* The child already reported its startup trap
795 before the parent reported its syscall return. */
797 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
798 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
800 [preattached child %d of %d in weird state!]\n",
805 if ((tcpchild = alloctcb(pid)) == NULL) {
808 fprintf(stderr, " [tcb table full]\n");
809 kill(pid, SIGKILL); /* XXX */
814 /* Attach to the new child */
815 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
818 perror("PTRACE_ATTACH");
819 fprintf(stderr, "Too late?\n");
828 tcpchild->flags |= TCB_ATTACHED;
829 /* Child has BPT too, must be removed on first occasion. */
831 tcpchild->flags |= TCB_BPTSET;
832 tcpchild->baddr = tcp->baddr;
833 memcpy(tcpchild->inst, tcp->inst,
834 sizeof tcpchild->inst);
836 tcpchild->parent = tcp;
838 if (tcpchild->flags & TCB_SUSPENDED) {
839 /* The child was born suspended, due to our having
840 forced CLONE_PTRACE. */
844 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
845 if (ptrace(PTRACE_SYSCALL, pid, (char *) 1, 0) < 0) {
846 perror("resume: ptrace(PTRACE_SYSCALL, ...)");
852 Process %u resumed (parent %d ready)\n",
858 fprintf(stderr, "Process %d attached\n", pid);
861 #ifdef TCB_CLONE_THREAD
864 * Save the flags used in this call,
865 * in case we point TCP to our parent below.
867 int call_flags = tcp->u_arg[ARG_FLAGS];
868 if ((tcp->flags & TCB_CLONE_THREAD) &&
869 tcp->parent != NULL) {
870 /* The parent in this clone is itself a
871 thread belonging to another process.
872 There is no meaning to the parentage
873 relationship of the new child with the
874 thread, only with the process. We
875 associate the new thread with our
876 parent. Since this is done for every
877 new thread, there will never be a
878 TCB_CLONE_THREAD process that has
882 tcpchild->parent = tcp;
885 if (call_flags & CLONE_THREAD) {
886 tcpchild->flags |= TCB_CLONE_THREAD;
887 ++tcp->nclone_threads;
889 if (call_flags & CLONE_DETACHED) {
890 tcpchild->flags |= TCB_CLONE_DETACHED;
891 ++tcp->nclone_detached;
906 /* We do special magic with clone for any clone or fork. */
907 return internal_clone(tcp);
910 struct tcb *tcpchild;
915 if (tcp->scno == SYS_vfork) {
916 /* Attempt to make vfork into fork, which we can follow. */
918 change_syscall(tcp, SYS_fork) < 0)
923 if (!followfork || dont_follow)
931 int bpt = tcp->flags & TCB_BPTSET;
933 if (!(tcp->flags & TCB_FOLLOWFORK))
942 if ((tcpchild = alloctcb(pid)) == NULL) {
943 fprintf(stderr, " [tcb table full]\n");
944 kill(pid, SIGKILL); /* XXX */
949 /* The child must have run before it can be attached. */
950 /* This must be a bug in the parisc kernel, but I havn't
951 * identified it yet. Seems to be an issue associated
952 * with attaching to a process (which sends it a signal)
953 * before that process has ever been scheduled. When
954 * debugging, I started seeing crashes in
955 * arch/parisc/kernel/signal.c:do_signal(), apparently
956 * caused by r8 getting corrupt over the dequeue_signal()
957 * call. Didn't make much sense though...
963 select(0, NULL, NULL, NULL, &tv);
966 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
967 perror("PTRACE_ATTACH");
968 fprintf(stderr, "Too late?\n");
975 /* The child must have run before it can be attached. */
980 select(0, NULL, NULL, NULL, &tv);
982 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
983 perror("PTRACE_ATTACH");
984 fprintf(stderr, "Too late?\n");
989 /* Try to catch the new process as soon as possible. */
992 for (i = 0; i < 1024; i++)
993 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
996 perror("PTRACE_ATTACH");
997 fprintf(stderr, "Too late?\n");
1002 #endif /* !oldway */
1004 tcpchild->flags |= TCB_ATTACHED;
1005 /* Child has BPT too, must be removed on first occasion */
1007 tcpchild->flags |= TCB_BPTSET;
1008 tcpchild->baddr = tcp->baddr;
1009 memcpy(tcpchild->inst, tcp->inst,
1010 sizeof tcpchild->inst);
1013 tcpchild->parent = tcp;
1016 fprintf(stderr, "Process %d attached\n", pid);
1022 #endif /* !USE_PROCFS */
1024 #if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
1031 return RVAL_UDECIMAL;
1035 #endif /* SUNOS4 || LINUX || FREEBSD */
1039 static char idstr[16];
1046 sprintf(idstr, "ppid %lu", getrval2(tcp));
1047 tcp->auxstr = idstr;
1058 sprintf(idstr, "euid %lu", getrval2(tcp));
1059 tcp->auxstr = idstr;
1070 sprintf(idstr, "egid %lu", getrval2(tcp));
1071 tcp->auxstr = idstr;
1085 if (entering(tcp)) {
1086 tprintf("%u", (uid_t) tcp->u_arg[0]);
1095 if (entering(tcp)) {
1096 tprintf("%u", (gid_t) tcp->u_arg[0]);
1108 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1109 tcp->u_arg[1], tcp->u_arg[2]);
1111 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1112 tprintf("%#lx, ", tcp->u_arg[0]);
1114 tprintf("[%lu], ", (unsigned long) uid);
1115 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1116 tprintf("%#lx, ", tcp->u_arg[1]);
1118 tprintf("[%lu], ", (unsigned long) uid);
1119 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1120 tprintf("%#lx", tcp->u_arg[2]);
1122 tprintf("[%lu]", (unsigned long) uid);
1135 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1136 tcp->u_arg[1], tcp->u_arg[2]);
1138 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1139 tprintf("%#lx, ", tcp->u_arg[0]);
1141 tprintf("[%lu], ", (unsigned long) gid);
1142 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1143 tprintf("%#lx, ", tcp->u_arg[1]);
1145 tprintf("[%lu], ", (unsigned long) gid);
1146 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1147 tprintf("%#lx", tcp->u_arg[2]);
1149 tprintf("[%lu]", (unsigned long) gid);
1161 if (entering(tcp)) {
1162 printuid("", tcp->u_arg[0]);
1163 printuid(", ", tcp->u_arg[1]);
1172 if (entering(tcp)) {
1173 printuid("", tcp->u_arg[0]);
1174 printuid(", ", tcp->u_arg[1]);
1179 #if defined(LINUX) || defined(FREEBSD)
1184 if (entering(tcp)) {
1185 printuid("", tcp->u_arg[0]);
1186 printuid(", ", tcp->u_arg[1]);
1187 printuid(", ", tcp->u_arg[2]);
1195 if (entering(tcp)) {
1196 printuid("", tcp->u_arg[0]);
1197 printuid(", ", tcp->u_arg[1]);
1198 printuid(", ", tcp->u_arg[2]);
1203 #endif /* LINUX || FREEBSD */
1210 GETGROUPS_T *gidset;
1212 if (entering(tcp)) {
1213 len = tcp->u_arg[0];
1214 tprintf("%u, ", len);
1219 gidset = (GETGROUPS_T *) malloc(len * sizeof(GETGROUPS_T));
1220 if (gidset == NULL) {
1221 fprintf(stderr, "sys_setgroups: out of memory\n");
1225 tprintf("%#lx", tcp->u_arg[1]);
1226 else if (umoven(tcp, tcp->u_arg[1],
1227 len * sizeof(GETGROUPS_T), (char *) gidset) < 0)
1231 for (i = 0; i < len; i++)
1232 tprintf("%s%lu", i ? ", " : "",
1233 (unsigned long) gidset[i]);
1236 free((char *) gidset);
1246 GETGROUPS_T *gidset;
1248 if (entering(tcp)) {
1249 len = tcp->u_arg[0];
1250 tprintf("%u, ", len);
1257 gidset = (GETGROUPS_T *) malloc(len * sizeof(GETGROUPS_T));
1258 if (gidset == NULL) {
1259 fprintf(stderr, "sys_getgroups: out of memory\n");
1264 else if (!verbose(tcp) || tcp->u_arg[0] == 0)
1265 tprintf("%#lx", tcp->u_arg[1]);
1266 else if (umoven(tcp, tcp->u_arg[1],
1267 len * sizeof(GETGROUPS_T), (char *) gidset) < 0)
1271 for (i = 0; i < len; i++)
1272 tprintf("%s%lu", i ? ", " : "",
1273 (unsigned long) gidset[i]);
1276 free((char *)gidset);
1283 sys_setgroups32(tcp)
1287 GETGROUPS32_T *gidset;
1289 if (entering(tcp)) {
1290 len = tcp->u_arg[0];
1291 tprintf("%u, ", len);
1296 gidset = (GETGROUPS32_T *) malloc(len * sizeof(GETGROUPS32_T));
1297 if (gidset == NULL) {
1298 fprintf(stderr, "sys_setgroups32: out of memory\n");
1302 tprintf("%#lx", tcp->u_arg[1]);
1303 else if (umoven(tcp, tcp->u_arg[1],
1304 len * sizeof(GETGROUPS32_T), (char *) gidset) < 0)
1308 for (i = 0; i < len; i++)
1309 tprintf("%s%lu", i ? ", " : "",
1310 (unsigned long) gidset[i]);
1313 free((char *) gidset);
1319 sys_getgroups32(tcp)
1323 GETGROUPS32_T *gidset;
1325 if (entering(tcp)) {
1326 len = tcp->u_arg[0];
1327 tprintf("%u, ", len);
1334 gidset = (GETGROUPS32_T *) malloc(len * sizeof(GETGROUPS32_T));
1335 if (gidset == NULL) {
1336 fprintf(stderr, "sys_getgroups32: out of memory\n");
1341 else if (!verbose(tcp) || tcp->u_arg[0] == 0)
1342 tprintf("%#lx", tcp->u_arg[1]);
1343 else if (umoven(tcp, tcp->u_arg[1],
1344 len * sizeof(GETGROUPS32_T), (char *) gidset) < 0)
1348 for (i = 0; i < len; i++)
1349 tprintf("%s%lu", i ? ", " : "",
1350 (unsigned long) gidset[i]);
1353 free((char *)gidset);
1363 if (entering(tcp)) {
1365 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1375 if (entering(tcp)) {
1377 tprintf("%lu", tcp->u_arg[0]);
1387 if (entering(tcp)) {
1388 tprintf("%lu", tcp->u_arg[0]);
1404 if (entering(tcp)) {
1405 tprintf("%lu", tcp->u_arg[0]);
1414 if (entering(tcp)) {
1415 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1422 #include <sys/privilege.h>
1425 static struct xlat procpriv_cmds [] = {
1426 { SETPRV, "SETPRV" },
1427 { CLRPRV, "CLRPRV" },
1428 { PUTPRV, "PUTPRV" },
1429 { GETPRV, "GETPRV" },
1430 { CNTPRV, "CNTPRV" },
1435 static struct xlat procpriv_priv [] = {
1436 { P_OWNER, "P_OWNER" },
1437 { P_AUDIT, "P_AUDIT" },
1438 { P_COMPAT, "P_COMPAT" },
1439 { P_DACREAD, "P_DACREAD" },
1440 { P_DACWRITE, "P_DACWRITE" },
1442 { P_FILESYS, "P_FILESYS" },
1443 { P_MACREAD, "P_MACREAD" },
1444 { P_MACWRITE, "P_MACWRITE" },
1445 { P_MOUNT, "P_MOUNT" },
1446 { P_MULTIDIR, "P_MULTIDIR" },
1447 { P_SETPLEVEL, "P_SETPLEVEL" },
1448 { P_SETSPRIV, "P_SETSPRIV" },
1449 { P_SETUID, "P_SETUID" },
1450 { P_SYSOPS, "P_SYSOPS" },
1451 { P_SETUPRIV, "P_SETUPRIV" },
1452 { P_DRIVER, "P_DRIVER" },
1453 { P_RTIME, "P_RTIME" },
1454 { P_MACUPGRADE, "P_MACUPGRADE" },
1455 { P_FSYSRANGE, "P_FSYSRANGE" },
1456 { P_SETFLEVEL, "P_SETFLEVEL" },
1457 { P_AUDITWR, "P_AUDITWR" },
1458 { P_TSHAR, "P_TSHAR" },
1459 { P_PLOCK, "P_PLOCK" },
1460 { P_CORE, "P_CORE" },
1461 { P_LOADMOD, "P_LOADMOD" },
1462 { P_BIND, "P_BIND" },
1463 { P_ALLPRIVS, "P_ALLPRIVS" },
1468 static struct xlat procpriv_type [] = {
1469 { PS_FIX, "PS_FIX" },
1470 { PS_INH, "PS_INH" },
1471 { PS_MAX, "PS_MAX" },
1472 { PS_WKG, "PS_WKG" },
1478 printpriv(tcp, addr, len, opt)
1485 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1486 int dots = len > max;
1489 if (len > max) len = max;
1492 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1494 tprintf ("%#lx", addr);
1500 for (i = 0; i < len; ++i) {
1503 if (i) tprintf (", ");
1505 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1506 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1508 tprintf ("%s|%s", t, p);
1511 tprintf ("%#lx", buf [i]);
1515 if (dots) tprintf (" ...");
1525 if (entering(tcp)) {
1526 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1527 switch (tcp->u_arg[0]) {
1529 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1537 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1538 tprintf (", %ld", tcp->u_arg[2]);
1541 else if (tcp->u_arg[0] == GETPRV) {
1542 if (syserror (tcp)) {
1543 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1547 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1548 tprintf (", %ld", tcp->u_arg[2]);
1559 fake_execve(tcp, program, argv, envp)
1568 if (!(qual_flags[SYS_execve - __NR_SYSCALL_BASE] & QUAL_TRACE))
1571 if (!(qual_flags[SYS_execve] & QUAL_TRACE))
1576 string_quote(program);
1578 for (i = 0; argv[i] != NULL; i++) {
1581 string_quote(argv[i]);
1583 for (i = 0; envp[i] != NULL; i++)
1585 tprintf("], [/* %d var%s */]) ", i, (i != 1) ? "s" : "");
1592 printargv(tcp, addr)
1598 int max = max_strlen / 2;
1600 for (sep = ""; --max >= 0; sep = ", ") {
1603 if (umove(tcp, addr, &cp) < 0) {
1604 tprintf("%#lx", addr);
1610 printstr(tcp, (long) cp, -1);
1611 addr += sizeof(char *);
1618 printargc(fmt, tcp, addr)
1626 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1627 addr += sizeof(char *);
1629 tprintf(fmt, count, count == 1 ? "" : "s");
1636 if (entering(tcp)) {
1637 printpath(tcp, tcp->u_arg[0]);
1639 tprintf(", %#lx", tcp->u_arg[1]);
1641 else if (abbrev(tcp))
1642 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1646 printargv(tcp, tcp->u_arg[1]);
1657 if (entering(tcp)) {
1658 printpath(tcp, tcp->u_arg[0]);
1660 tprintf(", %#lx", tcp->u_arg[1]);
1662 else if (abbrev(tcp))
1663 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1667 printargv(tcp, tcp->u_arg[1]);
1671 tprintf(", %#lx", tcp->u_arg[2]);
1672 else if (abbrev(tcp))
1673 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1676 printargv(tcp, tcp->u_arg[2]);
1680 #if defined LINUX && defined TCB_WAITEXECVE
1681 tcp->flags |= TCB_WAITEXECVE;
1682 #endif /* LINUX && TCB_WAITEXECVE */
1688 int sys_rexecve(tcp)
1691 if (entering (tcp)) {
1693 tprintf (", %ld", tcp->u_arg[3]);
1705 if (exiting(tcp) && !syserror(tcp) && followfork)
1713 #define __WNOTHREAD 0x20000000
1716 #define __WALL 0x40000000
1719 #define __WCLONE 0x80000000
1723 static struct xlat wait4_options[] = {
1724 { WNOHANG, "WNOHANG" },
1726 { WUNTRACED, "WUNTRACED" },
1729 { WEXITED, "WEXITED" },
1732 { WTRAPPED, "WTRAPPED" },
1735 { WSTOPPED, "WSTOPPED" },
1738 { WCONTINUED, "WCONTINUED" },
1741 { WNOWAIT, "WNOWAIT" },
1744 { __WCLONE, "__WCLONE" },
1747 { __WALL, "__WALL" },
1750 { __WNOTHREAD, "__WNOTHREAD" },
1762 * Here is a tricky presentation problem. This solution
1763 * is still not entirely satisfactory but since there
1764 * are no wait status constructors it will have to do.
1766 if (WIFSTOPPED(status))
1767 tprintf("[WIFSTOPPED(s) && WSTOPSIG(s) == %s]",
1768 signame(WSTOPSIG(status)));
1769 else if WIFSIGNALED(status)
1770 tprintf("[WIFSIGNALED(s) && WTERMSIG(s) == %s%s]",
1771 signame(WTERMSIG(status)),
1772 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
1773 else if WIFEXITED(status) {
1774 tprintf("[WIFEXITED(s) && WEXITSTATUS(s) == %d]",
1775 WEXITSTATUS(status));
1779 tprintf("[%#x]", status);
1784 printwaitn(tcp, n, bitness)
1792 if (entering(tcp)) {
1793 tprintf("%ld, ", tcp->u_arg[0]);
1798 else if (syserror(tcp) || tcp->u_rval == 0)
1799 tprintf("%#lx", tcp->u_arg[1]);
1800 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1803 exited = printstatus(status);
1806 if (!printflags(wait4_options, tcp->u_arg[2]))
1814 else if (tcp->u_rval > 0) {
1817 printrusage32(tcp, tcp->u_arg[3]);
1820 printrusage(tcp, tcp->u_arg[3]);
1824 else if (tcp->u_rval > 0 && exited)
1825 printrusage(tcp, tcp->u_arg[3]);
1828 tprintf("%#lx", tcp->u_arg[3]);
1840 #ifdef TCB_CLONE_THREAD
1841 if (tcp->flags & TCB_CLONE_THREAD)
1842 /* The children we wait for are our parent's children. */
1843 got_kids = (tcp->parent->nchildren
1844 > tcp->parent->nclone_detached);
1846 got_kids = (tcp->nchildren > tcp->nclone_detached);
1848 got_kids = tcp->nchildren > 0;
1851 if (entering(tcp) && got_kids) {
1852 /* There are children that this parent should block for.
1853 But ptrace made us the parent of the traced children
1854 and the real parent will get ECHILD from the wait call.
1856 XXX If we attached with strace -f -p PID, then there
1857 may be untraced dead children the parent could be reaping
1858 now, but we make him block. */
1860 /* ??? WTA: fix bug with hanging children */
1862 if (!(tcp->u_arg[2] & WNOHANG)) {
1864 * There are traced children. We'll make the parent
1865 * block to avoid a false ECHILD error due to our
1866 * ptrace having stolen the children. However,
1867 * we shouldn't block if there are zombies to reap.
1868 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1870 struct tcb *child = NULL;
1871 if (tcp->nzombies > 0 &&
1872 (tcp->u_arg[0] == -1 ||
1873 (child = pid2tcb(tcp->u_arg[0])) == NULL))
1875 if (tcp->u_arg[0] > 0) {
1877 * If the parent waits for a specified child
1878 * PID, then it must get ECHILD right away
1879 * if that PID is not one of its children.
1880 * Make sure that the requested PID matches
1881 * one of the parent's children that we are
1882 * tracing, and don't suspend it otherwise.
1885 child = pid2tcb(tcp->u_arg[0]);
1886 if (child == NULL || child->parent != (
1887 #ifdef TCB_CLONE_THREAD
1888 (tcp->flags & TCB_CLONE_THREAD)
1894 tcp->flags |= TCB_SUSPENDED;
1895 tcp->waitpid = tcp->u_arg[0];
1896 #ifdef TCB_CLONE_THREAD
1897 if (tcp->flags & TCB_CLONE_THREAD)
1898 tcp->parent->nclone_waiting++;
1902 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
1903 if (tcp->u_arg[2] & WNOHANG) {
1904 /* We must force a fake result of 0 instead of
1905 the ECHILD error. */
1906 extern int force_result();
1907 return force_result(tcp, 0, 0);
1910 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
1911 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
1913 * We just reaped a child we don't know about,
1914 * presumably a zombie we already droptcb'd.
1928 /* The library wrapper stuffs this into the user variable. */
1930 printstatus(getrval2(tcp));
1945 if (!syserror(tcp)) {
1946 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1947 tprintf("%#lx", tcp->u_arg[0]);
1949 printstatus(status);
1960 return printwaitn(tcp, 3, 0);
1967 return printwaitn(tcp, 4, 0);
1975 return printwaitn(tcp, 4, 1);
1981 static struct xlat waitid_types[] = {
1983 { P_PPID, "P_PPID" },
1984 { P_PGID, "P_PGID" },
1991 { P_LWPID, "P_LWPID" },
2003 if (entering(tcp)) {
2004 printxval(waitid_types, tcp->u_arg[0], "P_???");
2005 tprintf(", %ld, ", tcp->u_arg[1]);
2006 if (tcp->nchildren > 0) {
2007 /* There are traced children */
2008 tcp->flags |= TCB_SUSPENDED;
2009 tcp->waitpid = tcp->u_arg[0];
2017 else if (syserror(tcp))
2018 tprintf("%#lx", tcp->u_arg[2]);
2019 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2022 printsiginfo(&si, verbose (tcp));
2025 if (!printflags(wait4_options, tcp->u_arg[3]))
2038 tprintf("%lu", tcp->u_arg[0]);
2046 struct utsname uname;
2049 if (syserror(tcp) || !verbose(tcp))
2050 tprintf("%#lx", tcp->u_arg[0]);
2051 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2053 else if (!abbrev(tcp)) {
2055 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2056 uname.sysname, uname.nodename);
2057 tprintf("release=\"%s\", version=\"%s\", ",
2058 uname.release, uname.version);
2059 tprintf("machine=\"%s\"", uname.machine);
2062 tprintf(", domainname=\"%s\"", uname.domainname);
2063 #endif /* __GLIBC__ */
2068 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2069 uname.sysname, uname.nodename);
2076 static struct xlat ptrace_cmds[] = {
2078 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2079 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2080 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2081 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2082 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2083 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2084 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2085 { PTRACE_CONT, "PTRACE_CONT" },
2086 { PTRACE_KILL, "PTRACE_KILL" },
2087 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2088 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2089 { PTRACE_DETACH, "PTRACE_DETACH" },
2090 #ifdef PTRACE_GETREGS
2091 { PTRACE_GETREGS, "PTRACE_GETREGS" },
2093 #ifdef PTRACE_SETREGS
2094 { PTRACE_SETREGS, "PTRACE_SETREGS" },
2096 #ifdef PTRACE_GETFPREGS
2097 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
2099 #ifdef PTRACE_SETFPREGS
2100 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
2102 #ifdef PTRACE_GETFPXREGS
2103 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2105 #ifdef PTRACE_SETFPXREGS
2106 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2109 { PTRACE_READDATA, "PTRACE_READDATA" },
2110 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2111 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2112 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2113 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2114 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2116 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2117 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2119 { PTRACE_22, "PTRACE_PTRACE_22" },
2120 { PTRACE_23, "PTRACE_PTRACE_23" },
2123 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2125 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2127 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2128 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2129 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2131 { PTRACE_26, "PTRACE_26" },
2132 { PTRACE_27, "PTRACE_27" },
2133 { PTRACE_28, "PTRACE_28" },
2135 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2138 { PT_TRACE_ME, "PT_TRACE_ME" },
2139 { PT_READ_I, "PT_READ_I" },
2140 { PT_READ_D, "PT_READ_D" },
2141 { PT_WRITE_I, "PT_WRITE_I" },
2142 { PT_WRITE_D, "PT_WRITE_D" },
2144 { PT_READ_U, "PT_READ_U" },
2146 { PT_CONTINUE, "PT_CONTINUE" },
2147 { PT_KILL, "PT_KILL" },
2148 { PT_STEP, "PT_STEP" },
2149 { PT_ATTACH, "PT_ATTACH" },
2150 { PT_DETACH, "PT_DETACH" },
2151 { PT_GETREGS, "PT_GETREGS" },
2152 { PT_SETREGS, "PT_SETREGS" },
2153 { PT_GETFPREGS, "PT_GETFPREGS" },
2154 { PT_SETFPREGS, "PT_SETFPREGS" },
2155 { PT_GETDBREGS, "PT_GETDBREGS" },
2156 { PT_SETDBREGS, "PT_SETDBREGS" },
2157 #endif /* FREEBSD */
2162 #ifndef SUNOS4_KERNEL_ARCH_KLUDGE
2164 #endif /* !SUNOS4_KERNEL_ARCH_KLUDGE */
2165 struct xlat struct_user_offsets[] = {
2167 #if defined(S390) || defined(S390X)
2168 { PT_PSWMASK, "psw_mask" },
2169 { PT_PSWADDR, "psw_addr" },
2170 { PT_GPR0, "gpr0" },
2171 { PT_GPR1, "gpr1" },
2172 { PT_GPR2, "gpr2" },
2173 { PT_GPR3, "gpr3" },
2174 { PT_GPR4, "gpr4" },
2175 { PT_GPR5, "gpr5" },
2176 { PT_GPR6, "gpr6" },
2177 { PT_GPR7, "gpr7" },
2178 { PT_GPR8, "gpr8" },
2179 { PT_GPR9, "gpr9" },
2180 { PT_GPR10, "gpr10" },
2181 { PT_GPR11, "gpr11" },
2182 { PT_GPR12, "gpr12" },
2183 { PT_GPR13, "gpr13" },
2184 { PT_GPR14, "gpr14" },
2185 { PT_GPR15, "gpr15" },
2186 { PT_ACR0, "acr0" },
2187 { PT_ACR1, "acr1" },
2188 { PT_ACR2, "acr2" },
2189 { PT_ACR3, "acr3" },
2190 { PT_ACR4, "acr4" },
2191 { PT_ACR5, "acr5" },
2192 { PT_ACR6, "acr6" },
2193 { PT_ACR7, "acr7" },
2194 { PT_ACR8, "acr8" },
2195 { PT_ACR9, "acr9" },
2196 { PT_ACR10, "acr10" },
2197 { PT_ACR11, "acr11" },
2198 { PT_ACR12, "acr12" },
2199 { PT_ACR13, "acr13" },
2200 { PT_ACR14, "acr14" },
2201 { PT_ACR15, "acr15" },
2202 { PT_ORIGGPR2, "orig_gpr2" },
2205 { PT_FPR0_HI, "fpr0.hi" },
2206 { PT_FPR0_LO, "fpr0.lo" },
2207 { PT_FPR1_HI, "fpr1.hi" },
2208 { PT_FPR1_LO, "fpr1.lo" },
2209 { PT_FPR2_HI, "fpr2.hi" },
2210 { PT_FPR2_LO, "fpr2.lo" },
2211 { PT_FPR3_HI, "fpr3.hi" },
2212 { PT_FPR3_LO, "fpr3.lo" },
2213 { PT_FPR4_HI, "fpr4.hi" },
2214 { PT_FPR4_LO, "fpr4.lo" },
2215 { PT_FPR5_HI, "fpr5.hi" },
2216 { PT_FPR5_LO, "fpr5.lo" },
2217 { PT_FPR6_HI, "fpr6.hi" },
2218 { PT_FPR6_LO, "fpr6.lo" },
2219 { PT_FPR7_HI, "fpr7.hi" },
2220 { PT_FPR7_LO, "fpr7.lo" },
2221 { PT_FPR8_HI, "fpr8.hi" },
2222 { PT_FPR8_LO, "fpr8.lo" },
2223 { PT_FPR9_HI, "fpr9.hi" },
2224 { PT_FPR9_LO, "fpr9.lo" },
2225 { PT_FPR10_HI, "fpr10.hi" },
2226 { PT_FPR10_LO, "fpr10.lo" },
2227 { PT_FPR11_HI, "fpr11.hi" },
2228 { PT_FPR11_LO, "fpr11.lo" },
2229 { PT_FPR12_HI, "fpr12.hi" },
2230 { PT_FPR12_LO, "fpr12.lo" },
2231 { PT_FPR13_HI, "fpr13.hi" },
2232 { PT_FPR13_LO, "fpr13.lo" },
2233 { PT_FPR14_HI, "fpr14.hi" },
2234 { PT_FPR14_LO, "fpr14.lo" },
2235 { PT_FPR15_HI, "fpr15.hi" },
2236 { PT_FPR15_LO, "fpr15.lo" },
2239 { PT_FPR0, "fpr0" },
2240 { PT_FPR1, "fpr1" },
2241 { PT_FPR2, "fpr2" },
2242 { PT_FPR3, "fpr3" },
2243 { PT_FPR4, "fpr4" },
2244 { PT_FPR5, "fpr5" },
2245 { PT_FPR6, "fpr6" },
2246 { PT_FPR7, "fpr7" },
2247 { PT_FPR8, "fpr8" },
2248 { PT_FPR9, "fpr9" },
2249 { PT_FPR10, "fpr10" },
2250 { PT_FPR11, "fpr11" },
2251 { PT_FPR12, "fpr12" },
2252 { PT_FPR13, "fpr13" },
2253 { PT_FPR14, "fpr14" },
2254 { PT_FPR15, "fpr15" },
2257 { PT_CR_10, "cr10" },
2258 { PT_CR_11, "cr11" },
2259 { PT_IEEE_IP, "ieee_exception_ip" },
2262 /* XXX No support for these offsets yet. */
2264 /* XXX No support for these offsets yet. */
2265 #elif defined(POWERPC)
2267 #define PT_ORIG_R3 34
2269 #define REGSIZE (sizeof(unsigned long))
2270 { REGSIZE*PT_R0, "r0" },
2271 { REGSIZE*PT_R1, "r1" },
2272 { REGSIZE*PT_R2, "r2" },
2273 { REGSIZE*PT_R3, "r3" },
2274 { REGSIZE*PT_R4, "r4" },
2275 { REGSIZE*PT_R5, "r5" },
2276 { REGSIZE*PT_R6, "r6" },
2277 { REGSIZE*PT_R7, "r7" },
2278 { REGSIZE*PT_R8, "r8" },
2279 { REGSIZE*PT_R9, "r9" },
2280 { REGSIZE*PT_R10, "r10" },
2281 { REGSIZE*PT_R11, "r11" },
2282 { REGSIZE*PT_R12, "r12" },
2283 { REGSIZE*PT_R13, "r13" },
2284 { REGSIZE*PT_R14, "r14" },
2285 { REGSIZE*PT_R15, "r15" },
2286 { REGSIZE*PT_R16, "r16" },
2287 { REGSIZE*PT_R17, "r17" },
2288 { REGSIZE*PT_R18, "r18" },
2289 { REGSIZE*PT_R19, "r19" },
2290 { REGSIZE*PT_R20, "r20" },
2291 { REGSIZE*PT_R21, "r21" },
2292 { REGSIZE*PT_R22, "r22" },
2293 { REGSIZE*PT_R23, "r23" },
2294 { REGSIZE*PT_R24, "r24" },
2295 { REGSIZE*PT_R25, "r25" },
2296 { REGSIZE*PT_R26, "r26" },
2297 { REGSIZE*PT_R27, "r27" },
2298 { REGSIZE*PT_R28, "r28" },
2299 { REGSIZE*PT_R29, "r29" },
2300 { REGSIZE*PT_R30, "r30" },
2301 { REGSIZE*PT_R31, "r31" },
2302 { REGSIZE*PT_NIP, "NIP" },
2303 { REGSIZE*PT_MSR, "MSR" },
2304 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2305 { REGSIZE*PT_CTR, "CTR" },
2306 { REGSIZE*PT_LNK, "LNK" },
2307 { REGSIZE*PT_XER, "XER" },
2308 { REGSIZE*PT_CCR, "CCR" },
2309 { REGSIZE*PT_FPR0, "FPR0" },
2380 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2381 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2382 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2383 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2384 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2385 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2386 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2387 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2388 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2389 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2390 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2391 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2392 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2393 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2394 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2395 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2396 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2397 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2398 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2399 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2400 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2401 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2402 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2403 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2404 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2405 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2406 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2407 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2408 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2409 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2410 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2411 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2413 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2414 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2415 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2416 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2417 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2418 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2419 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2420 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2421 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2422 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
2424 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2425 { PT_B4, "b4" }, { PT_B5, "b5" },
2426 { PT_AR_PFS, "kar.pfs" },
2427 { PT_AR_LC, "ar.lc" }, { PT_AR_UNAT, "kar.unat" },
2428 { PT_AR_RNAT, "kar.rnat" }, { PT_AR_BSPSTORE, "kar.bspstore" },
2431 { PT_CR_IPSR, "cr.ipsr" }, { PT_CR_IIP, "cr.iip" },
2432 /*{ PT_CR_IFS, "cr.ifs" },*/ { PT_AR_UNAT, "ar.unat" },
2433 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2434 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2435 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2436 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2437 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2438 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2439 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2440 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2441 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2442 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2443 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2444 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2445 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2446 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2447 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
2461 { 4*ORIG_EAX, "4*ORIG_EAX" },
2465 { 4*UESP, "4*UESP" },
2485 { 8*ORIG_RAX, "8*ORIG_EAX" },
2488 { 8*EFLAGS, "8*EFL" },
2498 { 4*PT_D1, "4*PT_D1" },
2499 { 4*PT_D2, "4*PT_D2" },
2500 { 4*PT_D3, "4*PT_D3" },
2501 { 4*PT_D4, "4*PT_D4" },
2502 { 4*PT_D5, "4*PT_D5" },
2503 { 4*PT_D6, "4*PT_D6" },
2504 { 4*PT_D7, "4*PT_D7" },
2505 { 4*PT_A0, "4*PT_A0" },
2506 { 4*PT_A1, "4*PT_A1" },
2507 { 4*PT_A2, "4*PT_A2" },
2508 { 4*PT_A3, "4*PT_A3" },
2509 { 4*PT_A4, "4*PT_A4" },
2510 { 4*PT_A5, "4*PT_A5" },
2511 { 4*PT_A6, "4*PT_A6" },
2512 { 4*PT_D0, "4*PT_D0" },
2513 { 4*PT_USP, "4*PT_USP" },
2514 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2515 { 4*PT_SR, "4*PT_SR" },
2516 { 4*PT_PC, "4*PT_PC" },
2520 { 4*REG_REG0, "4*REG_REG0" },
2521 { 4*(REG_REG0+1), "4*REG_REG1" },
2522 { 4*(REG_REG0+2), "4*REG_REG2" },
2523 { 4*(REG_REG0+3), "4*REG_REG3" },
2524 { 4*(REG_REG0+4), "4*REG_REG4" },
2525 { 4*(REG_REG0+5), "4*REG_REG5" },
2526 { 4*(REG_REG0+6), "4*REG_REG6" },
2527 { 4*(REG_REG0+7), "4*REG_REG7" },
2528 { 4*(REG_REG0+8), "4*REG_REG8" },
2529 { 4*(REG_REG0+9), "4*REG_REG9" },
2530 { 4*(REG_REG0+10), "4*REG_REG10" },
2531 { 4*(REG_REG0+11), "4*REG_REG11" },
2532 { 4*(REG_REG0+12), "4*REG_REG12" },
2533 { 4*(REG_REG0+13), "4*REG_REG13" },
2534 { 4*(REG_REG0+14), "4*REG_REG14" },
2535 { 4*REG_REG15, "4*REG_REG15" },
2536 { 4*REG_PC, "4*REG_PC" },
2537 { 4*REG_PR, "4*REG_PR" },
2538 { 4*REG_SR, "4*REG_SR" },
2539 { 4*REG_GBR, "4*REG_GBR" },
2540 { 4*REG_MACH, "4*REG_MACH" },
2541 { 4*REG_MACL, "4*REG_MACL" },
2542 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2543 { 4*REG_FPUL, "4*REG_FPUL" },
2544 { 4*REG_FPREG0, "4*REG_FPREG0" },
2545 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2546 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2547 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2548 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2549 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2550 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2551 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2552 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2553 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2554 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2555 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2556 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2557 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2558 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2559 { 4*REG_FPREG15, "4*REG_FPREG15" },
2561 { 4*REG_XDREG0, "4*REG_XDREG0" },
2562 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2563 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2564 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2565 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2566 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2567 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2568 { 4*REG_XDREG14, "4*REG_XDREG14" },
2570 { 4*REG_FPSCR, "4*REG_FPSCR" },
2577 { 16, "syscall no.(L)" },
2578 { 20, "syscall_no.(U)" },
2721 /* This entry is in case pt_regs contains dregs (depends on
2722 the kernel build options). */
2723 { uoff(regs), "offsetof(struct user, regs)" },
2724 { uoff(fpu), "offsetof(struct user, fpu)" },
2727 { uoff(regs.ARM_r0), "r0" },
2728 { uoff(regs.ARM_r1), "r1" },
2729 { uoff(regs.ARM_r2), "r2" },
2730 { uoff(regs.ARM_r3), "r3" },
2731 { uoff(regs.ARM_r4), "r4" },
2732 { uoff(regs.ARM_r5), "r5" },
2733 { uoff(regs.ARM_r6), "r6" },
2734 { uoff(regs.ARM_r7), "r7" },
2735 { uoff(regs.ARM_r8), "r8" },
2736 { uoff(regs.ARM_r9), "r9" },
2737 { uoff(regs.ARM_r10), "r10" },
2738 { uoff(regs.ARM_fp), "fp" },
2739 { uoff(regs.ARM_ip), "ip" },
2740 { uoff(regs.ARM_sp), "sp" },
2741 { uoff(regs.ARM_lr), "lr" },
2742 { uoff(regs.ARM_pc), "pc" },
2743 { uoff(regs.ARM_cpsr), "cpsr" },
2746 #if !defined(S390) && !defined(S390X) && !defined(MIPS)
2747 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
2749 #if defined(I386) || defined(X86_64)
2750 { uoff(i387), "offsetof(struct user, i387)" },
2753 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
2756 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
2757 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
2758 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
2759 { uoff(start_code), "offsetof(struct user, start_code)" },
2761 { uoff(start_data), "offsetof(struct user, start_data)" },
2763 { uoff(start_stack), "offsetof(struct user, start_stack)" },
2764 { uoff(signal), "offsetof(struct user, signal)" },
2765 #if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64)
2766 { uoff(reserved), "offsetof(struct user, reserved)" },
2768 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2769 #if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X)
2770 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
2772 { uoff(magic), "offsetof(struct user, magic)" },
2773 { uoff(u_comm), "offsetof(struct user, u_comm)" },
2774 #if defined(I386) || defined(X86_64)
2775 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
2779 #endif /* !POWERPC/!SPARC */
2782 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
2783 { uoff(u_procp), "offsetof(struct user, u_procp)" },
2784 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2785 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
2786 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
2787 { uoff(u_ap), "offsetof(struct user, u_ap)" },
2788 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
2789 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
2790 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
2791 { uoff(u_error), "offsetof(struct user, u_error)" },
2792 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
2793 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
2794 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
2795 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
2796 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
2797 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
2798 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
2799 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
2800 { uoff(u_code), "offsetof(struct user, u_code)" },
2801 { uoff(u_addr), "offsetof(struct user, u_addr)" },
2802 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
2803 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
2804 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
2805 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
2806 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
2807 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
2808 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
2809 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
2810 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
2811 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
2812 { uoff(u_ru), "offsetof(struct user, u_ru)" },
2813 { uoff(u_cru), "offsetof(struct user, u_cru)" },
2814 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
2815 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
2816 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
2817 { uoff(u_start), "offsetof(struct user, u_start)" },
2818 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
2819 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
2820 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
2821 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
2822 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
2823 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
2824 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
2825 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
2826 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
2829 { sizeof(struct user), "sizeof(struct user)" },
2842 if (entering(tcp)) {
2843 printxval(ptrace_cmds, tcp->u_arg[0],
2850 tprintf(", %lu, ", tcp->u_arg[1]);
2851 addr = tcp->u_arg[2];
2853 if (tcp->u_arg[0] == PTRACE_PEEKUSER
2854 || tcp->u_arg[0] == PTRACE_POKEUSER) {
2855 for (x = struct_user_offsets; x->str; x++) {
2860 tprintf("%#lx, ", addr);
2861 else if (x->val > addr && x != struct_user_offsets) {
2863 tprintf("%s + %ld, ", x->str, addr - x->val);
2866 tprintf("%s, ", x->str);
2870 tprintf("%#lx, ", tcp->u_arg[2]);
2872 switch (tcp->u_arg[0]) {
2873 case PTRACE_PEEKDATA:
2874 case PTRACE_PEEKTEXT:
2875 case PTRACE_PEEKUSER:
2878 case PTRACE_SINGLESTEP:
2879 case PTRACE_SYSCALL:
2881 printsignal(tcp->u_arg[3]);
2884 tprintf("%#lx", tcp->u_arg[3]);
2888 switch (tcp->u_arg[0]) {
2889 case PTRACE_PEEKDATA:
2890 case PTRACE_PEEKTEXT:
2891 case PTRACE_PEEKUSER:
2892 printnum(tcp, tcp->u_arg[3], "%#lx");
2898 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
2899 tcp->u_arg[0] == PTRACE_WRITETEXT) {
2900 tprintf("%lu, ", tcp->u_arg[3]);
2901 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2902 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
2903 tcp->u_arg[0] != PTRACE_READTEXT) {
2904 tprintf("%#lx", tcp->u_arg[3]);
2907 if (tcp->u_arg[0] == PTRACE_READDATA ||
2908 tcp->u_arg[0] == PTRACE_READTEXT) {
2909 tprintf("%lu, ", tcp->u_arg[3]);
2910 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2915 tprintf("%lu", tcp->u_arg[3]);
2917 #endif /* FREEBSD */
2924 static struct xlat futexops[] = {
2925 { FUTEX_WAIT, "FUTEX_WAIT" },
2926 { FUTEX_WAKE, "FUTEX_WAKE" },
2927 { FUTEX_FD, "FUTEX_FD" },
2928 { FUTEX_REQUEUE,"FUTEX_REQUEUE" },
2936 if (entering(tcp)) {
2937 tprintf("%p, ", (void *) tcp->u_arg[0]);
2938 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
2939 tprintf(", %ld", tcp->u_arg[2]);
2940 if (tcp->u_arg[1] == FUTEX_WAIT) {
2942 printtv(tcp, tcp->u_arg[3]);
2943 } else if (tcp->u_arg[1] == FUTEX_REQUEUE)
2944 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
2950 print_affinitylist(list, len)
2951 unsigned long *list;
2956 while (len >= sizeof (unsigned long)) {
2957 tprintf("%s %lx", first ? "" : ",", *list++);
2959 len -= sizeof (unsigned long);
2965 sys_sched_setaffinity(tcp)
2968 if (entering(tcp)) {
2969 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
2970 print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_arg[1]);
2976 sys_sched_getaffinity(tcp)
2979 if (entering(tcp)) {
2980 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
2982 print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_rval);