| 1 |
|
| 2 | |
| 3 | * thread-stack.h: Synthesize a thread's stack using call / return events
|
| 4 | * Copyright (c) 2014, Intel Corporation.
|
| 5 |
|
| 6 |
|
| 7 | #ifndef __PERF_THREAD_STACK_H
|
| 8 | #define __PERF_THREAD_STACK_H
|
| 9 |
|
| 10 | #include <sys/types.h>
|
| 11 |
|
| 12 | #include <linux/types.h>
|
| 13 |
|
| 14 | struct thread;
|
| 15 | struct comm;
|
| 16 | struct ip_callchain;
|
| 17 | struct symbol;
|
| 18 | struct dso;
|
| 19 | struct perf_sample;
|
| 20 | struct addr_location;
|
| 21 | struct call_path;
|
| 22 |
|
| 23 | |
| 24 | * Call/Return flags.
|
| 25 | *
|
| 26 | * CALL_RETURN_NO_CALL: 'return' but no matching 'call'
|
| 27 | * CALL_RETURN_NO_RETURN: 'call' but no matching 'return'
|
| 28 | * CALL_RETURN_NON_CALL: a branch but not a 'call' to the start of a different
|
| 29 | * symbol
|
| 30 |
|
| 31 | enum {
|
| 32 | CALL_RETURN_NO_CALL = 1 << 0,
|
| 33 | CALL_RETURN_NO_RETURN = 1 << 1,
|
| 34 | CALL_RETURN_NON_CALL = 1 << 2,
|
| 35 | };
|
| 36 |
|
| 37 | |
| 38 | * struct call_return - paired call/return information.
|
| 39 | * @thread: thread in which call/return occurred
|
| 40 | * @comm: comm in which call/return occurred
|
| 41 | * @cp: call path
|
| 42 | * @call_time: timestamp of call (if known)
|
| 43 | * @return_time: timestamp of return (if known)
|
| 44 | * @branch_count: number of branches seen between call and return
|
| 45 | * @insn_count: approx. number of instructions between call and return
|
| 46 | * @cyc_count: approx. number of cycles between call and return
|
| 47 | * @call_ref: external reference to 'call' sample (e.g. db_id)
|
| 48 | * @return_ref: external reference to 'return' sample (e.g. db_id)
|
| 49 | * @db_id: id used for db-export
|
| 50 | * @parent_db_id: id of parent call used for db-export
|
| 51 | * @flags: Call/Return flags
|
| 52 |
|
| 53 | struct call_return {
|
| 54 | struct thread *thread;
|
| 55 | struct comm *comm;
|
| 56 | struct call_path *cp;
|
| 57 | u64 call_time;
|
| 58 | u64 return_time;
|
| 59 | u64 branch_count;
|
| 60 | u64 insn_count;
|
| 61 | u64 cyc_count;
|
| 62 | u64 call_ref;
|
| 63 | u64 return_ref;
|
| 64 | u64 db_id;
|
| 65 | u64 parent_db_id;
|
| 66 | u32 flags;
|
| 67 | };
|
| 68 |
|
| 69 | |
| 70 | * struct call_return_processor - provides a call-back to consume call-return
|
| 71 | * information.
|
| 72 | * @cpr: call path root
|
| 73 | * @process: call-back that accepts call/return information
|
| 74 | * @data: anonymous data for call-back
|
| 75 |
|
| 76 | struct call_return_processor {
|
| 77 | struct call_path_root *cpr;
|
| 78 | int (*process)(struct call_return *cr, u64 *parent_db_id, void *data);
|
| 79 | void *data;
|
| 80 | };
|
| 81 |
|
| 82 | int thread_stack__event(struct thread *thread, int cpu, u32 flags, u64 from_ip,
|
| 83 | u64 to_ip, u16 insn_len, u64 trace_nr, bool callstack,
|
| 84 | unsigned int br_stack_sz, bool mispred_all);
|
| 85 | void thread_stack__set_trace_nr(struct thread *thread, int cpu, u64 trace_nr);
|
| 86 | void thread_stack__sample(struct thread *thread, int cpu, struct ip_callchain *chain,
|
| 87 | size_t sz, u64 ip, u64 kernel_start);
|
| 88 | void thread_stack__sample_late(struct thread *thread, int cpu,
|
| 89 | struct ip_callchain *chain, size_t sz, u64 ip,
|
| 90 | u64 kernel_start);
|
| 91 | void thread_stack__br_sample(struct thread *thread, int cpu,
|
| 92 | struct branch_stack *dst, unsigned int sz);
|
| 93 | void thread_stack__br_sample_late(struct thread *thread, int cpu,
|
| 94 | struct branch_stack *dst, unsigned int sz,
|
| 95 | u64 sample_ip, u64 kernel_start);
|
| 96 | int thread_stack__flush(struct thread *thread);
|
| 97 | void thread_stack__free(struct thread *thread);
|
| 98 | size_t thread_stack__depth(struct thread *thread, int cpu);
|
| 99 |
|
| 100 | struct call_return_processor *
|
| 101 | call_return_processor__new(int (*process)(struct call_return *cr, u64 *parent_db_id, void *data),
|
| 102 | void *data);
|
| 103 | void call_return_processor__free(struct call_return_processor *crp);
|
| 104 | int thread_stack__process(struct thread *thread, struct comm *comm,
|
| 105 | struct perf_sample *sample,
|
| 106 | struct addr_location *from_al,
|
| 107 | struct addr_location *to_al, u64 ref,
|
| 108 | struct call_return_processor *crp);
|
| 109 |
|
| 110 | #endif
|