diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
commit | 0cb7bf61b1e9f05027de58c80f9b46a714d24e35 (patch) | |
tree | 41fb55cf62d07b425122f9a8b96412c0d8eb99c5 /tools/perf/util | |
parent | aa877175e7a9982233ed8f10cb4bfddd78d82741 (diff) | |
parent | 3eab887a55424fc2c27553b7bfe32330df83f7b8 (diff) |
Merge branch 'linus' into smp/hotplug
Apply upstream changes to avoid conflicts with pending patches.
Diffstat (limited to 'tools/perf/util')
-rw-r--r-- | tools/perf/util/evsel.c | 6 | ||||
-rw-r--r-- | tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 44 | ||||
-rw-r--r-- | tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c | 24 | ||||
-rw-r--r-- | tools/perf/util/jitdump.c | 1 | ||||
-rw-r--r-- | tools/perf/util/probe-event.c | 60 | ||||
-rw-r--r-- | tools/perf/util/probe-event.h | 6 | ||||
-rw-r--r-- | tools/perf/util/probe-file.c | 36 | ||||
-rw-r--r-- | tools/perf/util/probe-finder.c | 15 | ||||
-rw-r--r-- | tools/perf/util/sort.c | 6 | ||||
-rw-r--r-- | tools/perf/util/symbol-elf.c | 3 | ||||
-rw-r--r-- | tools/perf/util/unwind-libdw.c | 2 | ||||
-rw-r--r-- | tools/perf/util/unwind-libunwind-local.c | 2 |
12 files changed, 136 insertions, 69 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index d9b80ef881cd..21fd573106ed 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -507,17 +507,17 @@ static int __perf_evsel__hw_cache_name(u64 config, char *bf, size_t size) | |||
507 | u8 op, result, type = (config >> 0) & 0xff; | 507 | u8 op, result, type = (config >> 0) & 0xff; |
508 | const char *err = "unknown-ext-hardware-cache-type"; | 508 | const char *err = "unknown-ext-hardware-cache-type"; |
509 | 509 | ||
510 | if (type > PERF_COUNT_HW_CACHE_MAX) | 510 | if (type >= PERF_COUNT_HW_CACHE_MAX) |
511 | goto out_err; | 511 | goto out_err; |
512 | 512 | ||
513 | op = (config >> 8) & 0xff; | 513 | op = (config >> 8) & 0xff; |
514 | err = "unknown-ext-hardware-cache-op"; | 514 | err = "unknown-ext-hardware-cache-op"; |
515 | if (op > PERF_COUNT_HW_CACHE_OP_MAX) | 515 | if (op >= PERF_COUNT_HW_CACHE_OP_MAX) |
516 | goto out_err; | 516 | goto out_err; |
517 | 517 | ||
518 | result = (config >> 16) & 0xff; | 518 | result = (config >> 16) & 0xff; |
519 | err = "unknown-ext-hardware-cache-result"; | 519 | err = "unknown-ext-hardware-cache-result"; |
520 | if (result > PERF_COUNT_HW_CACHE_RESULT_MAX) | 520 | if (result >= PERF_COUNT_HW_CACHE_RESULT_MAX) |
521 | goto out_err; | 521 | goto out_err; |
522 | 522 | ||
523 | err = "invalid-cache"; | 523 | err = "invalid-cache"; |
diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c index 9c8f15da86ce..8ff6c6a61291 100644 --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | |||
@@ -123,8 +123,6 @@ struct intel_pt_decoder { | |||
123 | bool have_calc_cyc_to_tsc; | 123 | bool have_calc_cyc_to_tsc; |
124 | int exec_mode; | 124 | int exec_mode; |
125 | unsigned int insn_bytes; | 125 | unsigned int insn_bytes; |
126 | uint64_t sign_bit; | ||
127 | uint64_t sign_bits; | ||
128 | uint64_t period; | 126 | uint64_t period; |
129 | enum intel_pt_period_type period_type; | 127 | enum intel_pt_period_type period_type; |
130 | uint64_t tot_insn_cnt; | 128 | uint64_t tot_insn_cnt; |
@@ -191,9 +189,6 @@ struct intel_pt_decoder *intel_pt_decoder_new(struct intel_pt_params *params) | |||
191 | decoder->data = params->data; | 189 | decoder->data = params->data; |
192 | decoder->return_compression = params->return_compression; | 190 | decoder->return_compression = params->return_compression; |
193 | 191 | ||
194 | decoder->sign_bit = (uint64_t)1 << 47; | ||
195 | decoder->sign_bits = ~(((uint64_t)1 << 48) - 1); | ||
196 | |||
197 | decoder->period = params->period; | 192 | decoder->period = params->period; |
198 | decoder->period_type = params->period_type; | 193 | decoder->period_type = params->period_type; |
199 | 194 | ||
@@ -362,21 +357,30 @@ int intel_pt__strerror(int code, char *buf, size_t buflen) | |||
362 | return 0; | 357 | return 0; |
363 | } | 358 | } |
364 | 359 | ||
365 | static uint64_t intel_pt_calc_ip(struct intel_pt_decoder *decoder, | 360 | static uint64_t intel_pt_calc_ip(const struct intel_pt_pkt *packet, |
366 | const struct intel_pt_pkt *packet, | ||
367 | uint64_t last_ip) | 361 | uint64_t last_ip) |
368 | { | 362 | { |
369 | uint64_t ip; | 363 | uint64_t ip; |
370 | 364 | ||
371 | switch (packet->count) { | 365 | switch (packet->count) { |
372 | case 2: | 366 | case 1: |
373 | ip = (last_ip & (uint64_t)0xffffffffffff0000ULL) | | 367 | ip = (last_ip & (uint64_t)0xffffffffffff0000ULL) | |
374 | packet->payload; | 368 | packet->payload; |
375 | break; | 369 | break; |
376 | case 4: | 370 | case 2: |
377 | ip = (last_ip & (uint64_t)0xffffffff00000000ULL) | | 371 | ip = (last_ip & (uint64_t)0xffffffff00000000ULL) | |
378 | packet->payload; | 372 | packet->payload; |
379 | break; | 373 | break; |
374 | case 3: | ||
375 | ip = packet->payload; | ||
376 | /* Sign-extend 6-byte ip */ | ||
377 | if (ip & (uint64_t)0x800000000000ULL) | ||
378 | ip |= (uint64_t)0xffff000000000000ULL; | ||
379 | break; | ||
380 | case 4: | ||
381 | ip = (last_ip & (uint64_t)0xffff000000000000ULL) | | ||
382 | packet->payload; | ||
383 | break; | ||
380 | case 6: | 384 | case 6: |
381 | ip = packet->payload; | 385 | ip = packet->payload; |
382 | break; | 386 | break; |
@@ -384,16 +388,12 @@ static uint64_t intel_pt_calc_ip(struct intel_pt_decoder *decoder, | |||
384 | return 0; | 388 | return 0; |
385 | } | 389 | } |
386 | 390 | ||
387 | if (ip & decoder->sign_bit) | ||
388 | return ip | decoder->sign_bits; | ||
389 | |||
390 | return ip; | 391 | return ip; |
391 | } | 392 | } |
392 | 393 | ||
393 | static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder) | 394 | static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder) |
394 | { | 395 | { |
395 | decoder->last_ip = intel_pt_calc_ip(decoder, &decoder->packet, | 396 | decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip); |
396 | decoder->last_ip); | ||
397 | } | 397 | } |
398 | 398 | ||
399 | static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder) | 399 | static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder) |
@@ -1657,6 +1657,12 @@ next: | |||
1657 | } | 1657 | } |
1658 | } | 1658 | } |
1659 | 1659 | ||
1660 | static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder) | ||
1661 | { | ||
1662 | return decoder->last_ip || decoder->packet.count == 0 || | ||
1663 | decoder->packet.count == 3 || decoder->packet.count == 6; | ||
1664 | } | ||
1665 | |||
1660 | /* Walk PSB+ packets to get in sync. */ | 1666 | /* Walk PSB+ packets to get in sync. */ |
1661 | static int intel_pt_walk_psb(struct intel_pt_decoder *decoder) | 1667 | static int intel_pt_walk_psb(struct intel_pt_decoder *decoder) |
1662 | { | 1668 | { |
@@ -1677,8 +1683,7 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder) | |||
1677 | 1683 | ||
1678 | case INTEL_PT_FUP: | 1684 | case INTEL_PT_FUP: |
1679 | decoder->pge = true; | 1685 | decoder->pge = true; |
1680 | if (decoder->last_ip || decoder->packet.count == 6 || | 1686 | if (intel_pt_have_ip(decoder)) { |
1681 | decoder->packet.count == 0) { | ||
1682 | uint64_t current_ip = decoder->ip; | 1687 | uint64_t current_ip = decoder->ip; |
1683 | 1688 | ||
1684 | intel_pt_set_ip(decoder); | 1689 | intel_pt_set_ip(decoder); |
@@ -1767,8 +1772,7 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) | |||
1767 | case INTEL_PT_TIP_PGE: | 1772 | case INTEL_PT_TIP_PGE: |
1768 | case INTEL_PT_TIP: | 1773 | case INTEL_PT_TIP: |
1769 | decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD; | 1774 | decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD; |
1770 | if (decoder->last_ip || decoder->packet.count == 6 || | 1775 | if (intel_pt_have_ip(decoder)) |
1771 | decoder->packet.count == 0) | ||
1772 | intel_pt_set_ip(decoder); | 1776 | intel_pt_set_ip(decoder); |
1773 | if (decoder->ip) | 1777 | if (decoder->ip) |
1774 | return 0; | 1778 | return 0; |
@@ -1776,9 +1780,7 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) | |||
1776 | 1780 | ||
1777 | case INTEL_PT_FUP: | 1781 | case INTEL_PT_FUP: |
1778 | if (decoder->overflow) { | 1782 | if (decoder->overflow) { |
1779 | if (decoder->last_ip || | 1783 | if (intel_pt_have_ip(decoder)) |
1780 | decoder->packet.count == 6 || | ||
1781 | decoder->packet.count == 0) | ||
1782 | intel_pt_set_ip(decoder); | 1784 | intel_pt_set_ip(decoder); |
1783 | if (decoder->ip) | 1785 | if (decoder->ip) |
1784 | return 0; | 1786 | return 0; |
diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c index b1257c816310..4f7b32020487 100644 --- a/tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c +++ b/tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c | |||
@@ -292,36 +292,46 @@ static int intel_pt_get_ip(enum intel_pt_pkt_type type, unsigned int byte, | |||
292 | const unsigned char *buf, size_t len, | 292 | const unsigned char *buf, size_t len, |
293 | struct intel_pt_pkt *packet) | 293 | struct intel_pt_pkt *packet) |
294 | { | 294 | { |
295 | switch (byte >> 5) { | 295 | int ip_len; |
296 | |||
297 | packet->count = byte >> 5; | ||
298 | |||
299 | switch (packet->count) { | ||
296 | case 0: | 300 | case 0: |
297 | packet->count = 0; | 301 | ip_len = 0; |
298 | break; | 302 | break; |
299 | case 1: | 303 | case 1: |
300 | if (len < 3) | 304 | if (len < 3) |
301 | return INTEL_PT_NEED_MORE_BYTES; | 305 | return INTEL_PT_NEED_MORE_BYTES; |
302 | packet->count = 2; | 306 | ip_len = 2; |
303 | packet->payload = le16_to_cpu(*(uint16_t *)(buf + 1)); | 307 | packet->payload = le16_to_cpu(*(uint16_t *)(buf + 1)); |
304 | break; | 308 | break; |
305 | case 2: | 309 | case 2: |
306 | if (len < 5) | 310 | if (len < 5) |
307 | return INTEL_PT_NEED_MORE_BYTES; | 311 | return INTEL_PT_NEED_MORE_BYTES; |
308 | packet->count = 4; | 312 | ip_len = 4; |
309 | packet->payload = le32_to_cpu(*(uint32_t *)(buf + 1)); | 313 | packet->payload = le32_to_cpu(*(uint32_t *)(buf + 1)); |
310 | break; | 314 | break; |
311 | case 3: | 315 | case 3: |
312 | case 6: | 316 | case 4: |
313 | if (len < 7) | 317 | if (len < 7) |
314 | return INTEL_PT_NEED_MORE_BYTES; | 318 | return INTEL_PT_NEED_MORE_BYTES; |
315 | packet->count = 6; | 319 | ip_len = 6; |
316 | memcpy_le64(&packet->payload, buf + 1, 6); | 320 | memcpy_le64(&packet->payload, buf + 1, 6); |
317 | break; | 321 | break; |
322 | case 6: | ||
323 | if (len < 9) | ||
324 | return INTEL_PT_NEED_MORE_BYTES; | ||
325 | ip_len = 8; | ||
326 | packet->payload = le64_to_cpu(*(uint64_t *)(buf + 1)); | ||
327 | break; | ||
318 | default: | 328 | default: |
319 | return INTEL_PT_BAD_PACKET; | 329 | return INTEL_PT_BAD_PACKET; |
320 | } | 330 | } |
321 | 331 | ||
322 | packet->type = type; | 332 | packet->type = type; |
323 | 333 | ||
324 | return packet->count + 1; | 334 | return ip_len + 1; |
325 | } | 335 | } |
326 | 336 | ||
327 | static int intel_pt_get_mode(const unsigned char *buf, size_t len, | 337 | static int intel_pt_get_mode(const unsigned char *buf, size_t len, |
diff --git a/tools/perf/util/jitdump.c b/tools/perf/util/jitdump.c index 9f3305f6b6d5..95f0884aae02 100644 --- a/tools/perf/util/jitdump.c +++ b/tools/perf/util/jitdump.c | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <sys/sysmacros.h> | ||
1 | #include <sys/types.h> | 2 | #include <sys/types.h> |
2 | #include <stdio.h> | 3 | #include <stdio.h> |
3 | #include <stdlib.h> | 4 | #include <stdlib.h> |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 953dc1ab2ed7..28733962cd80 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -170,15 +170,17 @@ static struct map *kernel_get_module_map(const char *module) | |||
170 | module = "kernel"; | 170 | module = "kernel"; |
171 | 171 | ||
172 | for (pos = maps__first(maps); pos; pos = map__next(pos)) { | 172 | for (pos = maps__first(maps); pos; pos = map__next(pos)) { |
173 | /* short_name is "[module]" */ | ||
173 | if (strncmp(pos->dso->short_name + 1, module, | 174 | if (strncmp(pos->dso->short_name + 1, module, |
174 | pos->dso->short_name_len - 2) == 0) { | 175 | pos->dso->short_name_len - 2) == 0 && |
176 | module[pos->dso->short_name_len - 2] == '\0') { | ||
175 | return pos; | 177 | return pos; |
176 | } | 178 | } |
177 | } | 179 | } |
178 | return NULL; | 180 | return NULL; |
179 | } | 181 | } |
180 | 182 | ||
181 | static struct map *get_target_map(const char *target, bool user) | 183 | struct map *get_target_map(const char *target, bool user) |
182 | { | 184 | { |
183 | /* Init maps of given executable or kernel */ | 185 | /* Init maps of given executable or kernel */ |
184 | if (user) | 186 | if (user) |
@@ -385,7 +387,7 @@ static int find_alternative_probe_point(struct debuginfo *dinfo, | |||
385 | if (uprobes) | 387 | if (uprobes) |
386 | address = sym->start; | 388 | address = sym->start; |
387 | else | 389 | else |
388 | address = map->unmap_ip(map, sym->start); | 390 | address = map->unmap_ip(map, sym->start) - map->reloc; |
389 | break; | 391 | break; |
390 | } | 392 | } |
391 | if (!address) { | 393 | if (!address) { |
@@ -664,22 +666,14 @@ static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, | |||
664 | return ret; | 666 | return ret; |
665 | } | 667 | } |
666 | 668 | ||
667 | /* Post processing the probe events */ | 669 | static int |
668 | static int post_process_probe_trace_events(struct probe_trace_event *tevs, | 670 | post_process_kernel_probe_trace_events(struct probe_trace_event *tevs, |
669 | int ntevs, const char *module, | 671 | int ntevs) |
670 | bool uprobe) | ||
671 | { | 672 | { |
672 | struct ref_reloc_sym *reloc_sym; | 673 | struct ref_reloc_sym *reloc_sym; |
673 | char *tmp; | 674 | char *tmp; |
674 | int i, skipped = 0; | 675 | int i, skipped = 0; |
675 | 676 | ||
676 | if (uprobe) | ||
677 | return add_exec_to_probe_trace_events(tevs, ntevs, module); | ||
678 | |||
679 | /* Note that currently ref_reloc_sym based probe is not for drivers */ | ||
680 | if (module) | ||
681 | return add_module_to_probe_trace_events(tevs, ntevs, module); | ||
682 | |||
683 | reloc_sym = kernel_get_ref_reloc_sym(); | 677 | reloc_sym = kernel_get_ref_reloc_sym(); |
684 | if (!reloc_sym) { | 678 | if (!reloc_sym) { |
685 | pr_warning("Relocated base symbol is not found!\n"); | 679 | pr_warning("Relocated base symbol is not found!\n"); |
@@ -711,6 +705,34 @@ static int post_process_probe_trace_events(struct probe_trace_event *tevs, | |||
711 | return skipped; | 705 | return skipped; |
712 | } | 706 | } |
713 | 707 | ||
708 | void __weak | ||
709 | arch__post_process_probe_trace_events(struct perf_probe_event *pev __maybe_unused, | ||
710 | int ntevs __maybe_unused) | ||
711 | { | ||
712 | } | ||
713 | |||
714 | /* Post processing the probe events */ | ||
715 | static int post_process_probe_trace_events(struct perf_probe_event *pev, | ||
716 | struct probe_trace_event *tevs, | ||
717 | int ntevs, const char *module, | ||
718 | bool uprobe) | ||
719 | { | ||
720 | int ret; | ||
721 | |||
722 | if (uprobe) | ||
723 | ret = add_exec_to_probe_trace_events(tevs, ntevs, module); | ||
724 | else if (module) | ||
725 | /* Currently ref_reloc_sym based probe is not for drivers */ | ||
726 | ret = add_module_to_probe_trace_events(tevs, ntevs, module); | ||
727 | else | ||
728 | ret = post_process_kernel_probe_trace_events(tevs, ntevs); | ||
729 | |||
730 | if (ret >= 0) | ||
731 | arch__post_process_probe_trace_events(pev, ntevs); | ||
732 | |||
733 | return ret; | ||
734 | } | ||
735 | |||
714 | /* Try to find perf_probe_event with debuginfo */ | 736 | /* Try to find perf_probe_event with debuginfo */ |
715 | static int try_to_find_probe_trace_events(struct perf_probe_event *pev, | 737 | static int try_to_find_probe_trace_events(struct perf_probe_event *pev, |
716 | struct probe_trace_event **tevs) | 738 | struct probe_trace_event **tevs) |
@@ -749,7 +771,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, | |||
749 | 771 | ||
750 | if (ntevs > 0) { /* Succeeded to find trace events */ | 772 | if (ntevs > 0) { /* Succeeded to find trace events */ |
751 | pr_debug("Found %d probe_trace_events.\n", ntevs); | 773 | pr_debug("Found %d probe_trace_events.\n", ntevs); |
752 | ret = post_process_probe_trace_events(*tevs, ntevs, | 774 | ret = post_process_probe_trace_events(pev, *tevs, ntevs, |
753 | pev->target, pev->uprobes); | 775 | pev->target, pev->uprobes); |
754 | if (ret < 0 || ret == ntevs) { | 776 | if (ret < 0 || ret == ntevs) { |
755 | clear_probe_trace_events(*tevs, ntevs); | 777 | clear_probe_trace_events(*tevs, ntevs); |
@@ -2936,8 +2958,6 @@ errout: | |||
2936 | return err; | 2958 | return err; |
2937 | } | 2959 | } |
2938 | 2960 | ||
2939 | bool __weak arch__prefers_symtab(void) { return false; } | ||
2940 | |||
2941 | /* Concatinate two arrays */ | 2961 | /* Concatinate two arrays */ |
2942 | static void *memcat(void *a, size_t sz_a, void *b, size_t sz_b) | 2962 | static void *memcat(void *a, size_t sz_a, void *b, size_t sz_b) |
2943 | { | 2963 | { |
@@ -3158,12 +3178,6 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev, | |||
3158 | if (ret > 0 || pev->sdt) /* SDT can be found only in the cache */ | 3178 | if (ret > 0 || pev->sdt) /* SDT can be found only in the cache */ |
3159 | return ret == 0 ? -ENOENT : ret; /* Found in probe cache */ | 3179 | return ret == 0 ? -ENOENT : ret; /* Found in probe cache */ |
3160 | 3180 | ||
3161 | if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) { | ||
3162 | ret = find_probe_trace_events_from_map(pev, tevs); | ||
3163 | if (ret > 0) | ||
3164 | return ret; /* Found in symbol table */ | ||
3165 | } | ||
3166 | |||
3167 | /* Convert perf_probe_event with debuginfo */ | 3181 | /* Convert perf_probe_event with debuginfo */ |
3168 | ret = try_to_find_probe_trace_events(pev, tevs); | 3182 | ret = try_to_find_probe_trace_events(pev, tevs); |
3169 | if (ret != 0) | 3183 | if (ret != 0) |
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index e18ea9fe6385..f4f45db77c1c 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h | |||
@@ -158,7 +158,6 @@ int show_line_range(struct line_range *lr, const char *module, bool user); | |||
158 | int show_available_vars(struct perf_probe_event *pevs, int npevs, | 158 | int show_available_vars(struct perf_probe_event *pevs, int npevs, |
159 | struct strfilter *filter); | 159 | struct strfilter *filter); |
160 | int show_available_funcs(const char *module, struct strfilter *filter, bool user); | 160 | int show_available_funcs(const char *module, struct strfilter *filter, bool user); |
161 | bool arch__prefers_symtab(void); | ||
162 | void arch__fix_tev_from_maps(struct perf_probe_event *pev, | 161 | void arch__fix_tev_from_maps(struct perf_probe_event *pev, |
163 | struct probe_trace_event *tev, struct map *map, | 162 | struct probe_trace_event *tev, struct map *map, |
164 | struct symbol *sym); | 163 | struct symbol *sym); |
@@ -173,4 +172,9 @@ int e_snprintf(char *str, size_t size, const char *format, ...) | |||
173 | int copy_to_probe_trace_arg(struct probe_trace_arg *tvar, | 172 | int copy_to_probe_trace_arg(struct probe_trace_arg *tvar, |
174 | struct perf_probe_arg *pvar); | 173 | struct perf_probe_arg *pvar); |
175 | 174 | ||
175 | struct map *get_target_map(const char *target, bool user); | ||
176 | |||
177 | void arch__post_process_probe_trace_events(struct perf_probe_event *pev, | ||
178 | int ntevs); | ||
179 | |||
176 | #endif /*_PROBE_EVENT_H */ | 180 | #endif /*_PROBE_EVENT_H */ |
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index 9aed9c332da6..9c3b9ed5b3c3 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c | |||
@@ -133,7 +133,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag) | |||
133 | /* Get raw string list of current kprobe_events or uprobe_events */ | 133 | /* Get raw string list of current kprobe_events or uprobe_events */ |
134 | struct strlist *probe_file__get_rawlist(int fd) | 134 | struct strlist *probe_file__get_rawlist(int fd) |
135 | { | 135 | { |
136 | int ret, idx; | 136 | int ret, idx, fddup; |
137 | FILE *fp; | 137 | FILE *fp; |
138 | char buf[MAX_CMDLEN]; | 138 | char buf[MAX_CMDLEN]; |
139 | char *p; | 139 | char *p; |
@@ -143,8 +143,17 @@ struct strlist *probe_file__get_rawlist(int fd) | |||
143 | return NULL; | 143 | return NULL; |
144 | 144 | ||
145 | sl = strlist__new(NULL, NULL); | 145 | sl = strlist__new(NULL, NULL); |
146 | if (sl == NULL) | ||
147 | return NULL; | ||
148 | |||
149 | fddup = dup(fd); | ||
150 | if (fddup < 0) | ||
151 | goto out_free_sl; | ||
152 | |||
153 | fp = fdopen(fddup, "r"); | ||
154 | if (!fp) | ||
155 | goto out_close_fddup; | ||
146 | 156 | ||
147 | fp = fdopen(dup(fd), "r"); | ||
148 | while (!feof(fp)) { | 157 | while (!feof(fp)) { |
149 | p = fgets(buf, MAX_CMDLEN, fp); | 158 | p = fgets(buf, MAX_CMDLEN, fp); |
150 | if (!p) | 159 | if (!p) |
@@ -156,13 +165,21 @@ struct strlist *probe_file__get_rawlist(int fd) | |||
156 | ret = strlist__add(sl, buf); | 165 | ret = strlist__add(sl, buf); |
157 | if (ret < 0) { | 166 | if (ret < 0) { |
158 | pr_debug("strlist__add failed (%d)\n", ret); | 167 | pr_debug("strlist__add failed (%d)\n", ret); |
159 | strlist__delete(sl); | 168 | goto out_close_fp; |
160 | return NULL; | ||
161 | } | 169 | } |
162 | } | 170 | } |
163 | fclose(fp); | 171 | fclose(fp); |
164 | 172 | ||
165 | return sl; | 173 | return sl; |
174 | |||
175 | out_close_fp: | ||
176 | fclose(fp); | ||
177 | goto out_free_sl; | ||
178 | out_close_fddup: | ||
179 | close(fddup); | ||
180 | out_free_sl: | ||
181 | strlist__delete(sl); | ||
182 | return NULL; | ||
166 | } | 183 | } |
167 | 184 | ||
168 | static struct strlist *__probe_file__get_namelist(int fd, bool include_group) | 185 | static struct strlist *__probe_file__get_namelist(int fd, bool include_group) |
@@ -447,12 +464,17 @@ static int probe_cache__load(struct probe_cache *pcache) | |||
447 | { | 464 | { |
448 | struct probe_cache_entry *entry = NULL; | 465 | struct probe_cache_entry *entry = NULL; |
449 | char buf[MAX_CMDLEN], *p; | 466 | char buf[MAX_CMDLEN], *p; |
450 | int ret = 0; | 467 | int ret = 0, fddup; |
451 | FILE *fp; | 468 | FILE *fp; |
452 | 469 | ||
453 | fp = fdopen(dup(pcache->fd), "r"); | 470 | fddup = dup(pcache->fd); |
454 | if (!fp) | 471 | if (fddup < 0) |
472 | return -errno; | ||
473 | fp = fdopen(fddup, "r"); | ||
474 | if (!fp) { | ||
475 | close(fddup); | ||
455 | return -EINVAL; | 476 | return -EINVAL; |
477 | } | ||
456 | 478 | ||
457 | while (!feof(fp)) { | 479 | while (!feof(fp)) { |
458 | if (!fgets(buf, MAX_CMDLEN, fp)) | 480 | if (!fgets(buf, MAX_CMDLEN, fp)) |
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index f2d9ff064e2d..5c290c682afe 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c | |||
@@ -297,10 +297,13 @@ static int convert_variable_type(Dwarf_Die *vr_die, | |||
297 | char sbuf[STRERR_BUFSIZE]; | 297 | char sbuf[STRERR_BUFSIZE]; |
298 | int bsize, boffs, total; | 298 | int bsize, boffs, total; |
299 | int ret; | 299 | int ret; |
300 | char sign; | ||
300 | 301 | ||
301 | /* TODO: check all types */ | 302 | /* TODO: check all types */ |
302 | if (cast && strcmp(cast, "string") != 0) { | 303 | if (cast && strcmp(cast, "string") != 0 && |
304 | strcmp(cast, "s") != 0 && strcmp(cast, "u") != 0) { | ||
303 | /* Non string type is OK */ | 305 | /* Non string type is OK */ |
306 | /* and respect signedness cast */ | ||
304 | tvar->type = strdup(cast); | 307 | tvar->type = strdup(cast); |
305 | return (tvar->type == NULL) ? -ENOMEM : 0; | 308 | return (tvar->type == NULL) ? -ENOMEM : 0; |
306 | } | 309 | } |
@@ -361,6 +364,13 @@ static int convert_variable_type(Dwarf_Die *vr_die, | |||
361 | return (tvar->type == NULL) ? -ENOMEM : 0; | 364 | return (tvar->type == NULL) ? -ENOMEM : 0; |
362 | } | 365 | } |
363 | 366 | ||
367 | if (cast && (strcmp(cast, "u") == 0)) | ||
368 | sign = 'u'; | ||
369 | else if (cast && (strcmp(cast, "s") == 0)) | ||
370 | sign = 's'; | ||
371 | else | ||
372 | sign = die_is_signed_type(&type) ? 's' : 'u'; | ||
373 | |||
364 | ret = dwarf_bytesize(&type); | 374 | ret = dwarf_bytesize(&type); |
365 | if (ret <= 0) | 375 | if (ret <= 0) |
366 | /* No size ... try to use default type */ | 376 | /* No size ... try to use default type */ |
@@ -373,8 +383,7 @@ static int convert_variable_type(Dwarf_Die *vr_die, | |||
373 | dwarf_diename(&type), MAX_BASIC_TYPE_BITS); | 383 | dwarf_diename(&type), MAX_BASIC_TYPE_BITS); |
374 | ret = MAX_BASIC_TYPE_BITS; | 384 | ret = MAX_BASIC_TYPE_BITS; |
375 | } | 385 | } |
376 | ret = snprintf(buf, 16, "%c%d", | 386 | ret = snprintf(buf, 16, "%c%d", sign, ret); |
377 | die_is_signed_type(&type) ? 's' : 'u', ret); | ||
378 | 387 | ||
379 | formatted: | 388 | formatted: |
380 | if (ret < 0 || ret >= 16) { | 389 | if (ret < 0 || ret >= 16) { |
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 947d21f38398..3d3cb8392c86 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c | |||
@@ -588,7 +588,11 @@ static char *get_trace_output(struct hist_entry *he) | |||
588 | } else { | 588 | } else { |
589 | pevent_event_info(&seq, evsel->tp_format, &rec); | 589 | pevent_event_info(&seq, evsel->tp_format, &rec); |
590 | } | 590 | } |
591 | return seq.buffer; | 591 | /* |
592 | * Trim the buffer, it starts at 4KB and we're not going to | ||
593 | * add anything more to this buffer. | ||
594 | */ | ||
595 | return realloc(seq.buffer, seq.len + 1); | ||
592 | } | 596 | } |
593 | 597 | ||
594 | static int64_t | 598 | static int64_t |
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index a34321e9b44d..a811c13a74d6 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c | |||
@@ -837,7 +837,8 @@ int dso__load_sym(struct dso *dso, struct map *map, | |||
837 | sec = syms_ss->symtab; | 837 | sec = syms_ss->symtab; |
838 | shdr = syms_ss->symshdr; | 838 | shdr = syms_ss->symshdr; |
839 | 839 | ||
840 | if (elf_section_by_name(elf, &ehdr, &tshdr, ".text", NULL)) | 840 | if (elf_section_by_name(runtime_ss->elf, &runtime_ss->ehdr, &tshdr, |
841 | ".text", NULL)) | ||
841 | dso->text_offset = tshdr.sh_addr - tshdr.sh_offset; | 842 | dso->text_offset = tshdr.sh_addr - tshdr.sh_offset; |
842 | 843 | ||
843 | if (runtime_ss->opdsec) | 844 | if (runtime_ss->opdsec) |
diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index cf5e250bc78e..783a53fb7a4e 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c | |||
@@ -66,7 +66,7 @@ static int entry(u64 ip, struct unwind_info *ui) | |||
66 | if (__report_module(&al, ip, ui)) | 66 | if (__report_module(&al, ip, ui)) |
67 | return -1; | 67 | return -1; |
68 | 68 | ||
69 | e->ip = ip; | 69 | e->ip = al.addr; |
70 | e->map = al.map; | 70 | e->map = al.map; |
71 | e->sym = al.sym; | 71 | e->sym = al.sym; |
72 | 72 | ||
diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c index 97c0f8fc5561..20c2e5743903 100644 --- a/tools/perf/util/unwind-libunwind-local.c +++ b/tools/perf/util/unwind-libunwind-local.c | |||
@@ -542,7 +542,7 @@ static int entry(u64 ip, struct thread *thread, | |||
542 | thread__find_addr_location(thread, PERF_RECORD_MISC_USER, | 542 | thread__find_addr_location(thread, PERF_RECORD_MISC_USER, |
543 | MAP__FUNCTION, ip, &al); | 543 | MAP__FUNCTION, ip, &al); |
544 | 544 | ||
545 | e.ip = ip; | 545 | e.ip = al.addr; |
546 | e.map = al.map; | 546 | e.map = al.map; |
547 | e.sym = al.sym; | 547 | e.sym = al.sym; |
548 | 548 | ||