162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __PERF_DATA_H
362306a36Sopenharmony_ci#define __PERF_DATA_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <stdio.h>
662306a36Sopenharmony_ci#include <stdbool.h>
762306a36Sopenharmony_ci#include <unistd.h>
862306a36Sopenharmony_ci#include <linux/types.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cienum perf_data_mode {
1162306a36Sopenharmony_ci	PERF_DATA_MODE_WRITE,
1262306a36Sopenharmony_ci	PERF_DATA_MODE_READ,
1362306a36Sopenharmony_ci};
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cienum perf_dir_version {
1662306a36Sopenharmony_ci	PERF_DIR_SINGLE_FILE	= 0,
1762306a36Sopenharmony_ci	PERF_DIR_VERSION	= 1,
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct perf_data_file {
2162306a36Sopenharmony_ci	char		*path;
2262306a36Sopenharmony_ci	union {
2362306a36Sopenharmony_ci		int	 fd;
2462306a36Sopenharmony_ci		FILE	*fptr;
2562306a36Sopenharmony_ci	};
2662306a36Sopenharmony_ci	unsigned long	 size;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct perf_data {
3062306a36Sopenharmony_ci	const char		*path;
3162306a36Sopenharmony_ci	struct perf_data_file	 file;
3262306a36Sopenharmony_ci	bool			 is_pipe;
3362306a36Sopenharmony_ci	bool			 is_dir;
3462306a36Sopenharmony_ci	bool			 force;
3562306a36Sopenharmony_ci	bool			 use_stdio;
3662306a36Sopenharmony_ci	bool			 in_place_update;
3762306a36Sopenharmony_ci	enum perf_data_mode	 mode;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	struct {
4062306a36Sopenharmony_ci		u64			 version;
4162306a36Sopenharmony_ci		struct perf_data_file	*files;
4262306a36Sopenharmony_ci		int			 nr;
4362306a36Sopenharmony_ci	} dir;
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline bool perf_data__is_read(struct perf_data *data)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	return data->mode == PERF_DATA_MODE_READ;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic inline bool perf_data__is_write(struct perf_data *data)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return data->mode == PERF_DATA_MODE_WRITE;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline int perf_data__is_pipe(struct perf_data *data)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	return data->is_pipe;
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic inline bool perf_data__is_dir(struct perf_data *data)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	return data->is_dir;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic inline bool perf_data__is_single_file(struct perf_data *data)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci	return data->dir.version == PERF_DIR_SINGLE_FILE;
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic inline int perf_data__fd(struct perf_data *data)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	if (data->use_stdio)
7462306a36Sopenharmony_ci		return fileno(data->file.fptr);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	return data->file.fd;
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ciint perf_data__open(struct perf_data *data);
8062306a36Sopenharmony_civoid perf_data__close(struct perf_data *data);
8162306a36Sopenharmony_cissize_t perf_data__read(struct perf_data *data, void *buf, size_t size);
8262306a36Sopenharmony_cissize_t perf_data__write(struct perf_data *data,
8362306a36Sopenharmony_ci			      void *buf, size_t size);
8462306a36Sopenharmony_cissize_t perf_data_file__write(struct perf_data_file *file,
8562306a36Sopenharmony_ci			      void *buf, size_t size);
8662306a36Sopenharmony_ci/*
8762306a36Sopenharmony_ci * If at_exit is set, only rename current perf.data to
8862306a36Sopenharmony_ci * perf.data.<postfix>, continue write on original data.
8962306a36Sopenharmony_ci * Set at_exit when flushing the last output.
9062306a36Sopenharmony_ci *
9162306a36Sopenharmony_ci * Return value is fd of new output.
9262306a36Sopenharmony_ci */
9362306a36Sopenharmony_ciint perf_data__switch(struct perf_data *data,
9462306a36Sopenharmony_ci			   const char *postfix,
9562306a36Sopenharmony_ci			   size_t pos, bool at_exit, char **new_filepath);
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ciint perf_data__create_dir(struct perf_data *data, int nr);
9862306a36Sopenharmony_ciint perf_data__open_dir(struct perf_data *data);
9962306a36Sopenharmony_civoid perf_data__close_dir(struct perf_data *data);
10062306a36Sopenharmony_ciint perf_data__update_dir(struct perf_data *data);
10162306a36Sopenharmony_ciunsigned long perf_data__size(struct perf_data *data);
10262306a36Sopenharmony_ciint perf_data__make_kcore_dir(struct perf_data *data, char *buf, size_t buf_sz);
10362306a36Sopenharmony_cibool has_kcore_dir(const char *path);
10462306a36Sopenharmony_cichar *perf_data__kallsyms_name(struct perf_data *data);
10562306a36Sopenharmony_cichar *perf_data__guest_kallsyms_name(struct perf_data *data, pid_t machine_pid);
10662306a36Sopenharmony_cibool is_perf_data(const char *path);
10762306a36Sopenharmony_ci#endif /* __PERF_DATA_H */
108