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