1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef __PERF_MAP_H
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define __PERF_MAP_H
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#if 0
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/compiler.h>
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/list.h>
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/rbtree.h>
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "include/linux/compiler.h"
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "include/linux/list.h"
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "include/linux/rbtree.h"
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdio.h>
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdbool.h>
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "types.h"
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum map_type {
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	MAP__FUNCTION = 0,
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	MAP__VARIABLE,
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define MAP__NR_TYPES (MAP__VARIABLE + 1)
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern const char *map_type__name[MAP__NR_TYPES];
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct dso;
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct ref_reloc_sym;
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map_groups;
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct machine;
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map {
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	union {
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		struct rb_node	rb_node;
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		struct list_head node;
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	};
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64			start;
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64			end;
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u8 /* enum map_type */	type;
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	bool			referenced;
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32			priv;
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64			pgoff;
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	/* ip -> dso rip */
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64			(*map_ip)(struct map *, u64);
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	/* dso rip -> ip */
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64			(*unmap_ip)(struct map *, u64);
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct dso		*dso;
51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct map_groups	*groups;
52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct kmap {
55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct ref_reloc_sym	*ref_reloc_sym;
56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct map_groups	*kmaps;
57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map_groups {
60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct rb_root	 maps[MAP__NR_TYPES];
61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct list_head removed_maps[MAP__NR_TYPES];
62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct machine	 *machine;
63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* Native host kernel uses -1 as pid index in machine */
66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define	HOST_KERNEL_ID			(-1)
67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define	DEFAULT_GUEST_KERNEL_ID		(0)
68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct machine {
70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct rb_node	  rb_node;
71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	pid_t		  pid;
72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	char		  *root_dir;
73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct list_head  user_dsos;
74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct list_head  kernel_dsos;
75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct map_groups kmaps;
76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct map	  *vmlinux_maps[MAP__NR_TYPES];
77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline
80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map *machine__kernel_map(struct machine *self, enum map_type type)
81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return self->vmlinux_maps[type];
83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline struct kmap *map__kmap(struct map *self)
86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return (struct kmap *)(self + 1);
88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline u64 map__map_ip(struct map *map, u64 ip)
91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return ip - map->start + map->pgoff;
93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline u64 map__unmap_ip(struct map *map, u64 ip)
96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return ip + map->start - map->pgoff;
98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline u64 identity__map_ip(struct map *map __used, u64 ip)
101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return ip;
103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengu64 map__rip_2objdump(struct map *map, u64 rip);
108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengu64 map__objdump_2ip(struct map *map, u64 addr);
109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol;
111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengtypedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map__init(struct map *self, enum map_type type,
115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	       u64 start, u64 end, u64 pgoff, struct dso *dso);
116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		     u64 pgoff, u32 pid, char *filename,
118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		     enum map_type type);
119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map__delete(struct map *self);
120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map *map__clone(struct map *self);
121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint map__overlap(struct map *l, struct map *r);
122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsize_t map__fprintf(struct map *self, FILE *fp);
123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint map__load(struct map *self, symbol_filter_t filter);
125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *map__find_symbol(struct map *self,
126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				u64 addr, symbol_filter_t filter);
127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *map__find_symbol_by_name(struct map *self, const char *name,
128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					symbol_filter_t filter);
129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map__fixup_start(struct map *self);
130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map__fixup_end(struct map *self);
131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map__reloc_vmlinux(struct map *self);
133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsize_t __map_groups__fprintf_maps(struct map_groups *self,
135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				  enum map_type type, int verbose, FILE *fp);
136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid maps__insert(struct rb_root *maps, struct map *map);
137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid maps__remove(struct rb_root *self, struct map *map);
138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map *maps__find(struct rb_root *maps, u64 addr);
139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map_groups__init(struct map_groups *self);
140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map_groups__exit(struct map_groups *self);
141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint map_groups__clone(struct map_groups *self,
142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		      struct map_groups *parent, enum map_type type);
143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsize_t map_groups__fprintf(struct map_groups *self, int verbose, FILE *fp);
144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsize_t map_groups__fprintf_maps(struct map_groups *self, int verbose, FILE *fp);
145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengtypedef void (*machine__process_t)(struct machine *self, void *data);
147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid machines__process(struct rb_root *self, machine__process_t process, void *data);
149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct machine *machines__add(struct rb_root *self, pid_t pid,
150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			      const char *root_dir);
151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct machine *machines__find_host(struct rb_root *self);
152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct machine *machines__find(struct rb_root *self, pid_t pid);
153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct machine *machines__findnew(struct rb_root *self, pid_t pid);
154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengchar *machine__mmap_name(struct machine *self, char *bf, size_t size);
155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint machine__init(struct machine *self, const char *root_dir, pid_t pid);
156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid machine__exit(struct machine *self);
157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid machine__delete(struct machine *self);
158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/*
160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Default guest kernel is defined by parameter --guestkallsyms
161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * and --guestmodules
162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool machine__is_default_guest(struct machine *self)
164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return self ? self->pid == DEFAULT_GUEST_KERNEL_ID : false;
166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool machine__is_host(struct machine *self)
169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return self ? self->pid == HOST_KERNEL_ID : false;
171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void map_groups__insert(struct map_groups *self, struct map *map)
174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	maps__insert(&self->maps[map->type], map);
176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	map->groups = self;
177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void map_groups__remove(struct map_groups *self, struct map *map)
180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	maps__remove(&self->maps[map->type], map);
182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline struct map *map_groups__find(struct map_groups *self,
185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					   enum map_type type, u64 addr)
186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return maps__find(&self->maps[type], addr);
188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *map_groups__find_symbol(struct map_groups *self,
191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				       enum map_type type, u64 addr,
192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				       struct map **mapp,
193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				       symbol_filter_t filter);
194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *map_groups__find_symbol_by_name(struct map_groups *self,
196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					       enum map_type type,
197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					       const char *name,
198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					       struct map **mapp,
199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					       symbol_filter_t filter);
200e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
201e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline
202e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *machine__find_kernel_symbol(struct machine *self,
203e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					   enum map_type type, u64 addr,
204e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					   struct map **mapp,
205e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					   symbol_filter_t filter)
206e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
207e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return map_groups__find_symbol(&self->kmaps, type, addr, mapp, filter);
208e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
209e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
210e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline
211e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *machine__find_kernel_function(struct machine *self, u64 addr,
212e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					     struct map **mapp,
213e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					     symbol_filter_t filter)
214e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
215e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return machine__find_kernel_symbol(self, MAP__FUNCTION, addr, mapp, filter);
216e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
217e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
218e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline
219e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *map_groups__find_function_by_name(struct map_groups *self,
220e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng						 const char *name, struct map **mapp,
221e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng						 symbol_filter_t filter)
222e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
223e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return map_groups__find_symbol_by_name(self, MAP__FUNCTION, name, mapp, filter);
224e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
225e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
226e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline
227e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct symbol *machine__find_kernel_function_by_name(struct machine *self,
228e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng						     const char *name,
229e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng						     struct map **mapp,
230e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng						     symbol_filter_t filter)
231e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
232e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return map_groups__find_function_by_name(&self->kmaps, name, mapp,
233e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng						 filter);
234e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
235e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
236e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint map_groups__fixup_overlappings(struct map_groups *self, struct map *map,
237e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				   int verbose, FILE *fp);
238e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
239e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map *map_groups__find_by_name(struct map_groups *self,
240e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				     enum map_type type, const char *name);
241e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct map *machine__new_module(struct machine *self, u64 start, const char *filename);
242e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
243e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid map_groups__flush(struct map_groups *self);
244e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
245e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif /* __PERF_MAP_H */
246