(root)/
gcc-13.2.0/
include/
btf.h
       1  /* Declarations and definitions relating to the BPF Type Format (BTF).
       2     Copyright (C) 2021-2023 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_ENUM64 	19	/* Enumeration up to 64 bits.  */
     113  #define BTF_KIND_MAX		BTF_KIND_ENUM64
     114  #define NR_BTF_KINDS		(BTF_KIND_MAX + 1)
     115  
     116  /* For some BTF_KINDs, struct btf_type is immediately followed by
     117     additional data describing the type.  */
     118  
     119  /* BTF_KIND_INT is followed by a 32-bit word, with the following
     120     bit arrangement.  */
     121  #define BTF_INT_ENCODING(VAL)	(((VAL) & 0x0f000000) >> 24)
     122  #define BTF_INT_OFFSET(VAL)	(((VAL) & 0x00ff0000) >> 16)
     123  #define BTF_INT_BITS(VAL)	((VAL)  & 0x000000ff)
     124  
     125  #define BTF_INT_DATA(encoding, offset, bits) \
     126    ((((encoding) & 0x0f) << 24) | (((offset) & 0xff) << 16) | ((bits) & 0xff))
     127  
     128  /* BTF_INT_ENCODING holds the following attribute flags.  */
     129  #define BTF_INT_SIGNED 	(1 << 0)
     130  #define BTF_INT_CHAR 	(1 << 1)
     131  #define BTF_INT_BOOL	(1 << 2)
     132  
     133  /* BTF_KIND_ENUM is followed by VLEN struct btf_enum entries,
     134     which describe the enumerators. */
     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_KF_ENUM_ holds the flags for kflags in BTF_KIND_ENUM{,64}.  */
     142  #define BTF_KF_ENUM_UNSIGNED	(0)
     143  #define BTF_KF_ENUM_SIGNED 	(1 << 0)
     144  
     145  /* BTF_KIND_ARRAY is followed by a single struct btf_array.  */
     146  struct btf_array
     147  {
     148    uint32_t type;	/* Type of array elements.  */
     149    uint32_t index_type;	/* Type of array index.  */
     150    uint32_t nelems;	/* Number of elements. 0 for unsized/variable length.  */
     151  };
     152  
     153  /* BTF_KIND_STRUCT and BTF_KIND_UNION are followed by VLEN
     154     struct btf_member.  */
     155  struct btf_member
     156  {
     157    uint32_t name_off;	/* Offset in string section of member name.  */
     158    uint32_t type;	/* Type of member.  */
     159    uint32_t offset;	/* If the type info kind_flag is set, this contains
     160  			   both the member bitfield size and bit offset,
     161  			   according to the macros below. If kind_flag is not
     162  			   set, offset contains only the bit offset (from the
     163  			   beginning of the struct).  */
     164  };
     165  
     166  /* If struct or union type info kind_flag is set, used to access member
     167     bitfield size from btf_member.offset.  */
     168  #define BTF_MEMBER_BITFIELD_SIZE (val) 	((val) >> 24)
     169  /* If struct or union type info kind_flag is set, used to access member
     170     bit offset from btf_member.offset.  */
     171  #define BTF_MEMBER_BIT_OFFSET (val)	((val) & 0x00ffffff)
     172  
     173  /* BTF_KIND_FUNC_PROTO is followed by VLEN struct btf_param entries, which
     174     describe the types of the function parameters.  */
     175  struct btf_param
     176  {
     177    uint32_t name_off;	/* Offset in string section of parameter name.  */
     178    uint32_t type;	/* Type of parameter.  */
     179  };
     180  
     181  /* BTF_KIND_FUNC records encode linkage information in the VLEN bits
     182     of the type record.  These are the supported values.  */
     183  enum btf_func_linkage
     184  {
     185    BTF_FUNC_STATIC = 0,
     186    BTF_FUNC_GLOBAL = 1,
     187    BTF_FUNC_EXTERN = 2,
     188  };
     189  
     190  /* BTF_KIND_VAR records encode linkage information in a single
     191     trailing struct btf_var.  These are the supported values.  */
     192  enum btf_var_linkage
     193  {
     194    BTF_VAR_STATIC = 0,
     195    BTF_VAR_GLOBAL_ALLOCATED = 1,
     196    BTF_VAR_GLOBAL_EXTERN = 2,
     197  };
     198  
     199  /* BTF_KIND_VAR is followed by a single struct btf_var, which describes
     200     information about the variable.  */
     201  struct btf_var
     202  {
     203    uint32_t linkage;	/* 0=static, 1=global, 2=extern.  */
     204  };
     205  
     206  /* BTF_KIND_DATASEC is followed by VLEN struct btf_var_secinfo entries,
     207     which describe all BTF_KIND_VAR or extern BTF_KIND_FUNC types contained
     208     in the section.  */
     209  struct btf_var_secinfo
     210  {
     211    uint32_t type;	/* Type of BTF_KIND_VAR or BTF_KIND_FUNC item.  */
     212    uint32_t offset;	/* In-section offset (in bytes) of item.  */
     213    uint32_t size;	/* Size (in bytes) of item.  */
     214  };
     215  
     216  /* BTF_KIND_ENUM64 is followed by VLEN struct btf_enum64 entries,
     217     which describe the 64 bits enumerators.  */
     218  struct btf_enum64
     219  {
     220    uint32_t name_off;	/* Offset in string section of enumerator name.  */
     221    uint32_t val_lo32;	/* lower 32-bit value for a 64-bit value Enumerator */
     222    uint32_t val_hi32;	/* high 32-bit value for a 64-bit value Enumerator */
     223  };
     224  
     225  #ifdef	__cplusplus
     226  }
     227  #endif
     228  
     229  #endif /* _BTF_H_ */