Patchwork [RFC,v1] iov: Factor out hexdumper

login
register
mail settings
Submitter Peter Crosthwaite
Date Feb. 7, 2013, 6:22 a.m.
Message ID <8236283a-5f9a-4d07-9230-8b3319349c54@AM1EHSMHS002.ehs.local>
Download mbox | patch
Permalink /patch/218822/
State New
Headers show

Comments

Peter Crosthwaite - Feb. 7, 2013, 6:22 a.m.
Factor out the hexdumper functionality from iov for all to use. Useful for
creating verbose debug printfery that dumps packet data.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
See v9 of the pl330 series for example usage.

 include/qemu/hexdump.h |    3 +++
 util/Makefile.objs     |    1 +
 util/hexdump.c         |   23 +++++++++++++++++++++++
 util/iov.c             |   31 ++++++-------------------------
 4 files changed, 33 insertions(+), 25 deletions(-)
 create mode 100644 include/qemu/hexdump.h
 create mode 100644 util/hexdump.c
Stefan Hajnoczi - Feb. 7, 2013, 8:56 a.m.
On Thu, Feb 07, 2013 at 04:22:02PM +1000, Peter Crosthwaite wrote:
> diff --git a/util/hexdump.c b/util/hexdump.c
> new file mode 100644
> index 0000000..38d64ca
> --- /dev/null
> +++ b/util/hexdump.c
> @@ -0,0 +1,23 @@

License/copyright header missing.

Looks good otherwise.

Stefan
Peter Crosthwaite - Feb. 8, 2013, 1:32 a.m.
On Thu, Feb 7, 2013 at 6:56 PM, Stefan Hajnoczi <stefanha@gmail.com> wrote:
> On Thu, Feb 07, 2013 at 04:22:02PM +1000, Peter Crosthwaite wrote:
>> diff --git a/util/hexdump.c b/util/hexdump.c
>> new file mode 100644
>> index 0000000..38d64ca
>> --- /dev/null
>> +++ b/util/hexdump.c
>> @@ -0,0 +1,23 @@
>
> License/copyright header missing.
>
> Looks good otherwise.
>

Thanks Stefan,

Ill fix this and prepend this to v9 of the PL330 series and it can be
cherry picked off the front or merged along with PL330 (which uses
it).

Regards,
Peter

> Stefan
>

Patch

diff --git a/include/qemu/hexdump.h b/include/qemu/hexdump.h
new file mode 100644
index 0000000..87bccf4
--- /dev/null
+++ b/include/qemu/hexdump.h
@@ -0,0 +1,3 @@ 
+#include "qemu-common.h"
+
+void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size);
diff --git a/util/Makefile.objs b/util/Makefile.objs
index 495a178..068ceac 100644
--- a/util/Makefile.objs
+++ b/util/Makefile.objs
@@ -8,3 +8,4 @@  util-obj-y += error.o qemu-error.o
 util-obj-$(CONFIG_POSIX) += compatfd.o
 util-obj-y += iov.o aes.o qemu-config.o qemu-sockets.o uri.o notify.o
 util-obj-y += qemu-option.o qemu-progress.o
+util-obj-y += hexdump.o
diff --git a/util/hexdump.c b/util/hexdump.c
new file mode 100644
index 0000000..38d64ca
--- /dev/null
+++ b/util/hexdump.c
@@ -0,0 +1,23 @@ 
+#include "qemu-common.h"
+#include "qemu/hexdump.h"
+
+void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size)
+{
+    unsigned int b;
+
+    for (b = 0; b < size; b++) {
+        if ((b % 16) == 0) {
+            fprintf(fp, "%s: %04x:", prefix, b);
+        }
+        if ((b % 4) == 0) {
+            fprintf(fp, " ");
+        }
+        fprintf(fp, " %02x", (unsigned char)buf[b]);
+        if ((b % 16) == 15) {
+            fprintf(fp, "\n");
+        }
+    }
+    if ((b % 16) != 0) {
+        fprintf(fp, "\n");
+    }
+}
diff --git a/util/iov.c b/util/iov.c
index fbe675d..d89933d 100644
--- a/util/iov.c
+++ b/util/iov.c
@@ -17,6 +17,7 @@ 
  */
 
 #include "qemu/iov.h"
+#include "qemu/hexdump.h"
 
 #ifdef _WIN32
 # include <windows.h>
@@ -201,31 +202,11 @@  ssize_t iov_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt,
 void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
                  FILE *fp, const char *prefix, size_t limit)
 {
-    unsigned int i, v, b;
-    uint8_t *c;
-
-    c = iov[0].iov_base;
-    for (i = 0, v = 0, b = 0; b < limit; i++, b++) {
-        if (i == iov[v].iov_len) {
-            i = 0; v++;
-            if (v == iov_cnt) {
-                break;
-            }
-            c = iov[v].iov_base;
-        }
-        if ((b % 16) == 0) {
-            fprintf(fp, "%s: %04x:", prefix, b);
-        }
-        if ((b % 4) == 0) {
-            fprintf(fp, " ");
-        }
-        fprintf(fp, " %02x", c[i]);
-        if ((b % 16) == 15) {
-            fprintf(fp, "\n");
-        }
-    }
-    if ((b % 16) != 0) {
-        fprintf(fp, "\n");
+    int v;
+    for (v = 0; v < iov_cnt && limit; v++) {
+        int size = limit < iov[v].iov_len ? limit : iov[v].iov_len;
+        hexdump(iov[v].iov_base, fp, prefix, size);
+        limit -= size;
     }
 }