selftests/bpf: Split off tracing-only helpers into bpf_tracing.h
[linux-block.git] / tools / testing / selftests / bpf / bpf_tracing.h
CommitLineData
3ac4dbe3
AN
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 */
93struct 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 */
123struct 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