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