cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

block-range.h (1714B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __PERF_BLOCK_RANGE_H
      3#define __PERF_BLOCK_RANGE_H
      4
      5#include <stdbool.h>
      6#include <linux/rbtree.h>
      7#include <linux/types.h>
      8
      9struct symbol;
     10
     11/*
     12 * struct block_range - non-overlapping parts of basic blocks
     13 * @node:	treenode
     14 * @start:	inclusive start of range
     15 * @end:	inclusive end of range
     16 * @is_target:	@start is a jump target
     17 * @is_branch:	@end is a branch instruction
     18 * @coverage:	number of blocks that cover this range
     19 * @taken:	number of times the branch is taken (requires @is_branch)
     20 * @pred:	number of times the taken branch was predicted
     21 */
     22struct block_range {
     23	struct rb_node node;
     24
     25	struct symbol *sym;
     26
     27	u64 start;
     28	u64 end;
     29
     30	int is_target, is_branch;
     31
     32	u64 coverage;
     33	u64 entry;
     34	u64 taken;
     35	u64 pred;
     36};
     37
     38static inline struct block_range *block_range__next(struct block_range *br)
     39{
     40	struct rb_node *n = rb_next(&br->node);
     41	if (!n)
     42		return NULL;
     43	return rb_entry(n, struct block_range, node);
     44}
     45
     46struct block_range_iter {
     47	struct block_range *start;
     48	struct block_range *end;
     49};
     50
     51static inline struct block_range *block_range_iter(struct block_range_iter *iter)
     52{
     53	return iter->start;
     54}
     55
     56static inline bool block_range_iter__next(struct block_range_iter *iter)
     57{
     58	if (iter->start == iter->end)
     59		return false;
     60
     61	iter->start = block_range__next(iter->start);
     62	return true;
     63}
     64
     65static inline bool block_range_iter__valid(struct block_range_iter *iter)
     66{
     67	if (!iter->start || !iter->end)
     68		return false;
     69	return true;
     70}
     71
     72extern struct block_range *block_range__find(u64 addr);
     73extern struct block_range_iter block_range__create(u64 start, u64 end);
     74extern double block_range__coverage(struct block_range *br);
     75
     76#endif /* __PERF_BLOCK_RANGE_H */