brintos

brintos / linux-shallow public Read only

0
0
Text · 2.2 KiB · b80c12c Raw
96 lines · c
1#ifndef _PERF_BRANCH_H2#define _PERF_BRANCH_H 13/*4 * The linux/stddef.h isn't need here, but is needed for __always_inline used5 * in files included from uapi/linux/perf_event.h such as6 * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h,7 * detected in at least musl libc, used in Alpine Linux. -acme8 */9#include <stdio.h>10#include <linux/perf_event.h>11#include <linux/types.h>12#include "util/map_symbol.h"13#include "util/sample.h"14 15struct branch_flags {16	union {17		u64 value;18		struct {19			u64 mispred:1;20			u64 predicted:1;21			u64 in_tx:1;22			u64 abort:1;23			u64 cycles:16;24			u64 type:4;25			u64 spec:2;26			u64 new_type:4;27			u64 priv:3;28			u64 reserved:31;29		};30	};31};32 33struct branch_info {34	struct addr_map_symbol from;35	struct addr_map_symbol to;36	struct branch_flags    flags;37	u64		       branch_stack_cntr;38	char		       *srcline_from;39	char		       *srcline_to;40};41 42struct branch_entry {43	u64			from;44	u64			to;45	struct branch_flags	flags;46};47 48struct branch_stack {49	u64			nr;50	u64			hw_idx;51	struct branch_entry	entries[];52};53 54/*55 * The hw_idx is only available when PERF_SAMPLE_BRANCH_HW_INDEX is applied.56 * Otherwise, the output format of a sample with branch stack is57 * struct branch_stack {58 *	u64			nr;59 *	struct branch_entry	entries[0];60 * }61 * Check whether the hw_idx is available,62 * and return the corresponding pointer of entries[0].63 */64static inline struct branch_entry *perf_sample__branch_entries(struct perf_sample *sample)65{66	u64 *entry = (u64 *)sample->branch_stack;67 68	entry++;69	if (sample->no_hw_idx)70		return (struct branch_entry *)entry;71	return (struct branch_entry *)(++entry);72}73 74struct branch_type_stat {75	bool	branch_to;76	u64	counts[PERF_BR_MAX];77	u64	new_counts[PERF_BR_NEW_MAX];78	u64	cond_fwd;79	u64	cond_bwd;80	u64	cross_4k;81	u64	cross_2m;82};83 84void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,85		       u64 from, u64 to);86 87const char *branch_type_name(int type);88const char *branch_new_type_name(int new_type);89const char *get_branch_type(struct branch_entry *e);90void branch_type_stat_display(FILE *fp, const struct branch_type_stat *st);91int branch_type_str(const struct branch_type_stat *st, char *bf, int bfsize);92 93const char *branch_spec_desc(int spec);94 95#endif /* _PERF_BRANCH_H */96