aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/util.c')
-rw-r--r--tools/perf/util/util.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 35b20dd454de..b7766c577b01 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -14,6 +14,7 @@
14#include <limits.h> 14#include <limits.h>
15#include <byteswap.h> 15#include <byteswap.h>
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/log2.h>
17#include <unistd.h> 18#include <unistd.h>
18#include "callchain.h" 19#include "callchain.h"
19#include "strlist.h" 20#include "strlist.h"
@@ -670,3 +671,39 @@ int fetch_current_timestamp(char *buf, size_t sz)
670 671
671 return 0; 672 return 0;
672} 673}
674
675void print_binary(unsigned char *data, size_t len,
676 size_t bytes_per_line, print_binary_t printer,
677 void *extra)
678{
679 size_t i, j, mask;
680
681 if (!printer)
682 return;
683
684 bytes_per_line = roundup_pow_of_two(bytes_per_line);
685 mask = bytes_per_line - 1;
686
687 printer(BINARY_PRINT_DATA_BEGIN, 0, extra);
688 for (i = 0; i < len; i++) {
689 if ((i & mask) == 0) {
690 printer(BINARY_PRINT_LINE_BEGIN, -1, extra);
691 printer(BINARY_PRINT_ADDR, i, extra);
692 }
693
694 printer(BINARY_PRINT_NUM_DATA, data[i], extra);
695
696 if (((i & mask) == mask) || i == len - 1) {
697 for (j = 0; j < mask-(i & mask); j++)
698 printer(BINARY_PRINT_NUM_PAD, -1, extra);
699
700 printer(BINARY_PRINT_SEP, i, extra);
701 for (j = i & ~mask; j <= i; j++)
702 printer(BINARY_PRINT_CHAR_DATA, data[j], extra);
703 for (j = 0; j < mask-(i & mask); j++)
704 printer(BINARY_PRINT_CHAR_PAD, i, extra);
705 printer(BINARY_PRINT_LINE_END, -1, extra);
706 }
707 }
708 printer(BINARY_PRINT_DATA_END, -1, extra);
709}