16ff66f50SPeter Crosthwaite /*
26ff66f50SPeter Crosthwaite * Helper to hexdump a buffer
36ff66f50SPeter Crosthwaite *
46ff66f50SPeter Crosthwaite * Copyright (c) 2013 Red Hat, Inc.
56ff66f50SPeter Crosthwaite * Copyright (c) 2013 Gerd Hoffmann <kraxel@redhat.com>
66ff66f50SPeter Crosthwaite * Copyright (c) 2013 Peter Crosthwaite <peter.crosthwaite@xilinx.com>
76ff66f50SPeter Crosthwaite * Copyright (c) 2013 Xilinx, Inc
86ff66f50SPeter Crosthwaite *
96ff66f50SPeter Crosthwaite * This work is licensed under the terms of the GNU GPL, version 2. See
106ff66f50SPeter Crosthwaite * the COPYING file in the top-level directory.
116ff66f50SPeter Crosthwaite *
126ff66f50SPeter Crosthwaite * Contributions after 2012-01-13 are licensed under the terms of the
136ff66f50SPeter Crosthwaite * GNU GPL, version 2 or (at your option) any later version.
146ff66f50SPeter Crosthwaite */
156ff66f50SPeter Crosthwaite
16aafd7584SPeter Maydell #include "qemu/osdep.h"
17*415b7327SMarc-André Lureau #include "qemu/cutils.h"
186ff66f50SPeter Crosthwaite
qemu_hexdump_line(char * line,unsigned int b,const void * bufptr,unsigned int len,bool ascii)19bbb16908SLaurent Vivier void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr,
20bbb16908SLaurent Vivier unsigned int len, bool ascii)
216ff66f50SPeter Crosthwaite {
2267263b33SPhilippe Mathieu-Daudé const char *buf = bufptr;
23bbb16908SLaurent Vivier int i, c;
246ff66f50SPeter Crosthwaite
25bbb16908SLaurent Vivier if (len > QEMU_HEXDUMP_LINE_BYTES) {
26bbb16908SLaurent Vivier len = QEMU_HEXDUMP_LINE_BYTES;
276ff66f50SPeter Crosthwaite }
28bbb16908SLaurent Vivier
29bbb16908SLaurent Vivier line += snprintf(line, 6, "%04x:", b);
30bbb16908SLaurent Vivier for (i = 0; i < QEMU_HEXDUMP_LINE_BYTES; i++) {
31a1555559SIsaac Lozano if ((i % 4) == 0) {
32bbb16908SLaurent Vivier *line++ = ' ';
336ff66f50SPeter Crosthwaite }
34a1555559SIsaac Lozano if (i < len) {
35bbb16908SLaurent Vivier line += sprintf(line, " %02x", (unsigned char)buf[b + i]);
36a1555559SIsaac Lozano } else {
37bbb16908SLaurent Vivier line += sprintf(line, " ");
386ff66f50SPeter Crosthwaite }
396ff66f50SPeter Crosthwaite }
40bbb16908SLaurent Vivier if (ascii) {
41bbb16908SLaurent Vivier *line++ = ' ';
42a1555559SIsaac Lozano for (i = 0; i < len; i++) {
43a1555559SIsaac Lozano c = buf[b + i];
44a1555559SIsaac Lozano if (c < ' ' || c > '~') {
45a1555559SIsaac Lozano c = '.';
46a1555559SIsaac Lozano }
47bbb16908SLaurent Vivier *line++ = c;
48a1555559SIsaac Lozano }
496ff66f50SPeter Crosthwaite }
50bbb16908SLaurent Vivier *line = '\0';
51bbb16908SLaurent Vivier }
52bbb16908SLaurent Vivier
qemu_hexdump(FILE * fp,const char * prefix,const void * bufptr,size_t size)53bbb16908SLaurent Vivier void qemu_hexdump(FILE *fp, const char *prefix,
54bbb16908SLaurent Vivier const void *bufptr, size_t size)
55bbb16908SLaurent Vivier {
56bbb16908SLaurent Vivier unsigned int b, len;
57bbb16908SLaurent Vivier char line[QEMU_HEXDUMP_LINE_LEN];
58bbb16908SLaurent Vivier
59bbb16908SLaurent Vivier for (b = 0; b < size; b += QEMU_HEXDUMP_LINE_BYTES) {
60bbb16908SLaurent Vivier len = size - b;
61bbb16908SLaurent Vivier qemu_hexdump_line(line, b, bufptr, len, true);
62bbb16908SLaurent Vivier fprintf(fp, "%s: %s\n", prefix, line);
63bbb16908SLaurent Vivier }
64bbb16908SLaurent Vivier
656ff66f50SPeter Crosthwaite }
66