133 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __PERF_UTIL_H3#define __PERF_UTIL_H4 5#define _BSD_SOURCE 16/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */7#define _DEFAULT_SOURCE 18 9#include <dirent.h>10#include <fcntl.h>11#include <stdbool.h>12#include <stddef.h>13#include <linux/compiler.h>14#include <sys/types.h>15#ifndef __cplusplus16#include <internal/cpumap.h>17#endif18 19extern const char perf_usage_string[];20extern const char perf_more_info_string[];21 22extern const char *input_name;23 24extern bool perf_host;25extern bool perf_guest;26 27/* General helper functions */28void usage(const char *err) __noreturn;29void die(const char *err, ...) __noreturn __printf(1, 2);30 31struct dirent;32struct strlist;33 34int mkdir_p(char *path, mode_t mode);35int rm_rf(const char *path);36int rm_rf_perf_data(const char *path);37struct strlist *lsdir(const char *name, bool (*filter)(const char *, struct dirent *));38bool lsdir_no_dot_filter(const char *name, struct dirent *d);39 40size_t hex_width(u64 v);41 42int sysctl__max_stack(void);43 44bool sysctl__nmi_watchdog_enabled(void);45 46int fetch_kernel_version(unsigned int *puint,47 char *str, size_t str_sz);48#define KVER_VERSION(x) (((x) >> 16) & 0xff)49#define KVER_PATCHLEVEL(x) (((x) >> 8) & 0xff)50#define KVER_SUBLEVEL(x) ((x) & 0xff)51#define KVER_FMT "%d.%d.%d"52#define KVER_PARAM(x) KVER_VERSION(x), KVER_PATCHLEVEL(x), KVER_SUBLEVEL(x)53 54int perf_tip(char **strp, const char *dirpath);55 56#ifndef HAVE_SCHED_GETCPU_SUPPORT57int sched_getcpu(void);58#endif59 60#ifndef HAVE_SCANDIRAT_SUPPORT61int scandirat(int dirfd, const char *dirp,62 struct dirent ***namelist,63 int (*filter)(const struct dirent *),64 int (*compar)(const struct dirent **, const struct dirent **));65#endif66 67extern bool perf_singlethreaded;68 69void perf_set_singlethreaded(void);70void perf_set_multithreaded(void);71 72char *perf_exe(char *buf, int len);73 74#ifndef O_CLOEXEC75#ifdef __sparc__76#define O_CLOEXEC 0x40000077#elif defined(__alpha__) || defined(__hppa__)78#define O_CLOEXEC 01000000079#else80#define O_CLOEXEC 0200000081#endif82#endif83 84extern bool test_attr__enabled;85void test_attr__ready(void);86void test_attr__init(void);87struct perf_event_attr;88void test_attr__open(struct perf_event_attr *attr, pid_t pid, struct perf_cpu cpu,89 int fd, int group_fd, unsigned long flags);90 91struct perf_debuginfod {92 const char *urls;93 bool set;94};95void perf_debuginfod_setup(struct perf_debuginfod *di);96 97char *filename_with_chroot(int pid, const char *filename);98 99int do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x,100 size_t msz, const void *init_val);101 102#define realloc_array_as_needed(a, n, x, v) ({ \103 typeof(x) __x = (x); \104 __x >= (n) ? \105 do_realloc_array_as_needed((void **)&(a), \106 &(n), \107 __x, \108 sizeof(*(a)), \109 (const void *)(v)) : \110 0; \111 })112 113static inline bool host_is_bigendian(void)114{115#ifdef __BYTE_ORDER__116#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__117 return false;118#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__119 return true;120#else121#error "Unrecognized __BYTE_ORDER__"122#endif123#else /* !__BYTE_ORDER__ */124 unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};125 unsigned int *ptr;126 127 ptr = (unsigned int *)(void *)str;128 return *ptr == 0x01020304;129#endif130}131 132#endif /* __PERF_UTIL_H */133