diff options
author | Ingo Molnar <mingo@kernel.org> | 2014-12-08 05:50:24 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2014-12-08 05:50:24 -0500 |
commit | 2a2662bf88e693d477ef08351d03934f7bc0b51c (patch) | |
tree | cef243df159cc12ada7e97998a253df7c0abb2a2 /tools/perf/ui/stdio/hist.c | |
parent | b2776bf7149bddd1f4161f14f79520f17fc1d71d (diff) | |
parent | 36748b9518a2437beffe861b47dff6d12b736b3f (diff) |
Merge branch 'perf/core-v3' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks into perf/hw_breakpoints
Pull AMD range breakpoints support from Frederic Weisbecker:
" - Extend breakpoint tools and core to support address range through perf
event with initial backend support for AMD extended breakpoints.
Syntax is:
perf record -e mem:addr/len:type
For example set write breakpoint from 0x1000 to 0x1200 (0x1000 + 512)
perf record -e mem:0x1000/512:w
- Clean up a bit breakpoint code validation
It has been acked by Jiri and Oleg. "
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/ui/stdio/hist.c')
-rw-r--r-- | tools/perf/ui/stdio/hist.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c index 15b451acbde6..dfcbc90146ef 100644 --- a/tools/perf/ui/stdio/hist.c +++ b/tools/perf/ui/stdio/hist.c | |||
@@ -41,6 +41,7 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain, | |||
41 | { | 41 | { |
42 | int i; | 42 | int i; |
43 | size_t ret = 0; | 43 | size_t ret = 0; |
44 | char bf[1024]; | ||
44 | 45 | ||
45 | ret += callchain__fprintf_left_margin(fp, left_margin); | 46 | ret += callchain__fprintf_left_margin(fp, left_margin); |
46 | for (i = 0; i < depth; i++) { | 47 | for (i = 0; i < depth; i++) { |
@@ -56,11 +57,8 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain, | |||
56 | } else | 57 | } else |
57 | ret += fprintf(fp, "%s", " "); | 58 | ret += fprintf(fp, "%s", " "); |
58 | } | 59 | } |
59 | if (chain->ms.sym) | 60 | fputs(callchain_list__sym_name(chain, bf, sizeof(bf), false), fp); |
60 | ret += fprintf(fp, "%s\n", chain->ms.sym->name); | 61 | fputc('\n', fp); |
61 | else | ||
62 | ret += fprintf(fp, "0x%0" PRIx64 "\n", chain->ip); | ||
63 | |||
64 | return ret; | 62 | return ret; |
65 | } | 63 | } |
66 | 64 | ||
@@ -168,6 +166,7 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root, | |||
168 | struct rb_node *node; | 166 | struct rb_node *node; |
169 | int i = 0; | 167 | int i = 0; |
170 | int ret = 0; | 168 | int ret = 0; |
169 | char bf[1024]; | ||
171 | 170 | ||
172 | /* | 171 | /* |
173 | * If have one single callchain root, don't bother printing | 172 | * If have one single callchain root, don't bother printing |
@@ -196,10 +195,8 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root, | |||
196 | } else | 195 | } else |
197 | ret += callchain__fprintf_left_margin(fp, left_margin); | 196 | ret += callchain__fprintf_left_margin(fp, left_margin); |
198 | 197 | ||
199 | if (chain->ms.sym) | 198 | ret += fprintf(fp, "%s\n", callchain_list__sym_name(chain, bf, sizeof(bf), |
200 | ret += fprintf(fp, " %s\n", chain->ms.sym->name); | 199 | false)); |
201 | else | ||
202 | ret += fprintf(fp, " %p\n", (void *)(long)chain->ip); | ||
203 | 200 | ||
204 | if (++entries_printed == callchain_param.print_limit) | 201 | if (++entries_printed == callchain_param.print_limit) |
205 | break; | 202 | break; |
@@ -219,6 +216,7 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node, | |||
219 | { | 216 | { |
220 | struct callchain_list *chain; | 217 | struct callchain_list *chain; |
221 | size_t ret = 0; | 218 | size_t ret = 0; |
219 | char bf[1024]; | ||
222 | 220 | ||
223 | if (!node) | 221 | if (!node) |
224 | return 0; | 222 | return 0; |
@@ -229,11 +227,8 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node, | |||
229 | list_for_each_entry(chain, &node->val, list) { | 227 | list_for_each_entry(chain, &node->val, list) { |
230 | if (chain->ip >= PERF_CONTEXT_MAX) | 228 | if (chain->ip >= PERF_CONTEXT_MAX) |
231 | continue; | 229 | continue; |
232 | if (chain->ms.sym) | 230 | ret += fprintf(fp, " %s\n", callchain_list__sym_name(chain, |
233 | ret += fprintf(fp, " %s\n", chain->ms.sym->name); | 231 | bf, sizeof(bf), false)); |
234 | else | ||
235 | ret += fprintf(fp, " %p\n", | ||
236 | (void *)(long)chain->ip); | ||
237 | } | 232 | } |
238 | 233 | ||
239 | return ret; | 234 | return ret; |