/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ #ifndef __TRACE_HELPERS_H #define __TRACE_HELPERS_H #include #define NSEC_PER_SEC 1000000000ULL struct ksym { const char *name; unsigned long addr; }; struct ksyms; struct ksyms *ksyms__load(void); void ksyms__free(struct ksyms *ksyms); const struct ksym *ksyms__map_addr(const struct ksyms *ksyms, unsigned long addr); const struct ksym *ksyms__get_symbol(const struct ksyms *ksyms, const char *name); struct sym { const char *name; unsigned long start; unsigned long size; }; struct syms; struct syms *syms__load_pid(int tgid); struct syms *syms__load_file(const char *fname); void syms__free(struct syms *syms); const struct sym *syms__map_addr(const struct syms *syms, unsigned long addr); struct syms_cache; struct syms_cache *syms_cache__new(int nr); struct syms *syms_cache__get_syms(struct syms_cache *syms_cache, int tgid); void syms_cache__free(struct syms_cache *syms_cache); struct partition { char *name; unsigned int dev; }; struct partitions; struct partitions *partitions__load(void); void partitions__free(struct partitions *partitions); const struct partition * partitions__get_by_dev(const struct partitions *partitions, unsigned int dev); const struct partition * partitions__get_by_name(const struct partitions *partitions, const char *name); void print_log2_hist(unsigned int *vals, int vals_size, const char *val_type); void print_linear_hist(unsigned int *vals, int vals_size, unsigned int base, unsigned int step, const char *val_type); unsigned long long get_ktime_ns(void); int bump_memlock_rlimit(void); bool is_kernel_module(const char *name); /* * When attempting to use kprobe/kretprobe, please check out new fentry/fexit * probes, as they provide better performance and usability. But in some * situations we have to fallback to kprobe/kretprobe probes. This helper * is used to detect fentry/fexit support for the specified kernel function. * * 1. A gap between kernel versions, kernel BTF is exposed * starting from 5.4 kernel. but fentry/fexit is actually * supported starting from 5.5. * 2. Whether kernel supports module BTF or not * * *name* is the name of a kernel function to be attached to, which can be * from vmlinux or a kernel module. * *mod* is a hint that indicates the *name* may reside in module BTF, * if NULL, it means *name* belongs to vmlinux. */ bool fentry_exists(const char *name, const char *mod); /* * The name of a kernel function to be attached to may be changed between * kernel releases. This helper is used to confirm whether the target kernel * uses a certain function name before attaching. * * It is achieved by scaning * /sys/kernel/debug/tracing/available_filter_functions * If this file does not exist, it fallbacks to parse /proc/kallsyms, * which is slower. */ bool kprobe_exists(const char *name); bool vmlinux_btf_exists(void); bool module_btf_exists(const char *mod); #endif /* __TRACE_HELPERS_H */