diff options
Diffstat (limited to 'tools/perf/util/machine.c')
-rw-r--r-- | tools/perf/util/machine.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index e3353307330c..e45c8f33a8fd 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
@@ -1408,29 +1408,27 @@ struct mem_info *sample__resolve_mem(struct perf_sample *sample, | |||
1408 | static int add_callchain_ip(struct thread *thread, | 1408 | static int add_callchain_ip(struct thread *thread, |
1409 | struct symbol **parent, | 1409 | struct symbol **parent, |
1410 | struct addr_location *root_al, | 1410 | struct addr_location *root_al, |
1411 | bool branch_history, | 1411 | u8 *cpumode, |
1412 | u64 ip) | 1412 | u64 ip) |
1413 | { | 1413 | { |
1414 | struct addr_location al; | 1414 | struct addr_location al; |
1415 | 1415 | ||
1416 | al.filtered = 0; | 1416 | al.filtered = 0; |
1417 | al.sym = NULL; | 1417 | al.sym = NULL; |
1418 | if (branch_history) | 1418 | if (!cpumode) { |
1419 | thread__find_cpumode_addr_location(thread, MAP__FUNCTION, | 1419 | thread__find_cpumode_addr_location(thread, MAP__FUNCTION, |
1420 | ip, &al); | 1420 | ip, &al); |
1421 | else { | 1421 | } else { |
1422 | u8 cpumode = PERF_RECORD_MISC_USER; | ||
1423 | |||
1424 | if (ip >= PERF_CONTEXT_MAX) { | 1422 | if (ip >= PERF_CONTEXT_MAX) { |
1425 | switch (ip) { | 1423 | switch (ip) { |
1426 | case PERF_CONTEXT_HV: | 1424 | case PERF_CONTEXT_HV: |
1427 | cpumode = PERF_RECORD_MISC_HYPERVISOR; | 1425 | *cpumode = PERF_RECORD_MISC_HYPERVISOR; |
1428 | break; | 1426 | break; |
1429 | case PERF_CONTEXT_KERNEL: | 1427 | case PERF_CONTEXT_KERNEL: |
1430 | cpumode = PERF_RECORD_MISC_KERNEL; | 1428 | *cpumode = PERF_RECORD_MISC_KERNEL; |
1431 | break; | 1429 | break; |
1432 | case PERF_CONTEXT_USER: | 1430 | case PERF_CONTEXT_USER: |
1433 | cpumode = PERF_RECORD_MISC_USER; | 1431 | *cpumode = PERF_RECORD_MISC_USER; |
1434 | break; | 1432 | break; |
1435 | default: | 1433 | default: |
1436 | pr_debug("invalid callchain context: " | 1434 | pr_debug("invalid callchain context: " |
@@ -1444,8 +1442,8 @@ static int add_callchain_ip(struct thread *thread, | |||
1444 | } | 1442 | } |
1445 | return 0; | 1443 | return 0; |
1446 | } | 1444 | } |
1447 | thread__find_addr_location(thread, cpumode, MAP__FUNCTION, | 1445 | thread__find_addr_location(thread, *cpumode, MAP__FUNCTION, |
1448 | ip, &al); | 1446 | ip, &al); |
1449 | } | 1447 | } |
1450 | 1448 | ||
1451 | if (al.sym != NULL) { | 1449 | if (al.sym != NULL) { |
@@ -1538,6 +1536,7 @@ static int resolve_lbr_callchain_sample(struct thread *thread, | |||
1538 | { | 1536 | { |
1539 | struct ip_callchain *chain = sample->callchain; | 1537 | struct ip_callchain *chain = sample->callchain; |
1540 | int chain_nr = min(max_stack, (int)chain->nr); | 1538 | int chain_nr = min(max_stack, (int)chain->nr); |
1539 | u8 cpumode = PERF_RECORD_MISC_USER; | ||
1541 | int i, j, err; | 1540 | int i, j, err; |
1542 | u64 ip; | 1541 | u64 ip; |
1543 | 1542 | ||
@@ -1584,7 +1583,7 @@ static int resolve_lbr_callchain_sample(struct thread *thread, | |||
1584 | ip = lbr_stack->entries[0].to; | 1583 | ip = lbr_stack->entries[0].to; |
1585 | } | 1584 | } |
1586 | 1585 | ||
1587 | err = add_callchain_ip(thread, parent, root_al, false, ip); | 1586 | err = add_callchain_ip(thread, parent, root_al, &cpumode, ip); |
1588 | if (err) | 1587 | if (err) |
1589 | return (err < 0) ? err : 0; | 1588 | return (err < 0) ? err : 0; |
1590 | } | 1589 | } |
@@ -1604,6 +1603,7 @@ static int thread__resolve_callchain_sample(struct thread *thread, | |||
1604 | struct branch_stack *branch = sample->branch_stack; | 1603 | struct branch_stack *branch = sample->branch_stack; |
1605 | struct ip_callchain *chain = sample->callchain; | 1604 | struct ip_callchain *chain = sample->callchain; |
1606 | int chain_nr = min(max_stack, (int)chain->nr); | 1605 | int chain_nr = min(max_stack, (int)chain->nr); |
1606 | u8 cpumode = PERF_RECORD_MISC_USER; | ||
1607 | int i, j, err; | 1607 | int i, j, err; |
1608 | int skip_idx = -1; | 1608 | int skip_idx = -1; |
1609 | int first_call = 0; | 1609 | int first_call = 0; |
@@ -1669,10 +1669,10 @@ static int thread__resolve_callchain_sample(struct thread *thread, | |||
1669 | 1669 | ||
1670 | for (i = 0; i < nr; i++) { | 1670 | for (i = 0; i < nr; i++) { |
1671 | err = add_callchain_ip(thread, parent, root_al, | 1671 | err = add_callchain_ip(thread, parent, root_al, |
1672 | true, be[i].to); | 1672 | NULL, be[i].to); |
1673 | if (!err) | 1673 | if (!err) |
1674 | err = add_callchain_ip(thread, parent, root_al, | 1674 | err = add_callchain_ip(thread, parent, root_al, |
1675 | true, be[i].from); | 1675 | NULL, be[i].from); |
1676 | if (err == -EINVAL) | 1676 | if (err == -EINVAL) |
1677 | break; | 1677 | break; |
1678 | if (err) | 1678 | if (err) |
@@ -1701,7 +1701,7 @@ check_calls: | |||
1701 | #endif | 1701 | #endif |
1702 | ip = chain->ips[j]; | 1702 | ip = chain->ips[j]; |
1703 | 1703 | ||
1704 | err = add_callchain_ip(thread, parent, root_al, false, ip); | 1704 | err = add_callchain_ip(thread, parent, root_al, &cpumode, ip); |
1705 | 1705 | ||
1706 | if (err) | 1706 | if (err) |
1707 | return (err < 0) ? err : 0; | 1707 | return (err < 0) ? err : 0; |