blob: de048399d7765658d4fab6cd38b10d0a37d0cd34 [file] [log] [blame]
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -02001#ifndef __PERF_MAP_H
2#define __PERF_MAP_H
3
4#include <linux/compiler.h>
5#include <linux/list.h>
6#include <linux/rbtree.h>
7#include <linux/types.h>
8
9enum map_type {
10 MAP__FUNCTION = 0,
11 MAP__VARIABLE,
12};
13
14#define MAP__NR_TYPES (MAP__VARIABLE + 1)
15
16struct dso;
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020017struct ref_reloc_sym;
18struct map_groups;
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020019
20struct map {
21 union {
22 struct rb_node rb_node;
23 struct list_head node;
24 };
25 u64 start;
26 u64 end;
27 enum map_type type;
28 u64 pgoff;
29 u64 (*map_ip)(struct map *, u64);
30 u64 (*unmap_ip)(struct map *, u64);
31 struct dso *dso;
32};
33
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020034struct kmap {
35 struct ref_reloc_sym *ref_reloc_sym;
36 struct map_groups *kmaps;
37};
38
39static inline struct kmap *map__kmap(struct map *self)
40{
41 return (struct kmap *)(self + 1);
42}
43
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020044static inline u64 map__map_ip(struct map *map, u64 ip)
45{
46 return ip - map->start + map->pgoff;
47}
48
49static inline u64 map__unmap_ip(struct map *map, u64 ip)
50{
51 return ip + map->start - map->pgoff;
52}
53
54static inline u64 identity__map_ip(struct map *map __used, u64 ip)
55{
56 return ip;
57}
58
59struct symbol;
60struct mmap_event;
61
62typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
63
64void map__init(struct map *self, enum map_type type,
65 u64 start, u64 end, u64 pgoff, struct dso *dso);
66struct map *map__new(struct mmap_event *event, enum map_type,
67 char *cwd, int cwdlen);
68void map__delete(struct map *self);
69struct map *map__clone(struct map *self);
70int map__overlap(struct map *l, struct map *r);
71size_t map__fprintf(struct map *self, FILE *fp);
72
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020073int map__load(struct map *self, symbol_filter_t filter);
74struct symbol *map__find_symbol(struct map *self,
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020075 u64 addr, symbol_filter_t filter);
76struct symbol *map__find_symbol_by_name(struct map *self, const char *name,
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020077 symbol_filter_t filter);
78void map__fixup_start(struct map *self);
79void map__fixup_end(struct map *self);
80
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020081void map__reloc_vmlinux(struct map *self);
82
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020083#endif /* __PERF_MAP_H */