diff options
Diffstat (limited to 'tools/lib/bpf/btf.h')
| -rw-r--r-- | tools/lib/bpf/btf.h | 26 | 
1 files changed, 24 insertions, 2 deletions
diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h index 583760df83b4..8e6880d91c84 100644 --- a/tools/lib/bpf/btf.h +++ b/tools/lib/bpf/btf.h @@ -116,7 +116,6 @@ LIBBPF_API struct btf *btf__parse_raw_split(const char *path, struct btf *base_b  LIBBPF_API struct btf *btf__load_vmlinux_btf(void);  LIBBPF_API struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf); -LIBBPF_API struct btf *libbpf_find_kernel_btf(void);  LIBBPF_API struct btf *btf__load_from_kernel_by_id(__u32 id);  LIBBPF_API struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf); @@ -487,6 +486,8 @@ static inline struct btf_enum *btf_enum(const struct btf_type *t)  	return (struct btf_enum *)(t + 1);  } +struct btf_enum64; +  static inline struct btf_enum64 *btf_enum64(const struct btf_type *t)  {  	return (struct btf_enum64 *)(t + 1); @@ -494,7 +495,28 @@ static inline struct btf_enum64 *btf_enum64(const struct btf_type *t)  static inline __u64 btf_enum64_value(const struct btf_enum64 *e)  { -	return ((__u64)e->val_hi32 << 32) | e->val_lo32; +	/* struct btf_enum64 is introduced in Linux 6.0, which is very +	 * bleeding-edge. Here we are avoiding relying on struct btf_enum64 +	 * definition coming from kernel UAPI headers to support wider range +	 * of system-wide kernel headers. +	 * +	 * Given this header can be also included from C++ applications, that +	 * further restricts C tricks we can use (like using compatible +	 * anonymous struct). So just treat struct btf_enum64 as +	 * a three-element array of u32 and access second (lo32) and third +	 * (hi32) elements directly. +	 * +	 * For reference, here is a struct btf_enum64 definition: +	 * +	 * const struct btf_enum64 { +	 *	__u32	name_off; +	 *	__u32	val_lo32; +	 *	__u32	val_hi32; +	 * }; +	 */ +	const __u32 *e64 = (const __u32 *)e; + +	return ((__u64)e64[2] << 32) | e64[1];  }  static inline struct btf_member *btf_members(const struct btf_type *t)  |