171ad0f5eSJiri Olsa #ifndef __UNWIND_H 271ad0f5eSJiri Olsa #define __UNWIND_H 371ad0f5eSJiri Olsa 4d944c4eeSBorislav Petkov #include <linux/types.h> 571ad0f5eSJiri Olsa #include "event.h" 671ad0f5eSJiri Olsa #include "symbol.h" 766f066d8SNamhyung Kim #include "thread.h" 871ad0f5eSJiri Olsa 971ad0f5eSJiri Olsa struct unwind_entry { 1071ad0f5eSJiri Olsa struct map *map; 1171ad0f5eSJiri Olsa struct symbol *sym; 1271ad0f5eSJiri Olsa u64 ip; 1371ad0f5eSJiri Olsa }; 1471ad0f5eSJiri Olsa 1571ad0f5eSJiri Olsa typedef int (*unwind_entry_cb_t)(struct unwind_entry *entry, void *arg); 1671ad0f5eSJiri Olsa 17*f83c0415SHe Kuang struct unwind_libunwind_ops { 18*f83c0415SHe Kuang int (*prepare_access)(struct thread *thread); 19*f83c0415SHe Kuang void (*flush_access)(struct thread *thread); 20*f83c0415SHe Kuang void (*finish_access)(struct thread *thread); 21*f83c0415SHe Kuang int (*get_entries)(unwind_entry_cb_t cb, void *arg, 22*f83c0415SHe Kuang struct thread *thread, 23*f83c0415SHe Kuang struct perf_sample *data, int max_stack); 24*f83c0415SHe Kuang }; 25*f83c0415SHe Kuang 269ff125d1SJiri Olsa #ifdef HAVE_DWARF_UNWIND_SUPPORT 2771ad0f5eSJiri Olsa int unwind__get_entries(unwind_entry_cb_t cb, void *arg, 2871ad0f5eSJiri Olsa struct thread *thread, 2937676af1SArnaldo Carvalho de Melo struct perf_sample *data, int max_stack); 309ff125d1SJiri Olsa /* libunwind specific */ 319ff125d1SJiri Olsa #ifdef HAVE_LIBUNWIND_SUPPORT 32ea3da69dSJiri Olsa int libunwind__arch_reg_id(int regnum); 3366f066d8SNamhyung Kim int unwind__prepare_access(struct thread *thread); 34380b5143SNamhyung Kim void unwind__flush_access(struct thread *thread); 3566f066d8SNamhyung Kim void unwind__finish_access(struct thread *thread); 3666f066d8SNamhyung Kim #else 3766f066d8SNamhyung Kim static inline int unwind__prepare_access(struct thread *thread __maybe_unused) 3866f066d8SNamhyung Kim { 3966f066d8SNamhyung Kim return 0; 4066f066d8SNamhyung Kim } 4166f066d8SNamhyung Kim 42380b5143SNamhyung Kim static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} 4366f066d8SNamhyung Kim static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} 449ff125d1SJiri Olsa #endif 4571ad0f5eSJiri Olsa #else 4671ad0f5eSJiri Olsa static inline int 471d037ca1SIrina Tirdea unwind__get_entries(unwind_entry_cb_t cb __maybe_unused, 481d037ca1SIrina Tirdea void *arg __maybe_unused, 491d037ca1SIrina Tirdea struct thread *thread __maybe_unused, 5037676af1SArnaldo Carvalho de Melo struct perf_sample *data __maybe_unused, 5137676af1SArnaldo Carvalho de Melo int max_stack __maybe_unused) 5271ad0f5eSJiri Olsa { 5371ad0f5eSJiri Olsa return 0; 5471ad0f5eSJiri Olsa } 5566f066d8SNamhyung Kim 5666f066d8SNamhyung Kim static inline int unwind__prepare_access(struct thread *thread __maybe_unused) 5766f066d8SNamhyung Kim { 5866f066d8SNamhyung Kim return 0; 5966f066d8SNamhyung Kim } 6066f066d8SNamhyung Kim 61380b5143SNamhyung Kim static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} 6266f066d8SNamhyung Kim static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} 639ff125d1SJiri Olsa #endif /* HAVE_DWARF_UNWIND_SUPPORT */ 6471ad0f5eSJiri Olsa #endif /* __UNWIND_H */ 65