xref: /openbmc/linux/tools/perf/util/branch.h (revision 42bbabed09ce6208026648a71a45b4394c74585a)
1992c7e92SJin Yao #ifndef _PERF_BRANCH_H
2992c7e92SJin Yao #define _PERF_BRANCH_H 1
3fb71c86cSArnaldo Carvalho de Melo /*
4fb71c86cSArnaldo Carvalho de Melo  * The linux/stddef.h isn't need here, but is needed for __always_inline used
5fb71c86cSArnaldo Carvalho de Melo  * in files included from uapi/linux/perf_event.h such as
6fb71c86cSArnaldo Carvalho de Melo  * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h,
7fb71c86cSArnaldo Carvalho de Melo  * detected in at least musl libc, used in Alpine Linux. -acme
8fb71c86cSArnaldo Carvalho de Melo  */
9f1a397f3SArnaldo Carvalho de Melo #include <stdio.h>
10992c7e92SJin Yao #include <stdint.h>
11fb71c86cSArnaldo Carvalho de Melo #include <linux/compiler.h>
12fb71c86cSArnaldo Carvalho de Melo #include <linux/stddef.h>
13f1a397f3SArnaldo Carvalho de Melo #include <linux/perf_event.h>
14f1a397f3SArnaldo Carvalho de Melo #include <linux/types.h>
15*42bbabedSKan Liang #include "event.h"
16f1a397f3SArnaldo Carvalho de Melo 
17f1a397f3SArnaldo Carvalho de Melo struct branch_flags {
18f1a397f3SArnaldo Carvalho de Melo 	u64 mispred:1;
19f1a397f3SArnaldo Carvalho de Melo 	u64 predicted:1;
20f1a397f3SArnaldo Carvalho de Melo 	u64 in_tx:1;
21f1a397f3SArnaldo Carvalho de Melo 	u64 abort:1;
22f1a397f3SArnaldo Carvalho de Melo 	u64 cycles:16;
23f1a397f3SArnaldo Carvalho de Melo 	u64 type:4;
24f1a397f3SArnaldo Carvalho de Melo 	u64 reserved:40;
25f1a397f3SArnaldo Carvalho de Melo };
26f1a397f3SArnaldo Carvalho de Melo 
27d3300a3cSArnaldo Carvalho de Melo struct branch_info {
28d3300a3cSArnaldo Carvalho de Melo 	struct addr_map_symbol from;
29d3300a3cSArnaldo Carvalho de Melo 	struct addr_map_symbol to;
30d3300a3cSArnaldo Carvalho de Melo 	struct branch_flags    flags;
31d3300a3cSArnaldo Carvalho de Melo 	char		       *srcline_from;
32d3300a3cSArnaldo Carvalho de Melo 	char		       *srcline_to;
33d3300a3cSArnaldo Carvalho de Melo };
34d3300a3cSArnaldo Carvalho de Melo 
35f1a397f3SArnaldo Carvalho de Melo struct branch_entry {
36f1a397f3SArnaldo Carvalho de Melo 	u64			from;
37f1a397f3SArnaldo Carvalho de Melo 	u64			to;
38f1a397f3SArnaldo Carvalho de Melo 	struct branch_flags	flags;
39f1a397f3SArnaldo Carvalho de Melo };
40f1a397f3SArnaldo Carvalho de Melo 
41f1a397f3SArnaldo Carvalho de Melo struct branch_stack {
42f1a397f3SArnaldo Carvalho de Melo 	u64			nr;
43*42bbabedSKan Liang 	u64			hw_idx;
44f1a397f3SArnaldo Carvalho de Melo 	struct branch_entry	entries[0];
45f1a397f3SArnaldo Carvalho de Melo };
46992c7e92SJin Yao 
47*42bbabedSKan Liang /*
48*42bbabedSKan Liang  * The hw_idx is only available when PERF_SAMPLE_BRANCH_HW_INDEX is applied.
49*42bbabedSKan Liang  * Otherwise, the output format of a sample with branch stack is
50*42bbabedSKan Liang  * struct branch_stack {
51*42bbabedSKan Liang  *	u64			nr;
52*42bbabedSKan Liang  *	struct branch_entry	entries[0];
53*42bbabedSKan Liang  * }
54*42bbabedSKan Liang  * Check whether the hw_idx is available,
55*42bbabedSKan Liang  * and return the corresponding pointer of entries[0].
56*42bbabedSKan Liang  */
57*42bbabedSKan Liang static inline struct branch_entry *perf_sample__branch_entries(struct perf_sample *sample)
58*42bbabedSKan Liang {
59*42bbabedSKan Liang 	u64 *entry = (u64 *)sample->branch_stack;
60*42bbabedSKan Liang 
61*42bbabedSKan Liang 	entry++;
62*42bbabedSKan Liang 	if (sample->no_hw_idx)
63*42bbabedSKan Liang 		return (struct branch_entry *)entry;
64*42bbabedSKan Liang 	return (struct branch_entry *)(++entry);
65*42bbabedSKan Liang }
66*42bbabedSKan Liang 
67992c7e92SJin Yao struct branch_type_stat {
68a1a8bed3SJin Yao 	bool	branch_to;
69992c7e92SJin Yao 	u64	counts[PERF_BR_MAX];
70992c7e92SJin Yao 	u64	cond_fwd;
71992c7e92SJin Yao 	u64	cond_bwd;
72992c7e92SJin Yao 	u64	cross_4k;
73992c7e92SJin Yao 	u64	cross_2m;
74992c7e92SJin Yao };
75992c7e92SJin Yao 
76992c7e92SJin Yao void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
77992c7e92SJin Yao 		       u64 from, u64 to);
78992c7e92SJin Yao 
79992c7e92SJin Yao const char *branch_type_name(int type);
80992c7e92SJin Yao void branch_type_stat_display(FILE *fp, struct branch_type_stat *st);
81992c7e92SJin Yao int branch_type_str(struct branch_type_stat *st, char *bf, int bfsize);
82992c7e92SJin Yao 
83992c7e92SJin Yao #endif /* _PERF_BRANCH_H */
84