LLVM14 added support for a new C attribute ([1]) __attribute__((btf_tag("arbitrary_str"))) This attribute will be emitted to dwarf ([2]) and pahole will convert it to BTF. Or for bpf target, this attribute will be emitted to BTF directly ([3], [4]). The attribute is intended to provide additional information for - struct/union type or struct/union member - static/global variables - static/global function or function parameter. For linux kernel, the btf_tag can be applied in various places to specify user pointer, function pre- or post- condition, function allow/deny in certain context, etc. Such information will be encoded in vmlinux BTF and can be used by verifier. The btf_tag can also be applied to bpf programs to help global verifiable functions, e.g., specifying preconditions, etc. This patch added basic parsing and checking support in kernel for new BTF_KIND_TAG kind. [1] https://reviews.llvm.org/D106614 [2] https://reviews.llvm.org/D106621 [3] https://reviews.llvm.org/D106622 [4] https://reviews.llvm.org/D109560
Showing the changes to include/uapi (1 of 3 files). Show all
Unified · Split
| @@ -43,7 +43,7 @@ struct btf_type { · 42 unmodified lines | |||
| 43 | * "size" tells the size of the type it is describing. | 43 | * "size" tells the size of the type it is describing. |
| 44 | * | 44 | * |
| 45 | * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, | 45 | * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, |
| 46 | * FUNC, FUNC_PROTO and VAR. | 46 | * FUNC, FUNC_PROTO, VAR and TAG. |
| 47 | * "type" is a type_id referring to another type. | 47 | * "type" is a type_id referring to another type. |
| 48 | */ | 48 | */ |
| 49 | union { | 49 | union { |
| @@ -74,6 +74,7 @@ enum { · 24 unmodified lines | |||
| 74 | BTF_KIND_VAR = 14, /* Variable */ | 74 | BTF_KIND_VAR = 14, /* Variable */ |
| 75 | BTF_KIND_DATASEC = 15, /* Section */ | 75 | BTF_KIND_DATASEC = 15, /* Section */ |
| 76 | BTF_KIND_FLOAT = 16, /* Floating point */ | 76 | BTF_KIND_FLOAT = 16, /* Floating point */ |
| 77 | BTF_KIND_TAG = 17, /* Tag */ | ||
| 77 | 78 | ||
| 78 | NR_BTF_KINDS, | 79 | NR_BTF_KINDS, |
| 79 | BTF_KIND_MAX = NR_BTF_KINDS - 1, | 80 | BTF_KIND_MAX = NR_BTF_KINDS - 1, |
| @@ -173,4 +174,15 @@ struct btf_var_secinfo { · 93 unmodified lines | |||
| 173 | __u32 size; | 174 | __u32 size; |
| 174 | }; | 175 | }; |
| 175 | 176 | ||
| 177 | /* BTF_KIND_TAG is followed by a single "struct btf_tag" to describe | ||
| 178 | * additional information related to the tag applied location. | ||
| 179 | * If component_idx == -1, the tag is applied to a struct, union, | ||
| 180 | * variable or function. Otherwise, it is applied to a struct/union | ||
| 181 | * member or a func argument, and component_idx indicates which member | ||
| 182 | * or argument (0 ... vlen-1). | ||
| 183 | */ | ||
| 184 | struct btf_tag { | ||
| 185 | __s32 component_idx; | ||
| 186 | }; | ||
| 187 | |||
| 176 | #endif /* _UAPI__LINUX_BTF_H__ */ | 188 | #endif /* _UAPI__LINUX_BTF_H__ */ |