162306a36Sopenharmony_ci/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __PERF_BPF_UTILS_H 462306a36Sopenharmony_ci#define __PERF_BPF_UTILS_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#define ptr_to_u64(ptr) ((__u64)(unsigned long)(ptr)) 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifdef HAVE_LIBBPF_SUPPORT 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <bpf/libbpf.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* 1362306a36Sopenharmony_ci * Get bpf_prog_info in continuous memory 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci * struct bpf_prog_info has multiple arrays. The user has option to choose 1662306a36Sopenharmony_ci * arrays to fetch from kernel. The following APIs provide an uniform way to 1762306a36Sopenharmony_ci * fetch these data. All arrays in bpf_prog_info are stored in a single 1862306a36Sopenharmony_ci * continuous memory region. This makes it easy to store the info in a 1962306a36Sopenharmony_ci * file. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * Before writing perf_bpil to files, it is necessary to 2262306a36Sopenharmony_ci * translate pointers in bpf_prog_info to offsets. Helper functions 2362306a36Sopenharmony_ci * bpil_addr_to_offs() and bpil_offs_to_addr() 2462306a36Sopenharmony_ci * are introduced to switch between pointers and offsets. 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * Examples: 2762306a36Sopenharmony_ci * # To fetch map_ids and prog_tags: 2862306a36Sopenharmony_ci * __u64 arrays = (1UL << PERF_BPIL_MAP_IDS) | 2962306a36Sopenharmony_ci * (1UL << PERF_BPIL_PROG_TAGS); 3062306a36Sopenharmony_ci * struct perf_bpil *info_linear = 3162306a36Sopenharmony_ci * get_bpf_prog_info_linear(fd, arrays); 3262306a36Sopenharmony_ci * 3362306a36Sopenharmony_ci * # To save data in file 3462306a36Sopenharmony_ci * bpil_addr_to_offs(info_linear); 3562306a36Sopenharmony_ci * write(f, info_linear, sizeof(*info_linear) + info_linear->data_len); 3662306a36Sopenharmony_ci * 3762306a36Sopenharmony_ci * # To read data from file 3862306a36Sopenharmony_ci * read(f, info_linear, <proper_size>); 3962306a36Sopenharmony_ci * bpil_offs_to_addr(info_linear); 4062306a36Sopenharmony_ci */ 4162306a36Sopenharmony_cienum perf_bpil_array_types { 4262306a36Sopenharmony_ci PERF_BPIL_FIRST_ARRAY = 0, 4362306a36Sopenharmony_ci PERF_BPIL_JITED_INSNS = 0, 4462306a36Sopenharmony_ci PERF_BPIL_XLATED_INSNS, 4562306a36Sopenharmony_ci PERF_BPIL_MAP_IDS, 4662306a36Sopenharmony_ci PERF_BPIL_JITED_KSYMS, 4762306a36Sopenharmony_ci PERF_BPIL_JITED_FUNC_LENS, 4862306a36Sopenharmony_ci PERF_BPIL_FUNC_INFO, 4962306a36Sopenharmony_ci PERF_BPIL_LINE_INFO, 5062306a36Sopenharmony_ci PERF_BPIL_JITED_LINE_INFO, 5162306a36Sopenharmony_ci PERF_BPIL_PROG_TAGS, 5262306a36Sopenharmony_ci PERF_BPIL_LAST_ARRAY, 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct perf_bpil { 5662306a36Sopenharmony_ci /* size of struct bpf_prog_info, when the tool is compiled */ 5762306a36Sopenharmony_ci __u32 info_len; 5862306a36Sopenharmony_ci /* total bytes allocated for data, round up to 8 bytes */ 5962306a36Sopenharmony_ci __u32 data_len; 6062306a36Sopenharmony_ci /* which arrays are included in data */ 6162306a36Sopenharmony_ci __u64 arrays; 6262306a36Sopenharmony_ci struct bpf_prog_info info; 6362306a36Sopenharmony_ci __u8 data[]; 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistruct perf_bpil * 6762306a36Sopenharmony_ciget_bpf_prog_info_linear(int fd, __u64 arrays); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_civoid 7062306a36Sopenharmony_cibpil_addr_to_offs(struct perf_bpil *info_linear); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_civoid 7362306a36Sopenharmony_cibpil_offs_to_addr(struct perf_bpil *info_linear); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#endif /* HAVE_LIBBPF_SUPPORT */ 7662306a36Sopenharmony_ci#endif /* __PERF_BPF_UTILS_H */ 77