linux/tools/perf/util/libunwind-arch/libunwind-arch.h
Ian Rogers 834c557167 perf unwind-libunwind: Add RISC-V libunwind support
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>
2026-05-15 16:19:50 -03:00

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 */