Blame view

include/linux/btf_ids.h 5.05 KB
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
1
2
3
4
  /* SPDX-License-Identifier: GPL-2.0 */
  
  #ifndef _LINUX_BTF_IDS_H
  #define _LINUX_BTF_IDS_H
eae2e83e6   Jiri Olsa   bpf: Add BTF_SET_...
5
6
7
8
  struct btf_id_set {
  	u32 cnt;
  	u32 ids[];
  };
079ef5367   Jiri Olsa   bpf: Fix build fo...
9
  #ifdef CONFIG_DEBUG_INFO_BTF
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  #include <linux/compiler.h> /* for __PASTE */
  
  /*
   * Following macros help to define lists of BTF IDs placed
   * in .BTF_ids section. They are initially filled with zeros
   * (during compilation) and resolved later during the
   * linking phase by resolve_btfids tool.
   *
   * Any change in list layout must be reflected in resolve_btfids
   * tool logic.
   */
  
  #define BTF_IDS_SECTION ".BTF_ids"
  
  #define ____BTF_ID(symbol)				\
  asm(							\
  ".pushsection " BTF_IDS_SECTION ",\"a\";       
  "	\
  ".local " #symbol " ;                          
  "	\
11bb2f7a4   Jiri Olsa   bpf: Fix cross bu...
30
31
  ".type  " #symbol ", STT_OBJECT;               
  "	\
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  ".size  " #symbol ", 4;                        
  "	\
  #symbol ":                                     
  "	\
  ".zero 4                                       
  "	\
  ".popsection;                                  
  ");
  
  #define __BTF_ID(symbol) \
  	____BTF_ID(symbol)
  
  #define __ID(prefix) \
  	__PASTE(prefix, __COUNTER__)
  
  /*
   * The BTF_ID defines unique symbol for each ID pointing
   * to 4 zero bytes.
   */
  #define BTF_ID(prefix, name) \
  	__BTF_ID(__ID(__BTF_ID__##prefix##__##name##__))
  
  /*
   * The BTF_ID_LIST macro defines pure (unsorted) list
   * of BTF IDs, with following layout:
   *
   * BTF_ID_LIST(list1)
   * BTF_ID(type1, name1)
   * BTF_ID(type2, name2)
   *
   * list1:
   * __BTF_ID__type1__name1__1:
   * .zero 4
   * __BTF_ID__type2__name2__2:
   * .zero 4
   *
   */
0f12e584b   Yonghong Song   bpf: Add BTF_ID_L...
69
  #define __BTF_ID_LIST(name, scope)			\
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
70
71
72
  asm(							\
  ".pushsection " BTF_IDS_SECTION ",\"a\";       
  "	\
0f12e584b   Yonghong Song   bpf: Add BTF_ID_L...
73
74
  "." #scope " " #name ";                        
  "	\
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
75
76
  #name ":;                                      
  "	\
eae2e83e6   Jiri Olsa   bpf: Add BTF_SET_...
77
78
  ".popsection;                                  
  ");
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
79
80
  
  #define BTF_ID_LIST(name)				\
0f12e584b   Yonghong Song   bpf: Add BTF_ID_L...
81
  __BTF_ID_LIST(name, local)				\
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
82
  extern u32 name[];
0f12e584b   Yonghong Song   bpf: Add BTF_ID_L...
83
84
  #define BTF_ID_LIST_GLOBAL(name)			\
  __BTF_ID_LIST(name, globl)
27774b707   Lorenz Bauer   btf: Add BTF_ID_L...
85
86
87
88
89
90
  /* The BTF_ID_LIST_SINGLE macro defines a BTF_ID_LIST with
   * a single entry.
   */
  #define BTF_ID_LIST_SINGLE(name, prefix, typename)	\
  	BTF_ID_LIST(name) \
  	BTF_ID(prefix, typename)
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  /*
   * The BTF_ID_UNUSED macro defines 4 zero bytes.
   * It's used when we want to define 'unused' entry
   * in BTF_ID_LIST, like:
   *
   *   BTF_ID_LIST(bpf_skb_output_btf_ids)
   *   BTF_ID(struct, sk_buff)
   *   BTF_ID_UNUSED
   *   BTF_ID(struct, task_struct)
   */
  
  #define BTF_ID_UNUSED					\
  asm(							\
  ".pushsection " BTF_IDS_SECTION ",\"a\";       
  "	\
  ".zero 4                                       
  "	\
  ".popsection;                                  
  ");
eae2e83e6   Jiri Olsa   bpf: Add BTF_SET_...
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  /*
   * The BTF_SET_START/END macros pair defines sorted list of
   * BTF IDs plus its members count, with following layout:
   *
   * BTF_SET_START(list)
   * BTF_ID(type1, name1)
   * BTF_ID(type2, name2)
   * BTF_SET_END(list)
   *
   * __BTF_ID__set__list:
   * .zero 4
   * list:
   * __BTF_ID__type1__name1__3:
   * .zero 4
   * __BTF_ID__type2__name2__4:
   * .zero 4
   *
   */
  #define __BTF_SET_START(name, scope)			\
  asm(							\
  ".pushsection " BTF_IDS_SECTION ",\"a\";       
  "	\
  "." #scope " __BTF_ID__set__" #name ";         
  "	\
  "__BTF_ID__set__" #name ":;                    
  "	\
  ".zero 4                                       
  "	\
  ".popsection;                                  
  ");
  
  #define BTF_SET_START(name)				\
  __BTF_ID_LIST(name, local)				\
  __BTF_SET_START(name, local)
  
  #define BTF_SET_START_GLOBAL(name)			\
  __BTF_ID_LIST(name, globl)				\
  __BTF_SET_START(name, globl)
  
  #define BTF_SET_END(name)				\
  asm(							\
  ".pushsection " BTF_IDS_SECTION ",\"a\";      
  "	\
  ".size __BTF_ID__set__" #name ", .-" #name "  
  "	\
  ".popsection;                                 
  ");	\
  extern struct btf_id_set name;
079ef5367   Jiri Olsa   bpf: Fix build fo...
158
159
160
161
162
  #else
  
  #define BTF_ID_LIST(name) static u32 name[5];
  #define BTF_ID(prefix, name)
  #define BTF_ID_UNUSED
0f12e584b   Yonghong Song   bpf: Add BTF_ID_L...
163
  #define BTF_ID_LIST_GLOBAL(name) u32 name[1];
27774b707   Lorenz Bauer   btf: Add BTF_ID_L...
164
  #define BTF_ID_LIST_SINGLE(name, prefix, typename) static u32 name[1];
eae2e83e6   Jiri Olsa   bpf: Add BTF_SET_...
165
166
167
  #define BTF_SET_START(name) static struct btf_id_set name = { 0 };
  #define BTF_SET_START_GLOBAL(name) static struct btf_id_set name = { 0 };
  #define BTF_SET_END(name)
079ef5367   Jiri Olsa   bpf: Fix build fo...
168
169
  
  #endif /* CONFIG_DEBUG_INFO_BTF */
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
170

fce557bce   Yonghong Song   bpf: Make btf_soc...
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
  #ifdef CONFIG_NET
  /* Define a list of socket types which can be the argument for
   * skc_to_*_sock() helpers. All these sockets should have
   * sock_common as the first argument in its memory layout.
   */
  #define BTF_SOCK_TYPE_xxx \
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET, inet_sock)			\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_CONN, inet_connection_sock)	\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_REQ, inet_request_sock)	\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_TW, inet_timewait_sock)	\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_REQ, request_sock)			\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_SOCK, sock)				\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_SOCK_COMMON, sock_common)		\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP, tcp_sock)			\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP_REQ, tcp_request_sock)		\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP_TW, tcp_timewait_sock)		\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP6, tcp6_sock)			\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP, udp_sock)			\
  	BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP6, udp6_sock)
  
  enum {
  #define BTF_SOCK_TYPE(name, str) name,
  BTF_SOCK_TYPE_xxx
  #undef BTF_SOCK_TYPE
  MAX_BTF_SOCK_TYPE,
  };
  
  extern u32 btf_sock_ids[];
  #endif
5a2798ab3   Jiri Olsa   bpf: Add BTF_ID_L...
200
  #endif