]>
Commit | Line | Data |
---|---|---|
b7e215a8 | 1 | /* Declarations and definitions relating to the BPF Type Format (BTF). |
7adcbafe | 2 | Copyright (C) 2021-2022 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 | |
29 | extern "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 | ||
38 | struct 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 | ||
59 | struct 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 DF |
111 | #define BTF_KIND_FLOAT 16 /* Floating point. */ |
112 | #define BTF_KIND_MAX BTF_KIND_FLOAT | |
b7e215a8 IB |
113 | #define NR_BTF_KINDS (BTF_KIND_MAX + 1) |
114 | ||
115 | /* For some BTF_KINDs, struct btf_type is immediately followed by | |
116 | additional data describing the type. */ | |
117 | ||
118 | /* BTF_KIND_INT is followed by a 32-bit word, with the following | |
119 | bit arrangement. */ | |
120 | #define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24) | |
121 | #define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16) | |
122 | #define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff) | |
123 | ||
124 | #define BTF_INT_DATA(encoding, offset, bits) \ | |
125 | ((((encoding) & 0x0f) << 24) | (((offset) & 0xff) << 16) | ((bits) & 0xff)) | |
126 | ||
127 | /* BTF_INT_ENCODING holds the following attribute flags. */ | |
128 | #define BTF_INT_SIGNED (1 << 0) | |
129 | #define BTF_INT_CHAR (1 << 1) | |
130 | #define BTF_INT_BOOL (1 << 2) | |
131 | ||
132 | /* BTF_KIND_ENUM is followed by VLEN struct btf_enum entries, | |
133 | which describe the enumerators. Note that BTF currently only | |
134 | supports signed 32-bit enumerator values. */ | |
135 | struct btf_enum | |
136 | { | |
137 | uint32_t name_off; /* Offset in string section of enumerator name. */ | |
138 | int32_t val; /* Enumerator value. */ | |
139 | }; | |
140 | ||
141 | /* BTF_KIND_ARRAY is followed by a single struct btf_array. */ | |
142 | struct btf_array | |
143 | { | |
144 | uint32_t type; /* Type of array elements. */ | |
145 | uint32_t index_type; /* Type of array index. */ | |
146 | uint32_t nelems; /* Number of elements. 0 for unsized/variable length. */ | |
147 | }; | |
148 | ||
149 | /* BTF_KIND_STRUCT and BTF_KIND_UNION are followed by VLEN | |
150 | struct btf_member. */ | |
151 | struct btf_member | |
152 | { | |
153 | uint32_t name_off; /* Offset in string section of member name. */ | |
154 | uint32_t type; /* Type of member. */ | |
155 | uint32_t offset; /* If the type info kind_flag is set, this contains | |
156 | both the member bitfield size and bit offset, | |
157 | according to the macros below. If kind_flag is not | |
158 | set, offset contains only the bit offset (from the | |
159 | beginning of the struct). */ | |
160 | }; | |
161 | ||
162 | /* If struct or union type info kind_flag is set, used to access member | |
163 | bitfield size from btf_member.offset. */ | |
164 | #define BTF_MEMBER_BITFIELD_SIZE (val) ((val) >> 24) | |
165 | /* If struct or union type info kind_flag is set, used to access member | |
166 | bit offset from btf_member.offset. */ | |
167 | #define BTF_MEMBER_BIT_OFFSET (val) ((val) & 0x00ffffff) | |
168 | ||
169 | /* BTF_KIND_FUNC_PROTO is followed by VLEN struct btf_param entries, which | |
170 | describe the types of the function parameters. */ | |
171 | struct btf_param | |
172 | { | |
173 | uint32_t name_off; /* Offset in string section of parameter name. */ | |
174 | uint32_t type; /* Type of parameter. */ | |
175 | }; | |
176 | ||
177 | /* BTF_KIND_VAR is followed by a single struct btf_var, which describes | |
178 | information about the variable. */ | |
179 | struct btf_var | |
180 | { | |
181 | uint32_t linkage; /* Currently only 0=static or 1=global. */ | |
182 | }; | |
183 | ||
184 | /* BTF_KIND_DATASEC is followed by VLEN struct btf_var_secinfo entries, | |
185 | which describe all BTF_KIND_VAR types contained in the section. */ | |
186 | struct btf_var_secinfo | |
187 | { | |
188 | uint32_t type; /* Type of variable. */ | |
189 | uint32_t offset; /* In-section offset of variable (in bytes). */ | |
190 | uint32_t size; /* Size (in bytes) of variable. */ | |
191 | }; | |
192 | ||
193 | #ifdef __cplusplus | |
194 | } | |
195 | #endif | |
196 | ||
197 | #endif /* _BTF_H_ */ |