Documentation/bpf: Describe new location-related BTF kinds

Update BTF specification to describe encoding schemes for
BTF_KIND_LOC_PARAM, BTF_KIND_LOC_PROTO and BTF_KIND_LOCSEC.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://patch.msgid.link/20260924111428.75957-12-alan.maguire@oracle.com
This commit is contained in:
Alan Maguire 2026-09-24 12:14:28 +01:00 committed by Alexei Starovoitov
parent 3429e01578
commit ce2913d959
No known key found for this signature in database

View File

@ -88,6 +88,9 @@ sequentially and type id is assigned to each recognized type starting from id
#define BTF_KIND_DECL_TAG 17 /* Decl Tag */
#define BTF_KIND_TYPE_TAG 18 /* Type Tag */
#define BTF_KIND_ENUM64 19 /* Enumeration up to 64-bit values */
#define BTF_KIND_LOC_PARAM 20 /* Location description (register, const etc) */
#define BTF_KIND_LOC_PROTO 21 /* Set of location parameters for site */
#define BTF_KIND_LOCSEC 22 /* Section with site descriptions */
Note that the type section encodes debug info, not just pure types.
``BTF_KIND_FUNC`` is not a type, and it represents a defined subprogram.
@ -104,11 +107,13 @@ Each type contains the following common data::
* decl_tag and type_tag
*/
__u32 info;
/* "size" is used by INT, ENUM, STRUCT, UNION and ENUM64.
/* "size" is used by INT, ENUM, STRUCT, UNION, ENUM64 and
* LOC_PARAM.
* "size" tells the size of the type it is describing.
*
* "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT,
* FUNC, FUNC_PROTO, DECL_TAG and TYPE_TAG.
* FUNC, FUNC_PROTO, DECL_TAG and TYPE_TAG. It is unused by
* LOC_PROTO and LOCSEC.
* "type" is a type_id referring to another type.
*/
union {
@ -563,6 +568,80 @@ The ``btf_enum64`` encoding:
If the original enum value is signed and the size is less than 8,
that value will be sign extended into 8 bytes.
2.2.20 BTF_KIND_LOC_PARAM
~~~~~~~~~~~~~~~~~~~~~~~~~~
``struct btf_type`` encoding requirement:
* ``name_off``: 0
* ``info.kind_flag``: 0
* ``info.kind``: BTF_KIND_LOC_PARAM
* ``info.vlen``: number of 32-bit location value words
* ``size``: size in bytes of the represented parameter: 1 through 16
``btf_type`` is followed by a ``struct btf_loc_param`` and ``info.vlen``
number of 32-bit value words.::
struct btf_loc_param {
__u32 flags;
__u32 values[];
};
The ``flags`` field describes how to interpret ``values``:
* ``BTF_LOC_PARAM_CONST`` describes a constant; the value is stored in
low-word, high-word order when it requires 64 bits.
* ``BTF_LOC_PARAM_ADDR | BTF_LOC_PARAM_CONST`` describes an address offset
relative to the runtime base address of the kernel or module image.
* ``BTF_LOC_PARAM_REG`` with one word describes a register number; with two
words it describes a multi-register parameter.
* ``BTF_LOC_PARAM_REG | BTF_LOC_PARAM_OFFSET`` describes an address held in
a register plus an offset. Adding ``BTF_LOC_PARAM_DEREF`` dereferences
that address. ``BTF_LOC_PARAM_REG | BTF_LOC_PARAM_DEREF`` with one word
dereferences the value held in the register.
* ``BTF_LOC_PARAM_SIGNED`` makes a constant or offset signed. A constant's
signed width is ``size``. For a register-relative offset, its signed
width is the number of offset value words times 32 bits.
2.2.21 BTF_KIND_LOC_PROTO
~~~~~~~~~~~~~~~~~~~~~~~~~~
``struct btf_type`` encoding requirement:
* ``name_off``: 0
* ``info.kind_flag``: 0
* ``info.kind``: BTF_KIND_LOC_PROTO
* ``info.vlen``: number of function parameter locations
* ``type``: 0
``btf_type`` is followed by ``info.vlen`` number of ``__u32`` BTF type IDs.
Each entry corresponds to a function parameter at an inline site. An entry is
either 0, meaning that no location information is available, or the type ID
of a ``BTF_KIND_LOC_PARAM``.
2.2.22 BTF_KIND_LOCSEC
~~~~~~~~~~~~~~~~~~~~~~
``struct btf_type`` encoding requirement:
* ``name_off``: offset to a valid ELF section name
* ``info.kind_flag``: 0
* ``info.kind``: BTF_KIND_LOCSEC
* ``info.vlen``: number of inline sites in the section
* ``type``: 0
``btf_type`` is followed by ``info.vlen`` number of ``struct btf_loc``.::
struct btf_loc {
__u32 func;
__u32 loc_proto;
__u32 offset;
};
The ``func`` field is the non-zero type ID of the ``BTF_KIND_FUNC`` being
described. ``loc_proto`` is the non-zero type ID of the associated
``BTF_KIND_LOC_PROTO``. ``offset`` is the location address offset relative to
the runtime base address of the ELF section associated with the LOCSEC.
For example, a LOCSEC named ``inline.text`` contains records for ``.text``
whose offsets are relative to the runtime base of that section.
2.3 Constant Values
-------------------