18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __PERF_HIST_H
38c2ecf20Sopenharmony_ci#define __PERF_HIST_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/rbtree.h>
68c2ecf20Sopenharmony_ci#include <linux/types.h>
78c2ecf20Sopenharmony_ci#include <pthread.h>
88c2ecf20Sopenharmony_ci#include "evsel.h"
98c2ecf20Sopenharmony_ci#include "color.h"
108c2ecf20Sopenharmony_ci#include "events_stats.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistruct hist_entry;
138c2ecf20Sopenharmony_cistruct hist_entry_ops;
148c2ecf20Sopenharmony_cistruct addr_location;
158c2ecf20Sopenharmony_cistruct map_symbol;
168c2ecf20Sopenharmony_cistruct mem_info;
178c2ecf20Sopenharmony_cistruct branch_info;
188c2ecf20Sopenharmony_cistruct branch_stack;
198c2ecf20Sopenharmony_cistruct block_info;
208c2ecf20Sopenharmony_cistruct symbol;
218c2ecf20Sopenharmony_cistruct ui_progress;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cienum hist_filter {
248c2ecf20Sopenharmony_ci	HIST_FILTER__DSO,
258c2ecf20Sopenharmony_ci	HIST_FILTER__THREAD,
268c2ecf20Sopenharmony_ci	HIST_FILTER__PARENT,
278c2ecf20Sopenharmony_ci	HIST_FILTER__SYMBOL,
288c2ecf20Sopenharmony_ci	HIST_FILTER__GUEST,
298c2ecf20Sopenharmony_ci	HIST_FILTER__HOST,
308c2ecf20Sopenharmony_ci	HIST_FILTER__SOCKET,
318c2ecf20Sopenharmony_ci	HIST_FILTER__C2C,
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cienum hist_column {
358c2ecf20Sopenharmony_ci	HISTC_SYMBOL,
368c2ecf20Sopenharmony_ci	HISTC_TIME,
378c2ecf20Sopenharmony_ci	HISTC_DSO,
388c2ecf20Sopenharmony_ci	HISTC_THREAD,
398c2ecf20Sopenharmony_ci	HISTC_COMM,
408c2ecf20Sopenharmony_ci	HISTC_CGROUP_ID,
418c2ecf20Sopenharmony_ci	HISTC_CGROUP,
428c2ecf20Sopenharmony_ci	HISTC_PARENT,
438c2ecf20Sopenharmony_ci	HISTC_CPU,
448c2ecf20Sopenharmony_ci	HISTC_SOCKET,
458c2ecf20Sopenharmony_ci	HISTC_SRCLINE,
468c2ecf20Sopenharmony_ci	HISTC_SRCFILE,
478c2ecf20Sopenharmony_ci	HISTC_MISPREDICT,
488c2ecf20Sopenharmony_ci	HISTC_IN_TX,
498c2ecf20Sopenharmony_ci	HISTC_ABORT,
508c2ecf20Sopenharmony_ci	HISTC_SYMBOL_FROM,
518c2ecf20Sopenharmony_ci	HISTC_SYMBOL_TO,
528c2ecf20Sopenharmony_ci	HISTC_DSO_FROM,
538c2ecf20Sopenharmony_ci	HISTC_DSO_TO,
548c2ecf20Sopenharmony_ci	HISTC_LOCAL_WEIGHT,
558c2ecf20Sopenharmony_ci	HISTC_GLOBAL_WEIGHT,
568c2ecf20Sopenharmony_ci	HISTC_MEM_DADDR_SYMBOL,
578c2ecf20Sopenharmony_ci	HISTC_MEM_DADDR_DSO,
588c2ecf20Sopenharmony_ci	HISTC_MEM_PHYS_DADDR,
598c2ecf20Sopenharmony_ci	HISTC_MEM_LOCKED,
608c2ecf20Sopenharmony_ci	HISTC_MEM_TLB,
618c2ecf20Sopenharmony_ci	HISTC_MEM_LVL,
628c2ecf20Sopenharmony_ci	HISTC_MEM_SNOOP,
638c2ecf20Sopenharmony_ci	HISTC_MEM_DCACHELINE,
648c2ecf20Sopenharmony_ci	HISTC_MEM_IADDR_SYMBOL,
658c2ecf20Sopenharmony_ci	HISTC_TRANSACTION,
668c2ecf20Sopenharmony_ci	HISTC_CYCLES,
678c2ecf20Sopenharmony_ci	HISTC_SRCLINE_FROM,
688c2ecf20Sopenharmony_ci	HISTC_SRCLINE_TO,
698c2ecf20Sopenharmony_ci	HISTC_TRACE,
708c2ecf20Sopenharmony_ci	HISTC_SYM_SIZE,
718c2ecf20Sopenharmony_ci	HISTC_DSO_SIZE,
728c2ecf20Sopenharmony_ci	HISTC_SYMBOL_IPC,
738c2ecf20Sopenharmony_ci	HISTC_NR_COLS, /* Last entry */
748c2ecf20Sopenharmony_ci};
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistruct thread;
778c2ecf20Sopenharmony_cistruct dso;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistruct hists {
808c2ecf20Sopenharmony_ci	struct rb_root_cached	entries_in_array[2];
818c2ecf20Sopenharmony_ci	struct rb_root_cached	*entries_in;
828c2ecf20Sopenharmony_ci	struct rb_root_cached	entries;
838c2ecf20Sopenharmony_ci	struct rb_root_cached	entries_collapsed;
848c2ecf20Sopenharmony_ci	u64			nr_entries;
858c2ecf20Sopenharmony_ci	u64			nr_non_filtered_entries;
868c2ecf20Sopenharmony_ci	u64			callchain_period;
878c2ecf20Sopenharmony_ci	u64			callchain_non_filtered_period;
888c2ecf20Sopenharmony_ci	struct thread		*thread_filter;
898c2ecf20Sopenharmony_ci	const struct dso	*dso_filter;
908c2ecf20Sopenharmony_ci	const char		*uid_filter_str;
918c2ecf20Sopenharmony_ci	const char		*symbol_filter_str;
928c2ecf20Sopenharmony_ci	pthread_mutex_t		lock;
938c2ecf20Sopenharmony_ci	struct events_stats	stats;
948c2ecf20Sopenharmony_ci	u64			event_stream;
958c2ecf20Sopenharmony_ci	u16			col_len[HISTC_NR_COLS];
968c2ecf20Sopenharmony_ci	bool			has_callchains;
978c2ecf20Sopenharmony_ci	int			socket_filter;
988c2ecf20Sopenharmony_ci	struct perf_hpp_list	*hpp_list;
998c2ecf20Sopenharmony_ci	struct list_head	hpp_formats;
1008c2ecf20Sopenharmony_ci	int			nr_hpp_node;
1018c2ecf20Sopenharmony_ci};
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci#define hists__has(__h, __f) (__h)->hpp_list->__f
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistruct hist_entry_iter;
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_cistruct hist_iter_ops {
1088c2ecf20Sopenharmony_ci	int (*prepare_entry)(struct hist_entry_iter *, struct addr_location *);
1098c2ecf20Sopenharmony_ci	int (*add_single_entry)(struct hist_entry_iter *, struct addr_location *);
1108c2ecf20Sopenharmony_ci	int (*next_entry)(struct hist_entry_iter *, struct addr_location *);
1118c2ecf20Sopenharmony_ci	int (*add_next_entry)(struct hist_entry_iter *, struct addr_location *);
1128c2ecf20Sopenharmony_ci	int (*finish_entry)(struct hist_entry_iter *, struct addr_location *);
1138c2ecf20Sopenharmony_ci};
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cistruct hist_entry_iter {
1168c2ecf20Sopenharmony_ci	int total;
1178c2ecf20Sopenharmony_ci	int curr;
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci	bool hide_unresolved;
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	struct evsel *evsel;
1228c2ecf20Sopenharmony_ci	struct perf_sample *sample;
1238c2ecf20Sopenharmony_ci	struct hist_entry *he;
1248c2ecf20Sopenharmony_ci	struct symbol *parent;
1258c2ecf20Sopenharmony_ci	void *priv;
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci	const struct hist_iter_ops *ops;
1288c2ecf20Sopenharmony_ci	/* user-defined callback function (optional) */
1298c2ecf20Sopenharmony_ci	int (*add_entry_cb)(struct hist_entry_iter *iter,
1308c2ecf20Sopenharmony_ci			    struct addr_location *al, bool single, void *arg);
1318c2ecf20Sopenharmony_ci};
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ciextern const struct hist_iter_ops hist_iter_normal;
1348c2ecf20Sopenharmony_ciextern const struct hist_iter_ops hist_iter_branch;
1358c2ecf20Sopenharmony_ciextern const struct hist_iter_ops hist_iter_mem;
1368c2ecf20Sopenharmony_ciextern const struct hist_iter_ops hist_iter_cumulative;
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_cistruct hist_entry *hists__add_entry(struct hists *hists,
1398c2ecf20Sopenharmony_ci				    struct addr_location *al,
1408c2ecf20Sopenharmony_ci				    struct symbol *parent,
1418c2ecf20Sopenharmony_ci				    struct branch_info *bi,
1428c2ecf20Sopenharmony_ci				    struct mem_info *mi,
1438c2ecf20Sopenharmony_ci				    struct perf_sample *sample,
1448c2ecf20Sopenharmony_ci				    bool sample_self);
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_cistruct hist_entry *hists__add_entry_ops(struct hists *hists,
1478c2ecf20Sopenharmony_ci					struct hist_entry_ops *ops,
1488c2ecf20Sopenharmony_ci					struct addr_location *al,
1498c2ecf20Sopenharmony_ci					struct symbol *sym_parent,
1508c2ecf20Sopenharmony_ci					struct branch_info *bi,
1518c2ecf20Sopenharmony_ci					struct mem_info *mi,
1528c2ecf20Sopenharmony_ci					struct perf_sample *sample,
1538c2ecf20Sopenharmony_ci					bool sample_self);
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_cistruct hist_entry *hists__add_entry_block(struct hists *hists,
1568c2ecf20Sopenharmony_ci					  struct addr_location *al,
1578c2ecf20Sopenharmony_ci					  struct block_info *bi);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ciint hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al,
1608c2ecf20Sopenharmony_ci			 int max_stack_depth, void *arg);
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_cistruct perf_hpp;
1638c2ecf20Sopenharmony_cistruct perf_hpp_fmt;
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ciint64_t hist_entry__cmp(struct hist_entry *left, struct hist_entry *right);
1668c2ecf20Sopenharmony_ciint64_t hist_entry__collapse(struct hist_entry *left, struct hist_entry *right);
1678c2ecf20Sopenharmony_ciint hist_entry__transaction_len(void);
1688c2ecf20Sopenharmony_ciint hist_entry__sort_snprintf(struct hist_entry *he, char *bf, size_t size,
1698c2ecf20Sopenharmony_ci			      struct hists *hists);
1708c2ecf20Sopenharmony_ciint hist_entry__snprintf_alignment(struct hist_entry *he, struct perf_hpp *hpp,
1718c2ecf20Sopenharmony_ci				   struct perf_hpp_fmt *fmt, int printed);
1728c2ecf20Sopenharmony_civoid hist_entry__delete(struct hist_entry *he);
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_citypedef int (*hists__resort_cb_t)(struct hist_entry *he, void *arg);
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_civoid evsel__output_resort_cb(struct evsel *evsel, struct ui_progress *prog,
1778c2ecf20Sopenharmony_ci			     hists__resort_cb_t cb, void *cb_arg);
1788c2ecf20Sopenharmony_civoid evsel__output_resort(struct evsel *evsel, struct ui_progress *prog);
1798c2ecf20Sopenharmony_civoid hists__output_resort(struct hists *hists, struct ui_progress *prog);
1808c2ecf20Sopenharmony_civoid hists__output_resort_cb(struct hists *hists, struct ui_progress *prog,
1818c2ecf20Sopenharmony_ci			     hists__resort_cb_t cb);
1828c2ecf20Sopenharmony_ciint hists__collapse_resort(struct hists *hists, struct ui_progress *prog);
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_civoid hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel);
1858c2ecf20Sopenharmony_civoid hists__delete_entries(struct hists *hists);
1868c2ecf20Sopenharmony_civoid hists__output_recalc_col_len(struct hists *hists, int max_rows);
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_cistruct hist_entry *hists__get_entry(struct hists *hists, int idx);
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ciu64 hists__total_period(struct hists *hists);
1918c2ecf20Sopenharmony_civoid hists__reset_stats(struct hists *hists);
1928c2ecf20Sopenharmony_civoid hists__inc_stats(struct hists *hists, struct hist_entry *h);
1938c2ecf20Sopenharmony_civoid hists__inc_nr_events(struct hists *hists, u32 type);
1948c2ecf20Sopenharmony_civoid hists__inc_nr_samples(struct hists *hists, bool filtered);
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_cisize_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
1978c2ecf20Sopenharmony_ci		      int max_cols, float min_pcnt, FILE *fp,
1988c2ecf20Sopenharmony_ci		      bool ignore_callchains);
1998c2ecf20Sopenharmony_cisize_t perf_evlist__fprintf_nr_events(struct evlist *evlist, FILE *fp);
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_civoid hists__filter_by_dso(struct hists *hists);
2028c2ecf20Sopenharmony_civoid hists__filter_by_thread(struct hists *hists);
2038c2ecf20Sopenharmony_civoid hists__filter_by_symbol(struct hists *hists);
2048c2ecf20Sopenharmony_civoid hists__filter_by_socket(struct hists *hists);
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_cistatic inline bool hists__has_filter(struct hists *hists)
2078c2ecf20Sopenharmony_ci{
2088c2ecf20Sopenharmony_ci	return hists->thread_filter || hists->dso_filter ||
2098c2ecf20Sopenharmony_ci		hists->symbol_filter_str || (hists->socket_filter > -1);
2108c2ecf20Sopenharmony_ci}
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ciu16 hists__col_len(struct hists *hists, enum hist_column col);
2138c2ecf20Sopenharmony_civoid hists__set_col_len(struct hists *hists, enum hist_column col, u16 len);
2148c2ecf20Sopenharmony_cibool hists__new_col_len(struct hists *hists, enum hist_column col, u16 len);
2158c2ecf20Sopenharmony_civoid hists__reset_col_len(struct hists *hists);
2168c2ecf20Sopenharmony_civoid hists__calc_col_len(struct hists *hists, struct hist_entry *he);
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_civoid hists__match(struct hists *leader, struct hists *other);
2198c2ecf20Sopenharmony_ciint hists__link(struct hists *leader, struct hists *other);
2208c2ecf20Sopenharmony_ciint hists__unlink(struct hists *hists);
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_cistruct hists_evsel {
2238c2ecf20Sopenharmony_ci	struct evsel evsel;
2248c2ecf20Sopenharmony_ci	struct hists	  hists;
2258c2ecf20Sopenharmony_ci};
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_cistatic inline struct evsel *hists_to_evsel(struct hists *hists)
2288c2ecf20Sopenharmony_ci{
2298c2ecf20Sopenharmony_ci	struct hists_evsel *hevsel = container_of(hists, struct hists_evsel, hists);
2308c2ecf20Sopenharmony_ci	return &hevsel->evsel;
2318c2ecf20Sopenharmony_ci}
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_cistatic inline struct hists *evsel__hists(struct evsel *evsel)
2348c2ecf20Sopenharmony_ci{
2358c2ecf20Sopenharmony_ci	struct hists_evsel *hevsel = (struct hists_evsel *)evsel;
2368c2ecf20Sopenharmony_ci	return &hevsel->hists;
2378c2ecf20Sopenharmony_ci}
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_cistatic __pure inline bool hists__has_callchains(struct hists *hists)
2408c2ecf20Sopenharmony_ci{
2418c2ecf20Sopenharmony_ci	return hists->has_callchains;
2428c2ecf20Sopenharmony_ci}
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ciint hists__init(void);
2458c2ecf20Sopenharmony_ciint __hists__init(struct hists *hists, struct perf_hpp_list *hpp_list);
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_cistruct rb_root_cached *hists__get_rotate_entries_in(struct hists *hists);
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_cistruct perf_hpp {
2508c2ecf20Sopenharmony_ci	char *buf;
2518c2ecf20Sopenharmony_ci	size_t size;
2528c2ecf20Sopenharmony_ci	const char *sep;
2538c2ecf20Sopenharmony_ci	void *ptr;
2548c2ecf20Sopenharmony_ci	bool skip;
2558c2ecf20Sopenharmony_ci};
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_cistruct perf_hpp_fmt {
2588c2ecf20Sopenharmony_ci	const char *name;
2598c2ecf20Sopenharmony_ci	int (*header)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
2608c2ecf20Sopenharmony_ci		      struct hists *hists, int line, int *span);
2618c2ecf20Sopenharmony_ci	int (*width)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
2628c2ecf20Sopenharmony_ci		     struct hists *hists);
2638c2ecf20Sopenharmony_ci	int (*color)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
2648c2ecf20Sopenharmony_ci		     struct hist_entry *he);
2658c2ecf20Sopenharmony_ci	int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
2668c2ecf20Sopenharmony_ci		     struct hist_entry *he);
2678c2ecf20Sopenharmony_ci	int64_t (*cmp)(struct perf_hpp_fmt *fmt,
2688c2ecf20Sopenharmony_ci		       struct hist_entry *a, struct hist_entry *b);
2698c2ecf20Sopenharmony_ci	int64_t (*collapse)(struct perf_hpp_fmt *fmt,
2708c2ecf20Sopenharmony_ci			    struct hist_entry *a, struct hist_entry *b);
2718c2ecf20Sopenharmony_ci	int64_t (*sort)(struct perf_hpp_fmt *fmt,
2728c2ecf20Sopenharmony_ci			struct hist_entry *a, struct hist_entry *b);
2738c2ecf20Sopenharmony_ci	bool (*equal)(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b);
2748c2ecf20Sopenharmony_ci	void (*free)(struct perf_hpp_fmt *fmt);
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	struct list_head list;
2778c2ecf20Sopenharmony_ci	struct list_head sort_list;
2788c2ecf20Sopenharmony_ci	bool elide;
2798c2ecf20Sopenharmony_ci	int len;
2808c2ecf20Sopenharmony_ci	int user_len;
2818c2ecf20Sopenharmony_ci	int idx;
2828c2ecf20Sopenharmony_ci	int level;
2838c2ecf20Sopenharmony_ci};
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_cistruct perf_hpp_list {
2868c2ecf20Sopenharmony_ci	struct list_head fields;
2878c2ecf20Sopenharmony_ci	struct list_head sorts;
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_ci	int nr_header_lines;
2908c2ecf20Sopenharmony_ci	int need_collapse;
2918c2ecf20Sopenharmony_ci	int parent;
2928c2ecf20Sopenharmony_ci	int sym;
2938c2ecf20Sopenharmony_ci	int dso;
2948c2ecf20Sopenharmony_ci	int socket;
2958c2ecf20Sopenharmony_ci	int thread;
2968c2ecf20Sopenharmony_ci	int comm;
2978c2ecf20Sopenharmony_ci};
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ciextern struct perf_hpp_list perf_hpp_list;
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_cistruct perf_hpp_list_node {
3028c2ecf20Sopenharmony_ci	struct list_head	list;
3038c2ecf20Sopenharmony_ci	struct perf_hpp_list	hpp;
3048c2ecf20Sopenharmony_ci	int			level;
3058c2ecf20Sopenharmony_ci	bool			skip;
3068c2ecf20Sopenharmony_ci};
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_civoid perf_hpp_list__column_register(struct perf_hpp_list *list,
3098c2ecf20Sopenharmony_ci				    struct perf_hpp_fmt *format);
3108c2ecf20Sopenharmony_civoid perf_hpp_list__register_sort_field(struct perf_hpp_list *list,
3118c2ecf20Sopenharmony_ci					struct perf_hpp_fmt *format);
3128c2ecf20Sopenharmony_civoid perf_hpp_list__prepend_sort_field(struct perf_hpp_list *list,
3138c2ecf20Sopenharmony_ci				       struct perf_hpp_fmt *format);
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_cistatic inline void perf_hpp__column_register(struct perf_hpp_fmt *format)
3168c2ecf20Sopenharmony_ci{
3178c2ecf20Sopenharmony_ci	perf_hpp_list__column_register(&perf_hpp_list, format);
3188c2ecf20Sopenharmony_ci}
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_cistatic inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
3218c2ecf20Sopenharmony_ci{
3228c2ecf20Sopenharmony_ci	perf_hpp_list__register_sort_field(&perf_hpp_list, format);
3238c2ecf20Sopenharmony_ci}
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_cistatic inline void perf_hpp__prepend_sort_field(struct perf_hpp_fmt *format)
3268c2ecf20Sopenharmony_ci{
3278c2ecf20Sopenharmony_ci	perf_hpp_list__prepend_sort_field(&perf_hpp_list, format);
3288c2ecf20Sopenharmony_ci}
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci#define perf_hpp_list__for_each_format(_list, format) \
3318c2ecf20Sopenharmony_ci	list_for_each_entry(format, &(_list)->fields, list)
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ci#define perf_hpp_list__for_each_format_safe(_list, format, tmp)	\
3348c2ecf20Sopenharmony_ci	list_for_each_entry_safe(format, tmp, &(_list)->fields, list)
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ci#define perf_hpp_list__for_each_sort_list(_list, format) \
3378c2ecf20Sopenharmony_ci	list_for_each_entry(format, &(_list)->sorts, sort_list)
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_ci#define perf_hpp_list__for_each_sort_list_safe(_list, format, tmp)	\
3408c2ecf20Sopenharmony_ci	list_for_each_entry_safe(format, tmp, &(_list)->sorts, sort_list)
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ci#define hists__for_each_format(hists, format) \
3438c2ecf20Sopenharmony_ci	perf_hpp_list__for_each_format((hists)->hpp_list, format)
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci#define hists__for_each_sort_list(hists, format) \
3468c2ecf20Sopenharmony_ci	perf_hpp_list__for_each_sort_list((hists)->hpp_list, format)
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ciextern struct perf_hpp_fmt perf_hpp__format[];
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_cienum {
3518c2ecf20Sopenharmony_ci	/* Matches perf_hpp__format array. */
3528c2ecf20Sopenharmony_ci	PERF_HPP__OVERHEAD,
3538c2ecf20Sopenharmony_ci	PERF_HPP__OVERHEAD_SYS,
3548c2ecf20Sopenharmony_ci	PERF_HPP__OVERHEAD_US,
3558c2ecf20Sopenharmony_ci	PERF_HPP__OVERHEAD_GUEST_SYS,
3568c2ecf20Sopenharmony_ci	PERF_HPP__OVERHEAD_GUEST_US,
3578c2ecf20Sopenharmony_ci	PERF_HPP__OVERHEAD_ACC,
3588c2ecf20Sopenharmony_ci	PERF_HPP__SAMPLES,
3598c2ecf20Sopenharmony_ci	PERF_HPP__PERIOD,
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci	PERF_HPP__MAX_INDEX
3628c2ecf20Sopenharmony_ci};
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_civoid perf_hpp__init(void);
3658c2ecf20Sopenharmony_civoid perf_hpp__cancel_cumulate(void);
3668c2ecf20Sopenharmony_civoid perf_hpp__setup_output_field(struct perf_hpp_list *list);
3678c2ecf20Sopenharmony_civoid perf_hpp__reset_output_field(struct perf_hpp_list *list);
3688c2ecf20Sopenharmony_civoid perf_hpp__append_sort_keys(struct perf_hpp_list *list);
3698c2ecf20Sopenharmony_ciint perf_hpp__setup_hists_formats(struct perf_hpp_list *list,
3708c2ecf20Sopenharmony_ci				  struct evlist *evlist);
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_cibool perf_hpp__is_sort_entry(struct perf_hpp_fmt *format);
3748c2ecf20Sopenharmony_cibool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *format);
3758c2ecf20Sopenharmony_cibool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt, struct hists *hists);
3768c2ecf20Sopenharmony_cibool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt);
3778c2ecf20Sopenharmony_cibool perf_hpp__is_srcline_entry(struct perf_hpp_fmt *fmt);
3788c2ecf20Sopenharmony_cibool perf_hpp__is_srcfile_entry(struct perf_hpp_fmt *fmt);
3798c2ecf20Sopenharmony_cibool perf_hpp__is_thread_entry(struct perf_hpp_fmt *fmt);
3808c2ecf20Sopenharmony_cibool perf_hpp__is_comm_entry(struct perf_hpp_fmt *fmt);
3818c2ecf20Sopenharmony_cibool perf_hpp__is_dso_entry(struct perf_hpp_fmt *fmt);
3828c2ecf20Sopenharmony_cibool perf_hpp__is_sym_entry(struct perf_hpp_fmt *fmt);
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_cistruct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt);
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ciint hist_entry__filter(struct hist_entry *he, int type, const void *arg);
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_cistatic inline bool perf_hpp__should_skip(struct perf_hpp_fmt *format,
3898c2ecf20Sopenharmony_ci					 struct hists *hists)
3908c2ecf20Sopenharmony_ci{
3918c2ecf20Sopenharmony_ci	if (format->elide)
3928c2ecf20Sopenharmony_ci		return true;
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	if (perf_hpp__is_dynamic_entry(format) &&
3958c2ecf20Sopenharmony_ci	    !perf_hpp__defined_dynamic_entry(format, hists))
3968c2ecf20Sopenharmony_ci		return true;
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci	return false;
3998c2ecf20Sopenharmony_ci}
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_civoid perf_hpp__reset_width(struct perf_hpp_fmt *fmt, struct hists *hists);
4028c2ecf20Sopenharmony_civoid perf_hpp__reset_sort_width(struct perf_hpp_fmt *fmt, struct hists *hists);
4038c2ecf20Sopenharmony_civoid perf_hpp__set_user_width(const char *width_list_str);
4048c2ecf20Sopenharmony_civoid hists__reset_column_width(struct hists *hists);
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_citypedef u64 (*hpp_field_fn)(struct hist_entry *he);
4078c2ecf20Sopenharmony_citypedef int (*hpp_callback_fn)(struct perf_hpp *hpp, bool front);
4088c2ecf20Sopenharmony_citypedef int (*hpp_snprint_fn)(struct perf_hpp *hpp, const char *fmt, ...);
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ciint hpp__fmt(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
4118c2ecf20Sopenharmony_ci	     struct hist_entry *he, hpp_field_fn get_field,
4128c2ecf20Sopenharmony_ci	     const char *fmtstr, hpp_snprint_fn print_fn, bool fmt_percent);
4138c2ecf20Sopenharmony_ciint hpp__fmt_acc(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
4148c2ecf20Sopenharmony_ci		 struct hist_entry *he, hpp_field_fn get_field,
4158c2ecf20Sopenharmony_ci		 const char *fmtstr, hpp_snprint_fn print_fn, bool fmt_percent);
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_cistatic inline void advance_hpp(struct perf_hpp *hpp, int inc)
4188c2ecf20Sopenharmony_ci{
4198c2ecf20Sopenharmony_ci	hpp->buf  += inc;
4208c2ecf20Sopenharmony_ci	hpp->size -= inc;
4218c2ecf20Sopenharmony_ci}
4228c2ecf20Sopenharmony_ci
4238c2ecf20Sopenharmony_cistatic inline size_t perf_hpp__use_color(void)
4248c2ecf20Sopenharmony_ci{
4258c2ecf20Sopenharmony_ci	return !symbol_conf.field_sep;
4268c2ecf20Sopenharmony_ci}
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_cistatic inline size_t perf_hpp__color_overhead(void)
4298c2ecf20Sopenharmony_ci{
4308c2ecf20Sopenharmony_ci	return perf_hpp__use_color() ?
4318c2ecf20Sopenharmony_ci	       (COLOR_MAXLEN + sizeof(PERF_COLOR_RESET)) * PERF_HPP__MAX_INDEX
4328c2ecf20Sopenharmony_ci	       : 0;
4338c2ecf20Sopenharmony_ci}
4348c2ecf20Sopenharmony_ci
4358c2ecf20Sopenharmony_cistruct evlist;
4368c2ecf20Sopenharmony_ci
4378c2ecf20Sopenharmony_cistruct hist_browser_timer {
4388c2ecf20Sopenharmony_ci	void (*timer)(void *arg);
4398c2ecf20Sopenharmony_ci	void *arg;
4408c2ecf20Sopenharmony_ci	int refresh;
4418c2ecf20Sopenharmony_ci};
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_cistruct annotation_options;
4448c2ecf20Sopenharmony_cistruct res_sample;
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_cienum rstype {
4478c2ecf20Sopenharmony_ci	A_NORMAL,
4488c2ecf20Sopenharmony_ci	A_ASM,
4498c2ecf20Sopenharmony_ci	A_SOURCE
4508c2ecf20Sopenharmony_ci};
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_cistruct block_hist;
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci#ifdef HAVE_SLANG_SUPPORT
4558c2ecf20Sopenharmony_ci#include "../ui/keysyms.h"
4568c2ecf20Sopenharmony_civoid attr_to_script(char *buf, struct perf_event_attr *attr);
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ciint map_symbol__tui_annotate(struct map_symbol *ms, struct evsel *evsel,
4598c2ecf20Sopenharmony_ci			     struct hist_browser_timer *hbt,
4608c2ecf20Sopenharmony_ci			     struct annotation_options *annotation_opts);
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ciint hist_entry__tui_annotate(struct hist_entry *he, struct evsel *evsel,
4638c2ecf20Sopenharmony_ci			     struct hist_browser_timer *hbt,
4648c2ecf20Sopenharmony_ci			     struct annotation_options *annotation_opts);
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_ciint perf_evlist__tui_browse_hists(struct evlist *evlist, const char *help,
4678c2ecf20Sopenharmony_ci				  struct hist_browser_timer *hbt,
4688c2ecf20Sopenharmony_ci				  float min_pcnt,
4698c2ecf20Sopenharmony_ci				  struct perf_env *env,
4708c2ecf20Sopenharmony_ci				  bool warn_lost_event,
4718c2ecf20Sopenharmony_ci				  struct annotation_options *annotation_options);
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ciint script_browse(const char *script_opt, struct evsel *evsel);
4748c2ecf20Sopenharmony_ci
4758c2ecf20Sopenharmony_civoid run_script(char *cmd);
4768c2ecf20Sopenharmony_ciint res_sample_browse(struct res_sample *res_samples, int num_res,
4778c2ecf20Sopenharmony_ci		      struct evsel *evsel, enum rstype rstype);
4788c2ecf20Sopenharmony_civoid res_sample_init(void);
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ciint block_hists_tui_browse(struct block_hist *bh, struct evsel *evsel,
4818c2ecf20Sopenharmony_ci			   float min_percent, struct perf_env *env,
4828c2ecf20Sopenharmony_ci			   struct annotation_options *annotation_opts);
4838c2ecf20Sopenharmony_ci#else
4848c2ecf20Sopenharmony_cistatic inline
4858c2ecf20Sopenharmony_ciint perf_evlist__tui_browse_hists(struct evlist *evlist __maybe_unused,
4868c2ecf20Sopenharmony_ci				  const char *help __maybe_unused,
4878c2ecf20Sopenharmony_ci				  struct hist_browser_timer *hbt __maybe_unused,
4888c2ecf20Sopenharmony_ci				  float min_pcnt __maybe_unused,
4898c2ecf20Sopenharmony_ci				  struct perf_env *env __maybe_unused,
4908c2ecf20Sopenharmony_ci				  bool warn_lost_event __maybe_unused,
4918c2ecf20Sopenharmony_ci				  struct annotation_options *annotation_options __maybe_unused)
4928c2ecf20Sopenharmony_ci{
4938c2ecf20Sopenharmony_ci	return 0;
4948c2ecf20Sopenharmony_ci}
4958c2ecf20Sopenharmony_cistatic inline int map_symbol__tui_annotate(struct map_symbol *ms __maybe_unused,
4968c2ecf20Sopenharmony_ci					   struct evsel *evsel __maybe_unused,
4978c2ecf20Sopenharmony_ci					   struct hist_browser_timer *hbt __maybe_unused,
4988c2ecf20Sopenharmony_ci					   struct annotation_options *annotation_options __maybe_unused)
4998c2ecf20Sopenharmony_ci{
5008c2ecf20Sopenharmony_ci	return 0;
5018c2ecf20Sopenharmony_ci}
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_cistatic inline int hist_entry__tui_annotate(struct hist_entry *he __maybe_unused,
5048c2ecf20Sopenharmony_ci					   struct evsel *evsel __maybe_unused,
5058c2ecf20Sopenharmony_ci					   struct hist_browser_timer *hbt __maybe_unused,
5068c2ecf20Sopenharmony_ci					   struct annotation_options *annotation_opts __maybe_unused)
5078c2ecf20Sopenharmony_ci{
5088c2ecf20Sopenharmony_ci	return 0;
5098c2ecf20Sopenharmony_ci}
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_cistatic inline int script_browse(const char *script_opt __maybe_unused,
5128c2ecf20Sopenharmony_ci				struct evsel *evsel __maybe_unused)
5138c2ecf20Sopenharmony_ci{
5148c2ecf20Sopenharmony_ci	return 0;
5158c2ecf20Sopenharmony_ci}
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_cistatic inline int res_sample_browse(struct res_sample *res_samples __maybe_unused,
5188c2ecf20Sopenharmony_ci				    int num_res __maybe_unused,
5198c2ecf20Sopenharmony_ci				    struct evsel *evsel __maybe_unused,
5208c2ecf20Sopenharmony_ci				    enum rstype rstype __maybe_unused)
5218c2ecf20Sopenharmony_ci{
5228c2ecf20Sopenharmony_ci	return 0;
5238c2ecf20Sopenharmony_ci}
5248c2ecf20Sopenharmony_ci
5258c2ecf20Sopenharmony_cistatic inline void res_sample_init(void) {}
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_cistatic inline int block_hists_tui_browse(struct block_hist *bh __maybe_unused,
5288c2ecf20Sopenharmony_ci					 struct evsel *evsel __maybe_unused,
5298c2ecf20Sopenharmony_ci					 float min_percent __maybe_unused,
5308c2ecf20Sopenharmony_ci					 struct perf_env *env __maybe_unused,
5318c2ecf20Sopenharmony_ci					 struct annotation_options *annotation_opts __maybe_unused)
5328c2ecf20Sopenharmony_ci{
5338c2ecf20Sopenharmony_ci	return 0;
5348c2ecf20Sopenharmony_ci}
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci#define K_LEFT  -1000
5378c2ecf20Sopenharmony_ci#define K_RIGHT -2000
5388c2ecf20Sopenharmony_ci#define K_SWITCH_INPUT_DATA -3000
5398c2ecf20Sopenharmony_ci#define K_RELOAD -4000
5408c2ecf20Sopenharmony_ci#endif
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_ciunsigned int hists__sort_list_width(struct hists *hists);
5438c2ecf20Sopenharmony_ciunsigned int hists__overhead_width(struct hists *hists);
5448c2ecf20Sopenharmony_ci
5458c2ecf20Sopenharmony_civoid hist__account_cycles(struct branch_stack *bs, struct addr_location *al,
5468c2ecf20Sopenharmony_ci			  struct perf_sample *sample, bool nonany_branch_mode,
5478c2ecf20Sopenharmony_ci			  u64 *total_cycles);
5488c2ecf20Sopenharmony_ci
5498c2ecf20Sopenharmony_cistruct option;
5508c2ecf20Sopenharmony_ciint parse_filter_percentage(const struct option *opt, const char *arg, int unset);
5518c2ecf20Sopenharmony_ciint perf_hist_config(const char *var, const char *value);
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_civoid perf_hpp_list__init(struct perf_hpp_list *list);
5548c2ecf20Sopenharmony_ci
5558c2ecf20Sopenharmony_cienum hierarchy_move_dir {
5568c2ecf20Sopenharmony_ci	HMD_NORMAL,
5578c2ecf20Sopenharmony_ci	HMD_FORCE_SIBLING,
5588c2ecf20Sopenharmony_ci	HMD_FORCE_CHILD,
5598c2ecf20Sopenharmony_ci};
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_cistruct rb_node *rb_hierarchy_last(struct rb_node *node);
5628c2ecf20Sopenharmony_cistruct rb_node *__rb_hierarchy_next(struct rb_node *node,
5638c2ecf20Sopenharmony_ci				    enum hierarchy_move_dir hmd);
5648c2ecf20Sopenharmony_cistruct rb_node *rb_hierarchy_prev(struct rb_node *node);
5658c2ecf20Sopenharmony_ci
5668c2ecf20Sopenharmony_cistatic inline struct rb_node *rb_hierarchy_next(struct rb_node *node)
5678c2ecf20Sopenharmony_ci{
5688c2ecf20Sopenharmony_ci	return __rb_hierarchy_next(node, HMD_NORMAL);
5698c2ecf20Sopenharmony_ci}
5708c2ecf20Sopenharmony_ci
5718c2ecf20Sopenharmony_ci#define HIERARCHY_INDENT  3
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_cibool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit);
5748c2ecf20Sopenharmony_ciint hpp_color_scnprintf(struct perf_hpp *hpp, const char *fmt, ...);
5758c2ecf20Sopenharmony_ciint __hpp__slsmg_color_printf(struct perf_hpp *hpp, const char *fmt, ...);
5768c2ecf20Sopenharmony_ciint __hist_entry__snprintf(struct hist_entry *he, struct perf_hpp *hpp,
5778c2ecf20Sopenharmony_ci			   struct perf_hpp_list *hpp_list);
5788c2ecf20Sopenharmony_ciint hists__fprintf_headers(struct hists *hists, FILE *fp);
5798c2ecf20Sopenharmony_ciint __hists__scnprintf_title(struct hists *hists, char *bf, size_t size, bool show_freq);
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_cistatic inline int hists__scnprintf_title(struct hists *hists, char *bf, size_t size)
5828c2ecf20Sopenharmony_ci{
5838c2ecf20Sopenharmony_ci	return __hists__scnprintf_title(hists, bf, size, true);
5848c2ecf20Sopenharmony_ci}
5858c2ecf20Sopenharmony_ci
5868c2ecf20Sopenharmony_ci#endif	/* __PERF_HIST_H */
587