|
@@ -630,3 +630,45 @@ int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *samp
|
|
return 0;
|
|
return 0;
|
|
return callchain_append(he->callchain, &callchain_cursor, sample->period);
|
|
return callchain_append(he->callchain, &callchain_cursor, sample->period);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *node,
|
|
|
|
+ bool hide_unresolved)
|
|
|
|
+{
|
|
|
|
+ al->map = node->map;
|
|
|
|
+ al->sym = node->sym;
|
|
|
|
+ if (node->map)
|
|
|
|
+ al->addr = node->map->map_ip(node->map, node->ip);
|
|
|
|
+ else
|
|
|
|
+ al->addr = node->ip;
|
|
|
|
+
|
|
|
|
+ if (al->sym == NULL) {
|
|
|
|
+ if (hide_unresolved)
|
|
|
|
+ return 0;
|
|
|
|
+ if (al->map == NULL)
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (al->map->groups == &al->machine->kmaps) {
|
|
|
|
+ if (machine__is_host(al->machine)) {
|
|
|
|
+ al->cpumode = PERF_RECORD_MISC_KERNEL;
|
|
|
|
+ al->level = 'k';
|
|
|
|
+ } else {
|
|
|
|
+ al->cpumode = PERF_RECORD_MISC_GUEST_KERNEL;
|
|
|
|
+ al->level = 'g';
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if (machine__is_host(al->machine)) {
|
|
|
|
+ al->cpumode = PERF_RECORD_MISC_USER;
|
|
|
|
+ al->level = '.';
|
|
|
|
+ } else if (perf_guest) {
|
|
|
|
+ al->cpumode = PERF_RECORD_MISC_GUEST_USER;
|
|
|
|
+ al->level = 'u';
|
|
|
|
+ } else {
|
|
|
|
+ al->cpumode = PERF_RECORD_MISC_HYPERVISOR;
|
|
|
|
+ al->level = 'H';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+out:
|
|
|
|
+ return 1;
|
|
|
|
+}
|