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 printflags(clone_flags, flags &~ CSIGNAL, NULL);
583 if ((flags & CSIGNAL) != 0)
584 tprintf("|%s", signame(flags & CSIGNAL));
585 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
586 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
588 if (flags & CLONE_PARENT_SETTID)
589 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
590 if (flags & CLONE_SETTLS) {
592 struct modify_ldt_ldt_s copy;
593 if (umove(tcp, tcp->u_arg[ARG_TLS], ©) != -1) {
594 tprintf(", {entry_number:%d, ",
599 print_ldt_entry(©);
603 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
605 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
606 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
617 return RVAL_UDECIMAL;
622 change_syscall(tcp, new)
628 /* Attempt to make vfork into fork, which we can follow. */
629 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
632 #elif defined(X86_64)
633 /* Attempt to make vfork into fork, which we can follow. */
634 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
637 #elif defined(POWERPC)
638 if (ptrace(PTRACE_POKEUSER, tcp->pid,
639 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
642 #elif defined(S390) || defined(S390X)
643 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
644 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
648 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
651 #elif defined(SPARC) || defined(SPARC64)
653 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)®s, 0)<0)
656 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)®s, 0)<0)
660 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
664 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
670 case 2: break; /* x86 SYS_fork */
671 case SYS_clone: new = 120; break;
673 fprintf(stderr, "%s: unexpected syscall %d\n",
677 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
679 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
683 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
687 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
691 /* Top half of reg encodes the no. of args n as 0x1n.
692 Assume 0 args as kernel never actually checks... */
693 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
698 #warning Do not know how to handle change_syscall for this architecture
699 #endif /* architecture */
711 unsigned long *bsp, *ap;
713 if (upeek(tcp->pid, PT_AR_BSP, (long *) &bsp) , 0)
716 ap = ia64_rse_skip_regs(bsp, argnum);
718 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
725 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
729 #elif defined(X86_64)
731 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
735 #elif defined(POWERPC)
737 #define PT_ORIG_R3 34
740 ptrace(PTRACE_POKEUSER, tcp->pid,
741 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
750 ptrace(PTRACE_POKEUSER, tcp->pid,
751 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
755 if (upeek(tcp->pid, REG_SP, (long *) &sp) , 0)
758 ptrace(PTRACE_POKEDATA, tcp->pid,
759 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
764 #elif defined(S390) || defined(S390X)
767 ptrace(PTRACE_POKEUSER, tcp->pid,
768 (char *) (argnum==0 ? PT_ORIGGPR2 :
769 PT_GPR2 + argnum*sizeof(long)),
777 # warning Sorry, setargs not implemented for this architecture.
782 #if defined SYS_clone || defined SYS_clone2
787 struct tcb *tcpchild;
797 int bpt = tcp->flags & TCB_BPTSET;
799 if (!(tcp->flags & TCB_FOLLOWFORK))
810 #ifdef CLONE_PTRACE /* See new setbpt code. */
811 tcpchild = pid2tcb(pid);
812 if (tcpchild != NULL) {
813 /* The child already reported its startup trap
814 before the parent reported its syscall return. */
816 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
817 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
819 [preattached child %d of %d in weird state!]\n",
824 if ((tcpchild = alloctcb(pid)) == NULL) {
827 fprintf(stderr, " [tcb table full]\n");
828 kill(pid, SIGKILL); /* XXX */
833 /* Attach to the new child */
834 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
837 perror("PTRACE_ATTACH");
838 fprintf(stderr, "Too late?\n");
847 tcpchild->flags |= TCB_ATTACHED;
848 /* Child has BPT too, must be removed on first occasion. */
850 tcpchild->flags |= TCB_BPTSET;
851 tcpchild->baddr = tcp->baddr;
852 memcpy(tcpchild->inst, tcp->inst,
853 sizeof tcpchild->inst);
855 tcpchild->parent = tcp;
857 if (tcpchild->flags & TCB_SUSPENDED) {
858 /* The child was born suspended, due to our having
859 forced CLONE_PTRACE. */
863 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
864 if (ptrace(PTRACE_SYSCALL, pid, (char *) 1, 0) < 0) {
865 perror("resume: ptrace(PTRACE_SYSCALL, ...)");
871 Process %u resumed (parent %d ready)\n",
877 fprintf(stderr, "Process %d attached\n", pid);
880 #ifdef TCB_CLONE_THREAD
883 * Save the flags used in this call,
884 * in case we point TCP to our parent below.
886 int call_flags = tcp->u_arg[ARG_FLAGS];
887 if ((tcp->flags & TCB_CLONE_THREAD) &&
888 tcp->parent != NULL) {
889 /* The parent in this clone is itself a
890 thread belonging to another process.
891 There is no meaning to the parentage
892 relationship of the new child with the
893 thread, only with the process. We
894 associate the new thread with our
895 parent. Since this is done for every
896 new thread, there will never be a
897 TCB_CLONE_THREAD process that has
901 tcpchild->parent = tcp;
904 if (call_flags & CLONE_THREAD) {
905 tcpchild->flags |= TCB_CLONE_THREAD;
906 ++tcp->nclone_threads;
908 if (call_flags & CLONE_DETACHED) {
909 tcpchild->flags |= TCB_CLONE_DETACHED;
910 ++tcp->nclone_detached;
925 /* We do special magic with clone for any clone or fork. */
926 return internal_clone(tcp);
929 struct tcb *tcpchild;
934 if (tcp->scno == SYS_vfork) {
935 /* Attempt to make vfork into fork, which we can follow. */
937 change_syscall(tcp, SYS_fork) < 0)
942 if (!followfork || dont_follow)
950 int bpt = tcp->flags & TCB_BPTSET;
952 if (!(tcp->flags & TCB_FOLLOWFORK))
961 if ((tcpchild = alloctcb(pid)) == NULL) {
962 fprintf(stderr, " [tcb table full]\n");
963 kill(pid, SIGKILL); /* XXX */
968 /* The child must have run before it can be attached. */
969 /* This must be a bug in the parisc kernel, but I havn't
970 * identified it yet. Seems to be an issue associated
971 * with attaching to a process (which sends it a signal)
972 * before that process has ever been scheduled. When
973 * debugging, I started seeing crashes in
974 * arch/parisc/kernel/signal.c:do_signal(), apparently
975 * caused by r8 getting corrupt over the dequeue_signal()
976 * call. Didn't make much sense though...
982 select(0, NULL, NULL, NULL, &tv);
985 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
986 perror("PTRACE_ATTACH");
987 fprintf(stderr, "Too late?\n");
994 /* The child must have run before it can be attached. */
999 select(0, NULL, NULL, NULL, &tv);
1001 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1002 perror("PTRACE_ATTACH");
1003 fprintf(stderr, "Too late?\n");
1008 /* Try to catch the new process as soon as possible. */
1011 for (i = 0; i < 1024; i++)
1012 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1015 perror("PTRACE_ATTACH");
1016 fprintf(stderr, "Too late?\n");
1021 #endif /* !oldway */
1023 tcpchild->flags |= TCB_ATTACHED;
1024 /* Child has BPT too, must be removed on first occasion */
1026 tcpchild->flags |= TCB_BPTSET;
1027 tcpchild->baddr = tcp->baddr;
1028 memcpy(tcpchild->inst, tcp->inst,
1029 sizeof tcpchild->inst);
1032 tcpchild->parent = tcp;
1035 fprintf(stderr, "Process %d attached\n", pid);
1041 #endif /* !USE_PROCFS */
1043 #if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
1050 return RVAL_UDECIMAL;
1054 #endif /* SUNOS4 || LINUX || FREEBSD */
1058 static char idstr[16];
1065 sprintf(idstr, "ppid %lu", getrval2(tcp));
1066 tcp->auxstr = idstr;
1077 sprintf(idstr, "euid %lu", getrval2(tcp));
1078 tcp->auxstr = idstr;
1089 sprintf(idstr, "egid %lu", getrval2(tcp));
1090 tcp->auxstr = idstr;
1104 if (entering(tcp)) {
1105 tprintf("%u", (uid_t) tcp->u_arg[0]);
1114 if (entering(tcp)) {
1115 tprintf("%u", (gid_t) tcp->u_arg[0]);
1127 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1128 tcp->u_arg[1], tcp->u_arg[2]);
1130 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1131 tprintf("%#lx, ", tcp->u_arg[0]);
1133 tprintf("[%lu], ", (unsigned long) uid);
1134 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1135 tprintf("%#lx, ", tcp->u_arg[1]);
1137 tprintf("[%lu], ", (unsigned long) uid);
1138 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1139 tprintf("%#lx", tcp->u_arg[2]);
1141 tprintf("[%lu]", (unsigned long) uid);
1154 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1155 tcp->u_arg[1], tcp->u_arg[2]);
1157 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1158 tprintf("%#lx, ", tcp->u_arg[0]);
1160 tprintf("[%lu], ", (unsigned long) gid);
1161 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1162 tprintf("%#lx, ", tcp->u_arg[1]);
1164 tprintf("[%lu], ", (unsigned long) gid);
1165 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1166 tprintf("%#lx", tcp->u_arg[2]);
1168 tprintf("[%lu]", (unsigned long) gid);
1180 if (entering(tcp)) {
1181 printuid("", tcp->u_arg[0]);
1182 printuid(", ", tcp->u_arg[1]);
1191 if (entering(tcp)) {
1192 printuid("", tcp->u_arg[0]);
1193 printuid(", ", tcp->u_arg[1]);
1198 #if defined(LINUX) || defined(FREEBSD)
1203 if (entering(tcp)) {
1204 printuid("", tcp->u_arg[0]);
1205 printuid(", ", tcp->u_arg[1]);
1206 printuid(", ", tcp->u_arg[2]);
1214 if (entering(tcp)) {
1215 printuid("", tcp->u_arg[0]);
1216 printuid(", ", tcp->u_arg[1]);
1217 printuid(", ", tcp->u_arg[2]);
1222 #endif /* LINUX || FREEBSD */
1228 if (entering(tcp)) {
1229 unsigned long len, size, start, cur, end, abbrev_end;
1233 len = tcp->u_arg[0];
1234 tprintf("%lu, ", len);
1239 start = tcp->u_arg[1];
1244 size = len * sizeof(gid);
1246 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1247 tprintf("%#lx", start);
1251 abbrev_end = start + max_strlen * sizeof(gid);
1252 if (abbrev_end < start)
1258 for (cur = start; cur < end; cur += sizeof(gid)) {
1261 if (cur >= abbrev_end) {
1265 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1270 tprintf("%lu", (unsigned long) gid);
1274 tprintf(" %#lx", tcp->u_arg[1]);
1285 if (entering(tcp)) {
1286 len = tcp->u_arg[0];
1287 tprintf("%lu, ", len);
1289 unsigned long size, start, cur, end, abbrev_end;
1298 start = tcp->u_arg[1];
1303 if (tcp->u_arg[0] == 0) {
1304 tprintf("%#lx", start);
1307 size = len * sizeof(gid);
1309 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1310 size / sizeof(gid) != len || end < start) {
1311 tprintf("%#lx", start);
1315 abbrev_end = start + max_strlen * sizeof(gid);
1316 if (abbrev_end < start)
1322 for (cur = start; cur < end; cur += sizeof(gid)) {
1325 if (cur >= abbrev_end) {
1329 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1334 tprintf("%lu", (unsigned long) gid);
1338 tprintf(" %#lx", tcp->u_arg[1]);
1345 sys_setgroups32(tcp)
1348 if (entering(tcp)) {
1349 unsigned long len, size, start, cur, end, abbrev_end;
1353 len = tcp->u_arg[0];
1354 tprintf("%lu, ", len);
1359 start = tcp->u_arg[1];
1364 size = len * sizeof(gid);
1366 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1367 tprintf("%#lx", start);
1371 abbrev_end = start + max_strlen * sizeof(gid);
1372 if (abbrev_end < start)
1378 for (cur = start; cur < end; cur += sizeof(gid)) {
1381 if (cur >= abbrev_end) {
1385 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1390 tprintf("%lu", (unsigned long) gid);
1394 tprintf(" %#lx", tcp->u_arg[1]);
1400 sys_getgroups32(tcp)
1405 if (entering(tcp)) {
1406 len = tcp->u_arg[0];
1407 tprintf("%lu, ", len);
1409 unsigned long size, start, cur, end, abbrev_end;
1418 start = tcp->u_arg[1];
1423 size = len * sizeof(gid);
1425 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1426 size / sizeof(gid) != len || end < start) {
1427 tprintf("%#lx", start);
1431 abbrev_end = start + max_strlen * sizeof(gid);
1432 if (abbrev_end < start)
1438 for (cur = start; cur < end; cur += sizeof(gid)) {
1441 if (cur >= abbrev_end) {
1445 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1450 tprintf("%lu", (unsigned long) gid);
1454 tprintf(" %#lx", tcp->u_arg[1]);
1464 if (entering(tcp)) {
1466 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1476 if (entering(tcp)) {
1478 tprintf("%lu", tcp->u_arg[0]);
1488 if (entering(tcp)) {
1489 tprintf("%lu", tcp->u_arg[0]);
1505 if (entering(tcp)) {
1506 tprintf("%lu", tcp->u_arg[0]);
1515 if (entering(tcp)) {
1516 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1523 #include <sys/privilege.h>
1526 static const struct xlat procpriv_cmds [] = {
1527 { SETPRV, "SETPRV" },
1528 { CLRPRV, "CLRPRV" },
1529 { PUTPRV, "PUTPRV" },
1530 { GETPRV, "GETPRV" },
1531 { CNTPRV, "CNTPRV" },
1536 static const struct xlat procpriv_priv [] = {
1537 { P_OWNER, "P_OWNER" },
1538 { P_AUDIT, "P_AUDIT" },
1539 { P_COMPAT, "P_COMPAT" },
1540 { P_DACREAD, "P_DACREAD" },
1541 { P_DACWRITE, "P_DACWRITE" },
1543 { P_FILESYS, "P_FILESYS" },
1544 { P_MACREAD, "P_MACREAD" },
1545 { P_MACWRITE, "P_MACWRITE" },
1546 { P_MOUNT, "P_MOUNT" },
1547 { P_MULTIDIR, "P_MULTIDIR" },
1548 { P_SETPLEVEL, "P_SETPLEVEL" },
1549 { P_SETSPRIV, "P_SETSPRIV" },
1550 { P_SETUID, "P_SETUID" },
1551 { P_SYSOPS, "P_SYSOPS" },
1552 { P_SETUPRIV, "P_SETUPRIV" },
1553 { P_DRIVER, "P_DRIVER" },
1554 { P_RTIME, "P_RTIME" },
1555 { P_MACUPGRADE, "P_MACUPGRADE" },
1556 { P_FSYSRANGE, "P_FSYSRANGE" },
1557 { P_SETFLEVEL, "P_SETFLEVEL" },
1558 { P_AUDITWR, "P_AUDITWR" },
1559 { P_TSHAR, "P_TSHAR" },
1560 { P_PLOCK, "P_PLOCK" },
1561 { P_CORE, "P_CORE" },
1562 { P_LOADMOD, "P_LOADMOD" },
1563 { P_BIND, "P_BIND" },
1564 { P_ALLPRIVS, "P_ALLPRIVS" },
1569 static const struct xlat procpriv_type [] = {
1570 { PS_FIX, "PS_FIX" },
1571 { PS_INH, "PS_INH" },
1572 { PS_MAX, "PS_MAX" },
1573 { PS_WKG, "PS_WKG" },
1579 printpriv(tcp, addr, len, opt)
1583 const struct xlat *opt;
1586 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1587 int dots = len > max;
1590 if (len > max) len = max;
1593 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1595 tprintf ("%#lx", addr);
1601 for (i = 0; i < len; ++i) {
1604 if (i) tprintf (", ");
1606 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1607 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1609 tprintf ("%s|%s", t, p);
1612 tprintf ("%#lx", buf [i]);
1616 if (dots) tprintf (" ...");
1626 if (entering(tcp)) {
1627 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1628 switch (tcp->u_arg[0]) {
1630 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1638 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1639 tprintf (", %ld", tcp->u_arg[2]);
1642 else if (tcp->u_arg[0] == GETPRV) {
1643 if (syserror (tcp)) {
1644 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1648 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1649 tprintf (", %ld", tcp->u_arg[2]);
1660 printargv(tcp, addr)
1666 int max = max_strlen / 2;
1668 for (sep = ""; --max >= 0; sep = ", ") {
1671 if (umove(tcp, addr, &cp) < 0) {
1672 tprintf("%#lx", addr);
1678 printstr(tcp, (long) cp, -1);
1679 addr += sizeof(char *);
1686 printargc(fmt, tcp, addr)
1694 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1695 addr += sizeof(char *);
1697 tprintf(fmt, count, count == 1 ? "" : "s");
1704 if (entering(tcp)) {
1705 printpath(tcp, tcp->u_arg[0]);
1707 tprintf(", %#lx", tcp->u_arg[1]);
1709 else if (abbrev(tcp))
1710 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1714 printargv(tcp, tcp->u_arg[1]);
1725 if (entering(tcp)) {
1726 printpath(tcp, tcp->u_arg[0]);
1728 tprintf(", %#lx", tcp->u_arg[1]);
1730 else if (abbrev(tcp))
1731 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1735 printargv(tcp, tcp->u_arg[1]);
1739 tprintf(", %#lx", tcp->u_arg[2]);
1740 else if (abbrev(tcp))
1741 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1744 printargv(tcp, tcp->u_arg[2]);
1753 int sys_rexecve(tcp)
1756 if (entering (tcp)) {
1758 tprintf (", %ld", tcp->u_arg[3]);
1770 if (exiting(tcp) && !syserror(tcp) && followfork)
1773 #if defined LINUX && defined TCB_WAITEXECVE
1774 if (exiting(tcp) && syserror(tcp))
1775 tcp->flags &= ~TCB_WAITEXECVE;
1777 tcp->flags |= TCB_WAITEXECVE;
1778 #endif /* LINUX && TCB_WAITEXECVE */
1784 #define __WNOTHREAD 0x20000000
1787 #define __WALL 0x40000000
1790 #define __WCLONE 0x80000000
1794 static const struct xlat wait4_options[] = {
1795 { WNOHANG, "WNOHANG" },
1797 { WUNTRACED, "WUNTRACED" },
1800 { WEXITED, "WEXITED" },
1803 { WTRAPPED, "WTRAPPED" },
1806 { WSTOPPED, "WSTOPPED" },
1809 { WCONTINUED, "WCONTINUED" },
1812 { WNOWAIT, "WNOWAIT" },
1815 { __WCLONE, "__WCLONE" },
1818 { __WALL, "__WALL" },
1821 { __WNOTHREAD, "__WNOTHREAD" },
1826 #if !defined WCOREFLAG && defined WCOREFLG
1827 # define WCOREFLAG WCOREFLG
1830 #define WCOREFLAG 0x80
1834 #define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1837 #define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1847 * Here is a tricky presentation problem. This solution
1848 * is still not entirely satisfactory but since there
1849 * are no wait status constructors it will have to do.
1851 if (WIFSTOPPED(status)) {
1852 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
1853 signame(WSTOPSIG(status)));
1854 status &= ~W_STOPCODE(WSTOPSIG(status));
1856 else if (WIFSIGNALED(status)) {
1857 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
1858 signame(WTERMSIG(status)),
1859 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
1860 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1862 else if (WIFEXITED(status)) {
1863 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
1864 WEXITSTATUS(status));
1866 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
1869 tprintf("[%#x]", status);
1876 tprintf(" | %#x]", status);
1882 printwaitn(tcp, n, bitness)
1890 if (entering(tcp)) {
1891 tprintf("%ld, ", tcp->u_arg[0]);
1896 else if (syserror(tcp) || tcp->u_rval == 0)
1897 tprintf("%#lx", tcp->u_arg[1]);
1898 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1901 exited = printstatus(status);
1904 printflags(wait4_options, tcp->u_arg[2], "W???");
1911 else if (tcp->u_rval > 0) {
1914 printrusage32(tcp, tcp->u_arg[3]);
1917 printrusage(tcp, tcp->u_arg[3]);
1921 else if (tcp->u_rval > 0 && exited)
1922 printrusage(tcp, tcp->u_arg[3]);
1925 tprintf("%#lx", tcp->u_arg[3]);
1932 internal_wait(tcp, flagarg)
1938 #ifdef TCB_CLONE_THREAD
1939 if (tcp->flags & TCB_CLONE_THREAD)
1940 /* The children we wait for are our parent's children. */
1941 got_kids = (tcp->parent->nchildren
1942 > tcp->parent->nclone_detached);
1944 got_kids = (tcp->nchildren > tcp->nclone_detached);
1946 got_kids = tcp->nchildren > 0;
1949 if (entering(tcp) && got_kids) {
1950 /* There are children that this parent should block for.
1951 But ptrace made us the parent of the traced children
1952 and the real parent will get ECHILD from the wait call.
1954 XXX If we attached with strace -f -p PID, then there
1955 may be untraced dead children the parent could be reaping
1956 now, but we make him block. */
1958 /* ??? WTA: fix bug with hanging children */
1960 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
1962 * There are traced children. We'll make the parent
1963 * block to avoid a false ECHILD error due to our
1964 * ptrace having stolen the children. However,
1965 * we shouldn't block if there are zombies to reap.
1966 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
1968 struct tcb *child = NULL;
1969 if (tcp->nzombies > 0 &&
1970 (tcp->u_arg[0] == -1 ||
1971 (child = pid2tcb(tcp->u_arg[0])) == NULL))
1973 if (tcp->u_arg[0] > 0) {
1975 * If the parent waits for a specified child
1976 * PID, then it must get ECHILD right away
1977 * if that PID is not one of its children.
1978 * Make sure that the requested PID matches
1979 * one of the parent's children that we are
1980 * tracing, and don't suspend it otherwise.
1983 child = pid2tcb(tcp->u_arg[0]);
1984 if (child == NULL || child->parent != (
1985 #ifdef TCB_CLONE_THREAD
1986 (tcp->flags & TCB_CLONE_THREAD)
1992 tcp->flags |= TCB_SUSPENDED;
1993 tcp->waitpid = tcp->u_arg[0];
1994 #ifdef TCB_CLONE_THREAD
1995 if (tcp->flags & TCB_CLONE_THREAD)
1996 tcp->parent->nclone_waiting++;
2000 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
2001 if (tcp->u_arg[flagarg] & WNOHANG) {
2002 /* We must force a fake result of 0 instead of
2003 the ECHILD error. */
2004 extern int force_result();
2005 return force_result(tcp, 0, 0);
2008 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2009 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2011 * We just reaped a child we don't know about,
2012 * presumably a zombie we already droptcb'd.
2026 /* The library wrapper stuffs this into the user variable. */
2028 printstatus(getrval2(tcp));
2043 if (!syserror(tcp)) {
2044 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2045 tprintf("%#lx", tcp->u_arg[0]);
2047 printstatus(status);
2058 return printwaitn(tcp, 3, 0);
2065 return printwaitn(tcp, 4, 0);
2073 return printwaitn(tcp, 4, 1);
2077 #if defined SVR4 || defined LINUX
2079 static const struct xlat waitid_types[] = {
2082 { P_PPID, "P_PPID" },
2084 { P_PGID, "P_PGID" },
2099 { P_LWPID, "P_LWPID" },
2111 if (entering(tcp)) {
2112 printxval(waitid_types, tcp->u_arg[0], "P_???");
2113 tprintf(", %ld, ", tcp->u_arg[1]);
2120 else if (syserror(tcp))
2121 tprintf("%#lx", tcp->u_arg[2]);
2122 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2125 printsiginfo(&si, verbose (tcp));
2128 printflags(wait4_options, tcp->u_arg[3], "W???");
2129 if (tcp->u_nargs > 4) {
2134 else if (tcp->u_error)
2135 tprintf("%#lx", tcp->u_arg[4]);
2137 printrusage(tcp, tcp->u_arg[4]);
2143 #endif /* SVR4 or LINUX */
2150 tprintf("%lu", tcp->u_arg[0]);
2158 struct utsname uname;
2161 if (syserror(tcp) || !verbose(tcp))
2162 tprintf("%#lx", tcp->u_arg[0]);
2163 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2165 else if (!abbrev(tcp)) {
2167 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2168 uname.sysname, uname.nodename);
2169 tprintf("release=\"%s\", version=\"%s\", ",
2170 uname.release, uname.version);
2171 tprintf("machine=\"%s\"", uname.machine);
2174 tprintf(", domainname=\"%s\"", uname.domainname);
2175 #endif /* __GLIBC__ */
2180 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2181 uname.sysname, uname.nodename);
2188 static const struct xlat ptrace_cmds[] = {
2190 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2191 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2192 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2193 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2194 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2195 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2196 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2197 { PTRACE_CONT, "PTRACE_CONT" },
2198 { PTRACE_KILL, "PTRACE_KILL" },
2199 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2200 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2201 { PTRACE_DETACH, "PTRACE_DETACH" },
2202 #ifdef PTRACE_GETREGS
2203 { PTRACE_GETREGS, "PTRACE_GETREGS" },
2205 #ifdef PTRACE_SETREGS
2206 { PTRACE_SETREGS, "PTRACE_SETREGS" },
2208 #ifdef PTRACE_GETFPREGS
2209 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
2211 #ifdef PTRACE_SETFPREGS
2212 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
2214 #ifdef PTRACE_GETFPXREGS
2215 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
2217 #ifdef PTRACE_SETFPXREGS
2218 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
2220 #ifdef PTRACE_GETVRREGS
2221 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
2223 #ifdef PTRACE_SETVRREGS
2224 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
2227 { PTRACE_READDATA, "PTRACE_READDATA" },
2228 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2229 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2230 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2231 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2232 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
2234 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2235 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
2237 { PTRACE_22, "PTRACE_PTRACE_22" },
2238 { PTRACE_23, "PTRACE_PTRACE_23" },
2241 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
2243 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
2245 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2246 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2247 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
2249 { PTRACE_26, "PTRACE_26" },
2250 { PTRACE_27, "PTRACE_27" },
2251 { PTRACE_28, "PTRACE_28" },
2253 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
2256 { PT_TRACE_ME, "PT_TRACE_ME" },
2257 { PT_READ_I, "PT_READ_I" },
2258 { PT_READ_D, "PT_READ_D" },
2259 { PT_WRITE_I, "PT_WRITE_I" },
2260 { PT_WRITE_D, "PT_WRITE_D" },
2262 { PT_READ_U, "PT_READ_U" },
2264 { PT_CONTINUE, "PT_CONTINUE" },
2265 { PT_KILL, "PT_KILL" },
2266 { PT_STEP, "PT_STEP" },
2267 { PT_ATTACH, "PT_ATTACH" },
2268 { PT_DETACH, "PT_DETACH" },
2269 { PT_GETREGS, "PT_GETREGS" },
2270 { PT_SETREGS, "PT_SETREGS" },
2271 { PT_GETFPREGS, "PT_GETFPREGS" },
2272 { PT_SETFPREGS, "PT_SETFPREGS" },
2273 { PT_GETDBREGS, "PT_GETDBREGS" },
2274 { PT_SETDBREGS, "PT_SETDBREGS" },
2275 #endif /* FREEBSD */
2280 #ifndef SUNOS4_KERNEL_ARCH_KLUDGE
2282 #endif /* !SUNOS4_KERNEL_ARCH_KLUDGE */
2283 const struct xlat struct_user_offsets[] = {
2285 #if defined(S390) || defined(S390X)
2286 { PT_PSWMASK, "psw_mask" },
2287 { PT_PSWADDR, "psw_addr" },
2288 { PT_GPR0, "gpr0" },
2289 { PT_GPR1, "gpr1" },
2290 { PT_GPR2, "gpr2" },
2291 { PT_GPR3, "gpr3" },
2292 { PT_GPR4, "gpr4" },
2293 { PT_GPR5, "gpr5" },
2294 { PT_GPR6, "gpr6" },
2295 { PT_GPR7, "gpr7" },
2296 { PT_GPR8, "gpr8" },
2297 { PT_GPR9, "gpr9" },
2298 { PT_GPR10, "gpr10" },
2299 { PT_GPR11, "gpr11" },
2300 { PT_GPR12, "gpr12" },
2301 { PT_GPR13, "gpr13" },
2302 { PT_GPR14, "gpr14" },
2303 { PT_GPR15, "gpr15" },
2304 { PT_ACR0, "acr0" },
2305 { PT_ACR1, "acr1" },
2306 { PT_ACR2, "acr2" },
2307 { PT_ACR3, "acr3" },
2308 { PT_ACR4, "acr4" },
2309 { PT_ACR5, "acr5" },
2310 { PT_ACR6, "acr6" },
2311 { PT_ACR7, "acr7" },
2312 { PT_ACR8, "acr8" },
2313 { PT_ACR9, "acr9" },
2314 { PT_ACR10, "acr10" },
2315 { PT_ACR11, "acr11" },
2316 { PT_ACR12, "acr12" },
2317 { PT_ACR13, "acr13" },
2318 { PT_ACR14, "acr14" },
2319 { PT_ACR15, "acr15" },
2320 { PT_ORIGGPR2, "orig_gpr2" },
2323 { PT_FPR0_HI, "fpr0.hi" },
2324 { PT_FPR0_LO, "fpr0.lo" },
2325 { PT_FPR1_HI, "fpr1.hi" },
2326 { PT_FPR1_LO, "fpr1.lo" },
2327 { PT_FPR2_HI, "fpr2.hi" },
2328 { PT_FPR2_LO, "fpr2.lo" },
2329 { PT_FPR3_HI, "fpr3.hi" },
2330 { PT_FPR3_LO, "fpr3.lo" },
2331 { PT_FPR4_HI, "fpr4.hi" },
2332 { PT_FPR4_LO, "fpr4.lo" },
2333 { PT_FPR5_HI, "fpr5.hi" },
2334 { PT_FPR5_LO, "fpr5.lo" },
2335 { PT_FPR6_HI, "fpr6.hi" },
2336 { PT_FPR6_LO, "fpr6.lo" },
2337 { PT_FPR7_HI, "fpr7.hi" },
2338 { PT_FPR7_LO, "fpr7.lo" },
2339 { PT_FPR8_HI, "fpr8.hi" },
2340 { PT_FPR8_LO, "fpr8.lo" },
2341 { PT_FPR9_HI, "fpr9.hi" },
2342 { PT_FPR9_LO, "fpr9.lo" },
2343 { PT_FPR10_HI, "fpr10.hi" },
2344 { PT_FPR10_LO, "fpr10.lo" },
2345 { PT_FPR11_HI, "fpr11.hi" },
2346 { PT_FPR11_LO, "fpr11.lo" },
2347 { PT_FPR12_HI, "fpr12.hi" },
2348 { PT_FPR12_LO, "fpr12.lo" },
2349 { PT_FPR13_HI, "fpr13.hi" },
2350 { PT_FPR13_LO, "fpr13.lo" },
2351 { PT_FPR14_HI, "fpr14.hi" },
2352 { PT_FPR14_LO, "fpr14.lo" },
2353 { PT_FPR15_HI, "fpr15.hi" },
2354 { PT_FPR15_LO, "fpr15.lo" },
2357 { PT_FPR0, "fpr0" },
2358 { PT_FPR1, "fpr1" },
2359 { PT_FPR2, "fpr2" },
2360 { PT_FPR3, "fpr3" },
2361 { PT_FPR4, "fpr4" },
2362 { PT_FPR5, "fpr5" },
2363 { PT_FPR6, "fpr6" },
2364 { PT_FPR7, "fpr7" },
2365 { PT_FPR8, "fpr8" },
2366 { PT_FPR9, "fpr9" },
2367 { PT_FPR10, "fpr10" },
2368 { PT_FPR11, "fpr11" },
2369 { PT_FPR12, "fpr12" },
2370 { PT_FPR13, "fpr13" },
2371 { PT_FPR14, "fpr14" },
2372 { PT_FPR15, "fpr15" },
2375 { PT_CR_10, "cr10" },
2376 { PT_CR_11, "cr11" },
2377 { PT_IEEE_IP, "ieee_exception_ip" },
2380 /* XXX No support for these offsets yet. */
2382 /* XXX No support for these offsets yet. */
2383 #elif defined(POWERPC)
2385 #define PT_ORIG_R3 34
2387 #define REGSIZE (sizeof(unsigned long))
2388 { REGSIZE*PT_R0, "r0" },
2389 { REGSIZE*PT_R1, "r1" },
2390 { REGSIZE*PT_R2, "r2" },
2391 { REGSIZE*PT_R3, "r3" },
2392 { REGSIZE*PT_R4, "r4" },
2393 { REGSIZE*PT_R5, "r5" },
2394 { REGSIZE*PT_R6, "r6" },
2395 { REGSIZE*PT_R7, "r7" },
2396 { REGSIZE*PT_R8, "r8" },
2397 { REGSIZE*PT_R9, "r9" },
2398 { REGSIZE*PT_R10, "r10" },
2399 { REGSIZE*PT_R11, "r11" },
2400 { REGSIZE*PT_R12, "r12" },
2401 { REGSIZE*PT_R13, "r13" },
2402 { REGSIZE*PT_R14, "r14" },
2403 { REGSIZE*PT_R15, "r15" },
2404 { REGSIZE*PT_R16, "r16" },
2405 { REGSIZE*PT_R17, "r17" },
2406 { REGSIZE*PT_R18, "r18" },
2407 { REGSIZE*PT_R19, "r19" },
2408 { REGSIZE*PT_R20, "r20" },
2409 { REGSIZE*PT_R21, "r21" },
2410 { REGSIZE*PT_R22, "r22" },
2411 { REGSIZE*PT_R23, "r23" },
2412 { REGSIZE*PT_R24, "r24" },
2413 { REGSIZE*PT_R25, "r25" },
2414 { REGSIZE*PT_R26, "r26" },
2415 { REGSIZE*PT_R27, "r27" },
2416 { REGSIZE*PT_R28, "r28" },
2417 { REGSIZE*PT_R29, "r29" },
2418 { REGSIZE*PT_R30, "r30" },
2419 { REGSIZE*PT_R31, "r31" },
2420 { REGSIZE*PT_NIP, "NIP" },
2421 { REGSIZE*PT_MSR, "MSR" },
2422 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2423 { REGSIZE*PT_CTR, "CTR" },
2424 { REGSIZE*PT_LNK, "LNK" },
2425 { REGSIZE*PT_XER, "XER" },
2426 { REGSIZE*PT_CCR, "CCR" },
2427 { REGSIZE*PT_FPR0, "FPR0" },
2498 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2499 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2500 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2501 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2502 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2503 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2504 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2505 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2506 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2507 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2508 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2509 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2510 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2511 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2512 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2513 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2514 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2515 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2516 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2517 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2518 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2519 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2520 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2521 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2522 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2523 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2524 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2525 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2526 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2527 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2528 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2529 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2531 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2532 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2533 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2534 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2535 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2536 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2537 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2538 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2539 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2540 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
2541 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2542 { PT_B4, "b4" }, { PT_B5, "b5" },
2543 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
2545 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2546 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
2547 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2548 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2549 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2550 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2551 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2552 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2553 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2554 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2555 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2556 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2557 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2558 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2559 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2560 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2561 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
2563 { PT_AR_CSD, "ar.csd" },
2566 { PT_AR_SSD, "ar.ssd" },
2568 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
2582 { 4*ORIG_EAX, "4*ORIG_EAX" },
2586 { 4*UESP, "4*UESP" },
2606 { 8*ORIG_RAX, "8*ORIG_EAX" },
2609 { 8*EFLAGS, "8*EFL" },
2619 { 4*PT_D1, "4*PT_D1" },
2620 { 4*PT_D2, "4*PT_D2" },
2621 { 4*PT_D3, "4*PT_D3" },
2622 { 4*PT_D4, "4*PT_D4" },
2623 { 4*PT_D5, "4*PT_D5" },
2624 { 4*PT_D6, "4*PT_D6" },
2625 { 4*PT_D7, "4*PT_D7" },
2626 { 4*PT_A0, "4*PT_A0" },
2627 { 4*PT_A1, "4*PT_A1" },
2628 { 4*PT_A2, "4*PT_A2" },
2629 { 4*PT_A3, "4*PT_A3" },
2630 { 4*PT_A4, "4*PT_A4" },
2631 { 4*PT_A5, "4*PT_A5" },
2632 { 4*PT_A6, "4*PT_A6" },
2633 { 4*PT_D0, "4*PT_D0" },
2634 { 4*PT_USP, "4*PT_USP" },
2635 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2636 { 4*PT_SR, "4*PT_SR" },
2637 { 4*PT_PC, "4*PT_PC" },
2641 { 4*REG_REG0, "4*REG_REG0" },
2642 { 4*(REG_REG0+1), "4*REG_REG1" },
2643 { 4*(REG_REG0+2), "4*REG_REG2" },
2644 { 4*(REG_REG0+3), "4*REG_REG3" },
2645 { 4*(REG_REG0+4), "4*REG_REG4" },
2646 { 4*(REG_REG0+5), "4*REG_REG5" },
2647 { 4*(REG_REG0+6), "4*REG_REG6" },
2648 { 4*(REG_REG0+7), "4*REG_REG7" },
2649 { 4*(REG_REG0+8), "4*REG_REG8" },
2650 { 4*(REG_REG0+9), "4*REG_REG9" },
2651 { 4*(REG_REG0+10), "4*REG_REG10" },
2652 { 4*(REG_REG0+11), "4*REG_REG11" },
2653 { 4*(REG_REG0+12), "4*REG_REG12" },
2654 { 4*(REG_REG0+13), "4*REG_REG13" },
2655 { 4*(REG_REG0+14), "4*REG_REG14" },
2656 { 4*REG_REG15, "4*REG_REG15" },
2657 { 4*REG_PC, "4*REG_PC" },
2658 { 4*REG_PR, "4*REG_PR" },
2659 { 4*REG_SR, "4*REG_SR" },
2660 { 4*REG_GBR, "4*REG_GBR" },
2661 { 4*REG_MACH, "4*REG_MACH" },
2662 { 4*REG_MACL, "4*REG_MACL" },
2663 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2664 { 4*REG_FPUL, "4*REG_FPUL" },
2665 { 4*REG_FPREG0, "4*REG_FPREG0" },
2666 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2667 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2668 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2669 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2670 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2671 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2672 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2673 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2674 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2675 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2676 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2677 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2678 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2679 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2680 { 4*REG_FPREG15, "4*REG_FPREG15" },
2682 { 4*REG_XDREG0, "4*REG_XDREG0" },
2683 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2684 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2685 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2686 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2687 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2688 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2689 { 4*REG_XDREG14, "4*REG_XDREG14" },
2691 { 4*REG_FPSCR, "4*REG_FPSCR" },
2698 { 16, "syscall no.(L)" },
2699 { 20, "syscall_no.(U)" },
2842 /* This entry is in case pt_regs contains dregs (depends on
2843 the kernel build options). */
2844 { uoff(regs), "offsetof(struct user, regs)" },
2845 { uoff(fpu), "offsetof(struct user, fpu)" },
2848 { uoff(regs.ARM_r0), "r0" },
2849 { uoff(regs.ARM_r1), "r1" },
2850 { uoff(regs.ARM_r2), "r2" },
2851 { uoff(regs.ARM_r3), "r3" },
2852 { uoff(regs.ARM_r4), "r4" },
2853 { uoff(regs.ARM_r5), "r5" },
2854 { uoff(regs.ARM_r6), "r6" },
2855 { uoff(regs.ARM_r7), "r7" },
2856 { uoff(regs.ARM_r8), "r8" },
2857 { uoff(regs.ARM_r9), "r9" },
2858 { uoff(regs.ARM_r10), "r10" },
2859 { uoff(regs.ARM_fp), "fp" },
2860 { uoff(regs.ARM_ip), "ip" },
2861 { uoff(regs.ARM_sp), "sp" },
2862 { uoff(regs.ARM_lr), "lr" },
2863 { uoff(regs.ARM_pc), "pc" },
2864 { uoff(regs.ARM_cpsr), "cpsr" },
2867 #if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64)
2868 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
2870 #if defined(I386) || defined(X86_64)
2871 { uoff(i387), "offsetof(struct user, i387)" },
2874 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
2877 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
2878 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
2879 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
2880 #if !defined(SPARC64)
2881 { uoff(start_code), "offsetof(struct user, start_code)" },
2884 { uoff(start_data), "offsetof(struct user, start_data)" },
2886 #if !defined(SPARC64)
2887 { uoff(start_stack), "offsetof(struct user, start_stack)" },
2889 { uoff(signal), "offsetof(struct user, signal)" },
2890 #if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
2891 { uoff(reserved), "offsetof(struct user, reserved)" },
2893 #if !defined(SPARC64)
2894 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2896 #if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64)
2897 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
2899 { uoff(magic), "offsetof(struct user, magic)" },
2900 { uoff(u_comm), "offsetof(struct user, u_comm)" },
2901 #if defined(I386) || defined(X86_64)
2902 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
2906 #endif /* !POWERPC/!SPARC */
2909 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
2910 { uoff(u_procp), "offsetof(struct user, u_procp)" },
2911 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
2912 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
2913 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
2914 { uoff(u_ap), "offsetof(struct user, u_ap)" },
2915 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
2916 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
2917 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
2918 { uoff(u_error), "offsetof(struct user, u_error)" },
2919 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
2920 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
2921 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
2922 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
2923 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
2924 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
2925 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
2926 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
2927 { uoff(u_code), "offsetof(struct user, u_code)" },
2928 { uoff(u_addr), "offsetof(struct user, u_addr)" },
2929 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
2930 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
2931 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
2932 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
2933 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
2934 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
2935 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
2936 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
2937 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
2938 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
2939 { uoff(u_ru), "offsetof(struct user, u_ru)" },
2940 { uoff(u_cru), "offsetof(struct user, u_cru)" },
2941 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
2942 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
2943 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
2944 { uoff(u_start), "offsetof(struct user, u_start)" },
2945 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
2946 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
2947 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
2948 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
2949 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
2950 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
2951 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
2952 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
2953 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
2956 { sizeof(struct user), "sizeof(struct user)" },
2966 const struct xlat *x;
2969 if (entering(tcp)) {
2970 printxval(ptrace_cmds, tcp->u_arg[0],
2977 tprintf(", %lu, ", tcp->u_arg[1]);
2978 addr = tcp->u_arg[2];
2980 if (tcp->u_arg[0] == PTRACE_PEEKUSER
2981 || tcp->u_arg[0] == PTRACE_POKEUSER) {
2982 for (x = struct_user_offsets; x->str; x++) {
2987 tprintf("%#lx, ", addr);
2988 else if (x->val > addr && x != struct_user_offsets) {
2990 tprintf("%s + %ld, ", x->str, addr - x->val);
2993 tprintf("%s, ", x->str);
2997 tprintf("%#lx, ", tcp->u_arg[2]);
2999 switch (tcp->u_arg[0]) {
3000 case PTRACE_PEEKDATA:
3001 case PTRACE_PEEKTEXT:
3002 case PTRACE_PEEKUSER:
3005 case PTRACE_SINGLESTEP:
3006 case PTRACE_SYSCALL:
3008 printsignal(tcp->u_arg[3]);
3011 tprintf("%#lx", tcp->u_arg[3]);
3015 switch (tcp->u_arg[0]) {
3016 case PTRACE_PEEKDATA:
3017 case PTRACE_PEEKTEXT:
3018 case PTRACE_PEEKUSER:
3019 printnum(tcp, tcp->u_arg[3], "%#lx");
3025 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3026 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3027 tprintf("%lu, ", tcp->u_arg[3]);
3028 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3029 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3030 tcp->u_arg[0] != PTRACE_READTEXT) {
3031 tprintf("%#lx", tcp->u_arg[3]);
3034 if (tcp->u_arg[0] == PTRACE_READDATA ||
3035 tcp->u_arg[0] == PTRACE_READTEXT) {
3036 tprintf("%lu, ", tcp->u_arg[3]);
3037 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3042 tprintf("%lu", tcp->u_arg[3]);
3044 #endif /* FREEBSD */
3051 static const struct xlat futexops[] = {
3052 { FUTEX_WAIT, "FUTEX_WAIT" },
3053 { FUTEX_WAKE, "FUTEX_WAKE" },
3054 { FUTEX_FD, "FUTEX_FD" },
3055 { FUTEX_REQUEUE,"FUTEX_REQUEUE" },
3063 if (entering(tcp)) {
3064 tprintf("%p, ", (void *) tcp->u_arg[0]);
3065 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3066 tprintf(", %ld", tcp->u_arg[2]);
3067 if (tcp->u_arg[1] == FUTEX_WAIT) {
3069 printtv(tcp, tcp->u_arg[3]);
3070 } else if (tcp->u_arg[1] == FUTEX_REQUEUE)
3071 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3077 print_affinitylist(tcp, list, len)
3084 while (len >= sizeof (unsigned long)) {
3086 umove(tcp, list, &w);
3087 tprintf("%s %lx", first ? "" : ",", w);
3089 len -= sizeof (unsigned long);
3090 list += sizeof(unsigned long);
3096 sys_sched_setaffinity(tcp)
3099 if (entering(tcp)) {
3100 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3101 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3107 sys_sched_getaffinity(tcp)
3110 if (entering(tcp)) {
3111 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3113 if (tcp->u_rval == -1)
3114 tprintf("%#lx", tcp->u_arg[2]);
3116 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3121 static const struct xlat schedulers[] = {
3122 { SCHED_OTHER, "SCHED_OTHER" },
3123 { SCHED_RR, "SCHED_RR" },
3124 { SCHED_FIFO, "SCHED_FIFO" },
3129 sys_sched_getscheduler(tcp)
3132 if (entering(tcp)) {
3133 tprintf("%d", (int) tcp->u_arg[0]);
3134 } else if (! syserror(tcp)) {
3135 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3136 if (tcp->auxstr != NULL)
3143 sys_sched_setscheduler(tcp)
3146 if (entering(tcp)) {
3147 struct sched_param p;
3148 tprintf("%d, ", (int) tcp->u_arg[0]);
3149 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3150 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3151 tprintf(", %#lx", tcp->u_arg[2]);
3153 tprintf(", { %d }", p.__sched_priority);
3159 sys_sched_getparam(tcp)
3162 if (entering(tcp)) {
3163 tprintf("%d, ", (int) tcp->u_arg[0]);
3165 struct sched_param p;
3166 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3167 tprintf("%#lx", tcp->u_arg[1]);
3169 tprintf("{ %d }", p.__sched_priority);
3175 sys_sched_setparam(tcp)
3178 if (entering(tcp)) {
3179 struct sched_param p;
3180 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3181 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3183 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3189 sys_sched_get_priority_min(tcp)
3192 if (entering(tcp)) {
3193 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3199 #include <asm/prctl.h>
3201 static const struct xlat archvals[] = {
3202 { ARCH_SET_GS, "ARCH_SET_GS" },
3203 { ARCH_SET_FS, "ARCH_SET_FS" },
3204 { ARCH_GET_FS, "ARCH_GET_FS" },
3205 { ARCH_GET_GS, "ARCH_GET_GS" },
3213 if (entering(tcp)) {
3214 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3215 if (tcp->u_arg[0] == ARCH_SET_GS
3216 || tcp->u_arg[0] == ARCH_SET_FS)
3217 tprintf(", %#lx", tcp->u_arg[1]);
3219 if (tcp->u_arg[0] == ARCH_GET_GS
3220 || tcp->u_arg[0] == ARCH_GET_FS) {
3222 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3223 tprintf(", [%#lx]", v);
3225 tprintf(", %#lx", tcp->u_arg[1]);