diff options
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/arch/arm/Makefile | 4 | ||||
| -rw-r--r-- | tools/perf/arch/arm/util/dwarf-regs.c | 64 | ||||
| -rw-r--r-- | tools/perf/builtin-timechart.c | 11 |
3 files changed, 74 insertions, 5 deletions
diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile new file mode 100644 index 00000000000..15130b50dfe --- /dev/null +++ b/tools/perf/arch/arm/Makefile | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | ifndef NO_DWARF | ||
| 2 | PERF_HAVE_DWARF_REGS := 1 | ||
| 3 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o | ||
| 4 | endif | ||
diff --git a/tools/perf/arch/arm/util/dwarf-regs.c b/tools/perf/arch/arm/util/dwarf-regs.c new file mode 100644 index 00000000000..fff6450c8c9 --- /dev/null +++ b/tools/perf/arch/arm/util/dwarf-regs.c | |||
| @@ -0,0 +1,64 @@ | |||
| 1 | /* | ||
| 2 | * Mapping of DWARF debug register numbers into register names. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Will Deacon, ARM Ltd. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <libio.h> | ||
| 12 | #include <dwarf-regs.h> | ||
| 13 | |||
| 14 | struct pt_regs_dwarfnum { | ||
| 15 | const char *name; | ||
| 16 | unsigned int dwarfnum; | ||
| 17 | }; | ||
| 18 | |||
| 19 | #define STR(s) #s | ||
| 20 | #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} | ||
| 21 | #define GPR_DWARFNUM_NAME(num) \ | ||
| 22 | {.name = STR(%r##num), .dwarfnum = num} | ||
| 23 | #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} | ||
| 24 | |||
| 25 | /* | ||
| 26 | * Reference: | ||
| 27 | * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf | ||
| 28 | */ | ||
| 29 | static const struct pt_regs_dwarfnum regdwarfnum_table[] = { | ||
| 30 | GPR_DWARFNUM_NAME(0), | ||
| 31 | GPR_DWARFNUM_NAME(1), | ||
| 32 | GPR_DWARFNUM_NAME(2), | ||
| 33 | GPR_DWARFNUM_NAME(3), | ||
| 34 | GPR_DWARFNUM_NAME(4), | ||
| 35 | GPR_DWARFNUM_NAME(5), | ||
| 36 | GPR_DWARFNUM_NAME(6), | ||
| 37 | GPR_DWARFNUM_NAME(7), | ||
| 38 | GPR_DWARFNUM_NAME(8), | ||
| 39 | GPR_DWARFNUM_NAME(9), | ||
| 40 | GPR_DWARFNUM_NAME(10), | ||
| 41 | REG_DWARFNUM_NAME("%fp", 11), | ||
| 42 | REG_DWARFNUM_NAME("%ip", 12), | ||
| 43 | REG_DWARFNUM_NAME("%sp", 13), | ||
| 44 | REG_DWARFNUM_NAME("%lr", 14), | ||
| 45 | REG_DWARFNUM_NAME("%pc", 15), | ||
| 46 | REG_DWARFNUM_END, | ||
| 47 | }; | ||
| 48 | |||
| 49 | /** | ||
| 50 | * get_arch_regstr() - lookup register name from it's DWARF register number | ||
| 51 | * @n: the DWARF register number | ||
| 52 | * | ||
| 53 | * get_arch_regstr() returns the name of the register in struct | ||
| 54 | * regdwarfnum_table from it's DWARF register number. If the register is not | ||
| 55 | * found in the table, this returns NULL; | ||
| 56 | */ | ||
| 57 | const char *get_arch_regstr(unsigned int n) | ||
| 58 | { | ||
| 59 | const struct pt_regs_dwarfnum *roff; | ||
| 60 | for (roff = regdwarfnum_table; roff->name != NULL; roff++) | ||
| 61 | if (roff->dwarfnum == n) | ||
| 62 | return roff->name; | ||
| 63 | return NULL; | ||
| 64 | } | ||
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 5a52ed9fc10..5161619d471 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
| @@ -300,8 +300,9 @@ struct trace_entry { | |||
| 300 | 300 | ||
| 301 | struct power_entry { | 301 | struct power_entry { |
| 302 | struct trace_entry te; | 302 | struct trace_entry te; |
| 303 | s64 type; | 303 | u64 type; |
| 304 | s64 value; | 304 | u64 value; |
| 305 | u64 cpu_id; | ||
| 305 | }; | 306 | }; |
| 306 | 307 | ||
| 307 | #define TASK_COMM_LEN 16 | 308 | #define TASK_COMM_LEN 16 |
| @@ -498,13 +499,13 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
| 498 | return 0; | 499 | return 0; |
| 499 | 500 | ||
| 500 | if (strcmp(event_str, "power:power_start") == 0) | 501 | if (strcmp(event_str, "power:power_start") == 0) |
| 501 | c_state_start(data.cpu, data.time, pe->value); | 502 | c_state_start(pe->cpu_id, data.time, pe->value); |
| 502 | 503 | ||
| 503 | if (strcmp(event_str, "power:power_end") == 0) | 504 | if (strcmp(event_str, "power:power_end") == 0) |
| 504 | c_state_end(data.cpu, data.time); | 505 | c_state_end(pe->cpu_id, data.time); |
| 505 | 506 | ||
| 506 | if (strcmp(event_str, "power:power_frequency") == 0) | 507 | if (strcmp(event_str, "power:power_frequency") == 0) |
| 507 | p_state_change(data.cpu, data.time, pe->value); | 508 | p_state_change(pe->cpu_id, data.time, pe->value); |
| 508 | 509 | ||
| 509 | if (strcmp(event_str, "sched:sched_wakeup") == 0) | 510 | if (strcmp(event_str, "sched:sched_wakeup") == 0) |
| 510 | sched_wakeup(data.cpu, data.time, data.pid, te); | 511 | sched_wakeup(data.cpu, data.time, data.pid, te); |
