xref: /linux/tools/perf/util/thread-stack.h (revision a5499b37197ab4b5fed101370df7ccadacbb4340)
100447ccdSAdrian Hunter /*
200447ccdSAdrian Hunter  * thread-stack.h: Synthesize a thread's stack using call / return events
300447ccdSAdrian Hunter  * Copyright (c) 2014, Intel Corporation.
400447ccdSAdrian Hunter  *
500447ccdSAdrian Hunter  * This program is free software; you can redistribute it and/or modify it
600447ccdSAdrian Hunter  * under the terms and conditions of the GNU General Public License,
700447ccdSAdrian Hunter  * version 2, as published by the Free Software Foundation.
800447ccdSAdrian Hunter  *
900447ccdSAdrian Hunter  * This program is distributed in the hope it will be useful, but WITHOUT
1000447ccdSAdrian Hunter  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1100447ccdSAdrian Hunter  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1200447ccdSAdrian Hunter  * more details.
1300447ccdSAdrian Hunter  *
1400447ccdSAdrian Hunter  */
1500447ccdSAdrian Hunter 
1600447ccdSAdrian Hunter #ifndef __PERF_THREAD_STACK_H
1700447ccdSAdrian Hunter #define __PERF_THREAD_STACK_H
1800447ccdSAdrian Hunter 
1900447ccdSAdrian Hunter #include <sys/types.h>
2000447ccdSAdrian Hunter 
2100447ccdSAdrian Hunter #include <linux/types.h>
2292a9e4f7SAdrian Hunter #include <linux/rbtree.h>
2300447ccdSAdrian Hunter 
2400447ccdSAdrian Hunter struct thread;
2592a9e4f7SAdrian Hunter struct comm;
2600447ccdSAdrian Hunter struct ip_callchain;
2792a9e4f7SAdrian Hunter struct symbol;
2892a9e4f7SAdrian Hunter struct dso;
2992a9e4f7SAdrian Hunter struct call_return_processor;
3092a9e4f7SAdrian Hunter struct comm;
3192a9e4f7SAdrian Hunter struct perf_sample;
3292a9e4f7SAdrian Hunter struct addr_location;
3392a9e4f7SAdrian Hunter 
3492a9e4f7SAdrian Hunter /*
3592a9e4f7SAdrian Hunter  * Call/Return flags.
3692a9e4f7SAdrian Hunter  *
3792a9e4f7SAdrian Hunter  * CALL_RETURN_NO_CALL: 'return' but no matching 'call'
3892a9e4f7SAdrian Hunter  * CALL_RETURN_NO_RETURN: 'call' but no matching 'return'
3992a9e4f7SAdrian Hunter  */
4092a9e4f7SAdrian Hunter enum {
4192a9e4f7SAdrian Hunter 	CALL_RETURN_NO_CALL	= 1 << 0,
4292a9e4f7SAdrian Hunter 	CALL_RETURN_NO_RETURN	= 1 << 1,
4392a9e4f7SAdrian Hunter };
4492a9e4f7SAdrian Hunter 
4592a9e4f7SAdrian Hunter /**
4692a9e4f7SAdrian Hunter  * struct call_return - paired call/return information.
4792a9e4f7SAdrian Hunter  * @thread: thread in which call/return occurred
4892a9e4f7SAdrian Hunter  * @comm: comm in which call/return occurred
4992a9e4f7SAdrian Hunter  * @cp: call path
5092a9e4f7SAdrian Hunter  * @call_time: timestamp of call (if known)
5192a9e4f7SAdrian Hunter  * @return_time: timestamp of return (if known)
5292a9e4f7SAdrian Hunter  * @branch_count: number of branches seen between call and return
5392a9e4f7SAdrian Hunter  * @call_ref: external reference to 'call' sample (e.g. db_id)
5492a9e4f7SAdrian Hunter  * @return_ref:  external reference to 'return' sample (e.g. db_id)
5592a9e4f7SAdrian Hunter  * @db_id: id used for db-export
5692a9e4f7SAdrian Hunter  * @flags: Call/Return flags
5792a9e4f7SAdrian Hunter  */
5892a9e4f7SAdrian Hunter struct call_return {
5992a9e4f7SAdrian Hunter 	struct thread *thread;
6092a9e4f7SAdrian Hunter 	struct comm *comm;
6192a9e4f7SAdrian Hunter 	struct call_path *cp;
6292a9e4f7SAdrian Hunter 	u64 call_time;
6392a9e4f7SAdrian Hunter 	u64 return_time;
6492a9e4f7SAdrian Hunter 	u64 branch_count;
6592a9e4f7SAdrian Hunter 	u64 call_ref;
6692a9e4f7SAdrian Hunter 	u64 return_ref;
6792a9e4f7SAdrian Hunter 	u64 db_id;
6892a9e4f7SAdrian Hunter 	u32 flags;
6992a9e4f7SAdrian Hunter };
7092a9e4f7SAdrian Hunter 
7192a9e4f7SAdrian Hunter /**
7292a9e4f7SAdrian Hunter  * struct call_path - node in list of calls leading to a function call.
7392a9e4f7SAdrian Hunter  * @parent: call path to the parent function call
7492a9e4f7SAdrian Hunter  * @sym: symbol of function called
7592a9e4f7SAdrian Hunter  * @ip: only if sym is null, the ip of the function
7692a9e4f7SAdrian Hunter  * @db_id: id used for db-export
7792a9e4f7SAdrian Hunter  * @in_kernel: whether function is a in the kernel
7892a9e4f7SAdrian Hunter  * @rb_node: node in parent's tree of called functions
7992a9e4f7SAdrian Hunter  * @children: tree of call paths of functions called
8092a9e4f7SAdrian Hunter  *
8192a9e4f7SAdrian Hunter  * In combination with the call_return structure, the call_path structure
8292a9e4f7SAdrian Hunter  * defines a context-sensitve call-graph.
8392a9e4f7SAdrian Hunter  */
8492a9e4f7SAdrian Hunter struct call_path {
8592a9e4f7SAdrian Hunter 	struct call_path *parent;
8692a9e4f7SAdrian Hunter 	struct symbol *sym;
8792a9e4f7SAdrian Hunter 	u64 ip;
8892a9e4f7SAdrian Hunter 	u64 db_id;
8992a9e4f7SAdrian Hunter 	bool in_kernel;
9092a9e4f7SAdrian Hunter 	struct rb_node rb_node;
9192a9e4f7SAdrian Hunter 	struct rb_root children;
9292a9e4f7SAdrian Hunter };
9300447ccdSAdrian Hunter 
9400447ccdSAdrian Hunter int thread_stack__event(struct thread *thread, u32 flags, u64 from_ip,
9500447ccdSAdrian Hunter 			u64 to_ip, u16 insn_len, u64 trace_nr);
9692a9e4f7SAdrian Hunter void thread_stack__set_trace_nr(struct thread *thread, u64 trace_nr);
9700447ccdSAdrian Hunter void thread_stack__sample(struct thread *thread, struct ip_callchain *chain,
9800447ccdSAdrian Hunter 			  size_t sz, u64 ip);
99*a5499b37SAdrian Hunter int thread_stack__flush(struct thread *thread);
10000447ccdSAdrian Hunter void thread_stack__free(struct thread *thread);
10100447ccdSAdrian Hunter 
10292a9e4f7SAdrian Hunter struct call_return_processor *
10392a9e4f7SAdrian Hunter call_return_processor__new(int (*process)(struct call_return *cr, void *data),
10492a9e4f7SAdrian Hunter 			   void *data);
10592a9e4f7SAdrian Hunter void call_return_processor__free(struct call_return_processor *crp);
10692a9e4f7SAdrian Hunter int thread_stack__process(struct thread *thread, struct comm *comm,
10792a9e4f7SAdrian Hunter 			  struct perf_sample *sample,
10892a9e4f7SAdrian Hunter 			  struct addr_location *from_al,
10992a9e4f7SAdrian Hunter 			  struct addr_location *to_al, u64 ref,
11092a9e4f7SAdrian Hunter 			  struct call_return_processor *crp);
11192a9e4f7SAdrian Hunter 
11200447ccdSAdrian Hunter #endif
113