mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-09 21:42:09 +02:00
406b51a9a5
Despite an unused function declaration, there was no unwind-libdw for MIPS but there is a perf_regs.h and a libdw implementation. Fill in the pieces so hopefully MIPS unwinding with libdw works. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Aditya Bodkhe <aditya.b1@linux.ibm.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexandre Ghiti <alex@ghiti.fr> Cc: Andi Kleen <ak@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.ibm.com> Cc: Chun-Tse Shao <ctshao@google.com> Cc: Dmitriy Vyukov <dvyukov@google.com> Cc: Dr. David Alan Gilbert <linux@treblig.org> Cc: Guo Ren <guoren@kernel.org> Cc: Haibo Xu <haibo1.xu@intel.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: Krzysztof Łopatowski <krzysztof.m.lopatowski@gmail.com> Cc: Leo Yan <leo.yan@linux.dev> Cc: Mark Wielaard <mark@klomp.org> 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: Sergei Trofimovich <slyich@gmail.com> Cc: Shimin Guo <shimin.guo@skydio.com> Cc: Stephen Brennan <stephen.s.brennan@oracle.com> Cc: Thomas Falcon <thomas.falcon@intel.com> Cc: Will Deacon <will@kernel.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
150 lines
4.2 KiB
C
150 lines
4.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _PERF_DWARF_REGS_H_
|
|
#define _PERF_DWARF_REGS_H_
|
|
#include "annotate.h"
|
|
#include <elf.h>
|
|
|
|
#ifndef EM_AARCH64
|
|
#define EM_AARCH64 183 /* ARM 64 bit */
|
|
#endif
|
|
|
|
#ifndef EM_CSKY
|
|
#define EM_CSKY 252 /* C-SKY */
|
|
#endif
|
|
#ifndef EF_CSKY_ABIV1
|
|
#define EF_CSKY_ABIV1 0X10000000
|
|
#endif
|
|
#ifndef EF_CSKY_ABIV2
|
|
#define EF_CSKY_ABIV2 0X20000000
|
|
#endif
|
|
|
|
#ifndef EM_LOONGARCH
|
|
#define EM_LOONGARCH 258 /* LoongArch */
|
|
#endif
|
|
|
|
/* EM_HOST gives the ELF machine for host, EF_HOST gives additional flags. */
|
|
#if defined(__x86_64__)
|
|
#define EM_HOST EM_X86_64
|
|
#elif defined(__i386__)
|
|
#define EM_HOST EM_386
|
|
#elif defined(__aarch64__)
|
|
#define EM_HOST EM_AARCH64
|
|
#elif defined(__arm__)
|
|
#define EM_HOST EM_ARM
|
|
#elif defined(__alpha__)
|
|
#define EM_HOST EM_ALPHA
|
|
#elif defined(__arc__)
|
|
#define EM_HOST EM_ARC
|
|
#elif defined(__AVR__)
|
|
#define EM_HOST EM_AVR
|
|
#elif defined(__AVR32__)
|
|
#define EM_HOST EM_AVR32
|
|
#elif defined(__bfin__)
|
|
#define EM_HOST EM_BLACKFIN
|
|
#elif defined(__csky__)
|
|
#define EM_HOST EM_CSKY
|
|
#if defined(__CSKYABIV2__)
|
|
#define EF_HOST EF_CSKY_ABIV2
|
|
#else
|
|
#define EF_HOST EF_CSKY_ABIV1
|
|
#endif
|
|
#elif defined(__cris__)
|
|
#define EM_HOST EM_CRIS
|
|
#elif defined(__hppa__) // HP PA-RISC
|
|
#define EM_HOST EM_PARISC
|
|
#elif defined(__loongarch__)
|
|
#define EM_HOST EM_LOONGARCH
|
|
#elif defined(__mips__)
|
|
#define EM_HOST EM_MIPS
|
|
#elif defined(__m32r__)
|
|
#define EM_HOST EM_M32R
|
|
#elif defined(__microblaze__)
|
|
#define EM_HOST EM_MICROBLAZE
|
|
#elif defined(__MSP430__)
|
|
#define EM_HOST EM_MSP430
|
|
#elif defined(__powerpc64__)
|
|
#define EM_HOST EM_PPC64
|
|
#elif defined(__powerpc__)
|
|
#define EM_HOST EM_PPC
|
|
#elif defined(__riscv)
|
|
#define EM_HOST EM_RISCV
|
|
#elif defined(__s390x__)
|
|
#define EM_HOST EM_S390
|
|
#elif defined(__sh__)
|
|
#define EM_HOST EM_SH
|
|
#elif defined(__sparc64__) || defined(__sparc__)
|
|
#define EM_HOST EM_SPARC
|
|
#elif defined(__xtensa__)
|
|
#define EM_HOST EM_XTENSA
|
|
#else
|
|
/* Unknown host ELF machine type. */
|
|
#define EM_HOST EM_NONE
|
|
#endif
|
|
|
|
#if !defined(EF_HOST)
|
|
#define EF_HOST 0
|
|
#endif
|
|
|
|
#define DWARF_REG_PC 0xd3af9c /* random number */
|
|
#define DWARF_REG_FB 0xd3affb /* random number */
|
|
|
|
#ifdef HAVE_LIBDW_SUPPORT
|
|
/**
|
|
* get_dwarf_regstr() - Returns ftrace register string from DWARF regnum.
|
|
* @n: DWARF register number.
|
|
* @machine: ELF machine signature (EM_*).
|
|
* @flags: ELF flags for things like ABI differences.
|
|
*/
|
|
const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags);
|
|
|
|
const char *__get_csky_regstr(unsigned int n, unsigned int flags);
|
|
int __get_csky_regnum(const char *name, unsigned int flags);
|
|
|
|
int __get_dwarf_regnum_i386(const char *name);
|
|
int __get_dwarf_regnum_x86_64(const char *name);
|
|
int __get_dwarf_regnum_for_perf_regnum_i386(int perf_regnum);
|
|
int __get_dwarf_regnum_for_perf_regnum_x86_64(int perf_regnum);
|
|
|
|
int __get_dwarf_regnum_for_perf_regnum_arm(int perf_regnum);
|
|
int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum);
|
|
|
|
int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int flags);
|
|
int __get_dwarf_regnum_for_perf_regnum_loongarch(int perf_regnum);
|
|
int __get_dwarf_regnum_for_perf_regnum_powerpc(int perf_regnum);
|
|
int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum);
|
|
int __get_dwarf_regnum_for_perf_regnum_s390(int perf_regnum);
|
|
int __get_dwarf_regnum_for_perf_regnum_mips(int perf_regnum);
|
|
|
|
/*
|
|
* get_dwarf_regnum - Returns DWARF regnum from register name
|
|
* name: architecture register name
|
|
* machine: ELF machine signature (EM_*)
|
|
*/
|
|
int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags);
|
|
|
|
/*
|
|
* get_dwarf_regnum - Returns DWARF regnum from perf register number.
|
|
*/
|
|
int get_dwarf_regnum_for_perf_regnum(int perf_regnum, unsigned int machine, unsigned int flags,
|
|
bool only_libdw_supported);
|
|
|
|
void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc);
|
|
|
|
#else /* HAVE_LIBDW_SUPPORT */
|
|
|
|
static inline int get_dwarf_regnum(const char *name __maybe_unused,
|
|
unsigned int machine __maybe_unused,
|
|
unsigned int flags __maybe_unused)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static inline void get_powerpc_regs(u32 raw_insn __maybe_unused, int is_source __maybe_unused,
|
|
struct annotated_op_loc *op_loc __maybe_unused)
|
|
{
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
#endif
|