int sys_rt_sigtimedwait(struct tcb *tcp) { if (entering(tcp)) { sigset_t sigset; if (copy_sigset_len(tcp, tcp->u_arg[0], &sigset, tcp->u_arg[3]) < 0) tprints("[?]"); else printsigmask(&sigset, 1); tprints(", "); /* This is the only "return" parameter, */ if (tcp->u_arg[1] != 0) return 0; /* ... if it's NULL, can decode all on entry */ tprints("NULL, "); } else if (tcp->u_arg[1] != 0) { /* syscall exit, and u_arg[1] wasn't NULL */ printsiginfo_at(tcp, tcp->u_arg[1]); tprints(", "); } else { /* syscall exit, and u_arg[1] was NULL */ return 0; } print_timespec(tcp, tcp->u_arg[2]); tprintf(", %d", (int) tcp->u_arg[3]); return 0; };
int sys_rt_sigtimedwait(struct tcb *tcp) { /* NB: kernel requires arg[3] == NSIG / 8 */ if (entering(tcp)) { print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[3]); tprints(", "); /* This is the only "return" parameter, */ if (tcp->u_arg[1] != 0) return 0; /* ... if it's NULL, can decode all on entry */ tprints("NULL, "); } else if (tcp->u_arg[1] != 0) { /* syscall exit, and u_arg[1] wasn't NULL */ printsiginfo_at(tcp, tcp->u_arg[1]); tprints(", "); } else { /* syscall exit, and u_arg[1] was NULL */ return 0; } print_timespec(tcp, tcp->u_arg[2]); tprintf(", %lu", tcp->u_arg[3]); return 0; };
static void print_sigqueueinfo(struct tcb *tcp, int sig, unsigned long uinfo) { printsignal(sig); tprints(", "); printsiginfo_at(tcp, uinfo); }
static void print_sigqueueinfo(struct tcb *const tcp, const int sig, const kernel_ulong_t addr) { printsignal(sig); tprints(", "); printsiginfo_at(tcp, addr); }
int sys_ptrace(struct tcb *tcp) { const struct xlat *x; unsigned long addr; if (entering(tcp)) { 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 ) { for (x = struct_user_offsets; x->str; x++) { if (x->val >= addr) break; } if (!x->str) tprintf("%#lx, ", addr); else if (x->val > addr && x != struct_user_offsets) { x--; tprintf("%s + %ld, ", x->str, addr - x->val); } else tprintf("%s, ", x->str); } else if (tcp->u_arg[0] == PTRACE_GETREGSET || tcp->u_arg[0] == PTRACE_SETREGSET ) { printxval(nt_descriptor_types, tcp->u_arg[2], "NT_???"); tprints(", "); } else tprintf("%#lx, ", addr); switch (tcp->u_arg[0]) { #ifndef IA64 case PTRACE_PEEKDATA: case PTRACE_PEEKTEXT: case PTRACE_PEEKUSER: break; #endif case PTRACE_CONT: case PTRACE_SINGLESTEP: case PTRACE_SYSCALL: case PTRACE_DETACH: printsignal(tcp->u_arg[3]); break; case PTRACE_SETOPTIONS: printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???"); break; case PTRACE_SETSIGINFO: { printsiginfo_at(tcp, tcp->u_arg[3]); break; } case PTRACE_SETREGSET: tprint_iov(tcp, /*len:*/ 1, tcp->u_arg[3], /*as string:*/ 0); break; case PTRACE_GETSIGINFO: case PTRACE_GETREGSET: /* Don't print anything, do it at syscall return. */ break; default: tprintf("%#lx", tcp->u_arg[3]); break; } } else { switch (tcp->u_arg[0]) { case PTRACE_PEEKDATA: case PTRACE_PEEKTEXT: case PTRACE_PEEKUSER: #ifdef IA64 return RVAL_HEX; #else printnum_long(tcp, tcp->u_arg[3], "%#lx"); break; #endif case PTRACE_GETSIGINFO: { printsiginfo_at(tcp, tcp->u_arg[3]); break; } case PTRACE_GETREGSET: tprint_iov(tcp, /*len:*/ 1, tcp->u_arg[3], /*as string:*/ 0); break; } } return 0; }