xref: /linux/tools/perf/util/include/dwarf-regs.h (revision bf4afc53b77aeaa48b5409da5c8da6bb4eff7f43)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _PERF_DWARF_REGS_H_
3 #define _PERF_DWARF_REGS_H_
4 #include "annotate.h"
5 #include <elf.h>
6 
7 #ifndef EM_AARCH64
8 #define EM_AARCH64	183  /* ARM 64 bit */
9 #endif
10 
11 #ifndef EM_CSKY
12 #define EM_CSKY		252  /* C-SKY */
13 #endif
14 #ifndef EF_CSKY_ABIV1
15 #define EF_CSKY_ABIV1	0X10000000
16 #endif
17 #ifndef EF_CSKY_ABIV2
18 #define EF_CSKY_ABIV2	0X20000000
19 #endif
20 
21 #ifndef EM_LOONGARCH
22 #define EM_LOONGARCH	258 /* LoongArch */
23 #endif
24 
25 /* EM_HOST gives the ELF machine for host, EF_HOST gives additional flags. */
26 #if defined(__x86_64__)
27   #define EM_HOST EM_X86_64
28 #elif defined(__i386__)
29   #define EM_HOST EM_386
30 #elif defined(__aarch64__)
31   #define EM_HOST EM_AARCH64
32 #elif defined(__arm__)
33   #define EM_HOST EM_ARM
34 #elif defined(__alpha__)
35   #define EM_HOST EM_ALPHA
36 #elif defined(__arc__)
37   #define EM_HOST EM_ARC
38 #elif defined(__AVR__)
39   #define EM_HOST EM_AVR
40 #elif defined(__AVR32__)
41   #define EM_HOST EM_AVR32
42 #elif defined(__bfin__)
43   #define EM_HOST EM_BLACKFIN
44 #elif defined(__csky__)
45   #define EM_HOST EM_CSKY
46   #if defined(__CSKYABIV2__)
47     #define EF_HOST EF_CSKY_ABIV2
48   #else
49     #define EF_HOST EF_CSKY_ABIV1
50   #endif
51 #elif defined(__cris__)
52   #define EM_HOST EM_CRIS
53 #elif defined(__hppa__) // HP PA-RISC
54   #define EM_HOST EM_PARISC
55 #elif defined(__loongarch__)
56   #define EM_HOST EM_LOONGARCH
57 #elif defined(__mips__)
58   #define EM_HOST EM_MIPS
59 #elif defined(__m32r__)
60   #define EM_HOST EM_M32R
61 #elif defined(__microblaze__)
62   #define EM_HOST EM_MICROBLAZE
63 #elif defined(__MSP430__)
64   #define EM_HOST EM_MSP430
65 #elif defined(__powerpc64__)
66   #define EM_HOST EM_PPC64
67 #elif defined(__powerpc__)
68   #define EM_HOST EM_PPC
69 #elif defined(__riscv)
70   #define EM_HOST EM_RISCV
71 #elif defined(__s390x__)
72   #define EM_HOST EM_S390
73 #elif defined(__sh__)
74   #define EM_HOST EM_SH
75 #elif defined(__sparc64__) || defined(__sparc__)
76   #define EM_HOST EM_SPARC
77 #elif defined(__xtensa__)
78   #define EM_HOST EM_XTENSA
79 #else
80   /* Unknown host ELF machine type. */
81   #define EM_HOST EM_NONE
82 #endif
83 
84 #if !defined(EF_HOST)
85   #define EF_HOST 0
86 #endif
87 
88 #define DWARF_REG_PC  0xd3af9c /* random number */
89 #define DWARF_REG_FB  0xd3affb /* random number */
90 
91 #ifdef HAVE_LIBDW_SUPPORT
92 /**
93  * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum.
94  * @n: DWARF register number.
95  * @machine: ELF machine signature (EM_*).
96  * @flags: ELF flags for things like ABI differences.
97  */
98 const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags);
99 
100 const char *__get_csky_regstr(unsigned int n, unsigned int flags);
101 int __get_csky_regnum(const char *name, unsigned int flags);
102 
103 int __get_dwarf_regnum_i386(const char *name);
104 int __get_dwarf_regnum_x86_64(const char *name);
105 int __get_dwarf_regnum_for_perf_regnum_i386(int perf_regnum);
106 int __get_dwarf_regnum_for_perf_regnum_x86_64(int perf_regnum);
107 
108 int __get_dwarf_regnum_for_perf_regnum_arm(int perf_regnum);
109 int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum);
110 
111 int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int flags);
112 int __get_dwarf_regnum_for_perf_regnum_loongarch(int perf_regnum);
113 int __get_dwarf_regnum_for_perf_regnum_powerpc(int perf_regnum);
114 int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum);
115 int __get_dwarf_regnum_for_perf_regnum_s390(int perf_regnum);
116 int __get_dwarf_regnum_for_perf_regnum_mips(int perf_regnum);
117 
118 /*
119  * get_dwarf_regnum - Returns DWARF regnum from register name
120  * name: architecture register name
121  * machine: ELF machine signature (EM_*)
122  */
123 int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags);
124 
125 /*
126  * get_dwarf_regnum - Returns DWARF regnum from perf register number.
127  */
128 int get_dwarf_regnum_for_perf_regnum(int perf_regnum, unsigned int machine, unsigned int flags,
129 				     bool only_libdw_supported);
130 
131 void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc);
132 
133 #else /* HAVE_LIBDW_SUPPORT */
134 
135 static inline int get_dwarf_regnum(const char *name __maybe_unused,
136 				   unsigned int machine __maybe_unused,
137 				   unsigned int flags __maybe_unused)
138 {
139 	return -1;
140 }
141 
142 static inline void get_powerpc_regs(u32 raw_insn __maybe_unused, int is_source __maybe_unused,
143 		struct annotated_op_loc *op_loc __maybe_unused)
144 {
145 	return;
146 }
147 #endif
148 
149 #endif
150