162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __PERF_UTIL_H 362306a36Sopenharmony_ci#define __PERF_UTIL_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#define _BSD_SOURCE 1 662306a36Sopenharmony_ci/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */ 762306a36Sopenharmony_ci#define _DEFAULT_SOURCE 1 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <fcntl.h> 1062306a36Sopenharmony_ci#include <stdbool.h> 1162306a36Sopenharmony_ci#include <stddef.h> 1262306a36Sopenharmony_ci#include <linux/compiler.h> 1362306a36Sopenharmony_ci#include <sys/types.h> 1462306a36Sopenharmony_ci#ifndef __cplusplus 1562306a36Sopenharmony_ci#include <internal/cpumap.h> 1662306a36Sopenharmony_ci#endif 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciextern const char perf_usage_string[]; 1962306a36Sopenharmony_ciextern const char perf_more_info_string[]; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciextern const char *input_name; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciextern bool perf_host; 2462306a36Sopenharmony_ciextern bool perf_guest; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* General helper functions */ 2762306a36Sopenharmony_civoid usage(const char *err) __noreturn; 2862306a36Sopenharmony_civoid die(const char *err, ...) __noreturn __printf(1, 2); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct dirent; 3162306a36Sopenharmony_cistruct strlist; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciint mkdir_p(char *path, mode_t mode); 3462306a36Sopenharmony_ciint rm_rf(const char *path); 3562306a36Sopenharmony_ciint rm_rf_perf_data(const char *path); 3662306a36Sopenharmony_cistruct strlist *lsdir(const char *name, bool (*filter)(const char *, struct dirent *)); 3762306a36Sopenharmony_cibool lsdir_no_dot_filter(const char *name, struct dirent *d); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cisize_t hex_width(u64 v); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ciint sysctl__max_stack(void); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cibool sysctl__nmi_watchdog_enabled(void); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciint fetch_kernel_version(unsigned int *puint, 4662306a36Sopenharmony_ci char *str, size_t str_sz); 4762306a36Sopenharmony_ci#define KVER_VERSION(x) (((x) >> 16) & 0xff) 4862306a36Sopenharmony_ci#define KVER_PATCHLEVEL(x) (((x) >> 8) & 0xff) 4962306a36Sopenharmony_ci#define KVER_SUBLEVEL(x) ((x) & 0xff) 5062306a36Sopenharmony_ci#define KVER_FMT "%d.%d.%d" 5162306a36Sopenharmony_ci#define KVER_PARAM(x) KVER_VERSION(x), KVER_PATCHLEVEL(x), KVER_SUBLEVEL(x) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ciint perf_tip(char **strp, const char *dirpath); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#ifndef HAVE_SCHED_GETCPU_SUPPORT 5662306a36Sopenharmony_ciint sched_getcpu(void); 5762306a36Sopenharmony_ci#endif 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciextern bool perf_singlethreaded; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_civoid perf_set_singlethreaded(void); 6262306a36Sopenharmony_civoid perf_set_multithreaded(void); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cichar *perf_exe(char *buf, int len); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#ifndef O_CLOEXEC 6762306a36Sopenharmony_ci#ifdef __sparc__ 6862306a36Sopenharmony_ci#define O_CLOEXEC 0x400000 6962306a36Sopenharmony_ci#elif defined(__alpha__) || defined(__hppa__) 7062306a36Sopenharmony_ci#define O_CLOEXEC 010000000 7162306a36Sopenharmony_ci#else 7262306a36Sopenharmony_ci#define O_CLOEXEC 02000000 7362306a36Sopenharmony_ci#endif 7462306a36Sopenharmony_ci#endif 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciextern bool test_attr__enabled; 7762306a36Sopenharmony_civoid test_attr__ready(void); 7862306a36Sopenharmony_civoid test_attr__init(void); 7962306a36Sopenharmony_cistruct perf_event_attr; 8062306a36Sopenharmony_civoid test_attr__open(struct perf_event_attr *attr, pid_t pid, struct perf_cpu cpu, 8162306a36Sopenharmony_ci int fd, int group_fd, unsigned long flags); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistruct perf_debuginfod { 8462306a36Sopenharmony_ci const char *urls; 8562306a36Sopenharmony_ci bool set; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_civoid perf_debuginfod_setup(struct perf_debuginfod *di); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cichar *filename_with_chroot(int pid, const char *filename); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciint do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x, 9262306a36Sopenharmony_ci size_t msz, const void *init_val); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define realloc_array_as_needed(a, n, x, v) ({ \ 9562306a36Sopenharmony_ci typeof(x) __x = (x); \ 9662306a36Sopenharmony_ci __x >= (n) ? \ 9762306a36Sopenharmony_ci do_realloc_array_as_needed((void **)&(a), \ 9862306a36Sopenharmony_ci &(n), \ 9962306a36Sopenharmony_ci __x, \ 10062306a36Sopenharmony_ci sizeof(*(a)), \ 10162306a36Sopenharmony_ci (const void *)(v)) : \ 10262306a36Sopenharmony_ci 0; \ 10362306a36Sopenharmony_ci }) 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic inline bool host_is_bigendian(void) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci#ifdef __BYTE_ORDER__ 10862306a36Sopenharmony_ci#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 10962306a36Sopenharmony_ci return false; 11062306a36Sopenharmony_ci#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 11162306a36Sopenharmony_ci return true; 11262306a36Sopenharmony_ci#else 11362306a36Sopenharmony_ci#error "Unrecognized __BYTE_ORDER__" 11462306a36Sopenharmony_ci#endif 11562306a36Sopenharmony_ci#else /* !__BYTE_ORDER__ */ 11662306a36Sopenharmony_ci unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0}; 11762306a36Sopenharmony_ci unsigned int *ptr; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci ptr = (unsigned int *)(void *)str; 12062306a36Sopenharmony_ci return *ptr == 0x01020304; 12162306a36Sopenharmony_ci#endif 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#endif /* __PERF_UTIL_H */ 125