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