xref: /kernel/linux/linux-5.10/tools/perf/util/branch.h (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci#ifndef _PERF_BRANCH_H
28c2ecf20Sopenharmony_ci#define _PERF_BRANCH_H 1
38c2ecf20Sopenharmony_ci/*
48c2ecf20Sopenharmony_ci * The linux/stddef.h isn't need here, but is needed for __always_inline used
58c2ecf20Sopenharmony_ci * in files included from uapi/linux/perf_event.h such as
68c2ecf20Sopenharmony_ci * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h,
78c2ecf20Sopenharmony_ci * detected in at least musl libc, used in Alpine Linux. -acme
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#include <stdio.h>
108c2ecf20Sopenharmony_ci#include <stdint.h>
118c2ecf20Sopenharmony_ci#include <linux/compiler.h>
128c2ecf20Sopenharmony_ci#include <linux/stddef.h>
138c2ecf20Sopenharmony_ci#include <linux/perf_event.h>
148c2ecf20Sopenharmony_ci#include <linux/types.h>
158c2ecf20Sopenharmony_ci#include "event.h"
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistruct branch_flags {
188c2ecf20Sopenharmony_ci	union {
198c2ecf20Sopenharmony_ci		u64 value;
208c2ecf20Sopenharmony_ci		struct {
218c2ecf20Sopenharmony_ci			u64 mispred:1;
228c2ecf20Sopenharmony_ci			u64 predicted:1;
238c2ecf20Sopenharmony_ci			u64 in_tx:1;
248c2ecf20Sopenharmony_ci			u64 abort:1;
258c2ecf20Sopenharmony_ci			u64 cycles:16;
268c2ecf20Sopenharmony_ci			u64 type:4;
278c2ecf20Sopenharmony_ci			u64 reserved:40;
288c2ecf20Sopenharmony_ci		};
298c2ecf20Sopenharmony_ci	};
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistruct branch_info {
338c2ecf20Sopenharmony_ci	struct addr_map_symbol from;
348c2ecf20Sopenharmony_ci	struct addr_map_symbol to;
358c2ecf20Sopenharmony_ci	struct branch_flags    flags;
368c2ecf20Sopenharmony_ci	char		       *srcline_from;
378c2ecf20Sopenharmony_ci	char		       *srcline_to;
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistruct branch_entry {
418c2ecf20Sopenharmony_ci	u64			from;
428c2ecf20Sopenharmony_ci	u64			to;
438c2ecf20Sopenharmony_ci	struct branch_flags	flags;
448c2ecf20Sopenharmony_ci};
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistruct branch_stack {
478c2ecf20Sopenharmony_ci	u64			nr;
488c2ecf20Sopenharmony_ci	u64			hw_idx;
498c2ecf20Sopenharmony_ci	struct branch_entry	entries[];
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci/*
538c2ecf20Sopenharmony_ci * The hw_idx is only available when PERF_SAMPLE_BRANCH_HW_INDEX is applied.
548c2ecf20Sopenharmony_ci * Otherwise, the output format of a sample with branch stack is
558c2ecf20Sopenharmony_ci * struct branch_stack {
568c2ecf20Sopenharmony_ci *	u64			nr;
578c2ecf20Sopenharmony_ci *	struct branch_entry	entries[0];
588c2ecf20Sopenharmony_ci * }
598c2ecf20Sopenharmony_ci * Check whether the hw_idx is available,
608c2ecf20Sopenharmony_ci * and return the corresponding pointer of entries[0].
618c2ecf20Sopenharmony_ci */
628c2ecf20Sopenharmony_cistatic inline struct branch_entry *perf_sample__branch_entries(struct perf_sample *sample)
638c2ecf20Sopenharmony_ci{
648c2ecf20Sopenharmony_ci	u64 *entry = (u64 *)sample->branch_stack;
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci	entry++;
678c2ecf20Sopenharmony_ci	if (sample->no_hw_idx)
688c2ecf20Sopenharmony_ci		return (struct branch_entry *)entry;
698c2ecf20Sopenharmony_ci	return (struct branch_entry *)(++entry);
708c2ecf20Sopenharmony_ci}
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistruct branch_type_stat {
738c2ecf20Sopenharmony_ci	bool	branch_to;
748c2ecf20Sopenharmony_ci	u64	counts[PERF_BR_MAX];
758c2ecf20Sopenharmony_ci	u64	cond_fwd;
768c2ecf20Sopenharmony_ci	u64	cond_bwd;
778c2ecf20Sopenharmony_ci	u64	cross_4k;
788c2ecf20Sopenharmony_ci	u64	cross_2m;
798c2ecf20Sopenharmony_ci};
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_civoid branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
828c2ecf20Sopenharmony_ci		       u64 from, u64 to);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ciconst char *branch_type_name(int type);
858c2ecf20Sopenharmony_civoid branch_type_stat_display(FILE *fp, struct branch_type_stat *st);
868c2ecf20Sopenharmony_ciint branch_type_str(struct branch_type_stat *st, char *bf, int bfsize);
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci#endif /* _PERF_BRANCH_H */
89