Changes: - Add support for decoding iovecs passed via the SG I/O v3 interface. - Decode the "data in" and "data out" buffers in hex instead of in ASCII. - Make print_sg_io_buffer() print square brackets instead of its caller. - Improve consistency with other decoding functions by passing pointers to client memory as integers instead of pointers. - Only print that part of the data in buffer that has been initialized by the SCSI LLD driver.
Signed-off-by: Bart Van Assche <bart.vanass...@sandisk.com> --- scsi.c | 60 +++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/scsi.c b/scsi.c index daf7252..bce149e 100644 --- a/scsi.c +++ b/scsi.c @@ -36,26 +36,31 @@ #include "xlat/sg_io_dxfer_direction.h" static void -print_sg_io_buffer(struct tcb *tcp, unsigned char *addr, const unsigned int len) +print_sg_io_buffer(struct tcb *tcp, unsigned long addr, const unsigned int len) { unsigned char *buf = NULL; unsigned int allocated, i; + tprints("["); if (len == 0) - return; + goto out; allocated = (len > max_strlen) ? max_strlen : len; if ((buf = malloc(allocated)) == NULL || - umoven(tcp, (unsigned long) addr, allocated, (char *) buf) < 0) { - tprintf("%p", addr); - free(buf); - return; + umoven(tcp, addr, allocated, (char *) buf) < 0) { + tprintf("%#lx", addr); + goto free; } tprintf("%02x", buf[0]); for (i = 1; i < allocated; ++i) tprintf(", %02x", buf[i]); - free(buf); if (allocated != len) tprints(", ..."); + +free: + free(buf); + +out: + tprints("]"); } static void @@ -64,9 +69,9 @@ print_sg_io_req(struct tcb *tcp, struct sg_io_hdr *sg_io) tprintf("{'%c', ", sg_io->interface_id); printxval(sg_io_dxfer_direction, sg_io->dxfer_direction, "SG_DXFER_???"); - tprintf(", cmd[%u]=[", sg_io->cmd_len); - print_sg_io_buffer(tcp, sg_io->cmdp, sg_io->cmd_len); - tprintf("], mx_sb_len=%d, ", sg_io->mx_sb_len); + 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); @@ -74,28 +79,41 @@ print_sg_io_req(struct tcb *tcp, struct sg_io_hdr *sg_io) 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); - printstr(tcp, (unsigned long) sg_io->dxferp, - sg_io->dxfer_len); - tprints("]"); + 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); } } static void print_sg_io_res(struct tcb *tcp, struct sg_io_hdr *sg_io) { + uint32_t din_len; + if (sg_io->dxfer_direction == SG_DXFER_FROM_DEV || sg_io->dxfer_direction == SG_DXFER_TO_FROM_DEV) { - tprintf(", data[%u]=[", sg_io->dxfer_len); - printstr(tcp, (unsigned long) sg_io->dxferp, - sg_io->dxfer_len); - tprints("]"); + 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, sg_io->sbp, sg_io->sb_len_wr); - tprintf("], host_status=%#x, ", sg_io->host_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); -- 2.1.4 ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel