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