xref: /netbsd-src/external/gpl3/gcc/dist/include/btf.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Declarations and definitions relating to the BPF Type Format (BTF).
2    Copyright (C) 2021-2022 Free Software Foundation, Inc.
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
65 			   - bits 24-28: kind
66 			   - bits 29-30: unused
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.  */
82 #define BTF_INFO_KIND(info)	(((info) >> 24) & 0x1f)
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.  */
111 #define BTF_KIND_FLOAT		16	/* Floating point.  */
112 #define BTF_KIND_MAX		BTF_KIND_FLOAT
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_ */
198