aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/tests/code-reading.c
diff options
context:
space:
mode:
authorJan Stancek <jstancek@redhat.com>2015-09-02 04:19:14 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-09-14 11:50:10 -0400
commit729a7ed103ae1b04a5c87a5855885e0973161da4 (patch)
tree7c292649c0d1f40581230b977698997c76ec530a /tools/perf/tests/code-reading.c
parent8f3e5684d3fbd91ead283916676fa3dac22615e5 (diff)
perf tests: Take into account address of each objdump line
objdump output can contain repeated bytes. At the moment test reads all output sequentially, assuming each address is represented in output only once: ffffffff8164efb3 <retint_swapgs+0x9>: ffffffff8164efb3: c1 5d 00 eb rcrl $0xeb,0x0(%rbp) ffffffff8164efb7: 00 4c 8b 5c add %cl,0x5c(%rbx,%rcx,4) ffffffff8164efb8 <restore_c_regs_and_iret>: ffffffff8164efb8: 4c 8b 5c 24 30 mov 0x30(%rsp),%r11 ffffffff8164efbd: 4c 8b 54 24 38 mov 0x38(%rsp),%r10 Store objdump output to buffer according to offset calculated from address on each line. Signed-off-by: Jan Stancek <jstancek@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/ad13289a55d6350f7717757c7e32c2d4286402bd.1441181335.git.jstancek@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/tests/code-reading.c')
-rw-r--r--tools/perf/tests/code-reading.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 39c784a100a9..38ee90bc2228 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -33,20 +33,20 @@ static unsigned int hex(char c)
33 return c - 'A' + 10; 33 return c - 'A' + 10;
34} 34}
35 35
36static void read_objdump_line(const char *line, size_t line_len, void **buf, 36static size_t read_objdump_line(const char *line, size_t line_len, void *buf,
37 size_t *len) 37 size_t len)
38{ 38{
39 const char *p; 39 const char *p;
40 size_t i; 40 size_t i, j = 0;
41 41
42 /* Skip to a colon */ 42 /* Skip to a colon */
43 p = strchr(line, ':'); 43 p = strchr(line, ':');
44 if (!p) 44 if (!p)
45 return; 45 return 0;
46 i = p + 1 - line; 46 i = p + 1 - line;
47 47
48 /* Read bytes */ 48 /* Read bytes */
49 while (*len) { 49 while (j < len) {
50 char c1, c2; 50 char c1, c2;
51 51
52 /* Skip spaces */ 52 /* Skip spaces */
@@ -65,20 +65,26 @@ static void read_objdump_line(const char *line, size_t line_len, void **buf,
65 if (i < line_len && line[i] && !isspace(line[i])) 65 if (i < line_len && line[i] && !isspace(line[i]))
66 break; 66 break;
67 /* Store byte */ 67 /* Store byte */
68 *(unsigned char *)*buf = (hex(c1) << 4) | hex(c2); 68 *(unsigned char *)buf = (hex(c1) << 4) | hex(c2);
69 *buf += 1; 69 buf += 1;
70 *len -= 1; 70 j++;
71 } 71 }
72 /* return number of successfully read bytes */
73 return j;
72} 74}
73 75
74static int read_objdump_output(FILE *f, void **buf, size_t *len) 76static int read_objdump_output(FILE *f, void *buf, size_t *len, u64 start_addr)
75{ 77{
76 char *line = NULL; 78 char *line = NULL;
77 size_t line_len; 79 size_t line_len, off_last = 0;
78 ssize_t ret; 80 ssize_t ret;
79 int err = 0; 81 int err = 0;
82 u64 addr;
83
84 while (off_last < *len) {
85 size_t off, read_bytes, written_bytes;
86 unsigned char tmp[BUFSZ];
80 87
81 while (1) {
82 ret = getline(&line, &line_len, f); 88 ret = getline(&line, &line_len, f);
83 if (feof(f)) 89 if (feof(f))
84 break; 90 break;
@@ -87,9 +93,28 @@ static int read_objdump_output(FILE *f, void **buf, size_t *len)
87 err = -1; 93 err = -1;
88 break; 94 break;
89 } 95 }
90 read_objdump_line(line, ret, buf, len); 96
97 /* read objdump data into temporary buffer */
98 read_bytes = read_objdump_line(line, ret, tmp, sizeof(tmp));
99 if (!read_bytes)
100 continue;
101
102 if (sscanf(line, "%"PRIx64, &addr) != 1)
103 continue;
104
105 /* copy it from temporary buffer to 'buf' according
106 * to address on current objdump line */
107 off = addr - start_addr;
108 if (off >= *len)
109 break;
110 written_bytes = MIN(read_bytes, *len - off);
111 memcpy(buf + off, tmp, written_bytes);
112 off_last = off + written_bytes;
91 } 113 }
92 114
115 /* len returns number of bytes that could not be read */
116 *len -= off_last;
117
93 free(line); 118 free(line);
94 119
95 return err; 120 return err;
@@ -120,7 +145,7 @@ static int read_via_objdump(const char *filename, u64 addr, void *buf,
120 return -1; 145 return -1;
121 } 146 }
122 147
123 ret = read_objdump_output(f, &buf, &len); 148 ret = read_objdump_output(f, buf, &len, addr);
124 if (len) { 149 if (len) {
125 pr_debug("objdump read too few bytes\n"); 150 pr_debug("objdump read too few bytes\n");
126 if (!ret) 151 if (!ret)