static int print_sg_io_v3_req(struct tcb *tcp, const long arg) { struct sg_io_hdr sg_io; if (umove(tcp, arg, &sg_io) < 0) { tprints("???}"); return RVAL_DECODED | 1; } printxval(sg_io_dxfer_direction, sg_io.dxfer_direction, "SG_DXFER_???"); tprintf(", cmd[%u]=", sg_io.cmd_len); print_sg_io_buffer(tcp, (unsigned long) sg_io.cmdp, sg_io.cmd_len); tprintf(", mx_sb_len=%d", sg_io.mx_sb_len); tprintf(", iovec_count=%d", sg_io.iovec_count); tprintf(", dxfer_len=%u", sg_io.dxfer_len); tprintf(", timeout=%u", sg_io.timeout); tprintf(", flags=%#x", sg_io.flags); if (sg_io.dxfer_direction == SG_DXFER_TO_DEV || sg_io.dxfer_direction == SG_DXFER_TO_FROM_DEV) { tprintf(", data[%u]=", sg_io.dxfer_len); if (sg_io.iovec_count) tprint_iov_upto(tcp, sg_io.iovec_count, (unsigned long) sg_io.dxferp, 1, sg_io.dxfer_len); else print_sg_io_buffer(tcp, (unsigned long) sg_io.dxferp, sg_io.dxfer_len); } return 1; }
static void print_sg_io_v4_res(struct tcb *tcp, const long arg) { struct sg_io_v4 sg_io; uint32_t din_len; if (umove(tcp, arg, &sg_io) < 0) { tprints(", ???"); return; } tprintf(", response[%u]=", sg_io.response_len); print_sg_io_buffer(tcp, sg_io.response, sg_io.response_len); din_len = sg_io.din_xfer_len; if (sg_io.din_resid > 0) din_len -= sg_io.din_resid; tprintf(", din[%u]=", din_len); if (sg_io.din_iovec_count) tprint_iov_upto(tcp, sg_io.din_iovec_count, sg_io.din_xferp, 1, din_len); else print_sg_io_buffer(tcp, sg_io.din_xferp, din_len); tprintf(", driver_status=%u", sg_io.driver_status); tprintf(", transport_status=%u", sg_io.transport_status); tprintf(", device_status=%u", sg_io.device_status); tprintf(", retry_delay=%u", sg_io.retry_delay); tprintf(", info=%u", sg_io.info); tprintf(", duration=%u", sg_io.duration); tprintf(", response_len=%u", sg_io.response_len); tprintf(", din_resid=%u", sg_io.din_resid); tprintf(", dout_resid=%u", sg_io.dout_resid); tprintf(", generated_tag=%llu", (unsigned long long) sg_io.generated_tag); tprintf(", spare_out=%u", sg_io.spare_out); }
static void print_sg_io_v3_res(struct tcb *tcp, const long arg) { struct sg_io_hdr sg_io; if (umove(tcp, arg, &sg_io) < 0) { tprints(", ???"); return; } if (sg_io.dxfer_direction == SG_DXFER_FROM_DEV || sg_io.dxfer_direction == SG_DXFER_TO_FROM_DEV) { uint32_t din_len = sg_io.dxfer_len; if (sg_io.resid > 0) din_len -= sg_io.resid; tprintf(", data[%u]=", din_len); if (sg_io.iovec_count) tprint_iov_upto(tcp, sg_io.iovec_count, (unsigned long) sg_io.dxferp, 1, din_len); else print_sg_io_buffer(tcp, (unsigned long) sg_io.dxferp, din_len); } tprintf(", status=%02x", sg_io.status); tprintf(", masked_status=%02x", sg_io.masked_status); tprintf(", sb[%u]=", sg_io.sb_len_wr); print_sg_io_buffer(tcp, (unsigned long) sg_io.sbp, sg_io.sb_len_wr); tprintf(", host_status=%#x", sg_io.host_status); tprintf(", driver_status=%#x", sg_io.driver_status); tprintf(", resid=%d", sg_io.resid); tprintf(", duration=%d", sg_io.duration); tprintf(", info=%#x", sg_io.info); }
void print_struct_msghdr(struct tcb *tcp, const struct msghdr *msg, const int *const p_user_msg_namelen, const unsigned long data_size) { const int msg_namelen = p_user_msg_namelen && (int) msg->msg_namelen > *p_user_msg_namelen ? *p_user_msg_namelen : (int) msg->msg_namelen; tprints("{msg_name="); const int family = decode_sockaddr(tcp, (long) msg->msg_name, msg_namelen); const enum iov_decode decode = (family == AF_NETLINK) ? IOV_DECODE_NETLINK : IOV_DECODE_STR; tprints(", msg_namelen="); if (p_user_msg_namelen && *p_user_msg_namelen != (int) msg->msg_namelen) tprintf("%d->", *p_user_msg_namelen); tprintf("%d", msg->msg_namelen); tprints(", msg_iov="); tprint_iov_upto(tcp, (unsigned long) msg->msg_iovlen, (unsigned long) msg->msg_iov, decode, data_size); tprintf(", msg_iovlen=%lu", (unsigned long) msg->msg_iovlen); decode_msg_control(tcp, (unsigned long) msg->msg_control, msg->msg_controllen); tprintf(", msg_controllen=%lu", (unsigned long) msg->msg_controllen); tprints(", msg_flags="); printflags(msg_flags, msg->msg_flags, "MSG_???"); tprints("}"); }
static int do_preadv(struct tcb *tcp, const int flags_arg) { if (entering(tcp)) { printfd(tcp, tcp->u_arg[0]); tprints(", "); } else { kernel_ulong_t len = truncate_kulong_to_current_wordsize(tcp->u_arg[2]); tprint_iov_upto(tcp, len, tcp->u_arg[1], syserror(tcp) ? IOV_DECODE_ADDR : IOV_DECODE_STR, tcp->u_rval); tprintf(", %" PRI_klu ", ", len); print_lld_from_low_high_val(tcp, 3); if (flags_arg >= 0) { tprints(", "); printflags(rwf_flags, tcp->u_arg[flags_arg], "RWF_???"); } } return 0; }
static void do_msghdr(struct tcb *tcp, struct msghdr *msg, unsigned long data_size) { tprintf("{msg_name(%d)=", msg->msg_namelen); printsock(tcp, (long)msg->msg_name, msg->msg_namelen); tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen); tprint_iov_upto(tcp, (unsigned long)msg->msg_iovlen, (unsigned long)msg->msg_iov, 1, data_size); #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen); if (msg->msg_controllen) printcmsghdr(tcp, (unsigned long) msg->msg_control, msg->msg_controllen); tprints(", msg_flags="); printflags(msg_flags, msg->msg_flags, "MSG_???"); #else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */ tprintf("msg_accrights=%#lx, msg_accrightslen=%u", (unsigned long) msg->msg_accrights, msg->msg_accrightslen); #endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */ tprints("}"); }
static int print_sg_io_v4_req(struct tcb *tcp, const long arg) { struct sg_io_v4 sg_io; if (umove(tcp, arg, &sg_io) < 0) { tprints("???}"); return RVAL_DECODED | 1; } printxval(bsg_protocol, sg_io.protocol, "BSG_PROTOCOL_???"); tprints(", "); printxval(bsg_subprotocol, sg_io.subprotocol, "BSG_SUB_PROTOCOL_???"); tprintf(", request[%u]=", sg_io.request_len); print_sg_io_buffer(tcp, sg_io.request, sg_io.request_len); tprintf(", request_tag=%llu", (unsigned long long) sg_io.request_tag); tprintf(", request_attr=%u", sg_io.request_attr); tprintf(", request_priority=%u", sg_io.request_priority); tprintf(", request_extra=%u", sg_io.request_extra); tprintf(", max_response_len=%u", sg_io.max_response_len); tprintf(", dout_iovec_count=%u", sg_io.dout_iovec_count); tprintf(", dout_xfer_len=%u", sg_io.dout_xfer_len); tprintf(", din_iovec_count=%u", sg_io.din_iovec_count); tprintf(", din_xfer_len=%u", sg_io.din_xfer_len); tprintf(", timeout=%u", sg_io.timeout); tprintf(", flags=%u", sg_io.flags); tprintf(", usr_ptr=%llu", (unsigned long long) sg_io.usr_ptr); tprintf(", spare_in=%u", sg_io.spare_in); tprintf(", dout[%u]=", sg_io.dout_xfer_len); if (sg_io.dout_iovec_count) tprint_iov_upto(tcp, sg_io.dout_iovec_count, sg_io.dout_xferp, 1, sg_io.dout_xfer_len); else print_sg_io_buffer(tcp, sg_io.dout_xferp, sg_io.dout_xfer_len); return 1; }
void tprint_iov(struct tcb *tcp, unsigned long len, unsigned long addr, int decode_iov) { tprint_iov_upto(tcp, len, addr, decode_iov, (unsigned long) -1L); }