Home | History | Annotate | Download | only in strace

Lines Matching defs:tcp

277 update_personality(struct tcb *tcp, unsigned int personality)
284 if (personality == tcp->currpers)
286 tcp->currpers = personality;
290 tcp->pid, personality_names[personality]);
304 decode_socket_subcall(struct tcb *tcp)
306 const int call = tcp->u_arg[0];
315 if (umoven(tcp, tcp->u_arg[1], nargs * current_wordsize, buf) < 0)
318 tcp->scno = scno;
319 tcp->qual_flg = qual_flags(scno);
320 tcp->s_ent = &sysent[scno];
324 tcp->u_arg[i] = (sizeof(uint32_t) == current_wordsize)
331 decode_ipc_subcall(struct tcb *tcp)
333 unsigned int call = tcp->u_arg[0];
344 set_tcb_priv_ulong(tcp, version);
358 tcp->scno = SYS_ipc_subcall + call;
359 tcp->qual_flg = qual_flags(tcp->scno);
360 tcp->s_ent = &sysent[tcp->scno];
362 const unsigned int n = tcp->s_ent->nargs;
365 tcp->u_arg[i] = tcp->u_arg[i + 1];
371 decode_syscall_subcall(struct tcb *tcp)
373 if (!scno_is_valid(tcp->u_arg[0]))
375 tcp->scno = tcp->u_arg[0];
376 tcp->qual_flg = qual_flags(tcp->scno);
377 tcp->s_ent = &sysent[tcp->scno];
378 memmove(&tcp->u_arg[0], &tcp->u_arg[1],
379 sizeof(tcp->u_arg) - sizeof(tcp->u_arg[0]));
386 if (tcp->s_ent->nargs == MAX_ARGS) {
387 if (umoven(tcp,
388 mips_REG_SP + MAX_ARGS * sizeof(tcp->u_arg[0]),
389 sizeof(tcp->u_arg[0]),
390 &tcp->u_arg[MAX_ARGS - 1]) < 0)
391 tcp->u_arg[MAX_ARGS - 1] = 0;
398 dumpio(struct tcb *tcp)
400 int fd = tcp->u_arg[0];
405 switch (tcp->s_ent->sen) {
411 dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
417 dumpiov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], -1);
420 dumpiov_in_msghdr(tcp, tcp->u_arg[1], -1);
423 dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
428 if (syserror(tcp))
432 switch (tcp->s_ent->sen) {
438 dumpstr(tcp, tcp->u_arg[1], tcp->u_rval);
443 dumpiov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
444 tcp->u_rval);
447 dumpiov_in_msghdr(tcp, tcp->u_arg[1], tcp->u_rval);
450 dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
480 static int arch_get_scno(struct tcb *tcp);
489 tcb_inject_opts(struct tcb *tcp)
491 return (scno_in_range(tcp->scno) && tcp->inject_vec[current_personality])
492 ? &tcp->inject_vec[current_personality][tcp->scno] : NULL;
497 tamper_with_syscall_entering(struct tcb *tcp, unsigned int *signo)
499 if (!tcp->inject_vec[current_personality]) {
500 tcp->inject_vec[current_personality] =
502 memcpy(tcp->inject_vec[current_personality],
507 struct inject_opts *opts = tcb_inject_opts(tcp);
519 if (!recovering(tcp)) {
528 if (!arch_set_scno(tcp, scno)) {
529 tcp->flags |= TCB_TAMPERED;
531 tcp->flags |= TCB_TAMPERED_NO_FAIL;
535 delay_tcb(tcp, opts->data.delay_idx, true);
537 tcp->flags |= TCB_INJECT_DELAY_EXIT;
544 tamper_with_syscall_exiting(struct tcb *tcp)
546 struct inject_opts *opts = tcb_inject_opts(tcp);
550 if (inject_delay_exit(tcp))
551 delay_tcb(tcp, opts->data.delay_idx, false);
553 if (!syscall_tampered(tcp))
556 if (!syserror(tcp) ^ !!syscall_tampered_nofail(tcp)) {
559 tcp->pid, syscall_tampered_nofail(tcp) ? "" : "no ",
560 tcp->u_rval, tcp->u_error);
570 kernel_long_t u_rval = tcp->u_rval;
572 tcp->u_rval = inject_rval;
573 if (arch_set_success(tcp)) {
574 tcp->u_rval = u_rval;
577 tcp->u_error = 0;
582 if (new_error != tcp->u_error && new_error <= MAX_ERRNO_VALUE) {
583 unsigned long u_error = tcp->u_error;
585 tcp->u_error = new_error;
586 if (arch_set_error(tcp)) {
587 tcp->u_error = u_error;
595 tcp->u_error = 0;
596 get_error(tcp, !(tcp->s_ent->sys_flags & SYSCALL_NEVER_FAILS));
606 * syscall_entering_finish(tcp, syscall_entering_trace(tcp, ...)).
607 * other: error; call syscall_entering_finish(tcp, res), where res is the value
611 syscall_entering_decode(struct tcb *tcp)
613 int res = get_scno(tcp);
617 if (res != 1 || (res = get_syscall_args(tcp)) != 1) {
618 printleader(tcp);
619 tprintf("%s(", scno_good == 1 ? tcp->s_ent->sys_name : "????");
631 switch (tcp->s_ent->sen) {
634 decode_ipc_subcall(tcp);
639 decode_socket_subcall(tcp);
644 decode_syscall_subcall(tcp);
645 if (tcp->s_ent->sen != SEN_syscall)
658 syscall_entering_trace(struct tcb *tcp, unsigned int *sig)
661 if (hide_log(tcp)) {
662 tcp->qual_flg &= ~QUAL_INJECT;
665 switch (tcp->s_ent->sen) {
671 tcp->flags &= ~TCB_HIDE_LOG;
675 tcp) || (tracing_paths && !pathtrace_match(tcp))) {
676 tcp->flags |= TCB_FILTERED;
680 tcp->flags &= ~TCB_FILTERED;
682 if (hide_log(tcp)) {
686 if (inject(tcp))
687 tamper_with_syscall_entering(tcp, sig);
695 if (tcp->s_ent->sys_flags & STACKTRACE_CAPTURE_ON_ENTER)
696 unwind_tcb_capture(tcp);
700 printleader(tcp);
701 tprintf("%s(", tcp->s_ent->sys_name);
702 int res = raw(tcp) ? printargs(tcp) : tcp->s_ent->sys_func(tcp);
703 fflush(tcp->outf);
708 syscall_entering_finish(struct tcb *tcp, int res)
710 tcp->flags |= TCB_INSYSCALL;
711 tcp->sys_func_rval = res;
713 if ((Tflag || cflag) && !filtered(tcp))
714 clock_gettime(CLOCK_MONOTONIC, &tcp->etime);
722 * If not 0, call syscall_exiting_trace(tcp, res), where res is the return
723 * value. Anyway, call syscall_exiting_finish(tcp) then.
726 syscall_exiting_decode(struct tcb *tcp, struct timespec *pts)
729 if ((Tflag || cflag) && !(filtered(tcp) || hide_log(tcp)))
732 if (tcp->s_ent->sys_flags & MEMORY_MAPPING_CHANGE)
733 mmap_notify_report(tcp);
735 if (filtered(tcp) || hide_log(tcp))
739 update_personality(tcp, tcp->currpers);
742 return get_syscall_result(tcp);
746 syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
748 if (syscall_tampered(tcp) || inject_delay_exit(tcp))
749 tamper_with_syscall_exiting(tcp);
752 count_syscall(tcp, ts);
758 /* If not in -ff mode, and printing_tcp != tcp,
767 if ((followfork < 2 && printing_tcp != tcp) || (tcp->flags & TCB_REPRINT)) {
768 tcp->flags &= ~TCB_REPRINT;
769 printleader(tcp);
770 tprintf("<... %s resumed> ", tcp->s_ent->sys_name);
772 printing_tcp = tcp;
774 tcp->s_prev_ent = NULL;
783 tcp->s_prev_ent = tcp->s_ent;
786 if (raw(tcp)) {
787 /* sys_res = printargs(tcp); - but it's nop on sysexit */
797 if (not_failing_only && tcp->u_error)
799 if (tcp->sys_func_rval & RVAL_DECODED)
800 sys_res = tcp->sys_func_rval;
802 sys_res = tcp->s_ent->sys_func(tcp);
808 if (raw(tcp)) {
809 if (tcp->u_error)
810 print_err_ret(tcp->u_rval, tcp->u_error);
812 tprintf("= %#" PRI_klx, tcp->u_rval);
814 if (syscall_tampered(tcp))
816 } else if (!(sys_res & RVAL_NONE) && tcp->u_error) {
817 switch (tcp->u_error) {
872 print_err_ret(tcp->u_rval, tcp->u_error);
875 if (syscall_tampered(tcp))
877 if ((sys_res & RVAL_STR) && tcp->auxstr)
878 tprintf(" (%s)", tcp->auxstr);
886 if (current_klongsize < sizeof(tcp->u_rval)) {
888 (unsigned int) tcp->u_rval);
892 tprintf("= %#" PRI_klx, tcp->u_rval);
897 print_numeric_long_umask(tcp->u_rval);
901 if (current_klongsize < sizeof(tcp->u_rval)) {
903 (unsigned int) tcp->u_rval);
907 tprintf("= %" PRI_klu, tcp->u_rval);
913 printfd(tcp, tcp->u_rval);
915 tprintf("= %" PRI_kld, tcp->u_rval);
922 if ((sys_res & RVAL_STR) && tcp->auxstr)
923 tprintf(" (%s)", tcp->auxstr);
924 if (syscall_tampered(tcp))
928 ts_sub(ts, ts, &tcp->etime);
933 dumpio(tcp);
938 unwind_tcb_print(tcp);
944 syscall_exiting_finish(struct tcb *tcp)
946 tcp->flags &= ~(TCB_INSYSCALL | TCB_TAMPERED | TCB_INJECT_DELAY_EXIT);
947 tcp->sys_func_rval = 0;
948 free_tcb_priv_data(tcp);
952 is_erestart(struct tcb *tcp)
954 switch (tcp->u_error) {
968 temporarily_clear_syserror(struct tcb *tcp)
970 saved_u_error = tcp->u_error;
971 tcp->u_error = 0;
975 restore_cleared_syserror(struct tcb *tcp)
977 tcp->u_error = saved_u_error;
991 print_pc(struct tcb *tcp)
998 # define ARCH_GET_PC upeek(tcp, ARCH_PC_PEEK_ADDR, &pc)
1002 if (get_regs(tcp) < 0 || ARCH_GET_PC)
1092 clear_regs(struct tcb *tcp)
1100 get_regs(struct tcb *const tcp)
1114 return get_regs_error = ptrace_getregset_or_getregs(tcp->pid);
1116 get_regs_error = ptrace_getregset_or_getregs(tcp->pid);
1125 return get_regs_error = getregs_old(tcp);
1128 get_regs_error = ptrace_getregset_or_getregs(tcp->pid);
1136 update_personality(tcp, 0);
1139 update_personality(tcp, 1);
1152 update_personality(tcp, 0);
1178 struct tcb *tcp;
1187 s->tcp->s_prev_ent = s->tcp->s_ent = NULL;
1200 get_scno(struct tcb *tcp)
1202 if (get_regs(tcp) < 0)
1205 int rc = arch_get_scno(tcp);
1209 tcp->scno = shuffle_scno(tcp->scno);
1211 if (scno_is_valid(tcp->scno)) {
1212 tcp->s_ent = &sysent[tcp->scno];
1213 tcp->qual_flg = qual_flags(tcp->scno);
1217 s->tcp = tcp;
1222 xsprintf(s->buf, "syscall_%#" PRI_klx, shuffle_scno(tcp->scno));
1224 tcp->s_ent = &s->ent;
1225 tcp->qual_flg = QUAL_RAW | DEFAULT_QUAL_FLAGS;
1227 set_tcb_priv_data(tcp, s, free_sysent_buf);
1230 tcp->pid, shuffle_scno(tcp->scno));
1238 if (recovering(tcp))
1239 tcp->qual_flg |= QUAL_RAW;
1256 get_syscall_result(struct tcb *tcp)
1258 if (get_syscall_result_regs(tcp) < 0)
1260 tcp->u_error = 0;
1261 get_error(tcp,
1262 (!(tcp->s_ent->sys_flags & SYSCALL_NEVER_FAILS)
1263 || syscall_tampered(tcp))
1264 && !syscall_tampered_nofail(tcp));