xref: /linux/tools/include/linux/btf_ids.h (revision e5a0516ec9681daf5c1f0d05144d21430b6ca6d7)
1*e5a0516eSJiri Olsa /* SPDX-License-Identifier: GPL-2.0 */
2*e5a0516eSJiri Olsa 
3*e5a0516eSJiri Olsa #ifndef _LINUX_BTF_IDS_H
4*e5a0516eSJiri Olsa #define _LINUX_BTF_IDS_H
5*e5a0516eSJiri Olsa 
6*e5a0516eSJiri Olsa #include <linux/compiler.h> /* for __PASTE */
7*e5a0516eSJiri Olsa 
8*e5a0516eSJiri Olsa /*
9*e5a0516eSJiri Olsa  * Following macros help to define lists of BTF IDs placed
10*e5a0516eSJiri Olsa  * in .BTF_ids section. They are initially filled with zeros
11*e5a0516eSJiri Olsa  * (during compilation) and resolved later during the
12*e5a0516eSJiri Olsa  * linking phase by resolve_btfids tool.
13*e5a0516eSJiri Olsa  *
14*e5a0516eSJiri Olsa  * Any change in list layout must be reflected in resolve_btfids
15*e5a0516eSJiri Olsa  * tool logic.
16*e5a0516eSJiri Olsa  */
17*e5a0516eSJiri Olsa 
18*e5a0516eSJiri Olsa #define BTF_IDS_SECTION ".BTF_ids"
19*e5a0516eSJiri Olsa 
20*e5a0516eSJiri Olsa #define ____BTF_ID(symbol)				\
21*e5a0516eSJiri Olsa asm(							\
22*e5a0516eSJiri Olsa ".pushsection " BTF_IDS_SECTION ",\"a\";       \n"	\
23*e5a0516eSJiri Olsa ".local " #symbol " ;                          \n"	\
24*e5a0516eSJiri Olsa ".type  " #symbol ", @object;                  \n"	\
25*e5a0516eSJiri Olsa ".size  " #symbol ", 4;                        \n"	\
26*e5a0516eSJiri Olsa #symbol ":                                     \n"	\
27*e5a0516eSJiri Olsa ".zero 4                                       \n"	\
28*e5a0516eSJiri Olsa ".popsection;                                  \n");
29*e5a0516eSJiri Olsa 
30*e5a0516eSJiri Olsa #define __BTF_ID(symbol) \
31*e5a0516eSJiri Olsa 	____BTF_ID(symbol)
32*e5a0516eSJiri Olsa 
33*e5a0516eSJiri Olsa #define __ID(prefix) \
34*e5a0516eSJiri Olsa 	__PASTE(prefix, __COUNTER__)
35*e5a0516eSJiri Olsa 
36*e5a0516eSJiri Olsa /*
37*e5a0516eSJiri Olsa  * The BTF_ID defines unique symbol for each ID pointing
38*e5a0516eSJiri Olsa  * to 4 zero bytes.
39*e5a0516eSJiri Olsa  */
40*e5a0516eSJiri Olsa #define BTF_ID(prefix, name) \
41*e5a0516eSJiri Olsa 	__BTF_ID(__ID(__BTF_ID__##prefix##__##name##__))
42*e5a0516eSJiri Olsa 
43*e5a0516eSJiri Olsa /*
44*e5a0516eSJiri Olsa  * The BTF_ID_LIST macro defines pure (unsorted) list
45*e5a0516eSJiri Olsa  * of BTF IDs, with following layout:
46*e5a0516eSJiri Olsa  *
47*e5a0516eSJiri Olsa  * BTF_ID_LIST(list1)
48*e5a0516eSJiri Olsa  * BTF_ID(type1, name1)
49*e5a0516eSJiri Olsa  * BTF_ID(type2, name2)
50*e5a0516eSJiri Olsa  *
51*e5a0516eSJiri Olsa  * list1:
52*e5a0516eSJiri Olsa  * __BTF_ID__type1__name1__1:
53*e5a0516eSJiri Olsa  * .zero 4
54*e5a0516eSJiri Olsa  * __BTF_ID__type2__name2__2:
55*e5a0516eSJiri Olsa  * .zero 4
56*e5a0516eSJiri Olsa  *
57*e5a0516eSJiri Olsa  */
58*e5a0516eSJiri Olsa #define __BTF_ID_LIST(name)				\
59*e5a0516eSJiri Olsa asm(							\
60*e5a0516eSJiri Olsa ".pushsection " BTF_IDS_SECTION ",\"a\";       \n"	\
61*e5a0516eSJiri Olsa ".local " #name ";                             \n"	\
62*e5a0516eSJiri Olsa #name ":;                                      \n"	\
63*e5a0516eSJiri Olsa ".popsection;                                  \n");	\
64*e5a0516eSJiri Olsa 
65*e5a0516eSJiri Olsa #define BTF_ID_LIST(name)				\
66*e5a0516eSJiri Olsa __BTF_ID_LIST(name)					\
67*e5a0516eSJiri Olsa extern u32 name[];
68*e5a0516eSJiri Olsa 
69*e5a0516eSJiri Olsa /*
70*e5a0516eSJiri Olsa  * The BTF_ID_UNUSED macro defines 4 zero bytes.
71*e5a0516eSJiri Olsa  * It's used when we want to define 'unused' entry
72*e5a0516eSJiri Olsa  * in BTF_ID_LIST, like:
73*e5a0516eSJiri Olsa  *
74*e5a0516eSJiri Olsa  *   BTF_ID_LIST(bpf_skb_output_btf_ids)
75*e5a0516eSJiri Olsa  *   BTF_ID(struct, sk_buff)
76*e5a0516eSJiri Olsa  *   BTF_ID_UNUSED
77*e5a0516eSJiri Olsa  *   BTF_ID(struct, task_struct)
78*e5a0516eSJiri Olsa  */
79*e5a0516eSJiri Olsa 
80*e5a0516eSJiri Olsa #define BTF_ID_UNUSED					\
81*e5a0516eSJiri Olsa asm(							\
82*e5a0516eSJiri Olsa ".pushsection " BTF_IDS_SECTION ",\"a\";       \n"	\
83*e5a0516eSJiri Olsa ".zero 4                                       \n"	\
84*e5a0516eSJiri Olsa ".popsection;                                  \n");
85*e5a0516eSJiri Olsa 
86*e5a0516eSJiri Olsa 
87*e5a0516eSJiri Olsa #endif
88