Commit | Line | Data |
---|---|---|
5a2798ab JO |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
3 | #ifndef _LINUX_BTF_IDS_H | |
4 | #define _LINUX_BTF_IDS_H | |
5 | ||
cfd3bfe9 DB |
6 | #include <linux/types.h> /* for u32 */ |
7 | ||
eae2e83e JO |
8 | struct btf_id_set { |
9 | u32 cnt; | |
10 | u32 ids[]; | |
11 | }; | |
12 | ||
a05e9042 DX |
13 | /* This flag implies BTF_SET8 holds kfunc(s) */ |
14 | #define BTF_SET8_KFUNCS (1 << 0) | |
15 | ||
ab21d606 KKD |
16 | struct btf_id_set8 { |
17 | u32 cnt; | |
18 | u32 flags; | |
19 | struct { | |
20 | u32 id; | |
21 | u32 flags; | |
22 | } pairs[]; | |
23 | }; | |
24 | ||
079ef536 JO |
25 | #ifdef CONFIG_DEBUG_INFO_BTF |
26 | ||
5a2798ab | 27 | #include <linux/compiler.h> /* for __PASTE */ |
dee872e1 | 28 | #include <linux/compiler_attributes.h> /* for __maybe_unused */ |
79b47344 | 29 | #include <linux/stringify.h> |
5a2798ab JO |
30 | |
31 | /* | |
32 | * Following macros help to define lists of BTF IDs placed | |
33 | * in .BTF_ids section. They are initially filled with zeros | |
34 | * (during compilation) and resolved later during the | |
35 | * linking phase by resolve_btfids tool. | |
36 | * | |
37 | * Any change in list layout must be reflected in resolve_btfids | |
38 | * tool logic. | |
39 | */ | |
40 | ||
41 | #define BTF_IDS_SECTION ".BTF_ids" | |
42 | ||
ab21d606 | 43 | #define ____BTF_ID(symbol, word) \ |
5a2798ab JO |
44 | asm( \ |
45 | ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ | |
46 | ".local " #symbol " ; \n" \ | |
11bb2f7a | 47 | ".type " #symbol ", STT_OBJECT; \n" \ |
5a2798ab JO |
48 | ".size " #symbol ", 4; \n" \ |
49 | #symbol ": \n" \ | |
50 | ".zero 4 \n" \ | |
ab21d606 | 51 | word \ |
5a2798ab JO |
52 | ".popsection; \n"); |
53 | ||
ab21d606 KKD |
54 | #define __BTF_ID(symbol, word) \ |
55 | ____BTF_ID(symbol, word) | |
5a2798ab JO |
56 | |
57 | #define __ID(prefix) \ | |
8f908db7 | 58 | __PASTE(__PASTE(prefix, __COUNTER__), __LINE__) |
5a2798ab JO |
59 | |
60 | /* | |
61 | * The BTF_ID defines unique symbol for each ID pointing | |
62 | * to 4 zero bytes. | |
63 | */ | |
64 | #define BTF_ID(prefix, name) \ | |
ab21d606 KKD |
65 | __BTF_ID(__ID(__BTF_ID__##prefix##__##name##__), "") |
66 | ||
67 | #define ____BTF_ID_FLAGS(prefix, name, flags) \ | |
68 | __BTF_ID(__ID(__BTF_ID__##prefix##__##name##__), ".long " #flags "\n") | |
69 | #define __BTF_ID_FLAGS(prefix, name, flags, ...) \ | |
70 | ____BTF_ID_FLAGS(prefix, name, flags) | |
71 | #define BTF_ID_FLAGS(prefix, name, ...) \ | |
72 | __BTF_ID_FLAGS(prefix, name, ##__VA_ARGS__, 0) | |
5a2798ab JO |
73 | |
74 | /* | |
75 | * The BTF_ID_LIST macro defines pure (unsorted) list | |
76 | * of BTF IDs, with following layout: | |
77 | * | |
78 | * BTF_ID_LIST(list1) | |
79 | * BTF_ID(type1, name1) | |
80 | * BTF_ID(type2, name2) | |
81 | * | |
82 | * list1: | |
83 | * __BTF_ID__type1__name1__1: | |
84 | * .zero 4 | |
85 | * __BTF_ID__type2__name2__2: | |
86 | * .zero 4 | |
87 | * | |
88 | */ | |
0f12e584 | 89 | #define __BTF_ID_LIST(name, scope) \ |
5a2798ab JO |
90 | asm( \ |
91 | ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ | |
0f12e584 | 92 | "." #scope " " #name "; \n" \ |
5a2798ab | 93 | #name ":; \n" \ |
eae2e83e | 94 | ".popsection; \n"); |
5a2798ab JO |
95 | |
96 | #define BTF_ID_LIST(name) \ | |
0f12e584 | 97 | __BTF_ID_LIST(name, local) \ |
5a2798ab JO |
98 | extern u32 name[]; |
99 | ||
9e2ad638 | 100 | #define BTF_ID_LIST_GLOBAL(name, n) \ |
0f12e584 YS |
101 | __BTF_ID_LIST(name, globl) |
102 | ||
27774b70 LB |
103 | /* The BTF_ID_LIST_SINGLE macro defines a BTF_ID_LIST with |
104 | * a single entry. | |
105 | */ | |
106 | #define BTF_ID_LIST_SINGLE(name, prefix, typename) \ | |
107 | BTF_ID_LIST(name) \ | |
108 | BTF_ID(prefix, typename) | |
1b07d00a | 109 | #define BTF_ID_LIST_GLOBAL_SINGLE(name, prefix, typename) \ |
9e2ad638 | 110 | BTF_ID_LIST_GLOBAL(name, 1) \ |
1b07d00a | 111 | BTF_ID(prefix, typename) |
27774b70 | 112 | |
5a2798ab JO |
113 | /* |
114 | * The BTF_ID_UNUSED macro defines 4 zero bytes. | |
115 | * It's used when we want to define 'unused' entry | |
116 | * in BTF_ID_LIST, like: | |
117 | * | |
118 | * BTF_ID_LIST(bpf_skb_output_btf_ids) | |
119 | * BTF_ID(struct, sk_buff) | |
120 | * BTF_ID_UNUSED | |
121 | * BTF_ID(struct, task_struct) | |
122 | */ | |
123 | ||
124 | #define BTF_ID_UNUSED \ | |
125 | asm( \ | |
126 | ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ | |
127 | ".zero 4 \n" \ | |
128 | ".popsection; \n"); | |
129 | ||
eae2e83e JO |
130 | /* |
131 | * The BTF_SET_START/END macros pair defines sorted list of | |
132 | * BTF IDs plus its members count, with following layout: | |
133 | * | |
134 | * BTF_SET_START(list) | |
135 | * BTF_ID(type1, name1) | |
136 | * BTF_ID(type2, name2) | |
137 | * BTF_SET_END(list) | |
138 | * | |
139 | * __BTF_ID__set__list: | |
140 | * .zero 4 | |
141 | * list: | |
142 | * __BTF_ID__type1__name1__3: | |
143 | * .zero 4 | |
144 | * __BTF_ID__type2__name2__4: | |
145 | * .zero 4 | |
146 | * | |
147 | */ | |
148 | #define __BTF_SET_START(name, scope) \ | |
149 | asm( \ | |
150 | ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ | |
151 | "." #scope " __BTF_ID__set__" #name "; \n" \ | |
152 | "__BTF_ID__set__" #name ":; \n" \ | |
153 | ".zero 4 \n" \ | |
154 | ".popsection; \n"); | |
155 | ||
156 | #define BTF_SET_START(name) \ | |
157 | __BTF_ID_LIST(name, local) \ | |
158 | __BTF_SET_START(name, local) | |
159 | ||
160 | #define BTF_SET_START_GLOBAL(name) \ | |
161 | __BTF_ID_LIST(name, globl) \ | |
162 | __BTF_SET_START(name, globl) | |
163 | ||
164 | #define BTF_SET_END(name) \ | |
165 | asm( \ | |
166 | ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ | |
167 | ".size __BTF_ID__set__" #name ", .-" #name " \n" \ | |
168 | ".popsection; \n"); \ | |
169 | extern struct btf_id_set name; | |
170 | ||
ab21d606 KKD |
171 | /* |
172 | * The BTF_SET8_START/END macros pair defines sorted list of | |
173 | * BTF IDs and their flags plus its members count, with the | |
174 | * following layout: | |
175 | * | |
176 | * BTF_SET8_START(list) | |
177 | * BTF_ID_FLAGS(type1, name1, flags) | |
178 | * BTF_ID_FLAGS(type2, name2, flags) | |
179 | * BTF_SET8_END(list) | |
180 | * | |
181 | * __BTF_ID__set8__list: | |
182 | * .zero 8 | |
183 | * list: | |
184 | * __BTF_ID__type1__name1__3: | |
185 | * .zero 4 | |
186 | * .word (1 << 0) | (1 << 2) | |
187 | * __BTF_ID__type2__name2__5: | |
188 | * .zero 4 | |
189 | * .word (1 << 3) | (1 << 1) | (1 << 2) | |
190 | * | |
191 | */ | |
79b47344 DX |
192 | #define __BTF_SET8_START(name, scope, flags) \ |
193 | __BTF_ID_LIST(name, local) \ | |
ab21d606 KKD |
194 | asm( \ |
195 | ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ | |
196 | "." #scope " __BTF_ID__set8__" #name "; \n" \ | |
197 | "__BTF_ID__set8__" #name ":; \n" \ | |
79b47344 DX |
198 | ".zero 4 \n" \ |
199 | ".long " __stringify(flags) "\n" \ | |
ab21d606 KKD |
200 | ".popsection; \n"); |
201 | ||
202 | #define BTF_SET8_START(name) \ | |
79b47344 | 203 | __BTF_SET8_START(name, local, 0) |
ab21d606 KKD |
204 | |
205 | #define BTF_SET8_END(name) \ | |
206 | asm( \ | |
207 | ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ | |
208 | ".size __BTF_ID__set8__" #name ", .-" #name " \n" \ | |
209 | ".popsection; \n"); \ | |
210 | extern struct btf_id_set8 name; | |
211 | ||
a05e9042 DX |
212 | #define BTF_KFUNCS_START(name) \ |
213 | __BTF_SET8_START(name, local, BTF_SET8_KFUNCS) | |
214 | ||
215 | #define BTF_KFUNCS_END(name) \ | |
216 | BTF_SET8_END(name) | |
217 | ||
079ef536 JO |
218 | #else |
219 | ||
2d5bcdcd | 220 | #define BTF_ID_LIST(name) static u32 __maybe_unused name[64]; |
079ef536 | 221 | #define BTF_ID(prefix, name) |
e4234143 | 222 | #define BTF_ID_FLAGS(prefix, name, ...) |
079ef536 | 223 | #define BTF_ID_UNUSED |
dee872e1 KKD |
224 | #define BTF_ID_LIST_GLOBAL(name, n) u32 __maybe_unused name[n]; |
225 | #define BTF_ID_LIST_SINGLE(name, prefix, typename) static u32 __maybe_unused name[1]; | |
226 | #define BTF_ID_LIST_GLOBAL_SINGLE(name, prefix, typename) u32 __maybe_unused name[1]; | |
227 | #define BTF_SET_START(name) static struct btf_id_set __maybe_unused name = { 0 }; | |
228 | #define BTF_SET_START_GLOBAL(name) static struct btf_id_set __maybe_unused name = { 0 }; | |
eae2e83e | 229 | #define BTF_SET_END(name) |
ab21d606 | 230 | #define BTF_SET8_START(name) static struct btf_id_set8 __maybe_unused name = { 0 }; |
e4234143 | 231 | #define BTF_SET8_END(name) |
a05e9042 DX |
232 | #define BTF_KFUNCS_START(name) static struct btf_id_set8 __maybe_unused name = { .flags = BTF_SET8_KFUNCS }; |
233 | #define BTF_KFUNCS_END(name) | |
079ef536 JO |
234 | |
235 | #endif /* CONFIG_DEBUG_INFO_BTF */ | |
5a2798ab | 236 | |
fce557bc YS |
237 | #ifdef CONFIG_NET |
238 | /* Define a list of socket types which can be the argument for | |
239 | * skc_to_*_sock() helpers. All these sockets should have | |
240 | * sock_common as the first argument in its memory layout. | |
241 | */ | |
242 | #define BTF_SOCK_TYPE_xxx \ | |
243 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET, inet_sock) \ | |
244 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_CONN, inet_connection_sock) \ | |
245 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_REQ, inet_request_sock) \ | |
246 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_TW, inet_timewait_sock) \ | |
247 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_REQ, request_sock) \ | |
248 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_SOCK, sock) \ | |
249 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_SOCK_COMMON, sock_common) \ | |
250 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP, tcp_sock) \ | |
251 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP_REQ, tcp_request_sock) \ | |
252 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP_TW, tcp_timewait_sock) \ | |
253 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP6, tcp6_sock) \ | |
254 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP, udp_sock) \ | |
2c860a43 | 255 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP6, udp6_sock) \ |
3bc253c2 | 256 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_UNIX, unix_sock) \ |
69fd337a SF |
257 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_MPTCP, mptcp_sock) \ |
258 | BTF_SOCK_TYPE(BTF_SOCK_TYPE_SOCKET, socket) | |
fce557bc YS |
259 | |
260 | enum { | |
261 | #define BTF_SOCK_TYPE(name, str) name, | |
262 | BTF_SOCK_TYPE_xxx | |
263 | #undef BTF_SOCK_TYPE | |
264 | MAX_BTF_SOCK_TYPE, | |
265 | }; | |
266 | ||
267 | extern u32 btf_sock_ids[]; | |
268 | #endif | |
269 | ||
d19ddb47 SL |
270 | #define BTF_TRACING_TYPE_xxx \ |
271 | BTF_TRACING_TYPE(BTF_TRACING_TYPE_TASK, task_struct) \ | |
272 | BTF_TRACING_TYPE(BTF_TRACING_TYPE_FILE, file) \ | |
273 | BTF_TRACING_TYPE(BTF_TRACING_TYPE_VMA, vm_area_struct) | |
274 | ||
275 | enum { | |
276 | #define BTF_TRACING_TYPE(name, type) name, | |
277 | BTF_TRACING_TYPE_xxx | |
278 | #undef BTF_TRACING_TYPE | |
279 | MAX_BTF_TRACING_TYPE, | |
280 | }; | |
281 | ||
282 | extern u32 btf_tracing_ids[]; | |
5e67b8ef | 283 | extern u32 bpf_cgroup_btf_id[]; |
3144bfa5 | 284 | extern u32 bpf_local_storage_map_btf_id[]; |
5ba190c2 | 285 | extern u32 btf_bpf_map_id[]; |
33c5cb36 | 286 | |
5a2798ab | 287 | #endif |