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