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>
60 #if defined (SPARC) || defined (SPARC64)
61 # define fpq kernel_fpq
63 # define fpu kernel_fpu
64 #endif /* SPARC || SPARC64 */
66 #if defined (SPARC) || defined (SPARC64)
70 #endif /* SPARC || SPARC64 */
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 # ifdef HAVE_STRUCT_IA64_FPREG
86 # define ia64_fpreg XXX_ia64_fpreg
88 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
89 # define pt_all_user_regs XXX_pt_all_user_regs
91 #include <linux/ptrace.h>
93 # undef pt_all_user_regs
96 #if defined (LINUX) && defined (SPARC64)
98 # undef PTRACE_GETREGS
99 # define PTRACE_GETREGS PTRACE_GETREGS64
100 # undef PTRACE_SETREGS
101 # define PTRACE_SETREGS PTRACE_SETREGS64
102 #endif /* LINUX && SPARC64 */
104 #ifdef HAVE_LINUX_FUTEX_H
105 #include <linux/futex.h>
109 # define FUTEX_WAIT 0
112 # define FUTEX_WAKE 1
117 # ifndef FUTEX_REQUEUE
118 # define FUTEX_REQUEUE 3
124 #include <asm/posix_types.h>
126 #define GETGROUPS_T __kernel_gid_t
128 #define GETGROUPS32_T __kernel_gid32_t
131 #if defined(LINUX) && defined(IA64)
132 # include <asm/ptrace_offsets.h>
133 # include <asm/rse.h>
137 #include <sys/prctl.h>
141 #define WCOREDUMP(status) ((status) & 0200)
144 /* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
145 #if defined(HAVE_PRCTL)
146 static const struct xlat prctl_options[] = {
148 { PR_MAXPROCS, "PR_MAXPROCS" },
151 { PR_ISBLOCKED, "PR_ISBLOCKED" },
153 #ifdef PR_SETSTACKSIZE
154 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
156 #ifdef PR_GETSTACKSIZE
157 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
160 { PR_MAXPPROCS, "PR_MAXPPROCS" },
162 #ifdef PR_UNBLKONEXEC
163 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
166 { PR_ATOMICSIM, "PR_ATOMICSIM" },
169 { PR_SETEXITSIG, "PR_SETEXITSIG" },
172 { PR_RESIDENT, "PR_RESIDENT" },
175 { PR_ATTACHADDR, "PR_ATTACHADDR" },
178 { PR_DETACHADDR, "PR_DETACHADDR" },
181 { PR_TERMCHILD, "PR_TERMCHILD" },
184 { PR_GETSHMASK, "PR_GETSHMASK" },
187 { PR_GETNSHARE, "PR_GETNSHARE" },
189 #if defined(PR_SET_PDEATHSIG)
190 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
193 { PR_COREPID, "PR_COREPID" },
195 #ifdef PR_ATTACHADDRPERM
196 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
198 #ifdef PR_PTHREADEXIT
199 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
201 #ifdef PR_SET_PDEATHSIG
202 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
204 #ifdef PR_GET_PDEATHSIG
205 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
207 #ifdef PR_GET_UNALIGN
208 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
210 #ifdef PR_SET_UNALIGN
211 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
213 #ifdef PR_GET_KEEPCAPS
214 { PR_GET_KEEPCAPS, "PR_GET_KEEP_CAPS" },
216 #ifdef PR_SET_KEEPCAPS
217 { PR_SET_KEEPCAPS, "PR_SET_KEEP_CAPS" },
224 unalignctl_string (unsigned int ctl)
229 #ifdef PR_UNALIGN_NOPRINT
230 case PR_UNALIGN_NOPRINT:
233 #ifdef PR_UNALIGN_SIGBUS
234 case PR_UNALIGN_SIGBUS:
240 sprintf(buf, "%x", ctl);
252 printxval(prctl_options, tcp->u_arg[0], "PR_???");
253 switch (tcp->u_arg[0]) {
258 #ifdef PR_SET_DEATHSIG
259 case PR_GET_PDEATHSIG:
262 #ifdef PR_SET_UNALIGN
264 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
267 #ifdef PR_GET_UNALIGN
269 tprintf(", %#lx", tcp->u_arg[1]);
273 for (i = 1; i < tcp->u_nargs; i++)
274 tprintf(", %#lx", tcp->u_arg[i]);
278 switch (tcp->u_arg[0]) {
279 #ifdef PR_GET_PDEATHSIG
280 case PR_GET_PDEATHSIG:
281 for (i=1; i<tcp->u_nargs; i++)
282 tprintf(", %#lx", tcp->u_arg[i]);
285 #ifdef PR_SET_UNALIGN
289 #ifdef PR_GET_UNALIGN
294 umove(tcp, tcp->u_arg[1], &ctl);
295 tcp->auxstr = unalignctl_string(ctl);
306 #endif /* HAVE_PRCTL */
322 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
323 tprintf(", %lu", tcp->u_arg[1]);
334 tprintf("%#lx", tcp->u_arg[0]);
336 printpath(tcp, tcp->u_arg[0]);
337 tprintf(", %lu", tcp->u_arg[1]);
343 sys_setdomainname(tcp)
347 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
348 tprintf(", %lu", tcp->u_arg[1]);
356 sys_getdomainname(tcp)
361 tprintf("%#lx", tcp->u_arg[0]);
363 printpath(tcp, tcp->u_arg[0]);
364 tprintf(", %lu", tcp->u_arg[1]);
375 fprintf(stderr, "_exit returned!\n");
378 /* special case: we stop tracing this process, finish line now */
379 tprintf("%ld) ", tcp->u_arg[0]);
391 tcp->flags |= TCB_EXITING;
392 #ifdef __NR_exit_group
395 if (tcp->scno == 252)
396 tcp->flags |= TCB_GROUP_EXITING;
399 if (tcp->scno == __NR_exit_group)
400 tcp->flags |= TCB_GROUP_EXITING;
406 /* TCP is creating a child we want to follow.
407 If there will be space in tcbtab for it, set TCB_FOLLOWFORK and return 0.
408 If not, clear TCB_FOLLOWFORK, print an error, and return 1. */
410 fork_tcb(struct tcb *tcp)
412 if (nprocs == tcbtabsize) {
413 if (expand_tcbtab()) {
414 tcp->flags &= ~TCB_FOLLOWFORK;
415 fprintf(stderr, "sys_fork: tcb table full\n");
419 tcp->flags |= TCB_FOLLOWFORK;
431 tcp->auxstr = "child process";
432 return RVAL_UDECIMAL | RVAL_STR;
445 tprintf ("%ld", tcp->u_arg[0]);
449 tcp->auxstr = "child process";
450 return RVAL_UDECIMAL | RVAL_STR;
462 struct tcb *tcpchild;
466 if (tcp->scno == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
477 if ((tcpchild = alloctcb(tcp->u_rval)) == NULL) {
478 fprintf(stderr, "sys_fork: tcb table full\n");
481 if (proc_open(tcpchild, 2) < 0)
487 #else /* !USE_PROCFS */
491 /* defines copied from linux/sched.h since we can't include that
492 * ourselves (it conflicts with *lots* of libc includes)
494 #define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
495 #define CLONE_VM 0x00000100 /* set if VM shared between processes */
496 #define CLONE_FS 0x00000200 /* set if fs info shared between processes */
497 #define CLONE_FILES 0x00000400 /* set if open files shared between processes */
498 #define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
499 #define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
500 #define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
501 #define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
502 #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
503 #define CLONE_THREAD 0x00010000 /* Same thread group? */
504 #define CLONE_NEWNS 0x00020000 /* New namespace group? */
505 #define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
506 #define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
507 #define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
508 #define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
509 #define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
510 #define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
511 #define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
513 static const struct xlat clone_flags[] = {
514 { CLONE_VM, "CLONE_VM" },
515 { CLONE_FS, "CLONE_FS" },
516 { CLONE_FILES, "CLONE_FILES" },
517 { CLONE_SIGHAND, "CLONE_SIGHAND" },
518 { CLONE_IDLETASK, "CLONE_IDLETASK"},
519 { CLONE_PTRACE, "CLONE_PTRACE" },
520 { CLONE_VFORK, "CLONE_VFORK" },
521 { CLONE_PARENT, "CLONE_PARENT" },
522 { CLONE_THREAD, "CLONE_THREAD" },
523 { CLONE_NEWNS, "CLONE_NEWNS" },
524 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
525 { CLONE_SETTLS, "CLONE_SETTLS" },
526 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
527 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
528 { CLONE_DETACHED, "CLONE_DETACHED" },
529 { CLONE_UNTRACED, "CLONE_UNTRACED" },
530 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
535 # include <asm/ldt.h>
536 # ifdef HAVE_STRUCT_USER_DESC
537 # define modify_ldt_ldt_s user_desc
539 extern void print_ldt_entry();
545 # define ARG_STACKSIZE (tcp->scno == SYS_clone2 ? 2 : -1)
546 # define ARG_PTID (tcp->scno == SYS_clone2 ? 3 : 2)
547 # define ARG_CTID (tcp->scno == SYS_clone2 ? 4 : 3)
548 # define ARG_TLS (tcp->scno == SYS_clone2 ? 5 : 4)
549 # elif defined S390 || defined S390X
555 # elif defined X86_64 || defined ALPHA
574 unsigned long flags = tcp->u_arg[ARG_FLAGS];
575 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
576 # ifdef ARG_STACKSIZE
577 if (ARG_STACKSIZE != -1)
578 tprintf("stack_size=%#lx, ",
579 tcp->u_arg[ARG_STACKSIZE]);
582 if (printflags(clone_flags, flags &~ CSIGNAL) == 0)
584 if ((flags & CSIGNAL) != 0)
585 tprintf("|%s", signame(flags & CSIGNAL));
586 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
587 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
589 if (flags & CLONE_PARENT_SETTID)
590 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
591 if (flags & CLONE_SETTLS) {
593 struct modify_ldt_ldt_s copy;
594 if (umove(tcp, tcp->u_arg[ARG_TLS], ©) != -1) {
595 tprintf(", {entry_number:%d, ",
600 print_ldt_entry(©);
604 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
606 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
607 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
618 return RVAL_UDECIMAL;
623 change_syscall(tcp, new)
629 /* Attempt to make vfork into fork, which we can follow. */
630 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
633 #elif defined(X86_64)
634 /* Attempt to make vfork into fork, which we can follow. */
635 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
638 #elif defined(POWERPC)
639 if (ptrace(PTRACE_POKEUSER, tcp->pid,
640 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
643 #elif defined(S390) || defined(S390X)
644 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
645 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
649 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
652 #elif defined(SPARC) || defined(SPARC64)
654 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)®s, 0)<0)
657 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)®s, 0)<0)
661 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
665 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
671 case 2: break; /* x86 SYS_fork */
672 case SYS_clone: new = 120; break;
674 fprintf(stderr, "%s: unexpected syscall %d\n",
678 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
680 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
684 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
688 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
692 /* Top half of reg encodes the no. of args n as 0x1n.
693 Assume 0 args as kernel never actually checks... */
694 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
699 #warning Do not know how to handle change_syscall for this architecture
700 #endif /* architecture */
712 unsigned long *bsp, *ap;
714 if (upeek(tcp->pid, PT_AR_BSP, (long *) &bsp) , 0)
717 ap = ia64_rse_skip_regs(bsp, argnum);
719 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
726 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
730 #elif defined(X86_64)
732 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
736 #elif defined(POWERPC)
738 #define PT_ORIG_R3 34
741 ptrace(PTRACE_POKEUSER, tcp->pid,
742 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
751 ptrace(PTRACE_POKEUSER, tcp->pid,
752 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
756 if (upeek(tcp->pid, REG_SP, (long *) &sp) , 0)
759 ptrace(PTRACE_POKEDATA, tcp->pid,
760 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
765 #elif defined(S390) || defined(S390X)
768 ptrace(PTRACE_POKEUSER, tcp->pid,
769 (char *) (argnum==0 ? PT_ORIGGPR2 :
770 PT_GPR2 + argnum*sizeof(long)),
778 # warning Sorry, setargs not implemented for this architecture.
783 #if defined SYS_clone || defined SYS_clone2
788 struct tcb *tcpchild;
798 int bpt = tcp->flags & TCB_BPTSET;
800 if (!(tcp->flags & TCB_FOLLOWFORK))
811 #ifdef CLONE_PTRACE /* See new setbpt code. */
812 tcpchild = pid2tcb(pid);
813 if (tcpchild != NULL) {
814 /* The child already reported its startup trap
815 before the parent reported its syscall return. */
817 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
818 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
820 [preattached child %d of %d in weird state!]\n",
825 if ((tcpchild = alloctcb(pid)) == NULL) {
828 fprintf(stderr, " [tcb table full]\n");
829 kill(pid, SIGKILL); /* XXX */
834 /* Attach to the new child */
835 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
838 perror("PTRACE_ATTACH");
839 fprintf(stderr, "Too late?\n");
848 tcpchild->flags |= TCB_ATTACHED;
849 /* Child has BPT too, must be removed on first occasion. */
851 tcpchild->flags |= TCB_BPTSET;
852 tcpchild->baddr = tcp->baddr;
853 memcpy(tcpchild->inst, tcp->inst,
854 sizeof tcpchild->inst);
856 tcpchild->parent = tcp;
858 if (tcpchild->flags & TCB_SUSPENDED) {
859 /* The child was born suspended, due to our having
860 forced CLONE_PTRACE. */
864 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
865 if (ptrace(PTRACE_SYSCALL, pid, (char *) 1, 0) < 0) {
866 perror("resume: ptrace(PTRACE_SYSCALL, ...)");
872 Process %u resumed (parent %d ready)\n",
878 fprintf(stderr, "Process %d attached\n", pid);
881 #ifdef TCB_CLONE_THREAD
884 * Save the flags used in this call,
885 * in case we point TCP to our parent below.
887 int call_flags = tcp->u_arg[ARG_FLAGS];
888 if ((tcp->flags & TCB_CLONE_THREAD) &&
889 tcp->parent != NULL) {
890 /* The parent in this clone is itself a
891 thread belonging to another process.
892 There is no meaning to the parentage
893 relationship of the new child with the
894 thread, only with the process. We
895 associate the new thread with our
896 parent. Since this is done for every
897 new thread, there will never be a
898 TCB_CLONE_THREAD process that has
902 tcpchild->parent = tcp;
905 if (call_flags & CLONE_THREAD) {
906 tcpchild->flags |= TCB_CLONE_THREAD;
907 ++tcp->nclone_threads;
909 if (call_flags & CLONE_DETACHED) {
910 tcpchild->flags |= TCB_CLONE_DETACHED;
911 ++tcp->nclone_detached;
926 /* We do special magic with clone for any clone or fork. */
927 return internal_clone(tcp);
930 struct tcb *tcpchild;
935 if (tcp->scno == SYS_vfork) {
936 /* Attempt to make vfork into fork, which we can follow. */
938 change_syscall(tcp, SYS_fork) < 0)
943 if (!followfork || dont_follow)
951 int bpt = tcp->flags & TCB_BPTSET;
953 if (!(tcp->flags & TCB_FOLLOWFORK))
962 if ((tcpchild = alloctcb(pid)) == NULL) {
963 fprintf(stderr, " [tcb table full]\n");
964 kill(pid, SIGKILL); /* XXX */
969 /* The child must have run before it can be attached. */
970 /* This must be a bug in the parisc kernel, but I havn't
971 * identified it yet. Seems to be an issue associated
972 * with attaching to a process (which sends it a signal)
973 * before that process has ever been scheduled. When
974 * debugging, I started seeing crashes in
975 * arch/parisc/kernel/signal.c:do_signal(), apparently
976 * caused by r8 getting corrupt over the dequeue_signal()
977 * call. Didn't make much sense though...
983 select(0, NULL, NULL, NULL, &tv);
986 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
987 perror("PTRACE_ATTACH");
988 fprintf(stderr, "Too late?\n");
995 /* The child must have run before it can be attached. */
1000 select(0, NULL, NULL, NULL, &tv);
1002 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1003 perror("PTRACE_ATTACH");
1004 fprintf(stderr, "Too late?\n");
1009 /* Try to catch the new process as soon as possible. */
1012 for (i = 0; i < 1024; i++)
1013 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1016 perror("PTRACE_ATTACH");
1017 fprintf(stderr, "Too late?\n");
1022 #endif /* !oldway */
1024 tcpchild->flags |= TCB_ATTACHED;
1025 /* Child has BPT too, must be removed on first occasion */
1027 tcpchild->flags |= TCB_BPTSET;
1028 tcpchild->baddr = tcp->baddr;
1029 memcpy(tcpchild->inst, tcp->inst,
1030 sizeof tcpchild->inst);
1033 tcpchild->parent = tcp;
1036 fprintf(stderr, "Process %d attached\n", pid);
1042 #endif /* !USE_PROCFS */
1044 #if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
1051 return RVAL_UDECIMAL;
1055 #endif /* SUNOS4 || LINUX || FREEBSD */
1059 static char idstr[16];
1066 sprintf(idstr, "ppid %lu", getrval2(tcp));
1067 tcp->auxstr = idstr;
1078 sprintf(idstr, "euid %lu", getrval2(tcp));
1079 tcp->auxstr = idstr;
1090 sprintf(idstr, "egid %lu", getrval2(tcp));
1091 tcp->auxstr = idstr;
1105 if (entering(tcp)) {
1106 tprintf("%u", (uid_t) tcp->u_arg[0]);
1115 if (entering(tcp)) {
1116 tprintf("%u", (gid_t) tcp->u_arg[0]);
1128 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1129 tcp->u_arg[1], tcp->u_arg[2]);
1131 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1132 tprintf("%#lx, ", tcp->u_arg[0]);
1134 tprintf("[%lu], ", (unsigned long) uid);
1135 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1136 tprintf("%#lx, ", tcp->u_arg[1]);
1138 tprintf("[%lu], ", (unsigned long) uid);
1139 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1140 tprintf("%#lx", tcp->u_arg[2]);
1142 tprintf("[%lu]", (unsigned long) uid);
1155 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1156 tcp->u_arg[1], tcp->u_arg[2]);
1158 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1159 tprintf("%#lx, ", tcp->u_arg[0]);
1161 tprintf("[%lu], ", (unsigned long) gid);
1162 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1163 tprintf("%#lx, ", tcp->u_arg[1]);
1165 tprintf("[%lu], ", (unsigned long) gid);
1166 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1167 tprintf("%#lx", tcp->u_arg[2]);
1169 tprintf("[%lu]", (unsigned long) gid);
1181 if (entering(tcp)) {
1182 printuid("", tcp->u_arg[0]);
1183 printuid(", ", tcp->u_arg[1]);
1192 if (entering(tcp)) {
1193 printuid("", tcp->u_arg[0]);
1194 printuid(", ", tcp->u_arg[1]);
1199 #if defined(LINUX) || defined(FREEBSD)
1204 if (entering(tcp)) {
1205 printuid("", tcp->u_arg[0]);
1206 printuid(", ", tcp->u_arg[1]);
1207 printuid(", ", tcp->u_arg[2]);
1215 if (entering(tcp)) {
1216 printuid("", tcp->u_arg[0]);
1217 printuid(", ", tcp->u_arg[1]);
1218 printuid(", ", tcp->u_arg[2]);
1223 #endif /* LINUX || FREEBSD */
1230 GETGROUPS_T *gidset;
1232 if (entering(tcp)) {
1233 len = tcp->u_arg[0];
1234 tprintf("%u, ", len);
1239 gidset = (GETGROUPS_T *) malloc(len * sizeof(GETGROUPS_T));
1240 if (gidset == NULL) {
1241 fprintf(stderr, "sys_setgroups: out of memory\n");
1245 tprintf("%#lx", tcp->u_arg[1]);
1246 else if (umoven(tcp, tcp->u_arg[1],
1247 len * sizeof(GETGROUPS_T), (char *) gidset) < 0)
1251 for (i = 0; i < len; i++)
1252 tprintf("%s%lu", i ? ", " : "",
1253 (unsigned long) gidset[i]);
1256 free((char *) gidset);
1266 GETGROUPS_T *gidset;
1268 if (entering(tcp)) {
1269 len = tcp->u_arg[0];
1270 tprintf("%u, ", len);
1277 gidset = (GETGROUPS_T *) malloc(len * sizeof(GETGROUPS_T));
1278 if (gidset == NULL) {
1279 fprintf(stderr, "sys_getgroups: out of memory\n");
1284 else if (!verbose(tcp) || tcp->u_arg[0] == 0)
1285 tprintf("%#lx", tcp->u_arg[1]);
1286 else if (umoven(tcp, tcp->u_arg[1],
1287 len * sizeof(GETGROUPS_T), (char *) gidset) < 0)
1291 for (i = 0; i < len; i++)
1292 tprintf("%s%lu", i ? ", " : "",
1293 (unsigned long) gidset[i]);
1296 free((char *)gidset);
1303 sys_setgroups32(tcp)
1307 GETGROUPS32_T *gidset;
1309 if (entering(tcp)) {
1310 len = tcp->u_arg[0];
1311 tprintf("%u, ", len);
1316 gidset = (GETGROUPS32_T *) malloc(len * sizeof(GETGROUPS32_T));
1317 if (gidset == NULL) {
1318 fprintf(stderr, "sys_setgroups32: out of memory\n");
1322 tprintf("%#lx", tcp->u_arg[1]);
1323 else if (umoven(tcp, tcp->u_arg[1],
1324 len * sizeof(GETGROUPS32_T), (char *) gidset) < 0)
1328 for (i = 0; i < len; i++)
1329 tprintf("%s%lu", i ? ", " : "",
1330 (unsigned long) gidset[i]);
1333 free((char *) gidset);
1339 sys_getgroups32(tcp)
1343 GETGROUPS32_T *gidset;
1345 if (entering(tcp)) {
1346 len = tcp->u_arg[0];
1347 tprintf("%u, ", len);
1354 gidset = (GETGROUPS32_T *) malloc(len * sizeof(GETGROUPS32_T));
1355 if (gidset == NULL) {
1356 fprintf(stderr, "sys_getgroups32: out of memory\n");
1361 else if (!verbose(tcp) || tcp->u_arg[0] == 0)
1362 tprintf("%#lx", tcp->u_arg[1]);
1363 else if (umoven(tcp, tcp->u_arg[1],
1364 len * sizeof(GETGROUPS32_T), (char *) gidset) < 0)
1368 for (i = 0; i < len; i++)
1369 tprintf("%s%lu", i ? ", " : "",
1370 (unsigned long) gidset[i]);
1373 free((char *)gidset);
1383 if (entering(tcp)) {
1385 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1395 if (entering(tcp)) {
1397 tprintf("%lu", tcp->u_arg[0]);
1407 if (entering(tcp)) {
1408 tprintf("%lu", tcp->u_arg[0]);
1424 if (entering(tcp)) {
1425 tprintf("%lu", tcp->u_arg[0]);
1434 if (entering(tcp)) {
1435 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1442 #include <sys/privilege.h>
1445 static const struct xlat procpriv_cmds [] = {
1446 { SETPRV, "SETPRV" },
1447 { CLRPRV, "CLRPRV" },
1448 { PUTPRV, "PUTPRV" },
1449 { GETPRV, "GETPRV" },
1450 { CNTPRV, "CNTPRV" },
1455 static const struct xlat procpriv_priv [] = {
1456 { P_OWNER, "P_OWNER" },
1457 { P_AUDIT, "P_AUDIT" },
1458 { P_COMPAT, "P_COMPAT" },
1459 { P_DACREAD, "P_DACREAD" },
1460 { P_DACWRITE, "P_DACWRITE" },
1462 { P_FILESYS, "P_FILESYS" },
1463 { P_MACREAD, "P_MACREAD" },
1464 { P_MACWRITE, "P_MACWRITE" },
1465 { P_MOUNT, "P_MOUNT" },
1466 { P_MULTIDIR, "P_MULTIDIR" },
1467 { P_SETPLEVEL, "P_SETPLEVEL" },
1468 { P_SETSPRIV, "P_SETSPRIV" },
1469 { P_SETUID, "P_SETUID" },
1470 { P_SYSOPS, "P_SYSOPS" },
1471 { P_SETUPRIV, "P_SETUPRIV" },
1472 { P_DRIVER, "P_DRIVER" },
1473 { P_RTIME, "P_RTIME" },
1474 { P_MACUPGRADE, "P_MACUPGRADE" },
1475 { P_FSYSRANGE, "P_FSYSRANGE" },
1476 { P_SETFLEVEL, "P_SETFLEVEL" },
1477 { P_AUDITWR, "P_AUDITWR" },
1478 { P_TSHAR, "P_TSHAR" },
1479 { P_PLOCK, "P_PLOCK" },
1480 { P_CORE, "P_CORE" },
1481 { P_LOADMOD, "P_LOADMOD" },
1482 { P_BIND, "P_BIND" },
1483 { P_ALLPRIVS, "P_ALLPRIVS" },
1488 static const struct xlat procpriv_type [] = {
1489 { PS_FIX, "PS_FIX" },
1490 { PS_INH, "PS_INH" },
1491 { PS_MAX, "PS_MAX" },
1492 { PS_WKG, "PS_WKG" },
1498 printpriv(tcp, addr, len, opt)
1502 const struct xlat *opt;
1505 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1506 int dots = len > max;
1509 if (len > max) len = max;
1512 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1514 tprintf ("%#lx", addr);
1520 for (i = 0; i < len; ++i) {
1523 if (i) tprintf (", ");
1525 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1526 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1528 tprintf ("%s|%s", t, p);
1531 tprintf ("%#lx", buf [i]);
1535 if (dots) tprintf (" ...");
1545 if (entering(tcp)) {
1546 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1547 switch (tcp->u_arg[0]) {
1549 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1557 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1558 tprintf (", %ld", tcp->u_arg[2]);
1561 else if (tcp->u_arg[0] == GETPRV) {
1562 if (syserror (tcp)) {
1563 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1567 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1568 tprintf (", %ld", tcp->u_arg[2]);
1579 printargv(tcp, addr)
1585 int max = max_strlen / 2;
1587 for (sep = ""; --max >= 0; sep = ", ") {
1590 if (umove(tcp, addr, &cp) < 0) {
1591 tprintf("%#lx", addr);
1597 printstr(tcp, (long) cp, -1);
1598 addr += sizeof(char *);
1605 printargc(fmt, tcp, addr)
1613 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1614 addr += sizeof(char *);
1616 tprintf(fmt, count, count == 1 ? "" : "s");
1623 if (entering(tcp)) {
1624 printpath(tcp, tcp->u_arg[0]);
1626 tprintf(", %#lx", tcp->u_arg[1]);
1628 else if (abbrev(tcp))
1629 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1633 printargv(tcp, tcp->u_arg[1]);
1644 if (entering(tcp)) {
1645 printpath(tcp, tcp->u_arg[0]);
1647 tprintf(", %#lx", tcp->u_arg[1]);
1649 else if (abbrev(tcp))
1650 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1654 printargv(tcp, tcp->u_arg[1]);
1658 tprintf(", %#lx", tcp->u_arg[2]);
1659 else if (abbrev(tcp))
1660 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1663 printargv(tcp, tcp->u_arg[2]);
1672 int sys_rexecve(tcp)
1675 if (entering (tcp)) {
1677 tprintf (", %ld", tcp->u_arg[3]);
1689 if (exiting(tcp) && !syserror(tcp) && followfork)
1692 #if defined LINUX && defined TCB_WAITEXECVE
1693 if (exiting(tcp) && syserror(tcp))
1694 tcp->flags &= ~TCB_WAITEXECVE;
1696 tcp->flags |= TCB_WAITEXECVE;
1697 #endif /* LINUX && TCB_WAITEXECVE */
1703 #define __WNOTHREAD 0x20000000
1706 #define __WALL 0x40000000
1709 #define __WCLONE 0x80000000
1713 static const struct xlat wait4_options[] = {
1714 { WNOHANG, "WNOHANG" },
1716 { WUNTRACED, "WUNTRACED" },
1719 { WEXITED, "WEXITED" },
1722 { WTRAPPED, "WTRAPPED" },
1725 { WSTOPPED, "WSTOPPED" },
1728 { WCONTINUED, "WCONTINUED" },
1731 { WNOWAIT, "WNOWAIT" },
1734 { __WCLONE, "__WCLONE" },
1737 { __WALL, "__WALL" },
1740 { __WNOTHREAD, "__WNOTHREAD" },
1745 #if !defined WCOREFLAG && defined WCOREFLG
1746 # define WCOREFLAG WCOREFLG
1749 #define WCOREFLAG 0x80
1753 #define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1756 #define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1766 * Here is a tricky presentation problem. This solution
1767 * is still not entirely satisfactory but since there
1768 * are no wait status constructors it will have to do.
1770 if (WIFSTOPPED(status)) {
1771 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
1772 signame(WSTOPSIG(status)));
1773 status &= ~W_STOPCODE(WSTOPSIG(status));
1775 else if (WIFSIGNALED(status)) {
1776 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
1777 signame(WTERMSIG(status)),
1778 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
1779 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1781 else if (WIFEXITED(status)) {
1782 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
1783 WEXITSTATUS(status));
1785 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
1788 tprintf("[%#x]", status);
1795 tprintf(" | %#x]", status);
1801 printwaitn(tcp, n, bitness)
1809 if (entering(tcp)) {
1810 tprintf("%ld, ", tcp->u_arg[0]);
1815 else if (syserror(tcp) || tcp->u_rval == 0)
1816 tprintf("%#lx", tcp->u_arg[1]);
1817 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1820 exited = printstatus(status);
1823 if (!printflags(wait4_options, tcp->u_arg[2]))
1831 else if (tcp->u_rval > 0) {
1834 printrusage32(tcp, tcp->u_arg[3]);
1837 printrusage(tcp, tcp->u_arg[3]);
1841 else if (tcp->u_rval > 0 && exited)
1842 printrusage(tcp, tcp->u_arg[3]);
1845 tprintf("%#lx", tcp->u_arg[3]);
1852 internal_wait(tcp, flagarg)
1858 #ifdef TCB_CLONE_THREAD
1859 if (tcp->flags & TCB_CLONE_THREAD)
1860 /* The children we wait for are our parent's children. */
1861 got_kids = (tcp->parent->nchildren
1862 > tcp->parent->nclone_detached);
1864 got_kids = (tcp->nchildren > tcp->nclone_detached);
1866 got_kids = tcp->nchildren > 0;
1869 if (entering(tcp) && got_kids) {
1870 /* There are children that this parent should block for.
1871 But ptrace made us the parent of the traced children
1872 and the real parent will get ECHILD from the wait call.
1874 XXX If we attached with strace -f -p PID, then there
1875 may be untraced dead children the parent could be reaping
1876 now, but we make him block. */
1878 /* ??? WTA: fix bug with hanging children */
1880 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
1882 * There are traced children. We'll make the parent
1883 * block to avoid a false ECHILD error due to our
1884 * ptrace having stolen the children. However,
1885 * we shouldn't block if there are zombies to reap.
1886 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1888 struct tcb *child = NULL;
1889 if (tcp->nzombies > 0 &&
1890 (tcp->u_arg[0] == -1 ||
1891 (child = pid2tcb(tcp->u_arg[0])) == NULL))
1893 if (tcp->u_arg[0] > 0) {
1895 * If the parent waits for a specified child
1896 * PID, then it must get ECHILD right away
1897 * if that PID is not one of its children.
1898 * Make sure that the requested PID matches
1899 * one of the parent's children that we are
1900 * tracing, and don't suspend it otherwise.
1903 child = pid2tcb(tcp->u_arg[0]);
1904 if (child == NULL || child->parent != (
1905 #ifdef TCB_CLONE_THREAD
1906 (tcp->flags & TCB_CLONE_THREAD)
1912 tcp->flags |= TCB_SUSPENDED;
1913 tcp->waitpid = tcp->u_arg[0];
1914 #ifdef TCB_CLONE_THREAD
1915 if (tcp->flags & TCB_CLONE_THREAD)
1916 tcp->parent->nclone_waiting++;
1920 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
1921 if (tcp->u_arg[flagarg] & WNOHANG) {
1922 /* We must force a fake result of 0 instead of
1923 the ECHILD error. */
1924 extern int force_result();
1925 return force_result(tcp, 0, 0);
1928 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
1929 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
1931 * We just reaped a child we don't know about,
1932 * presumably a zombie we already droptcb'd.
1946 /* The library wrapper stuffs this into the user variable. */
1948 printstatus(getrval2(tcp));
1963 if (!syserror(tcp)) {
1964 if (umove(tcp, tcp->u_arg[0], &status) < 0)
1965 tprintf("%#lx", tcp->u_arg[0]);
1967 printstatus(status);
1978 return printwaitn(tcp, 3, 0);
1985 return printwaitn(tcp, 4, 0);
1993 return printwaitn(tcp, 4, 1);
1997 #if defined SVR4 || defined LINUX
1999 static const struct xlat waitid_types[] = {
2002 { P_PPID, "P_PPID" },
2004 { P_PGID, "P_PGID" },
2019 { P_LWPID, "P_LWPID" },
2031 if (entering(tcp)) {
2032 printxval(waitid_types, tcp->u_arg[0], "P_???");
2033 tprintf(", %ld, ", tcp->u_arg[1]);
2040 else if (syserror(tcp))
2041 tprintf("%#lx", tcp->u_arg[2]);
2042 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2045 printsiginfo(&si, verbose (tcp));
2048 if (!printflags(wait4_options, tcp->u_arg[3]))
2050 if (tcp->u_nargs > 4) {
2055 else if (tcp->u_error)
2056 tprintf("%#lx", tcp->u_arg[4]);
2058 printrusage(tcp, tcp->u_arg[4]);
2064 #endif /* SVR4 or LINUX */
2071 tprintf("%lu", tcp->u_arg[0]);
2079 struct utsname uname;
2082 if (syserror(tcp) || !verbose(tcp))
2083 tprintf("%#lx", tcp->u_arg[0]);
2084 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2086 else if (!abbrev(tcp)) {
2088 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2089 uname.sysname, uname.nodename);
2090 tprintf("release=\"%s\", version=\"%s\", ",
2091 uname.release, uname.version);
2092 tprintf("machine=\"%s\"", uname.machine);
2095 tprintf(", domainname=\"%s\"", uname.domainname);
2096 #endif /* __GLIBC__ */
2101 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2102 uname.sysname, uname.nodename);
2109 static const struct xlat ptrace_cmds[] = {
2111 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2112 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2113 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2114 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2115 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2116 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2117 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2118 { PTRACE_CONT, "PTRACE_CONT" },
2119 { PTRACE_KILL, "PTRACE_KILL" },
2120 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2121 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2122 { PTRACE_DETACH, "PTRACE_DETACH" },
2123 #ifdef PTRACE_GETREGS
2124 { PTRACE_GETREGS, "PTRACE_GETREGS" },
2126 #ifdef PTRACE_SETREGS
2127 { PTRACE_SETREGS, "PTRACE_SETREGS" },
2129 #ifdef PTRACE_GETFPREGS
2130 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
2132 #ifdef PTRACE_SETFPREGS
2133 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
2135 #ifdef PTRACE_GETFPXREGS
2136 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2138 #ifdef PTRACE_SETFPXREGS
2139 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2142 { PTRACE_READDATA, "PTRACE_READDATA" },
2143 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2144 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2145 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2146 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2147 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2149 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2150 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2152 { PTRACE_22, "PTRACE_PTRACE_22" },
2153 { PTRACE_23, "PTRACE_PTRACE_23" },
2156 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2158 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2160 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2161 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2162 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2164 { PTRACE_26, "PTRACE_26" },
2165 { PTRACE_27, "PTRACE_27" },
2166 { PTRACE_28, "PTRACE_28" },
2168 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2171 { PT_TRACE_ME, "PT_TRACE_ME" },
2172 { PT_READ_I, "PT_READ_I" },
2173 { PT_READ_D, "PT_READ_D" },
2174 { PT_WRITE_I, "PT_WRITE_I" },
2175 { PT_WRITE_D, "PT_WRITE_D" },
2177 { PT_READ_U, "PT_READ_U" },
2179 { PT_CONTINUE, "PT_CONTINUE" },
2180 { PT_KILL, "PT_KILL" },
2181 { PT_STEP, "PT_STEP" },
2182 { PT_ATTACH, "PT_ATTACH" },
2183 { PT_DETACH, "PT_DETACH" },
2184 { PT_GETREGS, "PT_GETREGS" },
2185 { PT_SETREGS, "PT_SETREGS" },
2186 { PT_GETFPREGS, "PT_GETFPREGS" },
2187 { PT_SETFPREGS, "PT_SETFPREGS" },
2188 { PT_GETDBREGS, "PT_GETDBREGS" },
2189 { PT_SETDBREGS, "PT_SETDBREGS" },
2190 #endif /* FREEBSD */
2195 #ifndef SUNOS4_KERNEL_ARCH_KLUDGE
2197 #endif /* !SUNOS4_KERNEL_ARCH_KLUDGE */
2198 const struct xlat struct_user_offsets[] = {
2200 #if defined(S390) || defined(S390X)
2201 { PT_PSWMASK, "psw_mask" },
2202 { PT_PSWADDR, "psw_addr" },
2203 { PT_GPR0, "gpr0" },
2204 { PT_GPR1, "gpr1" },
2205 { PT_GPR2, "gpr2" },
2206 { PT_GPR3, "gpr3" },
2207 { PT_GPR4, "gpr4" },
2208 { PT_GPR5, "gpr5" },
2209 { PT_GPR6, "gpr6" },
2210 { PT_GPR7, "gpr7" },
2211 { PT_GPR8, "gpr8" },
2212 { PT_GPR9, "gpr9" },
2213 { PT_GPR10, "gpr10" },
2214 { PT_GPR11, "gpr11" },
2215 { PT_GPR12, "gpr12" },
2216 { PT_GPR13, "gpr13" },
2217 { PT_GPR14, "gpr14" },
2218 { PT_GPR15, "gpr15" },
2219 { PT_ACR0, "acr0" },
2220 { PT_ACR1, "acr1" },
2221 { PT_ACR2, "acr2" },
2222 { PT_ACR3, "acr3" },
2223 { PT_ACR4, "acr4" },
2224 { PT_ACR5, "acr5" },
2225 { PT_ACR6, "acr6" },
2226 { PT_ACR7, "acr7" },
2227 { PT_ACR8, "acr8" },
2228 { PT_ACR9, "acr9" },
2229 { PT_ACR10, "acr10" },
2230 { PT_ACR11, "acr11" },
2231 { PT_ACR12, "acr12" },
2232 { PT_ACR13, "acr13" },
2233 { PT_ACR14, "acr14" },
2234 { PT_ACR15, "acr15" },
2235 { PT_ORIGGPR2, "orig_gpr2" },
2238 { PT_FPR0_HI, "fpr0.hi" },
2239 { PT_FPR0_LO, "fpr0.lo" },
2240 { PT_FPR1_HI, "fpr1.hi" },
2241 { PT_FPR1_LO, "fpr1.lo" },
2242 { PT_FPR2_HI, "fpr2.hi" },
2243 { PT_FPR2_LO, "fpr2.lo" },
2244 { PT_FPR3_HI, "fpr3.hi" },
2245 { PT_FPR3_LO, "fpr3.lo" },
2246 { PT_FPR4_HI, "fpr4.hi" },
2247 { PT_FPR4_LO, "fpr4.lo" },
2248 { PT_FPR5_HI, "fpr5.hi" },
2249 { PT_FPR5_LO, "fpr5.lo" },
2250 { PT_FPR6_HI, "fpr6.hi" },
2251 { PT_FPR6_LO, "fpr6.lo" },
2252 { PT_FPR7_HI, "fpr7.hi" },
2253 { PT_FPR7_LO, "fpr7.lo" },
2254 { PT_FPR8_HI, "fpr8.hi" },
2255 { PT_FPR8_LO, "fpr8.lo" },
2256 { PT_FPR9_HI, "fpr9.hi" },
2257 { PT_FPR9_LO, "fpr9.lo" },
2258 { PT_FPR10_HI, "fpr10.hi" },
2259 { PT_FPR10_LO, "fpr10.lo" },
2260 { PT_FPR11_HI, "fpr11.hi" },
2261 { PT_FPR11_LO, "fpr11.lo" },
2262 { PT_FPR12_HI, "fpr12.hi" },
2263 { PT_FPR12_LO, "fpr12.lo" },
2264 { PT_FPR13_HI, "fpr13.hi" },
2265 { PT_FPR13_LO, "fpr13.lo" },
2266 { PT_FPR14_HI, "fpr14.hi" },
2267 { PT_FPR14_LO, "fpr14.lo" },
2268 { PT_FPR15_HI, "fpr15.hi" },
2269 { PT_FPR15_LO, "fpr15.lo" },
2272 { PT_FPR0, "fpr0" },
2273 { PT_FPR1, "fpr1" },
2274 { PT_FPR2, "fpr2" },
2275 { PT_FPR3, "fpr3" },
2276 { PT_FPR4, "fpr4" },
2277 { PT_FPR5, "fpr5" },
2278 { PT_FPR6, "fpr6" },
2279 { PT_FPR7, "fpr7" },
2280 { PT_FPR8, "fpr8" },
2281 { PT_FPR9, "fpr9" },
2282 { PT_FPR10, "fpr10" },
2283 { PT_FPR11, "fpr11" },
2284 { PT_FPR12, "fpr12" },
2285 { PT_FPR13, "fpr13" },
2286 { PT_FPR14, "fpr14" },
2287 { PT_FPR15, "fpr15" },
2290 { PT_CR_10, "cr10" },
2291 { PT_CR_11, "cr11" },
2292 { PT_IEEE_IP, "ieee_exception_ip" },
2295 /* XXX No support for these offsets yet. */
2297 /* XXX No support for these offsets yet. */
2298 #elif defined(POWERPC)
2300 #define PT_ORIG_R3 34
2302 #define REGSIZE (sizeof(unsigned long))
2303 { REGSIZE*PT_R0, "r0" },
2304 { REGSIZE*PT_R1, "r1" },
2305 { REGSIZE*PT_R2, "r2" },
2306 { REGSIZE*PT_R3, "r3" },
2307 { REGSIZE*PT_R4, "r4" },
2308 { REGSIZE*PT_R5, "r5" },
2309 { REGSIZE*PT_R6, "r6" },
2310 { REGSIZE*PT_R7, "r7" },
2311 { REGSIZE*PT_R8, "r8" },
2312 { REGSIZE*PT_R9, "r9" },
2313 { REGSIZE*PT_R10, "r10" },
2314 { REGSIZE*PT_R11, "r11" },
2315 { REGSIZE*PT_R12, "r12" },
2316 { REGSIZE*PT_R13, "r13" },
2317 { REGSIZE*PT_R14, "r14" },
2318 { REGSIZE*PT_R15, "r15" },
2319 { REGSIZE*PT_R16, "r16" },
2320 { REGSIZE*PT_R17, "r17" },
2321 { REGSIZE*PT_R18, "r18" },
2322 { REGSIZE*PT_R19, "r19" },
2323 { REGSIZE*PT_R20, "r20" },
2324 { REGSIZE*PT_R21, "r21" },
2325 { REGSIZE*PT_R22, "r22" },
2326 { REGSIZE*PT_R23, "r23" },
2327 { REGSIZE*PT_R24, "r24" },
2328 { REGSIZE*PT_R25, "r25" },
2329 { REGSIZE*PT_R26, "r26" },
2330 { REGSIZE*PT_R27, "r27" },
2331 { REGSIZE*PT_R28, "r28" },
2332 { REGSIZE*PT_R29, "r29" },
2333 { REGSIZE*PT_R30, "r30" },
2334 { REGSIZE*PT_R31, "r31" },
2335 { REGSIZE*PT_NIP, "NIP" },
2336 { REGSIZE*PT_MSR, "MSR" },
2337 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2338 { REGSIZE*PT_CTR, "CTR" },
2339 { REGSIZE*PT_LNK, "LNK" },
2340 { REGSIZE*PT_XER, "XER" },
2341 { REGSIZE*PT_CCR, "CCR" },
2342 { REGSIZE*PT_FPR0, "FPR0" },
2413 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2414 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2415 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2416 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2417 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2418 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2419 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2420 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2421 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2422 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2423 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2424 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2425 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2426 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2427 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2428 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2429 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2430 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2431 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2432 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2433 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2434 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2435 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2436 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2437 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2438 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2439 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2440 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2441 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2442 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2443 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2444 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2446 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2447 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2448 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2449 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2450 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2451 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2452 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2453 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2454 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2455 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
2456 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2457 { PT_B4, "b4" }, { PT_B5, "b5" },
2458 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
2460 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2461 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
2462 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2463 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2464 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2465 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2466 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2467 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2468 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2469 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2470 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2471 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2472 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2473 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2474 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2475 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2476 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
2478 { PT_AR_CSD, "ar.csd" },
2481 { PT_AR_SSD, "ar.ssd" },
2483 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
2497 { 4*ORIG_EAX, "4*ORIG_EAX" },
2501 { 4*UESP, "4*UESP" },
2521 { 8*ORIG_RAX, "8*ORIG_EAX" },
2524 { 8*EFLAGS, "8*EFL" },
2534 { 4*PT_D1, "4*PT_D1" },
2535 { 4*PT_D2, "4*PT_D2" },
2536 { 4*PT_D3, "4*PT_D3" },
2537 { 4*PT_D4, "4*PT_D4" },
2538 { 4*PT_D5, "4*PT_D5" },
2539 { 4*PT_D6, "4*PT_D6" },
2540 { 4*PT_D7, "4*PT_D7" },
2541 { 4*PT_A0, "4*PT_A0" },
2542 { 4*PT_A1, "4*PT_A1" },
2543 { 4*PT_A2, "4*PT_A2" },
2544 { 4*PT_A3, "4*PT_A3" },
2545 { 4*PT_A4, "4*PT_A4" },
2546 { 4*PT_A5, "4*PT_A5" },
2547 { 4*PT_A6, "4*PT_A6" },
2548 { 4*PT_D0, "4*PT_D0" },
2549 { 4*PT_USP, "4*PT_USP" },
2550 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2551 { 4*PT_SR, "4*PT_SR" },
2552 { 4*PT_PC, "4*PT_PC" },
2556 { 4*REG_REG0, "4*REG_REG0" },
2557 { 4*(REG_REG0+1), "4*REG_REG1" },
2558 { 4*(REG_REG0+2), "4*REG_REG2" },
2559 { 4*(REG_REG0+3), "4*REG_REG3" },
2560 { 4*(REG_REG0+4), "4*REG_REG4" },
2561 { 4*(REG_REG0+5), "4*REG_REG5" },
2562 { 4*(REG_REG0+6), "4*REG_REG6" },
2563 { 4*(REG_REG0+7), "4*REG_REG7" },
2564 { 4*(REG_REG0+8), "4*REG_REG8" },
2565 { 4*(REG_REG0+9), "4*REG_REG9" },
2566 { 4*(REG_REG0+10), "4*REG_REG10" },
2567 { 4*(REG_REG0+11), "4*REG_REG11" },
2568 { 4*(REG_REG0+12), "4*REG_REG12" },
2569 { 4*(REG_REG0+13), "4*REG_REG13" },
2570 { 4*(REG_REG0+14), "4*REG_REG14" },
2571 { 4*REG_REG15, "4*REG_REG15" },
2572 { 4*REG_PC, "4*REG_PC" },
2573 { 4*REG_PR, "4*REG_PR" },
2574 { 4*REG_SR, "4*REG_SR" },
2575 { 4*REG_GBR, "4*REG_GBR" },
2576 { 4*REG_MACH, "4*REG_MACH" },
2577 { 4*REG_MACL, "4*REG_MACL" },
2578 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2579 { 4*REG_FPUL, "4*REG_FPUL" },
2580 { 4*REG_FPREG0, "4*REG_FPREG0" },
2581 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2582 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2583 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2584 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2585 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2586 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2587 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2588 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2589 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2590 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2591 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2592 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2593 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2594 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2595 { 4*REG_FPREG15, "4*REG_FPREG15" },
2597 { 4*REG_XDREG0, "4*REG_XDREG0" },
2598 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2599 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2600 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2601 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2602 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2603 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2604 { 4*REG_XDREG14, "4*REG_XDREG14" },
2606 { 4*REG_FPSCR, "4*REG_FPSCR" },
2613 { 16, "syscall no.(L)" },
2614 { 20, "syscall_no.(U)" },
2757 /* This entry is in case pt_regs contains dregs (depends on
2758 the kernel build options). */
2759 { uoff(regs), "offsetof(struct user, regs)" },
2760 { uoff(fpu), "offsetof(struct user, fpu)" },
2763 { uoff(regs.ARM_r0), "r0" },
2764 { uoff(regs.ARM_r1), "r1" },
2765 { uoff(regs.ARM_r2), "r2" },
2766 { uoff(regs.ARM_r3), "r3" },
2767 { uoff(regs.ARM_r4), "r4" },
2768 { uoff(regs.ARM_r5), "r5" },
2769 { uoff(regs.ARM_r6), "r6" },
2770 { uoff(regs.ARM_r7), "r7" },
2771 { uoff(regs.ARM_r8), "r8" },
2772 { uoff(regs.ARM_r9), "r9" },
2773 { uoff(regs.ARM_r10), "r10" },
2774 { uoff(regs.ARM_fp), "fp" },
2775 { uoff(regs.ARM_ip), "ip" },
2776 { uoff(regs.ARM_sp), "sp" },
2777 { uoff(regs.ARM_lr), "lr" },
2778 { uoff(regs.ARM_pc), "pc" },
2779 { uoff(regs.ARM_cpsr), "cpsr" },
2782 #if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64)
2783 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
2785 #if defined(I386) || defined(X86_64)
2786 { uoff(i387), "offsetof(struct user, i387)" },
2789 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
2792 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
2793 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
2794 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
2795 #if !defined(SPARC64)
2796 { uoff(start_code), "offsetof(struct user, start_code)" },
2799 { uoff(start_data), "offsetof(struct user, start_data)" },
2801 #if !defined(SPARC64)
2802 { uoff(start_stack), "offsetof(struct user, start_stack)" },
2804 { uoff(signal), "offsetof(struct user, signal)" },
2805 #if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
2806 { uoff(reserved), "offsetof(struct user, reserved)" },
2808 #if !defined(SPARC64)
2809 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2811 #if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64)
2812 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
2814 { uoff(magic), "offsetof(struct user, magic)" },
2815 { uoff(u_comm), "offsetof(struct user, u_comm)" },
2816 #if defined(I386) || defined(X86_64)
2817 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
2821 #endif /* !POWERPC/!SPARC */
2824 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
2825 { uoff(u_procp), "offsetof(struct user, u_procp)" },
2826 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2827 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
2828 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
2829 { uoff(u_ap), "offsetof(struct user, u_ap)" },
2830 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
2831 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
2832 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
2833 { uoff(u_error), "offsetof(struct user, u_error)" },
2834 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
2835 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
2836 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
2837 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
2838 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
2839 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
2840 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
2841 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
2842 { uoff(u_code), "offsetof(struct user, u_code)" },
2843 { uoff(u_addr), "offsetof(struct user, u_addr)" },
2844 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
2845 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
2846 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
2847 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
2848 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
2849 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
2850 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
2851 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
2852 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
2853 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
2854 { uoff(u_ru), "offsetof(struct user, u_ru)" },
2855 { uoff(u_cru), "offsetof(struct user, u_cru)" },
2856 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
2857 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
2858 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
2859 { uoff(u_start), "offsetof(struct user, u_start)" },
2860 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
2861 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
2862 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
2863 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
2864 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
2865 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
2866 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
2867 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
2868 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
2871 { sizeof(struct user), "sizeof(struct user)" },
2881 const struct xlat *x;
2884 if (entering(tcp)) {
2885 printxval(ptrace_cmds, tcp->u_arg[0],
2892 tprintf(", %lu, ", tcp->u_arg[1]);
2893 addr = tcp->u_arg[2];
2895 if (tcp->u_arg[0] == PTRACE_PEEKUSER
2896 || tcp->u_arg[0] == PTRACE_POKEUSER) {
2897 for (x = struct_user_offsets; x->str; x++) {
2902 tprintf("%#lx, ", addr);
2903 else if (x->val > addr && x != struct_user_offsets) {
2905 tprintf("%s + %ld, ", x->str, addr - x->val);
2908 tprintf("%s, ", x->str);
2912 tprintf("%#lx, ", tcp->u_arg[2]);
2914 switch (tcp->u_arg[0]) {
2915 case PTRACE_PEEKDATA:
2916 case PTRACE_PEEKTEXT:
2917 case PTRACE_PEEKUSER:
2920 case PTRACE_SINGLESTEP:
2921 case PTRACE_SYSCALL:
2923 printsignal(tcp->u_arg[3]);
2926 tprintf("%#lx", tcp->u_arg[3]);
2930 switch (tcp->u_arg[0]) {
2931 case PTRACE_PEEKDATA:
2932 case PTRACE_PEEKTEXT:
2933 case PTRACE_PEEKUSER:
2934 printnum(tcp, tcp->u_arg[3], "%#lx");
2940 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
2941 tcp->u_arg[0] == PTRACE_WRITETEXT) {
2942 tprintf("%lu, ", tcp->u_arg[3]);
2943 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2944 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
2945 tcp->u_arg[0] != PTRACE_READTEXT) {
2946 tprintf("%#lx", tcp->u_arg[3]);
2949 if (tcp->u_arg[0] == PTRACE_READDATA ||
2950 tcp->u_arg[0] == PTRACE_READTEXT) {
2951 tprintf("%lu, ", tcp->u_arg[3]);
2952 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
2957 tprintf("%lu", tcp->u_arg[3]);
2959 #endif /* FREEBSD */
2966 static const struct xlat futexops[] = {
2967 { FUTEX_WAIT, "FUTEX_WAIT" },
2968 { FUTEX_WAKE, "FUTEX_WAKE" },
2969 { FUTEX_FD, "FUTEX_FD" },
2970 { FUTEX_REQUEUE,"FUTEX_REQUEUE" },
2978 if (entering(tcp)) {
2979 tprintf("%p, ", (void *) tcp->u_arg[0]);
2980 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
2981 tprintf(", %ld", tcp->u_arg[2]);
2982 if (tcp->u_arg[1] == FUTEX_WAIT) {
2984 printtv(tcp, tcp->u_arg[3]);
2985 } else if (tcp->u_arg[1] == FUTEX_REQUEUE)
2986 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
2992 print_affinitylist(tcp, list, len)
2999 while (len >= sizeof (unsigned long)) {
3001 umove(tcp, list, &w);
3002 tprintf("%s %lx", first ? "" : ",", w);
3004 len -= sizeof (unsigned long);
3005 list += sizeof(unsigned long);
3011 sys_sched_setaffinity(tcp)
3014 if (entering(tcp)) {
3015 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3016 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3022 sys_sched_getaffinity(tcp)
3025 if (entering(tcp)) {
3026 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3028 if (tcp->u_rval == -1)
3029 tprintf("%#lx", tcp->u_arg[2]);
3031 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3036 static const struct xlat schedulers[] = {
3037 { SCHED_OTHER, "SCHED_OTHER" },
3038 { SCHED_RR, "SCHED_RR" },
3039 { SCHED_FIFO, "SCHED_FIFO" },
3044 sys_sched_getscheduler(tcp)
3047 if (entering(tcp)) {
3048 tprintf("%d", (int) tcp->u_arg[0]);
3049 } else if (! syserror(tcp)) {
3050 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3051 if (tcp->auxstr != NULL)
3058 sys_sched_setscheduler(tcp)
3061 if (entering(tcp)) {
3062 struct sched_param p;
3063 tprintf("%d, ", (int) tcp->u_arg[0]);
3064 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3065 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3066 tprintf(", %#lx", tcp->u_arg[2]);
3068 tprintf(", { %d }", p.__sched_priority);
3074 sys_sched_getparam(tcp)
3077 if (entering(tcp)) {
3078 tprintf("%d, ", (int) tcp->u_arg[0]);
3080 struct sched_param p;
3081 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3082 tprintf("%#lx", tcp->u_arg[1]);
3084 tprintf("{ %d }", p.__sched_priority);
3090 sys_sched_setparam(tcp)
3093 if (entering(tcp)) {
3094 struct sched_param p;
3095 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3096 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3098 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3104 sys_sched_get_priority_min(tcp)
3107 if (entering(tcp)) {
3108 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3114 #include <asm/prctl.h>
3116 static const struct xlat archvals[] = {
3117 { ARCH_SET_GS, "ARCH_SET_GS" },
3118 { ARCH_SET_FS, "ARCH_SET_FS" },
3119 { ARCH_GET_FS, "ARCH_GET_FS" },
3120 { ARCH_GET_GS, "ARCH_GET_GS" },
3128 if (entering(tcp)) {
3129 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3130 if (tcp->u_arg[0] == ARCH_SET_GS
3131 || tcp->u_arg[0] == ARCH_SET_FS)
3132 tprintf(", %#lx", tcp->u_arg[1]);
3134 if (tcp->u_arg[0] == ARCH_GET_GS
3135 || tcp->u_arg[0] == ARCH_GET_FS) {
3137 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3138 tprintf(", [%#lx]", v);
3140 tprintf(", %#lx", tcp->u_arg[1]);