Commit | Line | Data |
---|---|---|
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 */ | |
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 |