xref: /linux/tools/lib/bpf/bpf_tracing.h (revision ee88f4ebe57523889fc437bc42f95d9ab89bdd9f)
1 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2 #ifndef __BPF_TRACING_H__
3 #define __BPF_TRACING_H__
4 
5 /* Scan the ARCH passed in from ARCH env variable (see Makefile) */
6 #if defined(__TARGET_ARCH_x86)
7 	#define bpf_target_x86
8 	#define bpf_target_defined
9 #elif defined(__TARGET_ARCH_s390)
10 	#define bpf_target_s390
11 	#define bpf_target_defined
12 #elif defined(__TARGET_ARCH_arm)
13 	#define bpf_target_arm
14 	#define bpf_target_defined
15 #elif defined(__TARGET_ARCH_arm64)
16 	#define bpf_target_arm64
17 	#define bpf_target_defined
18 #elif defined(__TARGET_ARCH_mips)
19 	#define bpf_target_mips
20 	#define bpf_target_defined
21 #elif defined(__TARGET_ARCH_powerpc)
22 	#define bpf_target_powerpc
23 	#define bpf_target_defined
24 #elif defined(__TARGET_ARCH_sparc)
25 	#define bpf_target_sparc
26 	#define bpf_target_defined
27 #else
28 	#undef bpf_target_defined
29 #endif
30 
31 /* Fall back to what the compiler says */
32 #ifndef bpf_target_defined
33 #if defined(__x86_64__)
34 	#define bpf_target_x86
35 #elif defined(__s390__)
36 	#define bpf_target_s390
37 #elif defined(__arm__)
38 	#define bpf_target_arm
39 #elif defined(__aarch64__)
40 	#define bpf_target_arm64
41 #elif defined(__mips__)
42 	#define bpf_target_mips
43 #elif defined(__powerpc__)
44 	#define bpf_target_powerpc
45 #elif defined(__sparc__)
46 	#define bpf_target_sparc
47 #endif
48 #endif
49 
50 #if defined(bpf_target_x86)
51 
52 #ifdef __KERNEL__
53 #define PT_REGS_PARM1(x) ((x)->di)
54 #define PT_REGS_PARM2(x) ((x)->si)
55 #define PT_REGS_PARM3(x) ((x)->dx)
56 #define PT_REGS_PARM4(x) ((x)->cx)
57 #define PT_REGS_PARM5(x) ((x)->r8)
58 #define PT_REGS_RET(x) ((x)->sp)
59 #define PT_REGS_FP(x) ((x)->bp)
60 #define PT_REGS_RC(x) ((x)->ax)
61 #define PT_REGS_SP(x) ((x)->sp)
62 #define PT_REGS_IP(x) ((x)->ip)
63 #else
64 #ifdef __i386__
65 /* i386 kernel is built with -mregparm=3 */
66 #define PT_REGS_PARM1(x) ((x)->eax)
67 #define PT_REGS_PARM2(x) ((x)->edx)
68 #define PT_REGS_PARM3(x) ((x)->ecx)
69 #define PT_REGS_PARM4(x) 0
70 #define PT_REGS_PARM5(x) 0
71 #define PT_REGS_RET(x) ((x)->esp)
72 #define PT_REGS_FP(x) ((x)->ebp)
73 #define PT_REGS_RC(x) ((x)->eax)
74 #define PT_REGS_SP(x) ((x)->esp)
75 #define PT_REGS_IP(x) ((x)->eip)
76 #else
77 #define PT_REGS_PARM1(x) ((x)->rdi)
78 #define PT_REGS_PARM2(x) ((x)->rsi)
79 #define PT_REGS_PARM3(x) ((x)->rdx)
80 #define PT_REGS_PARM4(x) ((x)->rcx)
81 #define PT_REGS_PARM5(x) ((x)->r8)
82 #define PT_REGS_RET(x) ((x)->rsp)
83 #define PT_REGS_FP(x) ((x)->rbp)
84 #define PT_REGS_RC(x) ((x)->rax)
85 #define PT_REGS_SP(x) ((x)->rsp)
86 #define PT_REGS_IP(x) ((x)->rip)
87 #endif
88 #endif
89 
90 #elif defined(bpf_target_s390)
91 
92 /* s390 provides user_pt_regs instead of struct pt_regs to userspace */
93 struct pt_regs;
94 #define PT_REGS_S390 const volatile user_pt_regs
95 #define PT_REGS_PARM1(x) (((PT_REGS_S390 *)(x))->gprs[2])
96 #define PT_REGS_PARM2(x) (((PT_REGS_S390 *)(x))->gprs[3])
97 #define PT_REGS_PARM3(x) (((PT_REGS_S390 *)(x))->gprs[4])
98 #define PT_REGS_PARM4(x) (((PT_REGS_S390 *)(x))->gprs[5])
99 #define PT_REGS_PARM5(x) (((PT_REGS_S390 *)(x))->gprs[6])
100 #define PT_REGS_RET(x) (((PT_REGS_S390 *)(x))->gprs[14])
101 /* Works only with CONFIG_FRAME_POINTER */
102 #define PT_REGS_FP(x) (((PT_REGS_S390 *)(x))->gprs[11])
103 #define PT_REGS_RC(x) (((PT_REGS_S390 *)(x))->gprs[2])
104 #define PT_REGS_SP(x) (((PT_REGS_S390 *)(x))->gprs[15])
105 #define PT_REGS_IP(x) (((PT_REGS_S390 *)(x))->psw.addr)
106 
107 #elif defined(bpf_target_arm)
108 
109 #define PT_REGS_PARM1(x) ((x)->uregs[0])
110 #define PT_REGS_PARM2(x) ((x)->uregs[1])
111 #define PT_REGS_PARM3(x) ((x)->uregs[2])
112 #define PT_REGS_PARM4(x) ((x)->uregs[3])
113 #define PT_REGS_PARM5(x) ((x)->uregs[4])
114 #define PT_REGS_RET(x) ((x)->uregs[14])
115 #define PT_REGS_FP(x) ((x)->uregs[11]) /* Works only with CONFIG_FRAME_POINTER */
116 #define PT_REGS_RC(x) ((x)->uregs[0])
117 #define PT_REGS_SP(x) ((x)->uregs[13])
118 #define PT_REGS_IP(x) ((x)->uregs[12])
119 
120 #elif defined(bpf_target_arm64)
121 
122 /* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */
123 struct pt_regs;
124 #define PT_REGS_ARM64 const volatile struct user_pt_regs
125 #define PT_REGS_PARM1(x) (((PT_REGS_ARM64 *)(x))->regs[0])
126 #define PT_REGS_PARM2(x) (((PT_REGS_ARM64 *)(x))->regs[1])
127 #define PT_REGS_PARM3(x) (((PT_REGS_ARM64 *)(x))->regs[2])
128 #define PT_REGS_PARM4(x) (((PT_REGS_ARM64 *)(x))->regs[3])
129 #define PT_REGS_PARM5(x) (((PT_REGS_ARM64 *)(x))->regs[4])
130 #define PT_REGS_RET(x) (((PT_REGS_ARM64 *)(x))->regs[30])
131 /* Works only with CONFIG_FRAME_POINTER */
132 #define PT_REGS_FP(x) (((PT_REGS_ARM64 *)(x))->regs[29])
133 #define PT_REGS_RC(x) (((PT_REGS_ARM64 *)(x))->regs[0])
134 #define PT_REGS_SP(x) (((PT_REGS_ARM64 *)(x))->sp)
135 #define PT_REGS_IP(x) (((PT_REGS_ARM64 *)(x))->pc)
136 
137 #elif defined(bpf_target_mips)
138 
139 #define PT_REGS_PARM1(x) ((x)->regs[4])
140 #define PT_REGS_PARM2(x) ((x)->regs[5])
141 #define PT_REGS_PARM3(x) ((x)->regs[6])
142 #define PT_REGS_PARM4(x) ((x)->regs[7])
143 #define PT_REGS_PARM5(x) ((x)->regs[8])
144 #define PT_REGS_RET(x) ((x)->regs[31])
145 #define PT_REGS_FP(x) ((x)->regs[30]) /* Works only with CONFIG_FRAME_POINTER */
146 #define PT_REGS_RC(x) ((x)->regs[1])
147 #define PT_REGS_SP(x) ((x)->regs[29])
148 #define PT_REGS_IP(x) ((x)->cp0_epc)
149 
150 #elif defined(bpf_target_powerpc)
151 
152 #define PT_REGS_PARM1(x) ((x)->gpr[3])
153 #define PT_REGS_PARM2(x) ((x)->gpr[4])
154 #define PT_REGS_PARM3(x) ((x)->gpr[5])
155 #define PT_REGS_PARM4(x) ((x)->gpr[6])
156 #define PT_REGS_PARM5(x) ((x)->gpr[7])
157 #define PT_REGS_RC(x) ((x)->gpr[3])
158 #define PT_REGS_SP(x) ((x)->sp)
159 #define PT_REGS_IP(x) ((x)->nip)
160 
161 #elif defined(bpf_target_sparc)
162 
163 #define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0])
164 #define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1])
165 #define PT_REGS_PARM3(x) ((x)->u_regs[UREG_I2])
166 #define PT_REGS_PARM4(x) ((x)->u_regs[UREG_I3])
167 #define PT_REGS_PARM5(x) ((x)->u_regs[UREG_I4])
168 #define PT_REGS_RET(x) ((x)->u_regs[UREG_I7])
169 #define PT_REGS_RC(x) ((x)->u_regs[UREG_I0])
170 #define PT_REGS_SP(x) ((x)->u_regs[UREG_FP])
171 
172 /* Should this also be a bpf_target check for the sparc case? */
173 #if defined(__arch64__)
174 #define PT_REGS_IP(x) ((x)->tpc)
175 #else
176 #define PT_REGS_IP(x) ((x)->pc)
177 #endif
178 
179 #endif
180 
181 #if defined(bpf_target_powerpc)
182 #define BPF_KPROBE_READ_RET_IP(ip, ctx)		({ (ip) = (ctx)->link; })
183 #define BPF_KRETPROBE_READ_RET_IP		BPF_KPROBE_READ_RET_IP
184 #elif defined(bpf_target_sparc)
185 #define BPF_KPROBE_READ_RET_IP(ip, ctx)		({ (ip) = PT_REGS_RET(ctx); })
186 #define BPF_KRETPROBE_READ_RET_IP		BPF_KPROBE_READ_RET_IP
187 #else
188 #define BPF_KPROBE_READ_RET_IP(ip, ctx)					    \
189 	({ bpf_probe_read(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); })
190 #define BPF_KRETPROBE_READ_RET_IP(ip, ctx)				    \
191 	({ bpf_probe_read(&(ip), sizeof(ip),				    \
192 			  (void *)(PT_REGS_FP(ctx) + sizeof(ip))); })
193 #endif
194 
195 #endif
196