xref: /openbmc/linux/tools/bpf/bpftool/Documentation/bpftool-btf.rst (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
143448428SQuentin Monnet.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
243448428SQuentin Monnet
3ca253339SAndrii Nakryiko================
4ca253339SAndrii Nakryikobpftool-btf
5ca253339SAndrii Nakryiko================
6ca253339SAndrii Nakryiko-------------------------------------------------------------------------------
7ca253339SAndrii Nakryikotool for inspection of BTF data
8ca253339SAndrii Nakryiko-------------------------------------------------------------------------------
9ca253339SAndrii Nakryiko
10ca253339SAndrii Nakryiko:Manual section: 8
11ca253339SAndrii Nakryiko
12*b6231815SQuentin Monnet.. include:: substitutions.rst
13*b6231815SQuentin Monnet
14ca253339SAndrii NakryikoSYNOPSIS
15ca253339SAndrii Nakryiko========
16ca253339SAndrii Nakryiko
17ca253339SAndrii Nakryiko	**bpftool** [*OPTIONS*] **btf** *COMMAND*
18ca253339SAndrii Nakryiko
19*b6231815SQuentin Monnet	*OPTIONS* := { |COMMON_OPTIONS| | { **-B** | **--base-btf** } }
20ca253339SAndrii Nakryiko
21ca253339SAndrii Nakryiko	*COMMANDS* := { **dump** | **help** }
22ca253339SAndrii Nakryiko
23ca253339SAndrii NakryikoBTF COMMANDS
24ca253339SAndrii Nakryiko=============
25ca253339SAndrii Nakryiko
264d374ba0SQuentin Monnet|	**bpftool** **btf** { **show** | **list** } [**id** *BTF_ID*]
27220ba451SAndrii Nakryiko|	**bpftool** **btf dump** *BTF_SRC* [**format** *FORMAT*]
28ca253339SAndrii Nakryiko|	**bpftool** **btf help**
29ca253339SAndrii Nakryiko|
30ca253339SAndrii Nakryiko|	*BTF_SRC* := { **id** *BTF_ID* | **prog** *PROG* | **map** *MAP* [{**key** | **value** | **kv** | **all**}] | **file** *FILE* }
31220ba451SAndrii Nakryiko|	*FORMAT* := { **raw** | **c** }
32ca253339SAndrii Nakryiko|	*MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
33ca253339SAndrii Nakryiko|	*PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* }
34ca253339SAndrii Nakryiko
35ca253339SAndrii NakryikoDESCRIPTION
36ca253339SAndrii Nakryiko===========
374d374ba0SQuentin Monnet	**bpftool btf { show | list }** [**id** *BTF_ID*]
384d374ba0SQuentin Monnet		  Show information about loaded BTF objects. If a BTF ID is
394d374ba0SQuentin Monnet		  specified, show information only about given BTF object,
404d374ba0SQuentin Monnet		  otherwise list all BTF objects currently loaded on the
414d374ba0SQuentin Monnet		  system.
424d374ba0SQuentin Monnet
43075c7766SAndrii Nakryiko		  Since Linux 5.8 bpftool is able to discover information about
44075c7766SAndrii Nakryiko		  processes that hold open file descriptors (FDs) against BTF
45075c7766SAndrii Nakryiko		  objects. On such kernels bpftool will automatically emit this
46075c7766SAndrii Nakryiko		  information as well.
47075c7766SAndrii Nakryiko
48ca253339SAndrii Nakryiko	**bpftool btf dump** *BTF_SRC*
49ca253339SAndrii Nakryiko		  Dump BTF entries from a given *BTF_SRC*.
50ca253339SAndrii Nakryiko
51ca253339SAndrii Nakryiko		  When **id** is specified, BTF object with that ID will be
52ca253339SAndrii Nakryiko		  loaded and all its BTF types emitted.
53ca253339SAndrii Nakryiko
54ca253339SAndrii Nakryiko		  When **map** is provided, it's expected that map has
55ca253339SAndrii Nakryiko		  associated BTF object with BTF types describing key and
56ca253339SAndrii Nakryiko		  value. It's possible to select whether to dump only BTF
57ca253339SAndrii Nakryiko		  type(s) associated with key (**key**), value (**value**),
58ca253339SAndrii Nakryiko		  both key and value (**kv**), or all BTF types present in
59ca253339SAndrii Nakryiko		  associated BTF object (**all**). If not specified, **kv**
60ca253339SAndrii Nakryiko		  is assumed.
61ca253339SAndrii Nakryiko
62ca253339SAndrii Nakryiko		  When **prog** is provided, it's expected that program has
63ca253339SAndrii Nakryiko		  associated BTF object with BTF types.
64ca253339SAndrii Nakryiko
65ca253339SAndrii Nakryiko		  When specifying *FILE*, an ELF file is expected, containing
66ca253339SAndrii Nakryiko		  .BTF section with well-defined BTF binary format data,
67ca253339SAndrii Nakryiko		  typically produced by clang or pahole.
68ca253339SAndrii Nakryiko
69220ba451SAndrii Nakryiko		  **format** option can be used to override default (raw)
70220ba451SAndrii Nakryiko		  output format. Raw (**raw**) or C-syntax (**c**) output
71220ba451SAndrii Nakryiko		  formats are supported.
72220ba451SAndrii Nakryiko
73ca253339SAndrii Nakryiko	**bpftool btf help**
74ca253339SAndrii Nakryiko		  Print short help message.
75ca253339SAndrii Nakryiko
76ca253339SAndrii NakryikoOPTIONS
77ca253339SAndrii Nakryiko=======
78f28ef96dSQuentin Monnet	.. include:: common_options.rst
79775bc8adSQuentin Monnet
808cc8c635SQuentin Monnet	-B, --base-btf *FILE*
818cc8c635SQuentin Monnet		  Pass a base BTF object. Base BTF objects are typically used
828cc8c635SQuentin Monnet		  with BTF objects for kernel modules. To avoid duplicating
838cc8c635SQuentin Monnet		  all kernel symbols required by modules, BTF objects for
848cc8c635SQuentin Monnet		  modules are "split", they are built incrementally on top of
858cc8c635SQuentin Monnet		  the kernel (vmlinux) BTF object. So the base BTF reference
868cc8c635SQuentin Monnet		  should usually point to the kernel BTF.
878cc8c635SQuentin Monnet
888cc8c635SQuentin Monnet		  When the main BTF object to process (for example, the
898cc8c635SQuentin Monnet		  module BTF to dump) is passed as a *FILE*, bpftool attempts
908cc8c635SQuentin Monnet		  to autodetect the path for the base object, and passing
918cc8c635SQuentin Monnet		  this option is optional. When the main BTF object is passed
928cc8c635SQuentin Monnet		  through other handles, this option becomes necessary.
938cc8c635SQuentin Monnet
94ca253339SAndrii NakryikoEXAMPLES
95ca253339SAndrii Nakryiko========
96ca253339SAndrii Nakryiko**# bpftool btf dump id 1226**
9716f3ddfbSQuentin Monnet
98ca253339SAndrii Nakryiko::
99ca253339SAndrii Nakryiko
100ca253339SAndrii Nakryiko  [1] PTR '(anon)' type_id=2
101ca253339SAndrii Nakryiko  [2] STRUCT 'dummy_tracepoint_args' size=16 vlen=2
102ca253339SAndrii Nakryiko          'pad' type_id=3 bits_offset=0
103ca253339SAndrii Nakryiko          'sock' type_id=4 bits_offset=64
104ca253339SAndrii Nakryiko  [3] INT 'long long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none)
105ca253339SAndrii Nakryiko  [4] PTR '(anon)' type_id=5
106ca253339SAndrii Nakryiko  [5] FWD 'sock' fwd_kind=union
107ca253339SAndrii Nakryiko
108ca253339SAndrii NakryikoThis gives an example of default output for all supported BTF kinds.
109ca253339SAndrii Nakryiko
110ca253339SAndrii Nakryiko**$ cat prog.c**
11116f3ddfbSQuentin Monnet
112ca253339SAndrii Nakryiko::
113ca253339SAndrii Nakryiko
114ca253339SAndrii Nakryiko  struct fwd_struct;
115ca253339SAndrii Nakryiko
116ca253339SAndrii Nakryiko  enum my_enum {
117ca253339SAndrii Nakryiko          VAL1 = 3,
118ca253339SAndrii Nakryiko          VAL2 = 7,
119ca253339SAndrii Nakryiko  };
120ca253339SAndrii Nakryiko
121ca253339SAndrii Nakryiko  typedef struct my_struct my_struct_t;
122ca253339SAndrii Nakryiko
123ca253339SAndrii Nakryiko  struct my_struct {
124ca253339SAndrii Nakryiko          const unsigned int const_int_field;
125ca253339SAndrii Nakryiko          int bitfield_field: 4;
126ca253339SAndrii Nakryiko          char arr_field[16];
127ca253339SAndrii Nakryiko          const struct fwd_struct *restrict fwd_field;
128ca253339SAndrii Nakryiko          enum my_enum enum_field;
129ca253339SAndrii Nakryiko          volatile my_struct_t *typedef_ptr_field;
130ca253339SAndrii Nakryiko  };
131ca253339SAndrii Nakryiko
132ca253339SAndrii Nakryiko  union my_union {
133ca253339SAndrii Nakryiko          int a;
134ca253339SAndrii Nakryiko          struct my_struct b;
135ca253339SAndrii Nakryiko  };
136ca253339SAndrii Nakryiko
137ca253339SAndrii Nakryiko  struct my_struct struct_global_var __attribute__((section("data_sec"))) = {
138ca253339SAndrii Nakryiko          .bitfield_field = 3,
139ca253339SAndrii Nakryiko          .enum_field = VAL1,
140ca253339SAndrii Nakryiko  };
141ca253339SAndrii Nakryiko  int global_var __attribute__((section("data_sec"))) = 7;
142ca253339SAndrii Nakryiko
143ca253339SAndrii Nakryiko  __attribute__((noinline))
144ca253339SAndrii Nakryiko  int my_func(union my_union *arg1, int arg2)
145ca253339SAndrii Nakryiko  {
146ca253339SAndrii Nakryiko          static int static_var __attribute__((section("data_sec"))) = 123;
147ca253339SAndrii Nakryiko          static_var++;
148ca253339SAndrii Nakryiko          return static_var;
149ca253339SAndrii Nakryiko  }
150ca253339SAndrii Nakryiko
151ca253339SAndrii Nakryiko**$ bpftool btf dump file prog.o**
15216f3ddfbSQuentin Monnet
153ca253339SAndrii Nakryiko::
154ca253339SAndrii Nakryiko
155ca253339SAndrii Nakryiko  [1] PTR '(anon)' type_id=2
156ca253339SAndrii Nakryiko  [2] UNION 'my_union' size=48 vlen=2
157ca253339SAndrii Nakryiko          'a' type_id=3 bits_offset=0
158ca253339SAndrii Nakryiko          'b' type_id=4 bits_offset=0
159ca253339SAndrii Nakryiko  [3] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
160ca253339SAndrii Nakryiko  [4] STRUCT 'my_struct' size=48 vlen=6
161ca253339SAndrii Nakryiko          'const_int_field' type_id=5 bits_offset=0
162ca253339SAndrii Nakryiko          'bitfield_field' type_id=3 bits_offset=32 bitfield_size=4
163ca253339SAndrii Nakryiko          'arr_field' type_id=8 bits_offset=40
164ca253339SAndrii Nakryiko          'fwd_field' type_id=10 bits_offset=192
165ca253339SAndrii Nakryiko          'enum_field' type_id=14 bits_offset=256
166ca253339SAndrii Nakryiko          'typedef_ptr_field' type_id=15 bits_offset=320
167ca253339SAndrii Nakryiko  [5] CONST '(anon)' type_id=6
168ca253339SAndrii Nakryiko  [6] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none)
169ca253339SAndrii Nakryiko  [7] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=SIGNED
170ca253339SAndrii Nakryiko  [8] ARRAY '(anon)' type_id=7 index_type_id=9 nr_elems=16
171ca253339SAndrii Nakryiko  [9] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none)
172ca253339SAndrii Nakryiko  [10] RESTRICT '(anon)' type_id=11
173ca253339SAndrii Nakryiko  [11] PTR '(anon)' type_id=12
174ca253339SAndrii Nakryiko  [12] CONST '(anon)' type_id=13
175ca253339SAndrii Nakryiko  [13] FWD 'fwd_struct' fwd_kind=union
176ca253339SAndrii Nakryiko  [14] ENUM 'my_enum' size=4 vlen=2
177ca253339SAndrii Nakryiko          'VAL1' val=3
178ca253339SAndrii Nakryiko          'VAL2' val=7
179ca253339SAndrii Nakryiko  [15] PTR '(anon)' type_id=16
180ca253339SAndrii Nakryiko  [16] VOLATILE '(anon)' type_id=17
181ca253339SAndrii Nakryiko  [17] TYPEDEF 'my_struct_t' type_id=4
182ca253339SAndrii Nakryiko  [18] FUNC_PROTO '(anon)' ret_type_id=3 vlen=2
183ca253339SAndrii Nakryiko          'arg1' type_id=1
184ca253339SAndrii Nakryiko          'arg2' type_id=3
185ca253339SAndrii Nakryiko  [19] FUNC 'my_func' type_id=18
186ca253339SAndrii Nakryiko  [20] VAR 'struct_global_var' type_id=4, linkage=global-alloc
187ca253339SAndrii Nakryiko  [21] VAR 'global_var' type_id=3, linkage=global-alloc
188ca253339SAndrii Nakryiko  [22] VAR 'my_func.static_var' type_id=3, linkage=static
189ca253339SAndrii Nakryiko  [23] DATASEC 'data_sec' size=0 vlen=3
190ca253339SAndrii Nakryiko          type_id=20 offset=0 size=48
191ca253339SAndrii Nakryiko          type_id=21 offset=0 size=4
192ca253339SAndrii Nakryiko          type_id=22 offset=52 size=4
193ca253339SAndrii Nakryiko
194ca253339SAndrii NakryikoThe following commands print BTF types associated with specified map's key,
195ca253339SAndrii Nakryikovalue, both key and value, and all BTF types, respectively. By default, both
196ca253339SAndrii Nakryikokey and value types will be printed.
197ca253339SAndrii Nakryiko
198ca253339SAndrii Nakryiko**# bpftool btf dump map id 123 key**
199ca253339SAndrii Nakryiko
200ca253339SAndrii Nakryiko::
201ca253339SAndrii Nakryiko
202ca253339SAndrii Nakryiko  [39] TYPEDEF 'u32' type_id=37
203ca253339SAndrii Nakryiko
204ca253339SAndrii Nakryiko**# bpftool btf dump map id 123 value**
205ca253339SAndrii Nakryiko
206ca253339SAndrii Nakryiko::
207ca253339SAndrii Nakryiko
208ca253339SAndrii Nakryiko  [86] PTR '(anon)' type_id=87
209ca253339SAndrii Nakryiko
210ca253339SAndrii Nakryiko**# bpftool btf dump map id 123 kv**
211ca253339SAndrii Nakryiko
212ca253339SAndrii Nakryiko::
213ca253339SAndrii Nakryiko
214ca253339SAndrii Nakryiko  [39] TYPEDEF 'u32' type_id=37
215ca253339SAndrii Nakryiko  [86] PTR '(anon)' type_id=87
216ca253339SAndrii Nakryiko
217ca253339SAndrii Nakryiko**# bpftool btf dump map id 123 all**
218ca253339SAndrii Nakryiko
219ca253339SAndrii Nakryiko::
220ca253339SAndrii Nakryiko
221ca253339SAndrii Nakryiko  [1] PTR '(anon)' type_id=0
222ca253339SAndrii Nakryiko  .
223ca253339SAndrii Nakryiko  .
224ca253339SAndrii Nakryiko  .
225ca253339SAndrii Nakryiko  [2866] ARRAY '(anon)' type_id=52 index_type_id=51 nr_elems=4
226ca253339SAndrii Nakryiko
227ca253339SAndrii NakryikoAll the standard ways to specify map or program are supported:
228ca253339SAndrii Nakryiko
229ca253339SAndrii Nakryiko**# bpftool btf dump map id 123**
230ca253339SAndrii Nakryiko
231ca253339SAndrii Nakryiko**# bpftool btf dump map pinned /sys/fs/bpf/map_name**
232ca253339SAndrii Nakryiko
233ca253339SAndrii Nakryiko**# bpftool btf dump prog id 456**
234ca253339SAndrii Nakryiko
235ca253339SAndrii Nakryiko**# bpftool btf dump prog tag b88e0a09b1d9759d**
236ca253339SAndrii Nakryiko
237ca253339SAndrii Nakryiko**# bpftool btf dump prog pinned /sys/fs/bpf/prog_name**
2388cc8c635SQuentin Monnet
2398cc8c635SQuentin Monnet|
2408cc8c635SQuentin Monnet| **# bpftool btf dump file /sys/kernel/btf/i2c_smbus**
2418cc8c635SQuentin Monnet| (or)
2428cc8c635SQuentin Monnet| **# I2C_SMBUS_ID=$(bpftool btf show -p | jq '.[] | select(.name=="i2c_smbus").id')**
2438cc8c635SQuentin Monnet| **# bpftool btf dump id ${I2C_SMBUS_ID} -B /sys/kernel/btf/vmlinux**
2448cc8c635SQuentin Monnet
2458cc8c635SQuentin Monnet::
2468cc8c635SQuentin Monnet
2478cc8c635SQuentin Monnet  [104848] STRUCT 'i2c_smbus_alert' size=40 vlen=2
2488cc8c635SQuentin Monnet          'alert' type_id=393 bits_offset=0
2498cc8c635SQuentin Monnet          'ara' type_id=56050 bits_offset=256
2508cc8c635SQuentin Monnet  [104849] STRUCT 'alert_data' size=12 vlen=3
2518cc8c635SQuentin Monnet          'addr' type_id=16 bits_offset=0
2528cc8c635SQuentin Monnet          'type' type_id=56053 bits_offset=32
2538cc8c635SQuentin Monnet          'data' type_id=7 bits_offset=64
2548cc8c635SQuentin Monnet  [104850] PTR '(anon)' type_id=104848
2558cc8c635SQuentin Monnet  [104851] PTR '(anon)' type_id=104849
2568cc8c635SQuentin Monnet  [104852] FUNC 'i2c_register_spd' type_id=84745 linkage=static
2578cc8c635SQuentin Monnet  [104853] FUNC 'smbalert_driver_init' type_id=1213 linkage=static
2588cc8c635SQuentin Monnet  [104854] FUNC_PROTO '(anon)' ret_type_id=18 vlen=1
2598cc8c635SQuentin Monnet          'ara' type_id=56050
2608cc8c635SQuentin Monnet  [104855] FUNC 'i2c_handle_smbus_alert' type_id=104854 linkage=static
2618cc8c635SQuentin Monnet  [104856] FUNC 'smbalert_remove' type_id=104854 linkage=static
2628cc8c635SQuentin Monnet  [104857] FUNC_PROTO '(anon)' ret_type_id=18 vlen=2
2638cc8c635SQuentin Monnet          'ara' type_id=56050
2648cc8c635SQuentin Monnet          'id' type_id=56056
2658cc8c635SQuentin Monnet  [104858] FUNC 'smbalert_probe' type_id=104857 linkage=static
2668cc8c635SQuentin Monnet  [104859] FUNC 'smbalert_work' type_id=9695 linkage=static
2678cc8c635SQuentin Monnet  [104860] FUNC 'smbus_alert' type_id=71367 linkage=static
2688cc8c635SQuentin Monnet  [104861] FUNC 'smbus_do_alert' type_id=84827 linkage=static
269