mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
Add a RISC-V implementation for unwinding. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexandre Ghiti <alex@ghiti.fr> Cc: Andrew Jones <andrew.jones@oss.qualcomm.com> Cc: Athira Rajeev <atrajeev@linux.ibm.com> Cc: Dapeng Mi <dapeng1.mi@linux.intel.com> Cc: Dmitrii Dolgov <9erthalion6@gmail.com> Cc: Florian Fainelli <florian.fainelli@broadcom.com> Cc: Howard Chu <howardchu95@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.g.garry@oracle.com> Cc: Leo Yan <leo.yan@linux.dev> Cc: Li Guan <guanli.oerv@isrc.iscas.ac.cn> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <pjw@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Shimin Guo <shimin.guo@skydio.com> Cc: Thomas Richter <tmricht@linux.ibm.com> Cc: Tomas Glozar <tglozar@redhat.com> Cc: Will Deacon <will@kernel.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
297 lines
11 KiB
C
297 lines
11 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LIBUNWIND_ARCH_H
|
|
#define __LIBUNWIND_ARCH_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
struct machine;
|
|
struct maps;
|
|
struct perf_sample;
|
|
struct thread;
|
|
|
|
struct unwind_info {
|
|
struct machine *machine;
|
|
struct thread *thread;
|
|
struct perf_sample *sample;
|
|
void *cursor;
|
|
uint64_t *ips;
|
|
int cur_ip;
|
|
int max_ips;
|
|
unsigned int unw_word_t_size;
|
|
uint16_t e_machine;
|
|
bool best_effort;
|
|
};
|
|
|
|
struct libarch_unwind__dyn_info {
|
|
uint64_t start_ip;
|
|
uint64_t end_ip;
|
|
uint64_t segbase;
|
|
uint64_t table_data;
|
|
uint64_t table_len;
|
|
};
|
|
struct libarch_unwind__proc_info;
|
|
|
|
int __get_perf_regnum_for_unw_regnum_arm(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_arm64(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_loongarch(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_mips(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_ppc32(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_ppc64(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_riscv(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_s390(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_i386(int unw_regnum);
|
|
int __get_perf_regnum_for_unw_regnum_x86_64(int unw_regnum);
|
|
int get_perf_regnum_for_unw_regnum(unsigned int e_machine, int unw_regnum);
|
|
|
|
void __libunwind_arch__flush_access_arm(struct maps *maps);
|
|
void __libunwind_arch__flush_access_arm64(struct maps *maps);
|
|
void __libunwind_arch__flush_access_loongarch(struct maps *maps);
|
|
void __libunwind_arch__flush_access_mips(struct maps *maps);
|
|
void __libunwind_arch__flush_access_ppc32(struct maps *maps);
|
|
void __libunwind_arch__flush_access_ppc64(struct maps *maps);
|
|
void __libunwind_arch__flush_access_riscv(struct maps *maps);
|
|
void __libunwind_arch__flush_access_s390(struct maps *maps);
|
|
void __libunwind_arch__flush_access_i386(struct maps *maps);
|
|
void __libunwind_arch__flush_access_x86_64(struct maps *maps);
|
|
void libunwind_arch__flush_access(struct maps *maps);
|
|
|
|
void __libunwind_arch__finish_access_arm(struct maps *maps);
|
|
void __libunwind_arch__finish_access_arm64(struct maps *maps);
|
|
void __libunwind_arch__finish_access_loongarch(struct maps *maps);
|
|
void __libunwind_arch__finish_access_mips(struct maps *maps);
|
|
void __libunwind_arch__finish_access_ppc32(struct maps *maps);
|
|
void __libunwind_arch__finish_access_ppc64(struct maps *maps);
|
|
void __libunwind_arch__finish_access_riscv(struct maps *maps);
|
|
void __libunwind_arch__finish_access_s390(struct maps *maps);
|
|
void __libunwind_arch__finish_access_i386(struct maps *maps);
|
|
void __libunwind_arch__finish_access_x86_64(struct maps *maps);
|
|
void libunwind_arch__finish_access(struct maps *maps);
|
|
|
|
void *__libunwind_arch__create_addr_space_arm(void);
|
|
void *__libunwind_arch__create_addr_space_arm64(void);
|
|
void *__libunwind_arch__create_addr_space_loongarch(void);
|
|
void *__libunwind_arch__create_addr_space_mips(void);
|
|
void *__libunwind_arch__create_addr_space_ppc32(void);
|
|
void *__libunwind_arch__create_addr_space_ppc64(void);
|
|
void *__libunwind_arch__create_addr_space_riscv(void);
|
|
void *__libunwind_arch__create_addr_space_s390(void);
|
|
void *__libunwind_arch__create_addr_space_i386(void);
|
|
void *__libunwind_arch__create_addr_space_x86_64(void);
|
|
void *libunwind_arch__create_addr_space(unsigned int e_machine);
|
|
|
|
int __libunwind__find_proc_info(void *as, uint64_t ip, void *pi, int need_unwind_info, void *arg);
|
|
int __libunwind__access_mem(void *as, uint64_t addr, void *valp_word, int __write, void *arg);
|
|
int __libunwind__access_reg(void *as, int regnum, void *valp_word, int __write, void *arg);
|
|
|
|
int __libunwind_arch__dwarf_search_unwind_table_arm(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_arm64(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_loongarch(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_mips(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_ppc32(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_ppc64(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_riscv(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_s390(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_i386(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int __libunwind_arch__dwarf_search_unwind_table_x86_64(void *as, uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
int libunwind_arch__dwarf_search_unwind_table(unsigned int e_machine,
|
|
void *as,
|
|
uint64_t ip,
|
|
struct libarch_unwind__dyn_info *di,
|
|
void *pi,
|
|
int need_unwind_info,
|
|
void *arg);
|
|
|
|
int __libunwind_arch__dwarf_find_debug_frame_arm(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_arm64(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_loongarch(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_mips(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_ppc32(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_ppc64(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_riscv(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_s390(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_i386(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int __libunwind_arch__dwarf_find_debug_frame_x86_64(int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
int libunwind_arch__dwarf_find_debug_frame(unsigned int e_machine,
|
|
int found,
|
|
struct libarch_unwind__dyn_info *di_debug,
|
|
uint64_t ip,
|
|
uint64_t segbase,
|
|
const char *obj_name,
|
|
uint64_t start,
|
|
uint64_t end);
|
|
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_arm(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_arm64(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_loongarch(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_mips(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_ppc32(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_ppc64(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_riscv(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_s390(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_i386(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *__libunwind_arch_unwind_info__new_x86_64(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint64_t first_ip);
|
|
struct unwind_info *libunwind_arch_unwind_info__new(struct thread *thread,
|
|
struct perf_sample *sample,
|
|
int max_stack,
|
|
bool best_effort,
|
|
uint16_t e_machine,
|
|
uint64_t first_ip);
|
|
|
|
void libunwind_arch_unwind_info__delete(struct unwind_info *ui);
|
|
|
|
int __libunwind_arch__unwind_step_arm(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_arm64(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_loongarch(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_mips(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_ppc32(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_ppc64(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_riscv(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_s390(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_i386(struct unwind_info *ui);
|
|
int __libunwind_arch__unwind_step_x86_64(struct unwind_info *ui);
|
|
int libunwind_arch__unwind_step(struct unwind_info *ui);
|
|
|
|
#endif /* __LIBUNWIND_ARCH_H */
|