]> git.ipfire.org Git - thirdparty/gcc.git/blame - include/btf.h
Update copyright years.
[thirdparty/gcc.git] / include / btf.h
CommitLineData
b7e215a8 1/* Declarations and definitions relating to the BPF Type Format (BTF).
a945c346 2 Copyright (C) 2021-2024 Free Software Foundation, Inc.
b7e215a8
IB
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20/* This file is derived from the BTF specification described in the
21 Linux kernel source tree (linux/Documentation/bpf/btf.rst). */
22
23#ifndef _BTF_H_
24#define _BTF_H_
25
26#include <stdint.h>
27
28#ifdef __cplusplus
29extern "C"
30{
31#endif
32
33/* BTF magic number to identify header, endianness. */
34#define BTF_MAGIC 0xeb9f
35/* Data format version number. */
36#define BTF_VERSION 1
37
38struct btf_header
39{
40 uint16_t magic; /* Magic number (BTF_MAGIC). */
41 uint8_t version; /* Data format version (BTF_VERSION). */
42 uint8_t flags; /* Flags. Currently unused. */
43 uint32_t hdr_len; /* Length of this header (sizeof (struct btf_header)). */
44
45 /* Following offsets are relative to the end of this header. */
46 uint32_t type_off; /* Offset of type section, in bytes. */
47 uint32_t type_len; /* Length of type section, in bytes. */
48 uint32_t str_off; /* Offset of string section, in bytes. */
49 uint32_t str_len; /* Length of string section, in bytes. */
50};
51
52/* Maximum type identifier. */
53#define BTF_MAX_TYPE 0x000fffff
54/* Maximum offset into the string section. */
55#define BTF_MAX_NAME_OFFSET 0x00ffffff
56/* Maximum number of struct, union, enum members or func args. */
57#define BTF_MAX_VLEN 0xffff
58
59struct btf_type
60{
61 uint32_t name_off; /* Offset in string section of type name. */
62 uint32_t info; /* Encoded kind, variant length, kind flag:
63 - bits 0-15: vlen
64 - bits 16-23: unused
18d0fad7
DF
65 - bits 24-28: kind
66 - bits 29-30: unused
b7e215a8
IB
67 - bit 31: kind_flag
68 See accessor macros below. */
69
70 /* SIZE is used by INT, ENUM, STRUCT, UNION, DATASEC kinds.
71 TYPE is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, FUNC,
72 FUNC_PROTO and VAR kinds. */
73 union
74 {
75 uint32_t size; /* Size of the entire type, in bytes. */
76 uint32_t type; /* A type_id referring to another type. */
77 };
78};
79
80/* The folloing macros access the information encoded in btf_type.info. */
81/* Type kind. See below. */
18d0fad7 82#define BTF_INFO_KIND(info) (((info) >> 24) & 0x1f)
b7e215a8
IB
83/* Number of entries of variable length data following certain type kinds.
84 For example, number of structure members, number of function parameters. */
85#define BTF_INFO_VLEN(info) ((info) & 0xffff)
86/* For BTF_KIND_FWD, 1 if forward to union, 0 if forward to struct.
87 For BTF_KIND_STRUCT and BTF_KIND_UNION, 1 if the struct/union contains
88 a bitfield. */
89#define BTF_INFO_KFLAG(info) ((info) >> 31)
90
91/* Encoding for struct btf_type.info. */
92#define BTF_TYPE_INFO(kind, kflag, vlen) \
93 ((((kflag) ? 1 : 0 ) << 31) | ((kind) << 24) | ((vlen) & 0xffff))
94
95#define BTF_KIND_UNKN 0 /* Unknown or invalid. */
96#define BTF_KIND_INT 1 /* Integer. */
97#define BTF_KIND_PTR 2 /* Pointer. */
98#define BTF_KIND_ARRAY 3 /* Array. */
99#define BTF_KIND_STRUCT 4 /* Struct. */
100#define BTF_KIND_UNION 5 /* Union. */
101#define BTF_KIND_ENUM 6 /* Enumeration. */
102#define BTF_KIND_FWD 7 /* Forward. */
103#define BTF_KIND_TYPEDEF 8 /* Typedef. */
104#define BTF_KIND_VOLATILE 9 /* Referenced type is volatile. */
105#define BTF_KIND_CONST 10 /* Referenced type is const. */
106#define BTF_KIND_RESTRICT 11 /* Restrict. */
107#define BTF_KIND_FUNC 12 /* Subprogram. */
108#define BTF_KIND_FUNC_PROTO 13 /* Function Prototype. */
109#define BTF_KIND_VAR 14 /* Variable. */
110#define BTF_KIND_DATASEC 15 /* Section such as .bss or .data. */
18d0fad7 111#define BTF_KIND_FLOAT 16 /* Floating point. */
8422861b
GM
112#define BTF_KIND_ENUM64 19 /* Enumeration up to 64 bits. */
113#define BTF_KIND_MAX BTF_KIND_ENUM64
b7e215a8
IB
114#define NR_BTF_KINDS (BTF_KIND_MAX + 1)
115
116/* For some BTF_KINDs, struct btf_type is immediately followed by
117 additional data describing the type. */
118
119/* BTF_KIND_INT is followed by a 32-bit word, with the following
120 bit arrangement. */
121#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24)
122#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16)
123#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff)
124
125#define BTF_INT_DATA(encoding, offset, bits) \
126 ((((encoding) & 0x0f) << 24) | (((offset) & 0xff) << 16) | ((bits) & 0xff))
127
128/* BTF_INT_ENCODING holds the following attribute flags. */
129#define BTF_INT_SIGNED (1 << 0)
130#define BTF_INT_CHAR (1 << 1)
131#define BTF_INT_BOOL (1 << 2)
132
133/* BTF_KIND_ENUM is followed by VLEN struct btf_enum entries,
8422861b 134 which describe the enumerators. */
b7e215a8
IB
135struct btf_enum
136{
137 uint32_t name_off; /* Offset in string section of enumerator name. */
138 int32_t val; /* Enumerator value. */
139};
140
8422861b
GM
141/* BTF_KF_ENUM_ holds the flags for kflags in BTF_KIND_ENUM{,64}. */
142#define BTF_KF_ENUM_UNSIGNED (0)
143#define BTF_KF_ENUM_SIGNED (1 << 0)
144
b7e215a8
IB
145/* BTF_KIND_ARRAY is followed by a single struct btf_array. */
146struct btf_array
147{
148 uint32_t type; /* Type of array elements. */
149 uint32_t index_type; /* Type of array index. */
150 uint32_t nelems; /* Number of elements. 0 for unsized/variable length. */
151};
152
153/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed by VLEN
154 struct btf_member. */
155struct btf_member
156{
157 uint32_t name_off; /* Offset in string section of member name. */
158 uint32_t type; /* Type of member. */
159 uint32_t offset; /* If the type info kind_flag is set, this contains
160 both the member bitfield size and bit offset,
161 according to the macros below. If kind_flag is not
162 set, offset contains only the bit offset (from the
163 beginning of the struct). */
164};
165
166/* If struct or union type info kind_flag is set, used to access member
167 bitfield size from btf_member.offset. */
168#define BTF_MEMBER_BITFIELD_SIZE (val) ((val) >> 24)
169/* If struct or union type info kind_flag is set, used to access member
170 bit offset from btf_member.offset. */
171#define BTF_MEMBER_BIT_OFFSET (val) ((val) & 0x00ffffff)
172
173/* BTF_KIND_FUNC_PROTO is followed by VLEN struct btf_param entries, which
174 describe the types of the function parameters. */
175struct btf_param
176{
177 uint32_t name_off; /* Offset in string section of parameter name. */
178 uint32_t type; /* Type of parameter. */
179};
180
70b30304
DF
181/* BTF_KIND_FUNC records encode linkage information in the VLEN bits
182 of the type record. These are the supported values. */
183enum btf_func_linkage
184{
185 BTF_FUNC_STATIC = 0,
186 BTF_FUNC_GLOBAL = 1,
187 BTF_FUNC_EXTERN = 2,
188};
189
2bce22e8
DF
190/* BTF_KIND_VAR records encode linkage information in a single
191 trailing struct btf_var. These are the supported values. */
192enum btf_var_linkage
193{
194 BTF_VAR_STATIC = 0,
195 BTF_VAR_GLOBAL_ALLOCATED = 1,
196 BTF_VAR_GLOBAL_EXTERN = 2,
197};
198
b7e215a8
IB
199/* BTF_KIND_VAR is followed by a single struct btf_var, which describes
200 information about the variable. */
201struct btf_var
202{
2bce22e8 203 uint32_t linkage; /* 0=static, 1=global, 2=extern. */
b7e215a8
IB
204};
205
206/* BTF_KIND_DATASEC is followed by VLEN struct btf_var_secinfo entries,
70b30304
DF
207 which describe all BTF_KIND_VAR or extern BTF_KIND_FUNC types contained
208 in the section. */
b7e215a8
IB
209struct btf_var_secinfo
210{
70b30304
DF
211 uint32_t type; /* Type of BTF_KIND_VAR or BTF_KIND_FUNC item. */
212 uint32_t offset; /* In-section offset (in bytes) of item. */
213 uint32_t size; /* Size (in bytes) of item. */
b7e215a8
IB
214};
215
8422861b
GM
216/* BTF_KIND_ENUM64 is followed by VLEN struct btf_enum64 entries,
217 which describe the 64 bits enumerators. */
218struct btf_enum64
219{
220 uint32_t name_off; /* Offset in string section of enumerator name. */
221 uint32_t val_lo32; /* lower 32-bit value for a 64-bit value Enumerator */
222 uint32_t val_hi32; /* high 32-bit value for a 64-bit value Enumerator */
223};
224
b7e215a8
IB
225#ifdef __cplusplus
226}
227#endif
228
229#endif /* _BTF_H_ */