forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.0 KiB
88 lines
2.0 KiB
#ifndef _PERF_BRANCH_H |
|
#define _PERF_BRANCH_H 1 |
|
/* |
|
* The linux/stddef.h isn't need here, but is needed for __always_inline used |
|
* in files included from uapi/linux/perf_event.h such as |
|
* /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h, |
|
* detected in at least musl libc, used in Alpine Linux. -acme |
|
*/ |
|
#include <stdio.h> |
|
#include <stdint.h> |
|
#include <linux/compiler.h> |
|
#include <linux/stddef.h> |
|
#include <linux/perf_event.h> |
|
#include <linux/types.h> |
|
#include "event.h" |
|
|
|
struct branch_flags { |
|
union { |
|
u64 value; |
|
struct { |
|
u64 mispred:1; |
|
u64 predicted:1; |
|
u64 in_tx:1; |
|
u64 abort:1; |
|
u64 cycles:16; |
|
u64 type:4; |
|
u64 reserved:40; |
|
}; |
|
}; |
|
}; |
|
|
|
struct branch_info { |
|
struct addr_map_symbol from; |
|
struct addr_map_symbol to; |
|
struct branch_flags flags; |
|
char *srcline_from; |
|
char *srcline_to; |
|
}; |
|
|
|
struct branch_entry { |
|
u64 from; |
|
u64 to; |
|
struct branch_flags flags; |
|
}; |
|
|
|
struct branch_stack { |
|
u64 nr; |
|
u64 hw_idx; |
|
struct branch_entry entries[]; |
|
}; |
|
|
|
/* |
|
* The hw_idx is only available when PERF_SAMPLE_BRANCH_HW_INDEX is applied. |
|
* Otherwise, the output format of a sample with branch stack is |
|
* struct branch_stack { |
|
* u64 nr; |
|
* struct branch_entry entries[0]; |
|
* } |
|
* Check whether the hw_idx is available, |
|
* and return the corresponding pointer of entries[0]. |
|
*/ |
|
static inline struct branch_entry *perf_sample__branch_entries(struct perf_sample *sample) |
|
{ |
|
u64 *entry = (u64 *)sample->branch_stack; |
|
|
|
entry++; |
|
if (sample->no_hw_idx) |
|
return (struct branch_entry *)entry; |
|
return (struct branch_entry *)(++entry); |
|
} |
|
|
|
struct branch_type_stat { |
|
bool branch_to; |
|
u64 counts[PERF_BR_MAX]; |
|
u64 cond_fwd; |
|
u64 cond_bwd; |
|
u64 cross_4k; |
|
u64 cross_2m; |
|
}; |
|
|
|
void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags, |
|
u64 from, u64 to); |
|
|
|
const char *branch_type_name(int type); |
|
void branch_type_stat_display(FILE *fp, struct branch_type_stat *st); |
|
int branch_type_str(struct branch_type_stat *st, char *bf, int bfsize); |
|
|
|
#endif /* _PERF_BRANCH_H */
|
|
|