aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c102
1 files changed, 80 insertions, 22 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index f5a8fbdd3f7..080e5336d89 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -12,6 +12,7 @@
12#include "session.h" 12#include "session.h"
13#include "sort.h" 13#include "sort.h"
14#include "util.h" 14#include "util.h"
15#include "cpumap.h"
15 16
16static int perf_session__open(struct perf_session *self, bool force) 17static int perf_session__open(struct perf_session *self, bool force)
17{ 18{
@@ -247,9 +248,14 @@ int perf_session__resolve_callchain(struct perf_session *self,
247 callchain_cursor_reset(&self->callchain_cursor); 248 callchain_cursor_reset(&self->callchain_cursor);
248 249
249 for (i = 0; i < chain->nr; i++) { 250 for (i = 0; i < chain->nr; i++) {
250 u64 ip = chain->ips[i]; 251 u64 ip;
251 struct addr_location al; 252 struct addr_location al;
252 253
254 if (callchain_param.order == ORDER_CALLEE)
255 ip = chain->ips[i];
256 else
257 ip = chain->ips[chain->nr - i - 1];
258
253 if (ip >= PERF_CONTEXT_MAX) { 259 if (ip >= PERF_CONTEXT_MAX) {
254 switch (ip) { 260 switch (ip) {
255 case PERF_CONTEXT_HV: 261 case PERF_CONTEXT_HV:
@@ -708,9 +714,9 @@ static void dump_sample(struct perf_session *session, union perf_event *event,
708 if (!dump_trace) 714 if (!dump_trace)
709 return; 715 return;
710 716
711 printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 "\n", 717 printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 " addr: %#" PRIx64 "\n",
712 event->header.misc, sample->pid, sample->tid, sample->ip, 718 event->header.misc, sample->pid, sample->tid, sample->ip,
713 sample->period); 719 sample->period, sample->addr);
714 720
715 if (session->sample_type & PERF_SAMPLE_CALLCHAIN) 721 if (session->sample_type & PERF_SAMPLE_CALLCHAIN)
716 callchain__printf(sample); 722 callchain__printf(sample);
@@ -1202,9 +1208,10 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
1202 return NULL; 1208 return NULL;
1203} 1209}
1204 1210
1205void perf_session__print_symbols(union perf_event *event, 1211void perf_session__print_ip(union perf_event *event,
1206 struct perf_sample *sample, 1212 struct perf_sample *sample,
1207 struct perf_session *session) 1213 struct perf_session *session,
1214 int print_sym, int print_dso)
1208{ 1215{
1209 struct addr_location al; 1216 struct addr_location al;
1210 const char *symname, *dsoname; 1217 const char *symname, *dsoname;
@@ -1233,32 +1240,83 @@ void perf_session__print_symbols(union perf_event *event,
1233 if (!node) 1240 if (!node)
1234 break; 1241 break;
1235 1242
1236 if (node->sym && node->sym->name) 1243 printf("\t%16" PRIx64, node->ip);
1237 symname = node->sym->name; 1244 if (print_sym) {
1245 if (node->sym && node->sym->name)
1246 symname = node->sym->name;
1247 else
1248 symname = "";
1249
1250 printf(" %s", symname);
1251 }
1252 if (print_dso) {
1253 if (node->map && node->map->dso && node->map->dso->name)
1254 dsoname = node->map->dso->name;
1255 else
1256 dsoname = "";
1257
1258 printf(" (%s)", dsoname);
1259 }
1260 printf("\n");
1261
1262 callchain_cursor_advance(cursor);
1263 }
1264
1265 } else {
1266 printf("%16" PRIx64, al.addr);
1267 if (print_sym) {
1268 if (al.sym && al.sym->name)
1269 symname = al.sym->name;
1238 else 1270 else
1239 symname = ""; 1271 symname = "";
1240 1272
1241 if (node->map && node->map->dso && node->map->dso->name) 1273 printf(" %s", symname);
1242 dsoname = node->map->dso->name; 1274 }
1275
1276 if (print_dso) {
1277 if (al.map && al.map->dso && al.map->dso->name)
1278 dsoname = al.map->dso->name;
1243 else 1279 else
1244 dsoname = ""; 1280 dsoname = "";
1245 1281
1246 printf("\t%16" PRIx64 " %s (%s)\n", node->ip, symname, dsoname); 1282 printf(" (%s)", dsoname);
1283 }
1284 }
1285}
1286
1287int perf_session__cpu_bitmap(struct perf_session *session,
1288 const char *cpu_list, unsigned long *cpu_bitmap)
1289{
1290 int i;
1291 struct cpu_map *map;
1292
1293 for (i = 0; i < PERF_TYPE_MAX; ++i) {
1294 struct perf_evsel *evsel;
1247 1295
1248 callchain_cursor_advance(cursor); 1296 evsel = perf_session__find_first_evtype(session, i);
1297 if (!evsel)
1298 continue;
1299
1300 if (!(evsel->attr.sample_type & PERF_SAMPLE_CPU)) {
1301 pr_err("File does not contain CPU events. "
1302 "Remove -c option to proceed.\n");
1303 return -1;
1249 } 1304 }
1305 }
1250 1306
1251 } else { 1307 map = cpu_map__new(cpu_list);
1252 if (al.sym && al.sym->name)
1253 symname = al.sym->name;
1254 else
1255 symname = "";
1256 1308
1257 if (al.map && al.map->dso && al.map->dso->name) 1309 for (i = 0; i < map->nr; i++) {
1258 dsoname = al.map->dso->name; 1310 int cpu = map->map[i];
1259 else 1311
1260 dsoname = ""; 1312 if (cpu >= MAX_NR_CPUS) {
1313 pr_err("Requested CPU %d too large. "
1314 "Consider raising MAX_NR_CPUS\n", cpu);
1315 return -1;
1316 }
1261 1317
1262 printf("%16" PRIx64 " %s (%s)", al.addr, symname, dsoname); 1318 set_bit(cpu, cpu_bitmap);
1263 } 1319 }
1320
1321 return 0;
1264} 1322}