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