X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=process.c;h=2c619e7fe9abed81199097b42fa6c75c42f99d05;hb=7a0fb3838629aa53fa4c6b21a1cc11f67a1090df;hp=621cad8e3254d02ace3075271521439b77edad03;hpb=72879c6a35cd5afa7f58ee7bc32e4dcd8e65bd9a;p=strace diff --git a/process.c b/process.c index 621cad8e..2c619e7f 100644 --- a/process.c +++ b/process.c @@ -8,7 +8,6 @@ * * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH * port by Greg Banks - * * All rights reserved. * @@ -33,21 +32,18 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ */ #include "defs.h" - #include #include -#include #include #include #include #include -#include -#include +#ifdef HAVE_ELF_H +# include +#endif #ifdef HAVE_SYS_REG_H # include @@ -163,6 +159,7 @@ static const struct xlat prctl_options[] = { #ifdef PR_PTHREADEXIT { PR_PTHREADEXIT, "PR_PTHREADEXIT" }, #endif + #ifdef PR_SET_PDEATHSIG { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" }, #endif @@ -223,6 +220,12 @@ static const struct xlat prctl_options[] = { #ifdef PR_SET_SECCOMP { PR_SET_SECCOMP, "PR_SET_SECCOMP" }, #endif +#ifdef PR_CAPBSET_READ + { PR_CAPBSET_READ, "PR_CAPBSET_READ" }, +#endif +#ifdef PR_CAPBSET_DROP + { PR_CAPBSET_DROP, "PR_CAPBSET_DROP" }, +#endif #ifdef PR_GET_TSC { PR_GET_TSC, "PR_GET_TSC" }, #endif @@ -234,6 +237,45 @@ static const struct xlat prctl_options[] = { #endif #ifdef PR_SET_SECUREBITS { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" }, +#endif +#ifdef PR_SET_TIMERSLACK + { PR_SET_TIMERSLACK, "PR_SET_TIMERSLACK" }, +#endif +#ifdef PR_GET_TIMERSLACK + { PR_GET_TIMERSLACK, "PR_GET_TIMERSLACK" }, +#endif +#ifdef PR_TASK_PERF_EVENTS_DISABLE + { PR_TASK_PERF_EVENTS_DISABLE, "PR_TASK_PERF_EVENTS_DISABLE" }, +#endif +#ifdef PR_TASK_PERF_EVENTS_ENABLE + { PR_TASK_PERF_EVENTS_ENABLE, "PR_TASK_PERF_EVENTS_ENABLE" }, +#endif +#ifdef PR_MCE_KILL + { PR_MCE_KILL, "PR_MCE_KILL" }, +#endif +#ifdef PR_MCE_KILL_GET + { PR_MCE_KILL_GET, "PR_MCE_KILL_GET" }, +#endif +#ifdef PR_SET_MM + { PR_SET_MM, "PR_SET_MM" }, +#endif +#ifdef PR_SET_PTRACER + { PR_SET_PTRACER, "PR_SET_PTRACER" }, +#endif +#ifdef PR_SET_CHILD_SUBREAPER + { PR_SET_CHILD_SUBREAPER, "PR_SET_CHILD_SUBREAPER" }, +#endif +#ifdef PR_GET_CHILD_SUBREAPER + { PR_GET_CHILD_SUBREAPER, "PR_GET_CHILD_SUBREAPER" }, +#endif +#ifdef PR_SET_NO_NEW_PRIVS + { PR_SET_NO_NEW_PRIVS, "PR_SET_NO_NEW_PRIVS" }, +#endif +#ifdef PR_GET_NO_NEW_PRIVS + { PR_GET_NO_NEW_PRIVS, "PR_GET_NO_NEW_PRIVS" }, +#endif +#ifdef PR_GET_TID_ADDRESS + { PR_GET_TID_ADDRESS, "PR_GET_TID_ADDRESS" }, #endif { 0, NULL }, }; @@ -309,7 +351,7 @@ sys_prctl(struct tcb *tcp) break; #endif default: - for (i = 1; i < tcp->u_nargs; i++) + for (i = 1; i < tcp->s_ent->nargs; i++) tprintf(", %#lx", tcp->u_arg[i]); break; } @@ -392,7 +434,7 @@ sys_exit(struct tcb *tcp) tprintf("%ld) ", tcp->u_arg[0]); tabto(); tprints("= ?\n"); - printing_tcp = NULL; + line_ended(); return 0; } @@ -425,66 +467,67 @@ sys_exit(struct tcb *tcp) #define CLONE_IO 0x80000000 /* Clone io context */ static const struct xlat clone_flags[] = { - { CLONE_VM, "CLONE_VM" }, - { CLONE_FS, "CLONE_FS" }, - { CLONE_FILES, "CLONE_FILES" }, - { CLONE_SIGHAND, "CLONE_SIGHAND" }, - { CLONE_IDLETASK, "CLONE_IDLETASK"}, - { CLONE_PTRACE, "CLONE_PTRACE" }, - { CLONE_VFORK, "CLONE_VFORK" }, - { CLONE_PARENT, "CLONE_PARENT" }, - { CLONE_THREAD, "CLONE_THREAD" }, - { CLONE_NEWNS, "CLONE_NEWNS" }, - { CLONE_SYSVSEM, "CLONE_SYSVSEM" }, - { CLONE_SETTLS, "CLONE_SETTLS" }, - { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" }, - { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" }, - { CLONE_UNTRACED, "CLONE_UNTRACED" }, - { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" }, - { CLONE_STOPPED, "CLONE_STOPPED" }, - { CLONE_NEWUTS, "CLONE_NEWUTS" }, - { CLONE_NEWIPC, "CLONE_NEWIPC" }, - { CLONE_NEWUSER, "CLONE_NEWUSER" }, - { CLONE_NEWPID, "CLONE_NEWPID" }, - { CLONE_NEWNET, "CLONE_NEWNET" }, - { CLONE_IO, "CLONE_IO" }, - { 0, NULL }, + { CLONE_VM, "CLONE_VM" }, + { CLONE_FS, "CLONE_FS" }, + { CLONE_FILES, "CLONE_FILES" }, + { CLONE_SIGHAND, "CLONE_SIGHAND" }, + { CLONE_IDLETASK, "CLONE_IDLETASK" }, + { CLONE_PTRACE, "CLONE_PTRACE" }, + { CLONE_VFORK, "CLONE_VFORK" }, + { CLONE_PARENT, "CLONE_PARENT" }, + { CLONE_THREAD, "CLONE_THREAD" }, + { CLONE_NEWNS, "CLONE_NEWNS" }, + { CLONE_SYSVSEM, "CLONE_SYSVSEM" }, + { CLONE_SETTLS, "CLONE_SETTLS" }, + { CLONE_PARENT_SETTID, "CLONE_PARENT_SETTID" }, + { CLONE_CHILD_CLEARTID, "CLONE_CHILD_CLEARTID" }, + { CLONE_UNTRACED, "CLONE_UNTRACED" }, + { CLONE_CHILD_SETTID, "CLONE_CHILD_SETTID" }, + { CLONE_STOPPED, "CLONE_STOPPED" }, + { CLONE_NEWUTS, "CLONE_NEWUTS" }, + { CLONE_NEWIPC, "CLONE_NEWIPC" }, + { CLONE_NEWUSER, "CLONE_NEWUSER" }, + { CLONE_NEWPID, "CLONE_NEWPID" }, + { CLONE_NEWNET, "CLONE_NEWNET" }, + { CLONE_IO, "CLONE_IO" }, + { 0, NULL }, }; -# ifdef I386 -# include -# ifdef HAVE_STRUCT_USER_DESC -# define modify_ldt_ldt_s user_desc -# endif +#ifdef I386 +# include +# ifdef HAVE_STRUCT_USER_DESC +# define modify_ldt_ldt_s user_desc +# endif extern void print_ldt_entry(); -# endif +#endif -# if defined IA64 -# define ARG_FLAGS 0 -# define ARG_STACK 1 -# define ARG_STACKSIZE (tcp->scno == SYS_clone2 ? 2 : -1) -# define ARG_PTID (tcp->scno == SYS_clone2 ? 3 : 2) -# define ARG_CTID (tcp->scno == SYS_clone2 ? 4 : 3) -# define ARG_TLS (tcp->scno == SYS_clone2 ? 5 : 4) -# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32 -# define ARG_STACK 0 -# define ARG_FLAGS 1 -# define ARG_PTID 2 -# define ARG_CTID 3 -# define ARG_TLS 4 -# elif defined X86_64 || defined ALPHA -# define ARG_FLAGS 0 -# define ARG_STACK 1 -# define ARG_PTID 2 -# define ARG_CTID 3 -# define ARG_TLS 4 -# else -# define ARG_FLAGS 0 -# define ARG_STACK 1 -# define ARG_PTID 2 -# define ARG_TLS 3 -# define ARG_CTID 4 -# endif +#if defined IA64 +# define ARG_FLAGS 0 +# define ARG_STACK 1 +# define ARG_STACKSIZE (tcp->scno == SYS_clone2 ? 2 : -1) +# define ARG_PTID (tcp->scno == SYS_clone2 ? 3 : 2) +# define ARG_CTID (tcp->scno == SYS_clone2 ? 4 : 3) +# define ARG_TLS (tcp->scno == SYS_clone2 ? 5 : 4) +#elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32 +# define ARG_STACK 0 +# define ARG_FLAGS 1 +# define ARG_PTID 2 +# define ARG_CTID 3 +# define ARG_TLS 4 +#elif defined X86_64 || defined X32 || defined ALPHA || defined TILE \ + || defined OR1K +# define ARG_FLAGS 0 +# define ARG_STACK 1 +# define ARG_PTID 2 +# define ARG_CTID 3 +# define ARG_TLS 4 +#else +# define ARG_FLAGS 0 +# define ARG_STACK 1 +# define ARG_PTID 2 +# define ARG_TLS 3 +# define ARG_CTID 4 +#endif int sys_clone(struct tcb *tcp) @@ -493,11 +536,11 @@ sys_clone(struct tcb *tcp) const char *sep = "|"; unsigned long flags = tcp->u_arg[ARG_FLAGS]; tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]); -# ifdef ARG_STACKSIZE +#ifdef ARG_STACKSIZE if (ARG_STACKSIZE != -1) tprintf("stack_size=%#lx, ", tcp->u_arg[ARG_STACKSIZE]); -# endif +#endif tprints("flags="); if (!printflags(clone_flags, flags &~ CSIGNAL, NULL)) sep = ""; @@ -509,7 +552,7 @@ sys_clone(struct tcb *tcp) if (flags & CLONE_PARENT_SETTID) tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]); if (flags & CLONE_SETTLS) { -# ifdef I386 +#ifdef I386 struct modify_ldt_ldt_s copy; if (umove(tcp, tcp->u_arg[ARG_TLS], ©) != -1) { tprintf(", {entry_number:%d, ", @@ -520,7 +563,7 @@ sys_clone(struct tcb *tcp) print_ldt_entry(©); } else -# endif +#endif tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]); } if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID)) @@ -545,148 +588,6 @@ sys_fork(struct tcb *tcp) return 0; } -int -change_syscall(struct tcb *tcp, int new) -{ -#if defined(I386) - /* Attempt to make vfork into fork, which we can follow. */ - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0) - return -1; - return 0; -#elif defined(X86_64) - /* Attempt to make vfork into fork, which we can follow. */ - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0) - return -1; - return 0; -#elif defined(POWERPC) - if (ptrace(PTRACE_POKEUSER, tcp->pid, - (char*)(sizeof(unsigned long)*PT_R0), new) < 0) - return -1; - return 0; -#elif defined(S390) || defined(S390X) - /* s390 linux after 2.4.7 has a hook in entry.S to allow this */ - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new) < 0) - return -1; - return 0; -#elif defined(M68K) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new) < 0) - return -1; - return 0; -#elif defined(SPARC) || defined(SPARC64) - struct pt_regs regs; - if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)®s, 0) < 0) - return -1; - regs.u_regs[U_REG_G1] = new; - if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)®s, 0) < 0) - return -1; - return 0; -#elif defined(MIPS) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new) < 0) - return -1; - return 0; -#elif defined(ALPHA) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new) < 0) - return -1; - return 0; -#elif defined(AVR32) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0) - return -1; - return 0; -#elif defined(BFIN) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new) < 0) - return -1; - return 0; -#elif defined(IA64) - if (ia32) { - switch (new) { - case 2: - break; /* x86 SYS_fork */ - case SYS_clone: - new = 120; - break; - default: - fprintf(stderr, "%s: unexpected syscall %d\n", - __FUNCTION__, new); - return -1; - } - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0) - return -1; - } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new) < 0) - return -1; - return 0; -#elif defined(HPPA) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new) < 0) - return -1; - return 0; -#elif defined(SH) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0) - return -1; - return 0; -#elif defined(SH64) - /* Top half of reg encodes the no. of args n as 0x1n. - Assume 0 args as kernel never actually checks... */ - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL), - 0x100000 | new) < 0) - return -1; - return 0; -#elif defined(CRISV10) || defined(CRISV32) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0) - return -1; - return 0; -#elif defined(ARM) - /* Some kernels support this, some (pre-2.6.16 or so) don't. */ -# ifndef PTRACE_SET_SYSCALL -# define PTRACE_SET_SYSCALL 23 -# endif - - if (ptrace(PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0) - return -1; - - return 0; -#elif defined(TILE) - if (ptrace(PTRACE_POKEUSER, tcp->pid, - (char*)PTREGS_OFFSET_REG(0), - new) != 0) - return -1; - return 0; -#elif defined(MICROBLAZE) - if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new) < 0) - return -1; - return 0; -#else -#warning Do not know how to handle change_syscall for this architecture -#endif /* architecture */ - return -1; -} - -int -internal_fork(struct tcb *tcp) -{ - if ((ptrace_setoptions - & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK)) - == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK)) - return 0; - - if (!followfork) - return 0; - - if (entering(tcp)) { - /* - * We won't see the new child if clone is called with - * CLONE_UNTRACED, so we keep the same logic with that option - * and don't trace it. - */ - if ((sysent[tcp->scno].sys_func == sys_clone) && - (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED)) - return 0; - setbpt(tcp); - } else { - if (tcp->flags & TCB_BPTSET) - clearbpt(tcp); - } - return 0; -} - int sys_vfork(struct tcb *tcp) { @@ -1007,21 +908,21 @@ printargv(struct tcb *tcp, long addr) } cp; const char *sep; int n = 0; + unsigned wordsize = current_wordsize; cp.p64 = 1; for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) { - if (umoven(tcp, addr, personality_wordsize[current_personality], - cp.data) < 0) { + if (umoven(tcp, addr, wordsize, cp.data) < 0) { tprintf("%#lx", addr); return; } - if (personality_wordsize[current_personality] == 4) + if (wordsize == 4) cp.p64 = cp.p32; if (cp.p64 == 0) break; tprints(sep); printstr(tcp, cp.p64, -1); - addr += personality_wordsize[current_personality]; + addr += wordsize; } if (cp.p64) tprintf("%s...", sep); @@ -1082,21 +983,6 @@ sys_execve(struct tcb *tcp) return 0; } -#if defined(TCB_WAITEXECVE) -int -internal_exec(struct tcb *tcp) -{ - if (exiting(tcp) && syserror(tcp)) - tcp->flags &= ~TCB_WAITEXECVE; - else { - /* Maybe we have post-execve SIGTRAP suppressed? */ - if (!(ptrace_setoptions & PTRACE_O_TRACEEXEC)) - tcp->flags |= TCB_WAITEXECVE; /* no */ - } - return 0; -} -#endif - #ifndef __WNOTHREAD #define __WNOTHREAD 0x20000000 #endif @@ -1146,14 +1032,13 @@ static const struct xlat wait4_options[] = { # define WCOREFLAG 0x80 #endif #ifndef WCOREDUMP -# define WCOREDUMP(status) ((status) & 0200) +# define WCOREDUMP(status) ((status) & 0200) #endif - #ifndef W_STOPCODE -#define W_STOPCODE(sig) ((sig) << 8 | 0x7f) +# define W_STOPCODE(sig) ((sig) << 8 | 0x7f) #endif #ifndef W_EXITCODE -#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig)) +# define W_EXITCODE(ret, sig) ((ret) << 8 | (sig)) #endif static int @@ -1291,26 +1176,17 @@ static const struct xlat waitid_types[] = { int sys_waitid(struct tcb *tcp) { - siginfo_t si; - if (entering(tcp)) { printxval(waitid_types, tcp->u_arg[0], "P_???"); tprintf(", %ld, ", tcp->u_arg[1]); } else { /* siginfo */ - if (!tcp->u_arg[2]) - tprints("NULL"); - else if (syserror(tcp)) - tprintf("%#lx", tcp->u_arg[2]); - else if (umove(tcp, tcp->u_arg[2], &si) < 0) - tprints("{???}"); - else - printsiginfo(&si, verbose(tcp)); + printsiginfo_at(tcp, tcp->u_arg[2]); /* options */ tprints(", "); printflags(wait4_options, tcp->u_arg[3], "W???"); - if (tcp->u_nargs > 4) { + if (tcp->s_ent->nargs > 4) { /* usage */ tprints(", "); if (!tcp->u_arg[4]) @@ -1335,13 +1211,12 @@ sys_uname(struct tcb *tcp) else if (umove(tcp, tcp->u_arg[0], &uname) < 0) tprints("{...}"); else if (!abbrev(tcp)) { - tprintf("{sysname=\"%s\", nodename=\"%s\", ", uname.sysname, uname.nodename); tprintf("release=\"%s\", version=\"%s\", ", uname.release, uname.version); tprintf("machine=\"%s\"", uname.machine); -#ifndef __GLIBC__ +#ifdef HAVE_STRUCT_UTSNAME_DOMAINNAME tprintf(", domainname=\"%s\"", uname.domainname); #endif tprints("}"); @@ -1366,94 +1241,169 @@ static const struct xlat ptrace_cmds[] = { { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" }, { PTRACE_ATTACH, "PTRACE_ATTACH" }, { PTRACE_DETACH, "PTRACE_DETACH" }, -# ifdef PTRACE_GETREGS +#ifdef PTRACE_GETREGS { PTRACE_GETREGS, "PTRACE_GETREGS" }, -# endif -# ifdef PTRACE_SETREGS +#endif +#ifdef PTRACE_SETREGS { PTRACE_SETREGS, "PTRACE_SETREGS" }, -# endif -# ifdef PTRACE_GETFPREGS +#endif +#ifdef PTRACE_GETFPREGS { PTRACE_GETFPREGS, "PTRACE_GETFPREGS" }, -# endif -# ifdef PTRACE_SETFPREGS +#endif +#ifdef PTRACE_SETFPREGS { PTRACE_SETFPREGS, "PTRACE_SETFPREGS" }, -# endif -# ifdef PTRACE_GETFPXREGS +#endif +#ifdef PTRACE_GETFPXREGS { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS" }, -# endif -# ifdef PTRACE_SETFPXREGS +#endif +#ifdef PTRACE_SETFPXREGS { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS" }, -# endif -# ifdef PTRACE_GETVRREGS +#endif +#ifdef PTRACE_GETVRREGS { PTRACE_GETVRREGS, "PTRACE_GETVRREGS" }, -# endif -# ifdef PTRACE_SETVRREGS +#endif +#ifdef PTRACE_SETVRREGS { PTRACE_SETVRREGS, "PTRACE_SETVRREGS" }, -# endif -# ifdef PTRACE_SETOPTIONS +#endif +#ifdef PTRACE_SETOPTIONS { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS" }, -# endif -# ifdef PTRACE_GETEVENTMSG +#endif +#ifdef PTRACE_GETEVENTMSG { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG" }, -# endif -# ifdef PTRACE_GETSIGINFO +#endif +#ifdef PTRACE_GETSIGINFO { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO" }, -# endif -# ifdef PTRACE_SETSIGINFO +#endif +#ifdef PTRACE_SETSIGINFO { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO" }, -# endif -# ifdef PTRACE_GETREGSET +#endif +#ifdef PTRACE_GETREGSET { PTRACE_GETREGSET, "PTRACE_GETREGSET" }, -# endif -# ifdef PTRACE_SETREGSET +#endif +#ifdef PTRACE_SETREGSET { PTRACE_SETREGSET, "PTRACE_SETREGSET" }, -# endif -# ifdef PTRACE_SET_SYSCALL +#endif +#ifdef PTRACE_SET_SYSCALL { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL" }, -# endif -# ifdef PTRACE_SEIZE +#endif +#ifdef PTRACE_SEIZE { PTRACE_SEIZE, "PTRACE_SEIZE" }, -# endif -# ifdef PTRACE_INTERRUPT +#endif +#ifdef PTRACE_INTERRUPT { PTRACE_INTERRUPT, "PTRACE_INTERRUPT" }, -# endif -# ifdef PTRACE_LISTEN +#endif +#ifdef PTRACE_LISTEN { PTRACE_LISTEN, "PTRACE_LISTEN" }, -# endif +#endif { PTRACE_SYSCALL, "PTRACE_SYSCALL" }, { 0, NULL }, }; -# ifdef PTRACE_SETOPTIONS +#ifdef PTRACE_SETOPTIONS static const struct xlat ptrace_setoptions_flags[] = { -# ifdef PTRACE_O_TRACESYSGOOD +# ifdef PTRACE_O_TRACESYSGOOD { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" }, -# endif -# ifdef PTRACE_O_TRACEFORK +# endif +# ifdef PTRACE_O_TRACEFORK { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" }, -# endif -# ifdef PTRACE_O_TRACEVFORK +# endif +# ifdef PTRACE_O_TRACEVFORK { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" }, -# endif -# ifdef PTRACE_O_TRACECLONE +# endif +# ifdef PTRACE_O_TRACECLONE { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" }, -# endif -# ifdef PTRACE_O_TRACEEXEC +# endif +# ifdef PTRACE_O_TRACEEXEC { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" }, -# endif -# ifdef PTRACE_O_TRACEVFORKDONE +# endif +# ifdef PTRACE_O_TRACEVFORKDONE { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"}, -# endif -# ifdef PTRACE_O_TRACEEXIT +# endif +# ifdef PTRACE_O_TRACEEXIT { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" }, -# endif +# endif { 0, NULL }, }; -# endif /* PTRACE_SETOPTIONS */ +#endif /* PTRACE_SETOPTIONS */ + +static const struct xlat nt_descriptor_types[] = { +#ifdef NT_PRSTATUS + { NT_PRSTATUS, "NT_PRSTATUS" }, +#endif +#ifdef NT_FPREGSET + { NT_FPREGSET, "NT_FPREGSET" }, +#endif +#ifdef NT_PRPSINFO + { NT_PRPSINFO, "NT_PRPSINFO" }, +#endif +#ifdef NT_PRXREG + { NT_PRXREG, "NT_PRXREG" }, +#endif +#ifdef NT_TASKSTRUCT + { NT_TASKSTRUCT, "NT_TASKSTRUCT" }, +#endif +#ifdef NT_PLATFORM + { NT_PLATFORM, "NT_PLATFORM" }, +#endif +#ifdef NT_AUXV + { NT_AUXV, "NT_AUXV" }, +#endif +#ifdef NT_GWINDOWS + { NT_GWINDOWS, "NT_GWINDOWS" }, +#endif +#ifdef NT_ASRS + { NT_ASRS, "NT_ASRS" }, +#endif +#ifdef NT_PSTATUS + { NT_PSTATUS, "NT_PSTATUS" }, +#endif +#ifdef NT_PSINFO + { NT_PSINFO, "NT_PSINFO" }, +#endif +#ifdef NT_PRCRED + { NT_PRCRED, "NT_PRCRED" }, +#endif +#ifdef NT_UTSNAME + { NT_UTSNAME, "NT_UTSNAME" }, +#endif +#ifdef NT_LWPSTATUS + { NT_LWPSTATUS, "NT_LWPSTATUS" }, +#endif +#ifdef NT_LWPSINFO + { NT_LWPSINFO, "NT_LWPSINFO" }, +#endif +#ifdef NT_PRFPXREG + { NT_PRFPXREG, "NT_PRFPXREG" }, +#endif +#ifdef NT_PRXFPREG + { NT_PRXFPREG, "NT_PRXFPREG" }, +#endif +#ifdef NT_PPC_VMX + { NT_PPC_VMX, "NT_PPC_VMX" }, +#endif +#ifdef NT_PPC_SPE + { NT_PPC_SPE, "NT_PPC_SPE" }, +#endif +#ifdef NT_PPC_VSX + { NT_PPC_VSX, "NT_PPC_VSX" }, +#endif +#ifdef NT_386_TLS + { NT_386_TLS, "NT_386_TLS" }, +#endif +#ifdef NT_386_IOPERM + { NT_386_IOPERM, "NT_386_IOPERM" }, +#endif +#ifdef NT_X86_XSTATE + { NT_X86_XSTATE, "NT_X86_XSTATE" }, +#endif + { 0, NULL }, +}; + +#define uoff(member) offsetof(struct user, member) const struct xlat struct_user_offsets[] = { -# if defined(S390) || defined(S390X) +#if defined(S390) || defined(S390X) { PT_PSWMASK, "psw_mask" }, { PT_PSWADDR, "psw_addr" }, { PT_GPR0, "gpr0" }, @@ -1490,7 +1440,7 @@ const struct xlat struct_user_offsets[] = { { PT_ACR15, "acr15" }, { PT_ORIGGPR2, "orig_gpr2" }, { PT_FPC, "fpc" }, -# if defined(S390) +#if defined(S390) { PT_FPR0_HI, "fpr0.hi" }, { PT_FPR0_LO, "fpr0.lo" }, { PT_FPR1_HI, "fpr1.hi" }, @@ -1523,8 +1473,8 @@ const struct xlat struct_user_offsets[] = { { PT_FPR14_LO, "fpr14.lo" }, { PT_FPR15_HI, "fpr15.hi" }, { PT_FPR15_LO, "fpr15.lo" }, -# endif -# if defined(S390X) +#endif +#if defined(S390X) { PT_FPR0, "fpr0" }, { PT_FPR1, "fpr1" }, { PT_FPR2, "fpr2" }, @@ -1541,20 +1491,20 @@ const struct xlat struct_user_offsets[] = { { PT_FPR13, "fpr13" }, { PT_FPR14, "fpr14" }, { PT_FPR15, "fpr15" }, -# endif +#endif { PT_CR_9, "cr9" }, { PT_CR_10, "cr10" }, { PT_CR_11, "cr11" }, { PT_IEEE_IP, "ieee_exception_ip" }, -# elif defined(SPARC) +#elif defined(SPARC) /* XXX No support for these offsets yet. */ -# elif defined(HPPA) +#elif defined(HPPA) /* XXX No support for these offsets yet. */ -# elif defined(POWERPC) -# ifndef PT_ORIG_R3 -# define PT_ORIG_R3 34 -# endif -# define REGSIZE (sizeof(unsigned long)) +#elif defined(POWERPC) +# ifndef PT_ORIG_R3 +# define PT_ORIG_R3 34 +# endif +# define REGSIZE (sizeof(unsigned long)) { REGSIZE*PT_R0, "r0" }, { REGSIZE*PT_R1, "r1" }, { REGSIZE*PT_R2, "r2" }, @@ -1595,8 +1545,8 @@ const struct xlat struct_user_offsets[] = { { REGSIZE*PT_XER, "XER" }, { REGSIZE*PT_CCR, "CCR" }, { REGSIZE*PT_FPR0, "FPR0" }, -# undef REGSIZE -# elif defined(ALPHA) +# undef REGSIZE +#elif defined(ALPHA) { 0, "r0" }, { 1, "r1" }, { 2, "r2" }, @@ -1662,7 +1612,7 @@ const struct xlat struct_user_offsets[] = { { 62, "fp30" }, { 63, "fp31" }, { 64, "pc" }, -# elif defined(IA64) +#elif defined(IA64) { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" }, { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" }, { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" }, @@ -1727,14 +1677,14 @@ const struct xlat struct_user_offsets[] = { { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" }, { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" }, { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" }, -# ifdef PT_AR_CSD +# ifdef PT_AR_CSD { PT_AR_CSD, "ar.csd" }, -# endif -# ifdef PT_AR_SSD +# endif +# ifdef PT_AR_SSD { PT_AR_SSD, "ar.ssd" }, -# endif +# endif { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" }, -# elif defined(I386) +#elif defined(I386) { 4*EBX, "4*EBX" }, { 4*ECX, "4*ECX" }, { 4*EDX, "4*EDX" }, @@ -1752,7 +1702,7 @@ const struct xlat struct_user_offsets[] = { { 4*EFL, "4*EFL" }, { 4*UESP, "4*UESP" }, { 4*SS, "4*SS" }, -# elif defined(X86_64) +#elif defined(X86_64) || defined(X32) { 8*R15, "8*R15" }, { 8*R14, "8*R14" }, { 8*R13, "8*R13" }, @@ -1774,7 +1724,7 @@ const struct xlat struct_user_offsets[] = { { 8*EFLAGS, "8*EFL" }, { 8*RSP, "8*RSP" }, { 8*SS, "8*SS" }, -# elif defined(M68K) +#elif defined(M68K) { 4*PT_D1, "4*PT_D1" }, { 4*PT_D2, "4*PT_D2" }, { 4*PT_D3, "4*PT_D3" }, @@ -1794,7 +1744,7 @@ const struct xlat struct_user_offsets[] = { { 4*PT_ORIG_D0, "4*PT_ORIG_D0" }, { 4*PT_SR, "4*PT_SR" }, { 4*PT_PC, "4*PT_PC" }, -# elif defined(SH) +#elif defined(SH) { 4*REG_REG0, "4*REG_REG0" }, { 4*(REG_REG0+1), "4*REG_REG1" }, { 4*(REG_REG0+2), "4*REG_REG2" }, @@ -1835,7 +1785,7 @@ const struct xlat struct_user_offsets[] = { { 4*(REG_FPREG0+13), "4*REG_FPREG13" }, { 4*(REG_FPREG0+14), "4*REG_FPREG14" }, { 4*REG_FPREG15, "4*REG_FPREG15" }, -# ifdef REG_XDREG0 +# ifdef REG_XDREG0 { 4*REG_XDREG0, "4*REG_XDREG0" }, { 4*(REG_XDREG0+2), "4*REG_XDREG2" }, { 4*(REG_XDREG0+4), "4*REG_XDREG4" }, @@ -1844,9 +1794,9 @@ const struct xlat struct_user_offsets[] = { { 4*(REG_XDREG0+10), "4*REG_XDREG10" }, { 4*(REG_XDREG0+12), "4*REG_XDREG12" }, { 4*REG_XDREG14, "4*REG_XDREG14" }, -# endif +# endif { 4*REG_FPSCR, "4*REG_FPSCR" }, -# elif defined(SH64) +#elif defined(SH64) { 0, "PC(L)" }, { 4, "PC(U)" }, { 8, "SR(L)" }, @@ -1999,7 +1949,7 @@ const struct xlat struct_user_offsets[] = { the kernel build options). */ { uoff(regs), "offsetof(struct user, regs)" }, { uoff(fpu), "offsetof(struct user, fpu)" }, -# elif defined(ARM) +#elif defined(ARM) { uoff(regs.ARM_r0), "r0" }, { uoff(regs.ARM_r1), "r1" }, { uoff(regs.ARM_r2), "r2" }, @@ -2017,7 +1967,7 @@ const struct xlat struct_user_offsets[] = { { uoff(regs.ARM_lr), "lr" }, { uoff(regs.ARM_pc), "pc" }, { uoff(regs.ARM_cpsr), "cpsr" }, -# elif defined(AVR32) +#elif defined(AVR32) { uoff(regs.sr), "sr" }, { uoff(regs.pc), "pc" }, { uoff(regs.lr), "lr" }, @@ -2036,7 +1986,7 @@ const struct xlat struct_user_offsets[] = { { uoff(regs.r1), "r1" }, { uoff(regs.r0), "r0" }, { uoff(regs.r12_orig), "orig_r12" }, -# elif defined(MIPS) +#elif defined(MIPS) { 0, "r0" }, { 1, "r1" }, { 2, "r2" }, @@ -2108,7 +2058,7 @@ const struct xlat struct_user_offsets[] = { { 68, "mmlo" }, { 69, "fpcsr" }, { 70, "fpeir" }, -# elif defined(TILE) +#elif defined(TILE) { PTREGS_OFFSET_REG(0), "r0" }, { PTREGS_OFFSET_REG(1), "r1" }, { PTREGS_OFFSET_REG(2), "r2" }, @@ -2170,8 +2120,8 @@ const struct xlat struct_user_offsets[] = { { PTREGS_OFFSET_FAULTNUM, "faultnum" }, { PTREGS_OFFSET_ORIG_R0, "orig_r0" }, { PTREGS_OFFSET_FLAGS, "flags" }, -# endif -# ifdef CRISV10 +#endif +#ifdef CRISV10 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" }, { 4*PT_ORIG_R10, "4*PT_ORIG_R10" }, { 4*PT_R13, "4*PT_R13" }, @@ -2196,8 +2146,8 @@ const struct xlat struct_user_offsets[] = { { 4*PT_CSRADDR, "4*PT_CSRADDR" }, { 4*PT_CSRDATA, "4*PT_CSRDATA" }, { 4*PT_USP, "4*PT_USP" }, -# endif -# ifdef CRISV32 +#endif +#ifdef CRISV32 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" }, { 4*PT_R0, "4*PT_R0" }, { 4*PT_R1, "4*PT_R1" }, @@ -2239,8 +2189,8 @@ const struct xlat struct_user_offsets[] = { { 4*PT_BP+48, "4*PT_BP+48" }, { 4*PT_BP+52, "4*PT_BP+52" }, { 4*PT_BP+56, "4*PT_BP+56" }, -# endif -# ifdef MICROBLAZE +#endif +#ifdef MICROBLAZE { PT_GPR(0), "r0" }, { PT_GPR(1), "r1" }, { PT_GPR(2), "r2" }, @@ -2279,52 +2229,273 @@ const struct xlat struct_user_offsets[] = { { PT_ESR, "resr", }, { PT_FSR, "rfsr", }, { PT_KERNEL_MODE, "kernel_mode", }, -# endif - -# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \ - && !defined(ALPHA) && !defined(IA64) \ - && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE) -# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN) && !defined(TILE) +#endif +#ifdef OR1K + { 4*0, "r0" }, + { 4*1, "r1" }, + { 4*2, "r2" }, + { 4*3, "r3" }, + { 4*4, "r4" }, + { 4*5, "r5" }, + { 4*6, "r6" }, + { 4*7, "r7" }, + { 4*8, "r8" }, + { 4*9, "r9" }, + { 4*10, "r10" }, + { 4*11, "r11" }, + { 4*12, "r12" }, + { 4*13, "r13" }, + { 4*14, "r14" }, + { 4*15, "r15" }, + { 4*16, "r16" }, + { 4*17, "r17" }, + { 4*18, "r18" }, + { 4*19, "r19" }, + { 4*20, "r20" }, + { 4*21, "r21" }, + { 4*22, "r22" }, + { 4*23, "r23" }, + { 4*24, "r24" }, + { 4*25, "r25" }, + { 4*26, "r26" }, + { 4*27, "r27" }, + { 4*28, "r28" }, + { 4*29, "r29" }, + { 4*30, "r30" }, + { 4*31, "r31" }, + { 4*32, "pc" }, + { 4*33, "sr" }, +#endif +#ifdef XTENSA + { SYSCALL_NR, "syscall_nr" }, + { REG_AR_BASE, "ar0" }, + { REG_AR_BASE+1, "ar1" }, + { REG_AR_BASE+2, "ar2" }, + { REG_AR_BASE+3, "ar3" }, + { REG_AR_BASE+4, "ar4" }, + { REG_AR_BASE+5, "ar5" }, + { REG_AR_BASE+6, "ar6" }, + { REG_AR_BASE+7, "ar7" }, + { REG_AR_BASE+8, "ar8" }, + { REG_AR_BASE+9, "ar9" }, + { REG_AR_BASE+10, "ar10" }, + { REG_AR_BASE+11, "ar11" }, + { REG_AR_BASE+12, "ar12" }, + { REG_AR_BASE+13, "ar13" }, + { REG_AR_BASE+14, "ar14" }, + { REG_AR_BASE+15, "ar15" }, + { REG_AR_BASE+16, "ar16" }, + { REG_AR_BASE+17, "ar17" }, + { REG_AR_BASE+18, "ar18" }, + { REG_AR_BASE+19, "ar19" }, + { REG_AR_BASE+20, "ar20" }, + { REG_AR_BASE+21, "ar21" }, + { REG_AR_BASE+22, "ar22" }, + { REG_AR_BASE+23, "ar23" }, + { REG_AR_BASE+24, "ar24" }, + { REG_AR_BASE+25, "ar25" }, + { REG_AR_BASE+26, "ar26" }, + { REG_AR_BASE+27, "ar27" }, + { REG_AR_BASE+28, "ar28" }, + { REG_AR_BASE+29, "ar29" }, + { REG_AR_BASE+30, "ar30" }, + { REG_AR_BASE+31, "ar31" }, + { REG_AR_BASE+32, "ar32" }, + { REG_AR_BASE+33, "ar33" }, + { REG_AR_BASE+34, "ar34" }, + { REG_AR_BASE+35, "ar35" }, + { REG_AR_BASE+36, "ar36" }, + { REG_AR_BASE+37, "ar37" }, + { REG_AR_BASE+38, "ar38" }, + { REG_AR_BASE+39, "ar39" }, + { REG_AR_BASE+40, "ar40" }, + { REG_AR_BASE+41, "ar41" }, + { REG_AR_BASE+42, "ar42" }, + { REG_AR_BASE+43, "ar43" }, + { REG_AR_BASE+44, "ar44" }, + { REG_AR_BASE+45, "ar45" }, + { REG_AR_BASE+46, "ar46" }, + { REG_AR_BASE+47, "ar47" }, + { REG_AR_BASE+48, "ar48" }, + { REG_AR_BASE+49, "ar49" }, + { REG_AR_BASE+50, "ar50" }, + { REG_AR_BASE+51, "ar51" }, + { REG_AR_BASE+52, "ar52" }, + { REG_AR_BASE+53, "ar53" }, + { REG_AR_BASE+54, "ar54" }, + { REG_AR_BASE+55, "ar55" }, + { REG_AR_BASE+56, "ar56" }, + { REG_AR_BASE+57, "ar57" }, + { REG_AR_BASE+58, "ar58" }, + { REG_AR_BASE+59, "ar59" }, + { REG_AR_BASE+60, "ar60" }, + { REG_AR_BASE+61, "ar61" }, + { REG_AR_BASE+62, "ar62" }, + { REG_AR_BASE+63, "ar63" }, + { REG_LBEG, "lbeg" }, + { REG_LEND, "lend" }, + { REG_LCOUNT, "lcount" }, + { REG_SAR, "sar" }, + { REG_WB, "wb" }, + { REG_WS, "ws" }, + { REG_PS, "ps" }, + { REG_PC, "pc" }, + { REG_A_BASE, "a0" }, + { REG_A_BASE+1, "a1" }, + { REG_A_BASE+2, "a2" }, + { REG_A_BASE+3, "a3" }, + { REG_A_BASE+4, "a4" }, + { REG_A_BASE+5, "a5" }, + { REG_A_BASE+6, "a6" }, + { REG_A_BASE+7, "a7" }, + { REG_A_BASE+8, "a8" }, + { REG_A_BASE+9, "a9" }, + { REG_A_BASE+10, "a10" }, + { REG_A_BASE+11, "a11" }, + { REG_A_BASE+12, "a12" }, + { REG_A_BASE+13, "a13" }, + { REG_A_BASE+14, "a14" }, + { REG_A_BASE+15, "a15" }, +#endif + + /* Other fields in "struct user" */ +#if defined(S390) || defined(S390X) + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(start_code), "offsetof(struct user, start_code)" }, + /* S390[X] has no start_data */ + { uoff(start_stack), "offsetof(struct user, start_stack)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(POWERPC) + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(I386) || defined(X86_64) || defined(X32) { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" }, -# endif -# if defined(I386) || defined(X86_64) { uoff(i387), "offsetof(struct user, i387)" }, -# endif -# if defined(M68K) - { uoff(m68kfp), "offsetof(struct user, m68kfp)" }, -# endif { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, -# if !defined(SPARC64) { uoff(start_code), "offsetof(struct user, start_code)" }, -# endif -# if defined(AVR32) || defined(SH64) - { uoff(start_data), "offsetof(struct user, start_data)" }, -# endif -# if !defined(SPARC64) { uoff(start_stack), "offsetof(struct user, start_stack)" }, -# endif { uoff(signal), "offsetof(struct user, signal)" }, -# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64) && !defined(TILE) { uoff(reserved), "offsetof(struct user, reserved)" }, -# endif -# if !defined(SPARC64) { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, -# endif -# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN) && !defined(TILE) { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" }, -# endif { uoff(magic), "offsetof(struct user, magic)" }, { uoff(u_comm), "offsetof(struct user, u_comm)" }, -# if defined(I386) || defined(X86_64) { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" }, -# endif -# endif /* !defined(many arches) */ - -# ifndef HPPA { sizeof(struct user), "sizeof(struct user)" }, -# endif +#elif defined(IA64) + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(ARM) + { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" }, + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(start_code), "offsetof(struct user, start_code)" }, + { uoff(start_stack), "offsetof(struct user, start_stack)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(reserved), "offsetof(struct user, reserved)" }, + { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(AARCH64) + /* nothing */ +#elif defined(M68K) + { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" }, + { uoff(m68kfp), "offsetof(struct user, m68kfp)" }, + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(start_code), "offsetof(struct user, start_code)" }, + { uoff(start_stack), "offsetof(struct user, start_stack)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(reserved), "offsetof(struct user, reserved)" }, + { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, + { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(MIPS) || defined(LINUX_MIPSN32) + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(start_code), "offsetof(struct user, start_code)" }, + { uoff(start_data), "offsetof(struct user, start_data)" }, + { uoff(start_stack), "offsetof(struct user, start_stack)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(ALPHA) + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(SPARC) + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(SPARC64) + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(HPPA) + /* nothing */ +#elif defined(SH) || defined(SH64) + { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" }, + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(start_code), "offsetof(struct user, start_code)" }, + { uoff(start_data), "offsetof(struct user, start_data)" }, + { uoff(start_stack), "offsetof(struct user, start_stack)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, + { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(CRISV10) || defined(CRISV32) + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(TILE) + /* nothing */ +#elif defined(MICROBLAZE) + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(AVR32) + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(start_code), "offsetof(struct user, start_code)" }, + { uoff(start_data), "offsetof(struct user, start_data)" }, + { uoff(start_stack), "offsetof(struct user, start_stack)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(BFIN) + { uoff(u_tsize), "offsetof(struct user, u_tsize)" }, + { uoff(u_dsize), "offsetof(struct user, u_dsize)" }, + { uoff(u_ssize), "offsetof(struct user, u_ssize)" }, + { uoff(start_code), "offsetof(struct user, start_code)" }, + { uoff(signal), "offsetof(struct user, signal)" }, + { uoff(u_ar0), "offsetof(struct user, u_ar0)" }, + { uoff(magic), "offsetof(struct user, magic)" }, + { uoff(u_comm), "offsetof(struct user, u_comm)" }, + { sizeof(struct user), "sizeof(struct user)" }, +#elif defined(OR1K) + /* nothing */ +#elif defined(METAG) + /* nothing */ +#elif defined(XTENSA) + /* nothing */ +#endif { 0, NULL }, }; @@ -2335,13 +2506,13 @@ sys_ptrace(struct tcb *tcp) long addr; if (entering(tcp)) { - printxval(ptrace_cmds, tcp->u_arg[0], - "PTRACE_???" - ); + printxval(ptrace_cmds, tcp->u_arg[0], "PTRACE_???"); tprintf(", %lu, ", tcp->u_arg[1]); + addr = tcp->u_arg[2]; if (tcp->u_arg[0] == PTRACE_PEEKUSER - || tcp->u_arg[0] == PTRACE_POKEUSER) { + || tcp->u_arg[0] == PTRACE_POKEUSER + ) { for (x = struct_user_offsets; x->str; x++) { if (x->val >= addr) break; @@ -2354,46 +2525,54 @@ sys_ptrace(struct tcb *tcp) } else tprintf("%s, ", x->str); - } - else - tprintf("%#lx, ", tcp->u_arg[2]); + } else +#ifdef PTRACE_GETREGSET + if (tcp->u_arg[0] == PTRACE_GETREGSET + || tcp->u_arg[0] == PTRACE_SETREGSET + ) { + printxval(nt_descriptor_types, tcp->u_arg[2], "NT_???"); + tprints(", "); + } else +#endif + tprintf("%#lx, ", addr); + + switch (tcp->u_arg[0]) { -# ifndef IA64 +#ifndef IA64 case PTRACE_PEEKDATA: case PTRACE_PEEKTEXT: case PTRACE_PEEKUSER: break; -# endif +#endif case PTRACE_CONT: case PTRACE_SINGLESTEP: case PTRACE_SYSCALL: case PTRACE_DETACH: printsignal(tcp->u_arg[3]); break; -# ifdef PTRACE_SETOPTIONS +#ifdef PTRACE_SETOPTIONS case PTRACE_SETOPTIONS: printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???"); break; -# endif -# ifdef PTRACE_SETSIGINFO +#endif +#ifdef PTRACE_SETSIGINFO case PTRACE_SETSIGINFO: { - siginfo_t si; - if (!tcp->u_arg[3]) - tprints("NULL"); - else if (syserror(tcp)) - tprintf("%#lx", tcp->u_arg[3]); - else if (umove(tcp, tcp->u_arg[3], &si) < 0) - tprints("{???}"); - else - printsiginfo(&si, verbose(tcp)); + printsiginfo_at(tcp, tcp->u_arg[3]); break; } -# endif -# ifdef PTRACE_GETSIGINFO +#endif +#ifdef PTRACE_GETSIGINFO case PTRACE_GETSIGINFO: /* Don't print anything, do it at syscall return. */ break; -# endif +#endif +#ifdef PTRACE_GETREGSET + case PTRACE_GETREGSET: + break; + case PTRACE_SETREGSET: + tprint_iov(tcp, /*len:*/ 1, tcp->u_arg[3], /*as string:*/ 0); + break; +#endif default: tprintf("%#lx", tcp->u_arg[3]); break; @@ -2403,60 +2582,57 @@ sys_ptrace(struct tcb *tcp) case PTRACE_PEEKDATA: case PTRACE_PEEKTEXT: case PTRACE_PEEKUSER: -# ifdef IA64 +#ifdef IA64 return RVAL_HEX; -# else +#else printnum(tcp, tcp->u_arg[3], "%#lx"); break; -# endif -# ifdef PTRACE_GETSIGINFO +#endif +#ifdef PTRACE_GETSIGINFO case PTRACE_GETSIGINFO: { - siginfo_t si; - if (!tcp->u_arg[3]) - tprints("NULL"); - else if (syserror(tcp)) - tprintf("%#lx", tcp->u_arg[3]); - else if (umove(tcp, tcp->u_arg[3], &si) < 0) - tprints("{???}"); - else - printsiginfo(&si, verbose(tcp)); + printsiginfo_at(tcp, tcp->u_arg[3]); break; } -# endif +#endif +#ifdef PTRACE_GETREGSET + case PTRACE_GETREGSET: + tprint_iov(tcp, /*len:*/ 1, tcp->u_arg[3], /*as string:*/ 0); + break; +#endif } } return 0; } -# ifndef FUTEX_CMP_REQUEUE -# define FUTEX_CMP_REQUEUE 4 -# endif -# ifndef FUTEX_WAKE_OP -# define FUTEX_WAKE_OP 5 -# endif -# ifndef FUTEX_LOCK_PI -# define FUTEX_LOCK_PI 6 -# define FUTEX_UNLOCK_PI 7 -# define FUTEX_TRYLOCK_PI 8 -# endif -# ifndef FUTEX_WAIT_BITSET -# define FUTEX_WAIT_BITSET 9 -# endif -# ifndef FUTEX_WAKE_BITSET -# define FUTEX_WAKE_BITSET 10 -# endif -# ifndef FUTEX_WAIT_REQUEUE_PI -# define FUTEX_WAIT_REQUEUE_PI 11 -# endif -# ifndef FUTEX_CMP_REQUEUE_PI -# define FUTEX_CMP_REQUEUE_PI 12 -# endif -# ifndef FUTEX_PRIVATE_FLAG -# define FUTEX_PRIVATE_FLAG 128 -# endif -# ifndef FUTEX_CLOCK_REALTIME -# define FUTEX_CLOCK_REALTIME 256 -# endif +#ifndef FUTEX_CMP_REQUEUE +# define FUTEX_CMP_REQUEUE 4 +#endif +#ifndef FUTEX_WAKE_OP +# define FUTEX_WAKE_OP 5 +#endif +#ifndef FUTEX_LOCK_PI +# define FUTEX_LOCK_PI 6 +# define FUTEX_UNLOCK_PI 7 +# define FUTEX_TRYLOCK_PI 8 +#endif +#ifndef FUTEX_WAIT_BITSET +# define FUTEX_WAIT_BITSET 9 +#endif +#ifndef FUTEX_WAKE_BITSET +# define FUTEX_WAKE_BITSET 10 +#endif +#ifndef FUTEX_WAIT_REQUEUE_PI +# define FUTEX_WAIT_REQUEUE_PI 11 +#endif +#ifndef FUTEX_CMP_REQUEUE_PI +# define FUTEX_CMP_REQUEUE_PI 12 +#endif +#ifndef FUTEX_PRIVATE_FLAG +# define FUTEX_PRIVATE_FLAG 128 +#endif +#ifndef FUTEX_CLOCK_REALTIME +# define FUTEX_CLOCK_REALTIME 256 +#endif static const struct xlat futexops[] = { { FUTEX_WAIT, "FUTEX_WAIT" }, { FUTEX_WAKE, "FUTEX_WAKE" }, @@ -2490,19 +2666,19 @@ static const struct xlat futexops[] = { { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME, "FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME" }, { 0, NULL } }; -# ifndef FUTEX_OP_SET -# define FUTEX_OP_SET 0 -# define FUTEX_OP_ADD 1 -# define FUTEX_OP_OR 2 -# define FUTEX_OP_ANDN 3 -# define FUTEX_OP_XOR 4 -# define FUTEX_OP_CMP_EQ 0 -# define FUTEX_OP_CMP_NE 1 -# define FUTEX_OP_CMP_LT 2 -# define FUTEX_OP_CMP_LE 3 -# define FUTEX_OP_CMP_GT 4 -# define FUTEX_OP_CMP_GE 5 -# endif +#ifndef FUTEX_OP_SET +# define FUTEX_OP_SET 0 +# define FUTEX_OP_ADD 1 +# define FUTEX_OP_OR 2 +# define FUTEX_OP_ANDN 3 +# define FUTEX_OP_XOR 4 +# define FUTEX_OP_CMP_EQ 0 +# define FUTEX_OP_CMP_NE 1 +# define FUTEX_OP_CMP_LT 2 +# define FUTEX_OP_CMP_LE 3 +# define FUTEX_OP_CMP_GT 4 +# define FUTEX_OP_CMP_GE 5 +#endif static const struct xlat futexwakeops[] = { { FUTEX_OP_SET, "FUTEX_OP_SET" }, { FUTEX_OP_ADD, "FUTEX_OP_ADD" }, @@ -2617,6 +2793,34 @@ sys_sched_getaffinity(struct tcb *tcp) return 0; } +int +sys_get_robust_list(struct tcb *tcp) +{ + if (entering(tcp)) { + tprintf("%ld, ", (long) (pid_t) tcp->u_arg[0]); + } else { + void *addr; + size_t len; + + if (syserror(tcp) || + !tcp->u_arg[1] || + umove(tcp, tcp->u_arg[1], &addr) < 0) { + tprintf("%#lx, ", tcp->u_arg[1]); + } else { + tprintf("[%p], ", addr); + } + + if (syserror(tcp) || + !tcp->u_arg[2] || + umove(tcp, tcp->u_arg[2], &len) < 0) { + tprintf("%#lx", tcp->u_arg[2]); + } else { + tprintf("[%lu]", (unsigned long) len); + } + } + return 0; +} + static const struct xlat schedulers[] = { { SCHED_OTHER, "SCHED_OTHER" }, { SCHED_RR, "SCHED_RR" }, @@ -2689,7 +2893,21 @@ sys_sched_get_priority_min(struct tcb *tcp) return 0; } -# ifdef X86_64 +int +sys_sched_rr_get_interval(struct tcb *tcp) +{ + if (entering(tcp)) { + tprintf("%ld, ", (long) (pid_t) tcp->u_arg[0]); + } else { + if (syserror(tcp)) + tprintf("%#lx", tcp->u_arg[1]); + else + print_timespec(tcp, tcp->u_arg[1]); + } + return 0; +} + +#if defined X86_64 || defined X32 # include static const struct xlat archvals[] = { @@ -2723,7 +2941,7 @@ sys_arch_prctl(struct tcb *tcp) } return 0; } -# endif /* X86_64 */ +#endif /* X86_64 || X32 */ int sys_getcpu(struct tcb *tcp) @@ -2754,22 +2972,48 @@ sys_process_vm_readv(struct tcb *tcp) /* arg 1: pid */ tprintf("%ld, ", tcp->u_arg[0]); } else { - /* args 2,3: local iov,cnt */ + /* arg 2: local iov */ if (syserror(tcp)) { - tprintf("%#lx, %lu", - tcp->u_arg[1], tcp->u_arg[2]); + tprintf("%#lx", tcp->u_arg[1]); } else { tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); } - tprints(", "); - /* args 4,5: remote iov,cnt */ + /* arg 3: local iovcnt */ + tprintf(", %lu, ", tcp->u_arg[2]); + /* arg 4: remote iov */ if (syserror(tcp)) { - tprintf("%#lx, %lu", tcp->u_arg[3], tcp->u_arg[4]); + tprintf("%#lx", tcp->u_arg[3]); } else { tprint_iov(tcp, tcp->u_arg[4], tcp->u_arg[3], 0); } + /* arg 5: remote iovcnt */ + /* arg 6: flags */ + tprintf(", %lu, %lu", tcp->u_arg[4], tcp->u_arg[5]); + } + return 0; +} + +int +sys_process_vm_writev(struct tcb *tcp) +{ + if (entering(tcp)) { + /* arg 1: pid */ + tprintf("%ld, ", tcp->u_arg[0]); + /* arg 2: local iov */ + if (syserror(tcp)) + tprintf("%#lx", tcp->u_arg[1]); + else + tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); + /* arg 3: local iovcnt */ + tprintf(", %lu, ", tcp->u_arg[2]); + /* arg 4: remote iov */ + if (syserror(tcp)) + tprintf("%#lx", tcp->u_arg[3]); + else + tprint_iov(tcp, tcp->u_arg[4], tcp->u_arg[3], 0); + /* arg 5: remote iovcnt */ /* arg 6: flags */ - tprintf(", %lu", tcp->u_arg[5]); + tprintf(", %lu, %lu", tcp->u_arg[4], tcp->u_arg[5]); } return 0; }