root/tools/perf/util/libunwind-arch/libunwind-arch.h
/* 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 */