xref: /linux/tools/perf/util/libunwind-arch/libunwind-arch.h (revision 3d5e48944e824bddc20d7b874e784f7b279636fe)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __LIBUNWIND_ARCH_H
3 #define __LIBUNWIND_ARCH_H
4 
5 #include <stdbool.h>
6 #include <stdint.h>
7 #include <stdlib.h>
8 
9 struct machine;
10 struct maps;
11 struct perf_sample;
12 struct thread;
13 
14 struct unwind_info {
15 	struct machine		*machine;
16 	struct thread		*thread;
17 	struct perf_sample	*sample;
18 	void			*cursor;
19 	uint64_t		*ips;
20 	int			 cur_ip;
21 	int			 max_ips;
22 	unsigned int		 unw_word_t_size;
23 	uint16_t		 e_machine;
24 	bool			 best_effort;
25 };
26 
27 struct libarch_unwind__dyn_info {
28 	uint64_t start_ip;
29 	uint64_t end_ip;
30 	uint64_t segbase;
31 	uint64_t table_data;
32 	uint64_t table_len;
33 };
34 struct libarch_unwind__proc_info;
35 
36 int __get_perf_regnum_for_unw_regnum_arm(int unw_regnum);
37 int __get_perf_regnum_for_unw_regnum_arm64(int unw_regnum);
38 int __get_perf_regnum_for_unw_regnum_loongarch(int unw_regnum);
39 int __get_perf_regnum_for_unw_regnum_mips(int unw_regnum);
40 int __get_perf_regnum_for_unw_regnum_ppc32(int unw_regnum);
41 int __get_perf_regnum_for_unw_regnum_ppc64(int unw_regnum);
42 int __get_perf_regnum_for_unw_regnum_riscv(int unw_regnum);
43 int __get_perf_regnum_for_unw_regnum_s390(int unw_regnum);
44 int __get_perf_regnum_for_unw_regnum_i386(int unw_regnum);
45 int __get_perf_regnum_for_unw_regnum_x86_64(int unw_regnum);
46 int get_perf_regnum_for_unw_regnum(unsigned int e_machine, int unw_regnum);
47 
48 void __libunwind_arch__flush_access_arm(struct maps *maps);
49 void __libunwind_arch__flush_access_arm64(struct maps *maps);
50 void __libunwind_arch__flush_access_loongarch(struct maps *maps);
51 void __libunwind_arch__flush_access_mips(struct maps *maps);
52 void __libunwind_arch__flush_access_ppc32(struct maps *maps);
53 void __libunwind_arch__flush_access_ppc64(struct maps *maps);
54 void __libunwind_arch__flush_access_riscv(struct maps *maps);
55 void __libunwind_arch__flush_access_s390(struct maps *maps);
56 void __libunwind_arch__flush_access_i386(struct maps *maps);
57 void __libunwind_arch__flush_access_x86_64(struct maps *maps);
58 void libunwind_arch__flush_access(struct maps *maps);
59 
60 void __libunwind_arch__finish_access_arm(struct maps *maps);
61 void __libunwind_arch__finish_access_arm64(struct maps *maps);
62 void __libunwind_arch__finish_access_loongarch(struct maps *maps);
63 void __libunwind_arch__finish_access_mips(struct maps *maps);
64 void __libunwind_arch__finish_access_ppc32(struct maps *maps);
65 void __libunwind_arch__finish_access_ppc64(struct maps *maps);
66 void __libunwind_arch__finish_access_riscv(struct maps *maps);
67 void __libunwind_arch__finish_access_s390(struct maps *maps);
68 void __libunwind_arch__finish_access_i386(struct maps *maps);
69 void __libunwind_arch__finish_access_x86_64(struct maps *maps);
70 void libunwind_arch__finish_access(struct maps *maps);
71 
72 void *__libunwind_arch__create_addr_space_arm(void);
73 void *__libunwind_arch__create_addr_space_arm64(void);
74 void *__libunwind_arch__create_addr_space_loongarch(void);
75 void *__libunwind_arch__create_addr_space_mips(void);
76 void *__libunwind_arch__create_addr_space_ppc32(void);
77 void *__libunwind_arch__create_addr_space_ppc64(void);
78 void *__libunwind_arch__create_addr_space_riscv(void);
79 void *__libunwind_arch__create_addr_space_s390(void);
80 void *__libunwind_arch__create_addr_space_i386(void);
81 void *__libunwind_arch__create_addr_space_x86_64(void);
82 void *libunwind_arch__create_addr_space(unsigned int e_machine);
83 
84 int __libunwind__find_proc_info(void *as, uint64_t ip, void *pi, int need_unwind_info, void *arg);
85 int __libunwind__access_mem(void *as, uint64_t addr, void *valp_word, int __write, void *arg);
86 int __libunwind__access_reg(void *as, int regnum, void *valp_word, int __write, void *arg);
87 
88 int __libunwind_arch__dwarf_search_unwind_table_arm(void *as, uint64_t ip,
89 						    struct libarch_unwind__dyn_info *di,
90 						    void *pi,
91 						    int need_unwind_info,
92 						    void *arg);
93 int __libunwind_arch__dwarf_search_unwind_table_arm64(void *as, uint64_t ip,
94 						      struct libarch_unwind__dyn_info *di,
95 						      void *pi,
96 						      int need_unwind_info,
97 						      void *arg);
98 int __libunwind_arch__dwarf_search_unwind_table_loongarch(void *as, uint64_t ip,
99 							  struct libarch_unwind__dyn_info *di,
100 							  void *pi,
101 							  int need_unwind_info,
102 							  void *arg);
103 int __libunwind_arch__dwarf_search_unwind_table_mips(void *as, uint64_t ip,
104 						     struct libarch_unwind__dyn_info *di,
105 						     void *pi,
106 						     int need_unwind_info,
107 						     void *arg);
108 int __libunwind_arch__dwarf_search_unwind_table_ppc32(void *as, uint64_t ip,
109 						      struct libarch_unwind__dyn_info *di,
110 						      void *pi,
111 						      int need_unwind_info,
112 						      void *arg);
113 int __libunwind_arch__dwarf_search_unwind_table_ppc64(void *as, uint64_t ip,
114 						      struct libarch_unwind__dyn_info *di,
115 						      void *pi,
116 						      int need_unwind_info,
117 						      void *arg);
118 int __libunwind_arch__dwarf_search_unwind_table_riscv(void *as, uint64_t ip,
119 						     struct libarch_unwind__dyn_info *di,
120 						     void *pi,
121 						     int need_unwind_info,
122 						     void *arg);
123 int __libunwind_arch__dwarf_search_unwind_table_s390(void *as, uint64_t ip,
124 						     struct libarch_unwind__dyn_info *di,
125 						     void *pi,
126 						     int need_unwind_info,
127 						     void *arg);
128 int __libunwind_arch__dwarf_search_unwind_table_i386(void *as, uint64_t ip,
129 						     struct libarch_unwind__dyn_info *di,
130 						     void *pi,
131 						     int need_unwind_info,
132 						     void *arg);
133 int __libunwind_arch__dwarf_search_unwind_table_x86_64(void *as, uint64_t ip,
134 						       struct libarch_unwind__dyn_info *di,
135 						       void *pi,
136 						       int need_unwind_info,
137 						       void *arg);
138 int libunwind_arch__dwarf_search_unwind_table(unsigned int e_machine,
139 					      void *as,
140 					      uint64_t ip,
141 					      struct libarch_unwind__dyn_info *di,
142 					      void *pi,
143 					      int need_unwind_info,
144 					      void *arg);
145 
146 int __libunwind_arch__dwarf_find_debug_frame_arm(int found,
147 						 struct libarch_unwind__dyn_info *di_debug,
148 						 uint64_t ip,
149 						 uint64_t segbase,
150 						 const char *obj_name,
151 						 uint64_t start,
152 						 uint64_t end);
153 int __libunwind_arch__dwarf_find_debug_frame_arm64(int found,
154 						   struct libarch_unwind__dyn_info *di_debug,
155 						   uint64_t ip,
156 						   uint64_t segbase,
157 						   const char *obj_name,
158 						   uint64_t start,
159 						   uint64_t end);
160 int __libunwind_arch__dwarf_find_debug_frame_loongarch(int found,
161 						       struct libarch_unwind__dyn_info *di_debug,
162 						       uint64_t ip,
163 						       uint64_t segbase,
164 						       const char *obj_name,
165 						       uint64_t start,
166 						       uint64_t end);
167 int __libunwind_arch__dwarf_find_debug_frame_mips(int found,
168 						  struct libarch_unwind__dyn_info *di_debug,
169 						  uint64_t ip,
170 						  uint64_t segbase,
171 						  const char *obj_name,
172 						  uint64_t start,
173 						  uint64_t end);
174 int __libunwind_arch__dwarf_find_debug_frame_ppc32(int found,
175 						   struct libarch_unwind__dyn_info *di_debug,
176 						   uint64_t ip,
177 						   uint64_t segbase,
178 						   const char *obj_name,
179 						   uint64_t start,
180 						   uint64_t end);
181 int __libunwind_arch__dwarf_find_debug_frame_ppc64(int found,
182 						   struct libarch_unwind__dyn_info *di_debug,
183 						   uint64_t ip,
184 						   uint64_t segbase,
185 						   const char *obj_name,
186 						   uint64_t start,
187 						   uint64_t end);
188 int __libunwind_arch__dwarf_find_debug_frame_riscv(int found,
189 						  struct libarch_unwind__dyn_info *di_debug,
190 						  uint64_t ip,
191 						  uint64_t segbase,
192 						  const char *obj_name,
193 						  uint64_t start,
194 						  uint64_t end);
195 int __libunwind_arch__dwarf_find_debug_frame_s390(int found,
196 						  struct libarch_unwind__dyn_info *di_debug,
197 						  uint64_t ip,
198 						  uint64_t segbase,
199 						  const char *obj_name,
200 						  uint64_t start,
201 						  uint64_t end);
202 int __libunwind_arch__dwarf_find_debug_frame_i386(int found,
203 						  struct libarch_unwind__dyn_info *di_debug,
204 						  uint64_t ip,
205 						  uint64_t segbase,
206 						  const char *obj_name,
207 						  uint64_t start,
208 						  uint64_t end);
209 int __libunwind_arch__dwarf_find_debug_frame_x86_64(int found,
210 						    struct libarch_unwind__dyn_info *di_debug,
211 						    uint64_t ip,
212 						    uint64_t segbase,
213 						    const char *obj_name,
214 						    uint64_t start,
215 						    uint64_t end);
216 int libunwind_arch__dwarf_find_debug_frame(unsigned int e_machine,
217 					   int found,
218 					   struct libarch_unwind__dyn_info *di_debug,
219 					   uint64_t ip,
220 					   uint64_t segbase,
221 					   const char *obj_name,
222 					   uint64_t start,
223 					   uint64_t end);
224 
225 struct unwind_info *__libunwind_arch_unwind_info__new_arm(struct thread *thread,
226 							struct perf_sample *sample,
227 							   int max_stack,
228 							   bool best_effort,
229 							uint64_t first_ip);
230 struct unwind_info *__libunwind_arch_unwind_info__new_arm64(struct thread *thread,
231 							struct perf_sample *sample,
232 							   int max_stack,
233 							   bool best_effort,
234 							uint64_t first_ip);
235 struct unwind_info *__libunwind_arch_unwind_info__new_loongarch(struct thread *thread,
236 							struct perf_sample *sample,
237 							   int max_stack,
238 							   bool best_effort,
239 							uint64_t first_ip);
240 struct unwind_info *__libunwind_arch_unwind_info__new_mips(struct thread *thread,
241 							struct perf_sample *sample,
242 							   int max_stack,
243 							   bool best_effort,
244 							uint64_t first_ip);
245 struct unwind_info *__libunwind_arch_unwind_info__new_ppc32(struct thread *thread,
246 							struct perf_sample *sample,
247 							   int max_stack,
248 							   bool best_effort,
249 							uint64_t first_ip);
250 struct unwind_info *__libunwind_arch_unwind_info__new_ppc64(struct thread *thread,
251 							struct perf_sample *sample,
252 							   int max_stack,
253 							   bool best_effort,
254 							uint64_t first_ip);
255 struct unwind_info *__libunwind_arch_unwind_info__new_riscv(struct thread *thread,
256 							struct perf_sample *sample,
257 							   int max_stack,
258 							   bool best_effort,
259 							uint64_t first_ip);
260 struct unwind_info *__libunwind_arch_unwind_info__new_s390(struct thread *thread,
261 							struct perf_sample *sample,
262 							   int max_stack,
263 							   bool best_effort,
264 							uint64_t first_ip);
265 struct unwind_info *__libunwind_arch_unwind_info__new_i386(struct thread *thread,
266 							struct perf_sample *sample,
267 							   int max_stack,
268 							   bool best_effort,
269 							uint64_t first_ip);
270 struct unwind_info *__libunwind_arch_unwind_info__new_x86_64(struct thread *thread,
271 							struct perf_sample *sample,
272 							   int max_stack,
273 							   bool best_effort,
274 							uint64_t first_ip);
275 struct unwind_info *libunwind_arch_unwind_info__new(struct thread *thread,
276 						struct perf_sample *sample,
277 						int max_stack,
278 						bool best_effort,
279 						uint16_t e_machine,
280 						uint64_t first_ip);
281 
282 void libunwind_arch_unwind_info__delete(struct unwind_info *ui);
283 
284 int __libunwind_arch__unwind_step_arm(struct unwind_info *ui);
285 int __libunwind_arch__unwind_step_arm64(struct unwind_info *ui);
286 int __libunwind_arch__unwind_step_loongarch(struct unwind_info *ui);
287 int __libunwind_arch__unwind_step_mips(struct unwind_info *ui);
288 int __libunwind_arch__unwind_step_ppc32(struct unwind_info *ui);
289 int __libunwind_arch__unwind_step_ppc64(struct unwind_info *ui);
290 int __libunwind_arch__unwind_step_riscv(struct unwind_info *ui);
291 int __libunwind_arch__unwind_step_s390(struct unwind_info *ui);
292 int __libunwind_arch__unwind_step_i386(struct unwind_info *ui);
293 int __libunwind_arch__unwind_step_x86_64(struct unwind_info *ui);
294 int libunwind_arch__unwind_step(struct unwind_info *ui);
295 
296 #endif /* __LIBUNWIND_ARCH_H */
297