aboutsummaryrefslogtreecommitdiff
path: root/include/btf.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/btf.h')
-rw-r--r--include/btf.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/include/btf.h b/include/btf.h
new file mode 100644
index 0000000..3b1a4c3
--- /dev/null
+++ b/include/btf.h
@@ -0,0 +1,196 @@
+/* Declarations and definitions relating to the BPF Type Format (BTF).
+ Copyright (C) 2021 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+/* This file is derived from the BTF specification described in the
+ Linux kernel source tree (linux/Documentation/bpf/btf.rst). */
+
+#ifndef _BTF_H_
+#define _BTF_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* BTF magic number to identify header, endianness. */
+#define BTF_MAGIC 0xeb9f
+/* Data format version number. */
+#define BTF_VERSION 1
+
+struct btf_header
+{
+ uint16_t magic; /* Magic number (BTF_MAGIC). */
+ uint8_t version; /* Data format version (BTF_VERSION). */
+ uint8_t flags; /* Flags. Currently unused. */
+ uint32_t hdr_len; /* Length of this header (sizeof (struct btf_header)). */
+
+ /* Following offsets are relative to the end of this header. */
+ uint32_t type_off; /* Offset of type section, in bytes. */
+ uint32_t type_len; /* Length of type section, in bytes. */
+ uint32_t str_off; /* Offset of string section, in bytes. */
+ uint32_t str_len; /* Length of string section, in bytes. */
+};
+
+/* Maximum type identifier. */
+#define BTF_MAX_TYPE 0x000fffff
+/* Maximum offset into the string section. */
+#define BTF_MAX_NAME_OFFSET 0x00ffffff
+/* Maximum number of struct, union, enum members or func args. */
+#define BTF_MAX_VLEN 0xffff
+
+struct btf_type
+{
+ uint32_t name_off; /* Offset in string section of type name. */
+ uint32_t info; /* Encoded kind, variant length, kind flag:
+ - bits 0-15: vlen
+ - bits 16-23: unused
+ - bits 24-27: kind
+ - bits 28-30: unused
+ - bit 31: kind_flag
+ See accessor macros below. */
+
+ /* SIZE is used by INT, ENUM, STRUCT, UNION, DATASEC kinds.
+ TYPE is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, FUNC,
+ FUNC_PROTO and VAR kinds. */
+ union
+ {
+ uint32_t size; /* Size of the entire type, in bytes. */
+ uint32_t type; /* A type_id referring to another type. */
+ };
+};
+
+/* The folloing macros access the information encoded in btf_type.info. */
+/* Type kind. See below. */
+#define BTF_INFO_KIND(info) (((info) >> 24) & 0x0f)
+/* Number of entries of variable length data following certain type kinds.
+ For example, number of structure members, number of function parameters. */
+#define BTF_INFO_VLEN(info) ((info) & 0xffff)
+/* For BTF_KIND_FWD, 1 if forward to union, 0 if forward to struct.
+ For BTF_KIND_STRUCT and BTF_KIND_UNION, 1 if the struct/union contains
+ a bitfield. */
+#define BTF_INFO_KFLAG(info) ((info) >> 31)
+
+/* Encoding for struct btf_type.info. */
+#define BTF_TYPE_INFO(kind, kflag, vlen) \
+ ((((kflag) ? 1 : 0 ) << 31) | ((kind) << 24) | ((vlen) & 0xffff))
+
+#define BTF_KIND_UNKN 0 /* Unknown or invalid. */
+#define BTF_KIND_INT 1 /* Integer. */
+#define BTF_KIND_PTR 2 /* Pointer. */
+#define BTF_KIND_ARRAY 3 /* Array. */
+#define BTF_KIND_STRUCT 4 /* Struct. */
+#define BTF_KIND_UNION 5 /* Union. */
+#define BTF_KIND_ENUM 6 /* Enumeration. */
+#define BTF_KIND_FWD 7 /* Forward. */
+#define BTF_KIND_TYPEDEF 8 /* Typedef. */
+#define BTF_KIND_VOLATILE 9 /* Referenced type is volatile. */
+#define BTF_KIND_CONST 10 /* Referenced type is const. */
+#define BTF_KIND_RESTRICT 11 /* Restrict. */
+#define BTF_KIND_FUNC 12 /* Subprogram. */
+#define BTF_KIND_FUNC_PROTO 13 /* Function Prototype. */
+#define BTF_KIND_VAR 14 /* Variable. */
+#define BTF_KIND_DATASEC 15 /* Section such as .bss or .data. */
+#define BTF_KIND_MAX BTF_KIND_DATASEC
+#define NR_BTF_KINDS (BTF_KIND_MAX + 1)
+
+/* For some BTF_KINDs, struct btf_type is immediately followed by
+ additional data describing the type. */
+
+/* BTF_KIND_INT is followed by a 32-bit word, with the following
+ bit arrangement. */
+#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24)
+#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16)
+#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff)
+
+#define BTF_INT_DATA(encoding, offset, bits) \
+ ((((encoding) & 0x0f) << 24) | (((offset) & 0xff) << 16) | ((bits) & 0xff))
+
+/* BTF_INT_ENCODING holds the following attribute flags. */
+#define BTF_INT_SIGNED (1 << 0)
+#define BTF_INT_CHAR (1 << 1)
+#define BTF_INT_BOOL (1 << 2)
+
+/* BTF_KIND_ENUM is followed by VLEN struct btf_enum entries,
+ which describe the enumerators. Note that BTF currently only
+ supports signed 32-bit enumerator values. */
+struct btf_enum
+{
+ uint32_t name_off; /* Offset in string section of enumerator name. */
+ int32_t val; /* Enumerator value. */
+};
+
+/* BTF_KIND_ARRAY is followed by a single struct btf_array. */
+struct btf_array
+{
+ uint32_t type; /* Type of array elements. */
+ uint32_t index_type; /* Type of array index. */
+ uint32_t nelems; /* Number of elements. 0 for unsized/variable length. */
+};
+
+/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed by VLEN
+ struct btf_member. */
+struct btf_member
+{
+ uint32_t name_off; /* Offset in string section of member name. */
+ uint32_t type; /* Type of member. */
+ uint32_t offset; /* If the type info kind_flag is set, this contains
+ both the member bitfield size and bit offset,
+ according to the macros below. If kind_flag is not
+ set, offset contains only the bit offset (from the
+ beginning of the struct). */
+};
+
+/* If struct or union type info kind_flag is set, used to access member
+ bitfield size from btf_member.offset. */
+#define BTF_MEMBER_BITFIELD_SIZE (val) ((val) >> 24)
+/* If struct or union type info kind_flag is set, used to access member
+ bit offset from btf_member.offset. */
+#define BTF_MEMBER_BIT_OFFSET (val) ((val) & 0x00ffffff)
+
+/* BTF_KIND_FUNC_PROTO is followed by VLEN struct btf_param entries, which
+ describe the types of the function parameters. */
+struct btf_param
+{
+ uint32_t name_off; /* Offset in string section of parameter name. */
+ uint32_t type; /* Type of parameter. */
+};
+
+/* BTF_KIND_VAR is followed by a single struct btf_var, which describes
+ information about the variable. */
+struct btf_var
+{
+ uint32_t linkage; /* Currently only 0=static or 1=global. */
+};
+
+/* BTF_KIND_DATASEC is followed by VLEN struct btf_var_secinfo entries,
+ which describe all BTF_KIND_VAR types contained in the section. */
+struct btf_var_secinfo
+{
+ uint32_t type; /* Type of variable. */
+ uint32_t offset; /* In-section offset of variable (in bytes). */
+ uint32_t size; /* Size (in bytes) of variable. */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _BTF_H_ */