// SPDX-License-Identifier: GPL-2.0
/*
 * builtin-inject.c
 *
 * Builtin inject command: Examine the live mode (stdin) event stream
 * and repipe it to stdout while optionally injecting additional
 * events into it.
 */
#include "builtin.h"

#include "util/aslr.h"
#include "util/color.h"
#include "util/dso.h"
#include "util/vdso.h"
#include "util/evlist.h"
#include "util/evsel.h"
#include "util/map.h"
#include "util/session.h"
#include "util/tool.h"
#include "util/debug.h"
#include "util/build-id.h"
#include "util/data.h"
#include "util/auxtrace.h"
#include "util/jit.h"
#include "util/string2.h"
#include "util/symbol.h"
#include "util/synthetic-events.h"
#include "util/pmus.h"
#include "util/thread.h"
#include "util/namespaces.h"
#include "util/unwind.h"
#include "util/util.h"
#include "util/tsc.h"

#include <internal/lib.h>

#include <linux/err.h>
#include <subcmd/parse-options.h>
#include <uapi/linux/mman.h> /* To get things like MAP_HUGETLB even on older libc headers */

#include <linux/list.h>
#include <linux/string.h>
#include <linux/zalloc.h>
#include <linux/hash.h>
#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <inttypes.h>

struct guest_event {
	struct perf_sample		sample;
	union perf_event		*event;
	char				*event_buf;
};

struct guest_id {
	/* hlist_node must be first, see free_hlist() */
	struct hlist_node		node;
	u64				id;
	u64				host_id;
	u32				vcpu;
};

struct guest_tid {
	/* hlist_node must be first, see free_hlist() */
	struct hlist_node		node;
	/* Thread ID of QEMU thread */
	u32				tid;
	u32				vcpu;
};

struct guest_vcpu {
	/* Current host CPU */
	u32				cpu;
	/* Thread ID of QEMU thread */
	u32				tid;
};

struct guest_session {
	char				*perf_data_file;
	u32				machine_pid;
	u64				time_offset;
	double				time_scale;
	struct perf_tool		tool;
	struct perf_data		data;
	struct perf_session		*session;
	char				*tmp_file_name;
	int				tmp_fd;
	struct perf_tsc_conversion	host_tc;
	struct perf_tsc_conversion	guest_tc;
	bool				copy_kcore_dir;
	bool				have_tc;
	bool				fetched;
	bool				ready;
	u16				dflt_id_hdr_size;
	u64				dflt_id;
	u64				highest_id;
	/* Array of guest_vcpu */
	struct guest_vcpu		*vcpu;
	size_t				vcpu_cnt;
	/* Hash table for guest_id */
	struct hlist_head		heads[PERF_EVLIST__HLIST_SIZE];
	/* Hash table for guest_tid */
	struct hlist_head		tids[PERF_EVLIST__HLIST_SIZE];
	/* Place to stash next guest event */
	struct guest_event		ev;
};

enum build_id_rewrite_style {
	BID_RWS__NONE = 0,
	BID_RWS__INJECT_HEADER_LAZY,
	BID_RWS__INJECT_HEADER_ALL,
	BID_RWS__MMAP2_BUILDID_ALL,
	BID_RWS__MMAP2_BUILDID_LAZY,
};

struct perf_inject {
	struct perf_tool	tool;
	struct perf_session	*session;
	enum build_id_rewrite_style build_id_style;
	bool			sched_stat;
	bool			have_auxtrace;
	bool			strip;
	bool			jit_mode;
	bool			in_place_update;
	bool			in_place_update_dry_run;
	bool			copy_kcore_dir;
	bool			convert_callchain;
	bool			aslr;
	const char		*input_name;
	struct perf_data	output;
	u64			bytes_written;
	u64			aux_id;
	struct list_head	samples;
	struct itrace_synth_opts itrace_synth_opts;
	char			*event_copy;
	struct perf_file_section secs[HEADER_FEAT_BITS];
	struct guest_session	guest_session;
	struct strlist		*known_build_ids;
	struct evsel		*mmap_evsel;
	struct ip_callchain	*raw_callchain;
};

struct event_entry {
	struct list_head node;
	u32		 tid;
	union perf_event event[];
};

static int tool__inject_build_id(const struct perf_tool *tool,
				 struct perf_sample *sample,
				 struct machine *machine,
				 __u16 misc,
				 const char *filename,
				 struct dso *dso, u32 flags);
static int tool__inject_mmap2_build_id(const struct perf_tool *tool,
				      struct perf_sample *sample,
				      struct machine *machine,
				      __u16 misc,
				      __u32 pid, __u32 tid,
				      __u64 start, __u64 len, __u64 pgoff,
				      struct dso *dso,
				      __u32 prot, __u32 flags,
				      const char *filename);

static int output_bytes(struct perf_inject *inject, void *buf, size_t sz)
{
	ssize_t size;

	size = perf_data__write(&inject->output, buf, sz);
	if (size < 0)
		return -errno;

	inject->bytes_written += size;
	return 0;
}

static int perf_event__repipe_synth(const struct perf_tool *tool,
				    union perf_event *event)

{
	struct perf_inject *inject = container_of(tool, struct perf_inject,
						  tool);

	return output_bytes(inject, event, event->header.size);
}

static int perf_event__repipe_oe_synth(const struct perf_tool *tool,
				       union perf_event *event,
				       struct ordered_events *oe __maybe_unused)
{
	return perf_event__repipe_synth(tool, event);
}

#ifdef HAVE_JITDUMP
static int perf_event__drop_oe(const struct perf_tool *tool __maybe_unused,
			       union perf_event *event __maybe_unused,
			       struct ordered_events *oe __maybe_unused)
{
	return 0;
}
#endif

static int perf_event__repipe_op2_synth(const struct perf_tool *tool,
					struct perf_session *session __maybe_unused,
					union perf_event *event)
{
	return perf_event__repipe_synth(tool, event);
}

static int perf_event__repipe_op4_synth(const struct perf_tool *tool,
					struct perf_session *session __maybe_unused,
					union perf_event *event,
					u64 data __maybe_unused,
					const char *str __maybe_unused)
{
	return perf_event__repipe_synth(tool, event);
}

static int perf_event__repipe_synth_cb(const struct perf_tool *tool,
				       union perf_event *event,
				       struct perf_sample *sample __maybe_unused,
				       struct machine *machine __maybe_unused)
{
	return perf_event__repipe_synth(tool, event);
}

static int perf_event__repipe_attr(const struct perf_tool *tool,
				   union perf_event *event,
				   struct evlist **pevlist)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject,
						  tool);
	struct perf_event_attr attr;
	u32 raw_attr_size, attr_size;
	size_t n_ids;
	u64 *ids;
	int ret;

	union perf_event *aslr_event = NULL;

	ret = perf_event__process_attr(tool, event, pevlist);
	if (ret)
		return ret;

	if (inject->aslr) {
		aslr_event = malloc(event->header.size);
		if (!aslr_event)
			return -ENOMEM;
		memcpy(aslr_event, event, event->header.size);
		aslr_tool__strip_attr_event(aslr_event, *pevlist);
		event = aslr_event;
	}

	/* If the output isn't a pipe then the attributes will be written as part of the header. */
	if (!inject->output.is_pipe) {
		ret = 0;
		goto out;
	}

	if (!inject->itrace_synth_opts.set) {
		ret = perf_event__repipe_synth(tool, event);
		goto out;
	}

	if (event->header.size < sizeof(struct perf_event_header) + PERF_ATTR_SIZE_VER0) {
		pr_err("Attribute event size %u is too small\n", event->header.size);
		ret = -EINVAL;
		goto out;
	}

	/*
	 * ABI0 pipe/inject events have attr.size == 0; default to
	 * PERF_ATTR_SIZE_VER0 (the ABI0 footprint) for the bounded
	 * copy and ID array position.  Same pattern as
	 * perf_event__process_attr() in header.c.
	 */
	raw_attr_size = event->attr.attr.size;
	attr_size = raw_attr_size ?: PERF_ATTR_SIZE_VER0;

	if (raw_attr_size && (raw_attr_size < PERF_ATTR_SIZE_VER0 ||
			      raw_attr_size > event->header.size - sizeof(event->header))) {
		pr_err("Attribute event size %u is too small for attr.size %u\n",
		       event->header.size, raw_attr_size);
		ret = -EINVAL;
		goto out;
	}

	memset(&attr, 0, sizeof(attr));
	memcpy(&attr, &event->attr.attr,
	       min_t(size_t, sizeof(attr), attr_size));

	n_ids = event->header.size - sizeof(event->header) - attr_size;
	n_ids /= sizeof(u64);
	ids = (void *)&event->attr.attr + attr_size;

	attr.size = sizeof(struct perf_event_attr);
	attr.sample_type &= ~PERF_SAMPLE_AUX;


	if (inject->itrace_synth_opts.add_last_branch) {
		attr.sample_type |= PERF_SAMPLE_BRANCH_STACK;
		attr.branch_sample_type |= PERF_SAMPLE_BRANCH_HW_INDEX;
	}
	ret = perf_event__synthesize_attr(tool, &attr, (u32)n_ids, ids,
					   perf_event__repipe_synth_cb);
out:
	free(aslr_event);
	return ret;
}

static int perf_event__repipe_event_update(const struct perf_tool *tool,
					   union perf_event *event,
					   struct evlist **pevlist __maybe_unused)
{
	return perf_event__repipe_synth(tool, event);
}

static int copy_bytes(struct perf_inject *inject, struct perf_data *data, off_t size)
{
	char buf[4096];
	ssize_t ssz;
	int ret;

	while (size > 0) {
		ssz = perf_data__read(data, buf, min(size, (off_t)sizeof(buf)));
		if (ssz < 0)
			return -errno;
		ret = output_bytes(inject, buf, ssz);
		if (ret)
			return ret;
		size -= ssz;
	}

	return 0;
}

static s64 perf_event__repipe_auxtrace(const struct perf_tool *tool,
				       struct perf_session *session,
				       union perf_event *event)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	int ret;

	inject->have_auxtrace = true;

	if (!inject->output.is_pipe) {
		off_t offset = perf_data__seek(&inject->output, 0, SEEK_CUR);

		if (offset == -1)
			return -errno;
		ret = auxtrace_index__auxtrace_event(&session->auxtrace_index,
						     event, offset);
		if (ret < 0)
			return ret;
	}

	if (perf_data__is_pipe(session->data) || !session->one_mmap) {
		ret = output_bytes(inject, event, event->header.size);
		if (ret < 0)
			return ret;
		ret = copy_bytes(inject, session->data,
				 event->auxtrace.size);
	} else {
		ret = output_bytes(inject, event,
				   event->header.size + event->auxtrace.size);
	}
	if (ret < 0)
		return ret;

	return event->auxtrace.size;
}

static int perf_event__repipe(const struct perf_tool *tool,
			      union perf_event *event,
			      struct perf_sample *sample __maybe_unused,
			      struct machine *machine __maybe_unused)
{
	return perf_event__repipe_synth(tool, event);
}

static int perf_event__drop(const struct perf_tool *tool __maybe_unused,
			    union perf_event *event __maybe_unused,
			    struct perf_sample *sample __maybe_unused,
			    struct machine *machine __maybe_unused)
{
	return 0;
}

static int perf_event__drop_aux(const struct perf_tool *tool,
				union perf_event *event __maybe_unused,
				struct perf_sample *sample,
				struct machine *machine __maybe_unused)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);

	if (!inject->aux_id)
		inject->aux_id = sample->id;

	return 0;
}

static union perf_event *
perf_inject__cut_auxtrace_sample(struct perf_inject *inject,
				 union perf_event *event,
				 struct perf_sample *sample)
{
	size_t sz1 = sample->aux_sample.data - (void *)event - sizeof(u64);
	size_t sz2 = event->header.size - sample->aux_sample.size - (sz1 + sizeof(u64));
	union perf_event *ev;

	if (inject->event_copy == NULL) {
		inject->event_copy = malloc(PERF_SAMPLE_MAX_SIZE);
		if (!inject->event_copy)
			return ERR_PTR(-ENOMEM);
	}
	ev = (union perf_event *)inject->event_copy;
	if (sz1 > event->header.size || sz2 > event->header.size ||
	    sz1 + sz2 > event->header.size ||
	    sz1 < sizeof(struct perf_event_header))
		return event;

	memcpy(ev, event, sz1);
	memcpy((void *)ev + sz1, (void *)event + event->header.size - sz2, sz2);
	ev->header.size = sz1 + sz2;

	return ev;
}

typedef int (*inject_handler)(const struct perf_tool *tool,
			      union perf_event *event,
			      struct perf_sample *sample,
			      struct machine *machine);

static int perf_event__repipe_sample(const struct perf_tool *tool,
				     union perf_event *event,
				     struct perf_sample *sample,
				     struct machine *machine)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct evsel *evsel = sample->evsel;

	if (evsel == NULL)
		return perf_event__repipe_synth(tool, event);

	if (evsel->handler) {
		inject_handler f = evsel->handler;
		return f(tool, event, sample, machine);
	}

	build_id__mark_dso_hit(tool, event, sample, machine);

	if (inject->itrace_synth_opts.set &&
	    (inject->itrace_synth_opts.last_branch ||
	     inject->itrace_synth_opts.add_last_branch)) {
		union perf_event *event_copy = (void *)inject->event_copy;
		struct branch_stack dummy_bs = { .nr = 0, .hw_idx = 0 };
		int err;
		size_t sz;
		u64 orig_type = evsel->core.attr.sample_type;
		u64 orig_branch_type = evsel->core.attr.branch_sample_type;

		struct branch_stack *orig_bs = sample->branch_stack;

		if (event_copy == NULL) {
			inject->event_copy = malloc(PERF_SAMPLE_MAX_SIZE);
			if (!inject->event_copy)
				return -ENOMEM;

			event_copy = (void *)inject->event_copy;
		}

		if (!sample->branch_stack)
			sample->branch_stack = &dummy_bs;

		if (inject->itrace_synth_opts.add_last_branch) {
			/* Temporarily add in type bits for synthesis. */
			evsel->core.attr.sample_type |= PERF_SAMPLE_BRANCH_STACK;
			evsel->core.attr.branch_sample_type |= PERF_SAMPLE_BRANCH_HW_INDEX;
		}
		evsel->core.attr.sample_type &= ~PERF_SAMPLE_AUX;

		sz = perf_event__sample_event_size(sample, evsel->core.attr.sample_type,
						   evsel->core.attr.read_format,
						   evsel->core.attr.branch_sample_type);

		if (sz >= PERF_SAMPLE_MAX_SIZE) {
			pr_err("Sample size %zu exceeds max size %d\n", sz, PERF_SAMPLE_MAX_SIZE);
			evsel->core.attr.sample_type = orig_type;
			evsel->core.attr.branch_sample_type = orig_branch_type;
			sample->branch_stack = orig_bs;
			return -EFAULT;
		}

		event_copy->header.type = PERF_RECORD_SAMPLE;
		event_copy->header.misc = event->header.misc;
		event_copy->header.size = sz;

		err = perf_event__synthesize_sample(event_copy, evsel->core.attr.sample_type,
						    evsel->core.attr.read_format,
						    evsel->core.attr.branch_sample_type, sample);

		evsel->core.attr.sample_type = orig_type;
		evsel->core.attr.branch_sample_type = orig_branch_type;
		sample->branch_stack = orig_bs;

		if (err) {
			pr_err("Failed to synthesize sample\n");
			return err;
		}
		event = event_copy;
	} else if (inject->itrace_synth_opts.set &&
		   (evsel->core.attr.sample_type & PERF_SAMPLE_AUX)) {
		event = perf_inject__cut_auxtrace_sample(inject, event, sample);
		if (IS_ERR(event))
			return PTR_ERR(event);
	}

	return perf_event__repipe_synth(tool, event);
}

static int perf_event__convert_sample_callchain(const struct perf_tool *tool,
						union perf_event *event,
						struct perf_sample *sample,
						struct machine *machine)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct evsel *evsel = sample->evsel;
	struct callchain_cursor *cursor = get_tls_callchain_cursor();
	union perf_event *event_copy = (void *)inject->event_copy;
	struct callchain_cursor_node *node;
	struct thread *thread;
	u64 sample_type = evsel->core.attr.sample_type;
	size_t sz;
	u64 i, k;
	int ret;

	if (event_copy == NULL) {
		inject->event_copy = malloc(PERF_SAMPLE_MAX_SIZE);
		if (!inject->event_copy)
			return -ENOMEM;

		event_copy = (void *)inject->event_copy;
	}

	if (cursor == NULL)
		return -ENOMEM;

	callchain_cursor_reset(cursor);

	thread = machine__find_thread(machine, sample->tid, sample->pid);
	if (thread == NULL)
		goto out;

	/* this will parse DWARF using stack and register data */
	ret = thread__resolve_callchain(thread, cursor, sample,
					/*parent=*/NULL, /*root_al=*/NULL,
					PERF_MAX_STACK_DEPTH);
	thread__put(thread);
	if (ret != 0)
		goto out;

	/* copy kernel callchain and context entries */
	for (i = 0; i < sample->callchain->nr; i++) {
		inject->raw_callchain->ips[i] = sample->callchain->ips[i];
		if (sample->callchain->ips[i] == PERF_CONTEXT_USER) {
			i++;
			break;
		}
	}
	if (i == 0 || inject->raw_callchain->ips[i - 1] != PERF_CONTEXT_USER)
		inject->raw_callchain->ips[i++] = PERF_CONTEXT_USER;

	node = cursor->first;
	for (k = 0; k < cursor->nr && i < PERF_MAX_STACK_DEPTH; k++) {
		if (!(machine->single_address_space &&
		      machine__kernel_ip(machine, node->ip)) &&
		    !(node->ms.sym && symbol__inlined(node->ms.sym))) {
			inject->raw_callchain->ips[i++] = node->ip;
		}

		node = node->next;
	}

	inject->raw_callchain->nr = i;
	sample->callchain = inject->raw_callchain;

out:
	memcpy(event_copy, event, sizeof(event->header));

	/* remove sample_type {STACK,REGS}_USER for synthesize */
	sample_type &= ~(PERF_SAMPLE_STACK_USER | PERF_SAMPLE_REGS_USER);

	sz = perf_event__sample_event_size(sample, sample_type,
					   evsel->core.attr.read_format,
					   evsel->core.attr.branch_sample_type);
	if (sz >= PERF_SAMPLE_MAX_SIZE) {
		pr_err("Sample size %zu exceeds max size %d\n", sz, PERF_SAMPLE_MAX_SIZE);
		return -EFAULT;
	}
	event_copy->header.size = sz;

	ret = perf_event__synthesize_sample(event_copy, sample_type,
					    evsel->core.attr.read_format,
					    evsel->core.attr.branch_sample_type, sample);
	if (ret) {
		pr_err("Failed to synthesize sample\n");
		return ret;
	}
	return perf_event__repipe_synth(tool, event_copy);
}

static struct dso *findnew_dso(int pid, int tid, const char *filename,
			       const struct dso_id *id, struct machine *machine)
{
	struct thread *thread;
	struct nsinfo *nsi = NULL;
	struct nsinfo *nnsi;
	struct dso *dso;
	bool vdso;

	thread = machine__findnew_thread(machine, pid, tid);
	if (thread == NULL) {
		pr_err("cannot find or create a task %d/%d.\n", tid, pid);
		return NULL;
	}

	vdso = is_vdso_map(filename);
	nsi = nsinfo__get(thread__nsinfo(thread));

	if (vdso) {
		/* The vdso maps are always on the host and not the
		 * container.  Ensure that we don't use setns to look
		 * them up.
		 */
		nnsi = nsinfo__copy(nsi);
		if (nnsi) {
			nsinfo__put(nsi);
			nsinfo__clear_need_setns(nnsi);
			nsi = nnsi;
		}
		dso = machine__findnew_vdso(machine, thread);
	} else {
		dso = machine__findnew_dso_id(machine, filename, id);
	}

	if (dso) {
		mutex_lock(dso__lock(dso));
		dso__set_nsinfo(dso, nsi);
		mutex_unlock(dso__lock(dso));
	} else
		nsinfo__put(nsi);

	thread__put(thread);
	return dso;
}

/*
 * The evsel used for the sample ID for mmap events. Typically stashed when
 * processing mmap events. If not stashed, search the evlist for the first mmap
 * gathering event.
 */
static struct evsel *inject__mmap_evsel(struct perf_inject *inject)
{
	struct evsel *pos;

	if (inject->mmap_evsel)
		return inject->mmap_evsel;

	evlist__for_each_entry(inject->session->evlist, pos) {
		if (pos->core.attr.mmap) {
			inject->mmap_evsel = pos;
			return pos;
		}
	}
	pr_err("No mmap events found\n");
	return NULL;
}

static int perf_event__repipe_common_mmap(const struct perf_tool *tool,
					  union perf_event *event,
					  struct perf_sample *sample,
					  struct machine *machine,
					  __u32 pid, __u32 tid,
					  __u64 start, __u64 len, __u64 pgoff,
					  __u32 flags, __u32 prot,
					  const char *filename,
					  const struct dso_id *dso_id,
					  int (*perf_event_process)(const struct perf_tool *tool,
								    union perf_event *event,
								    struct perf_sample *sample,
								    struct machine *machine))
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct dso *dso = NULL;
	bool dso_sought = false;

#ifdef HAVE_JITDUMP
	if (inject->jit_mode) {
		u64 n = 0;
		int ret;

		/* If jit marker, then inject jit mmaps and generate ELF images. */
		ret = jit_process(inject->session, &inject->output, machine,
				  filename, pid, tid, &n);
		if (ret < 0)
			return ret;
		if (ret) {
			inject->bytes_written += n;
			return 0;
		}
	}
#endif
	if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) {
		dso = findnew_dso(pid, tid, filename, dso_id, machine);
		dso_sought = true;
		if (dso) {
			/* mark it not to inject build-id */
			dso__set_hit(dso);
		}
	}
	if (inject->build_id_style == BID_RWS__INJECT_HEADER_ALL) {
		if (!dso_sought) {
			dso = findnew_dso(pid, tid, filename, dso_id, machine);
			dso_sought = true;
		}

		if (dso && !dso__hit(dso)) {
			if (!sample->evsel)
				sample->evsel = evlist__event2evsel(inject->session->evlist, event);

			if (sample->evsel) {
				dso__set_hit(dso);
				tool__inject_build_id(tool, sample, machine,
						      /*misc=*/sample->cpumode,
						      filename, dso, flags);
			}
		}
	} else {
		int err;

		/*
		 * Remember the evsel for lazy build id generation. It is used
		 * for the sample id header type.
		 */
		if ((inject->build_id_style == BID_RWS__INJECT_HEADER_LAZY ||
		     inject->build_id_style == BID_RWS__MMAP2_BUILDID_LAZY) &&
		    !inject->mmap_evsel)
			inject->mmap_evsel = evlist__event2evsel(inject->session->evlist, event);

		/* Create the thread, map, etc. Not done for the unordered inject all case. */
		err = perf_event_process(tool, event, sample, machine);

		if (err) {
			dso__put(dso);
			return err;
		}
	}
	if ((inject->build_id_style == BID_RWS__MMAP2_BUILDID_ALL) &&
	    !(event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID)) {
		struct evsel *saved_evsel = sample->evsel;

		sample->evsel = evlist__event2evsel(inject->session->evlist, event);
		if (sample->evsel && !dso_sought) {
			dso = findnew_dso(pid, tid, filename, dso_id, machine);
			dso_sought = true;
		}
		if (sample->evsel && dso &&
		    !tool__inject_mmap2_build_id(tool, sample, machine,
						 sample->cpumode | PERF_RECORD_MISC_MMAP_BUILD_ID,
						 pid, tid, start, len, pgoff,
						 dso,
						 prot, flags,
						 filename)) {
			/* Injected mmap2 so no need to repipe. */
			sample->evsel = saved_evsel;
			dso__put(dso);
			return 0;
		}
		sample->evsel = saved_evsel;
	}
	dso__put(dso);
	if (inject->build_id_style == BID_RWS__MMAP2_BUILDID_LAZY)
		return 0;

	return perf_event__repipe(tool, event, sample, machine);
}

static int perf_event__repipe_mmap(const struct perf_tool *tool,
				union perf_event *event,
				struct perf_sample *sample,
				struct machine *machine)
{
	return perf_event__repipe_common_mmap(
		tool, event, sample, machine,
		event->mmap.pid, event->mmap.tid,
		event->mmap.start, event->mmap.len, event->mmap.pgoff,
		/*flags=*/0, PROT_EXEC,
		event->mmap.filename, /*dso_id=*/NULL,
		perf_event__process_mmap);
}

static int perf_event__repipe_mmap2(const struct perf_tool *tool,
				union perf_event *event,
				struct perf_sample *sample,
				struct machine *machine)
{
	struct dso_id id = dso_id_empty;

	if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) {
		build_id__init(&id.build_id, event->mmap2.build_id, event->mmap2.build_id_size);
	} else {
		id.maj = event->mmap2.maj;
		id.min = event->mmap2.min;
		id.ino = event->mmap2.ino;
		id.ino_generation = event->mmap2.ino_generation;
		id.mmap2_valid = true;
		id.mmap2_ino_generation_valid = true;
	}

	return perf_event__repipe_common_mmap(
		tool, event, sample, machine,
		event->mmap2.pid, event->mmap2.tid,
		event->mmap2.start, event->mmap2.len, event->mmap2.pgoff,
		event->mmap2.flags, event->mmap2.prot,
		event->mmap2.filename, &id,
		perf_event__process_mmap2);
}

static int perf_event__repipe_fork(const struct perf_tool *tool,
				   union perf_event *event,
				   struct perf_sample *sample,
				   struct machine *machine)
{
	int err;

	err = perf_event__process_fork(tool, event, sample, machine);
	perf_event__repipe(tool, event, sample, machine);

	return err;
}

static int perf_event__repipe_comm(const struct perf_tool *tool,
				   union perf_event *event,
				   struct perf_sample *sample,
				   struct machine *machine)
{
	int err;

	err = perf_event__process_comm(tool, event, sample, machine);
	perf_event__repipe(tool, event, sample, machine);

	return err;
}

static int perf_event__repipe_namespaces(const struct perf_tool *tool,
					 union perf_event *event,
					 struct perf_sample *sample,
					 struct machine *machine)
{
	int err = perf_event__process_namespaces(tool, event, sample, machine);

	perf_event__repipe(tool, event, sample, machine);

	return err;
}

static int perf_event__repipe_exit(const struct perf_tool *tool,
				   union perf_event *event,
				   struct perf_sample *sample,
				   struct machine *machine)
{
	int err;

	err = perf_event__process_exit(tool, event, sample, machine);
	perf_event__repipe(tool, event, sample, machine);

	return err;
}

#ifdef HAVE_LIBTRACEEVENT
static int perf_event__repipe_tracing_data(const struct perf_tool *tool,
					   struct perf_session *session,
					   union perf_event *event)
{
	perf_event__repipe_synth(tool, event);

	return perf_event__process_tracing_data(tool, session, event);
}
#endif

static int dso__read_build_id(struct dso *dso)
{
	struct nscookie nsc;
	struct build_id bid = { .size = 0, };

	if (dso__has_build_id(dso))
		return 0;

	mutex_lock(dso__lock(dso));
	nsinfo__mountns_enter(dso__nsinfo(dso), &nsc);
	if (filename__read_build_id(dso__long_name(dso), &bid) > 0)
		dso__set_build_id(dso, &bid);
	else if (dso__nsinfo(dso)) {
		char *new_name = dso__filename_with_chroot(dso, dso__long_name(dso));

		if (new_name && filename__read_build_id(new_name, &bid) > 0)
			dso__set_build_id(dso, &bid);
		free(new_name);
	}
	nsinfo__mountns_exit(&nsc);
	mutex_unlock(dso__lock(dso));

	return dso__has_build_id(dso) ? 0 : -1;
}

static struct strlist *perf_inject__parse_known_build_ids(
	const char *known_build_ids_string)
{
	struct str_node *pos, *tmp;
	struct strlist *known_build_ids;
	int bid_len;

	known_build_ids = strlist__new(known_build_ids_string, NULL);
	if (known_build_ids == NULL)
		return NULL;
	strlist__for_each_entry_safe(pos, tmp, known_build_ids) {
		const char *build_id, *dso_name;

		build_id = skip_spaces(pos->s);
		dso_name = strchr(build_id, ' ');
		if (dso_name == NULL) {
			strlist__remove(known_build_ids, pos);
			continue;
		}
		bid_len = dso_name - pos->s;
		dso_name = skip_spaces(dso_name);
		if (bid_len % 2 != 0 || bid_len >= SBUILD_ID_SIZE) {
			strlist__remove(known_build_ids, pos);
			continue;
		}
		for (int ix = 0; 2 * ix + 1 < bid_len; ++ix) {
			if (!isxdigit(build_id[2 * ix]) ||
			    !isxdigit(build_id[2 * ix + 1])) {
				strlist__remove(known_build_ids, pos);
				break;
			}
		}
	}
	return known_build_ids;
}

static bool perf_inject__lookup_known_build_id(struct perf_inject *inject,
					       struct dso *dso)
{
	struct str_node *pos;

	strlist__for_each_entry(pos, inject->known_build_ids) {
		struct build_id bid;
		const char *build_id, *dso_name;
		size_t bid_len;

		build_id = skip_spaces(pos->s);
		dso_name = strchr(build_id, ' ');
		bid_len = dso_name - pos->s;
		if (bid_len > sizeof(bid.data))
			bid_len = sizeof(bid.data);
		dso_name = skip_spaces(dso_name);
		if (strcmp(dso__long_name(dso), dso_name))
			continue;
		for (size_t ix = 0; 2 * ix + 1 < bid_len; ++ix) {
			bid.data[ix] = (hex(build_id[2 * ix]) << 4 |
					hex(build_id[2 * ix + 1]));
		}
		bid.size = bid_len / 2;
		dso__set_build_id(dso, &bid);
		return true;
	}
	return false;
}

static int tool__inject_build_id(const struct perf_tool *tool,
				 struct perf_sample *sample,
				 struct machine *machine,
				 __u16 misc,
				 const char *filename,
				 struct dso *dso, u32 flags)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	int err;

	if (is_anon_memory(filename) || flags & MAP_HUGETLB)
		return 0;
	if (is_no_dso_memory(filename))
		return 0;

	if (inject->known_build_ids != NULL &&
	    perf_inject__lookup_known_build_id(inject, dso))
		return 1;

	if (dso__read_build_id(dso) < 0) {
		pr_debug("no build_id found for %s\n", filename);
		return -1;
	}

	err = perf_event__synthesize_build_id(tool, sample, machine,
					      perf_event__repipe,
					      misc, dso__bid(dso),
					      filename);
	if (err) {
		pr_err("Can't synthesize build_id event for %s\n", filename);
		return -1;
	}

	return 0;
}

static int tool__inject_mmap2_build_id(const struct perf_tool *tool,
				       struct perf_sample *sample,
				       struct machine *machine,
				       __u16 misc,
				       __u32 pid, __u32 tid,
				       __u64 start, __u64 len, __u64 pgoff,
				       struct dso *dso,
				       __u32 prot, __u32 flags,
				       const char *filename)
{
	int err;

	/* Return to repipe anonymous maps. */
	if (is_anon_memory(filename) || flags & MAP_HUGETLB)
		return 1;
	if (is_no_dso_memory(filename))
		return 1;

	if (dso__read_build_id(dso)) {
		pr_debug("no build_id found for %s\n", filename);
		return -1;
	}

	err = perf_event__synthesize_mmap2_build_id(tool, sample, machine,
						    perf_event__repipe,
						    misc, pid, tid,
						    start, len, pgoff,
						    dso__bid(dso),
						    prot, flags,
						    filename);
	if (err) {
		pr_err("Can't synthesize build_id event for %s\n", filename);
		return -1;
	}
	return 0;
}

static int mark_dso_hit(const struct perf_inject *inject,
			const struct perf_tool *tool,
			struct perf_sample *sample,
			struct machine *machine,
			struct evsel *mmap_evsel,
			struct map *map, bool sample_in_dso)
{
	struct dso *dso;
	u16 misc = sample->cpumode;

	if (!map)
		return 0;

	if (!sample_in_dso) {
		u16 guest_mask = PERF_RECORD_MISC_GUEST_KERNEL |
			PERF_RECORD_MISC_GUEST_USER;

		if ((misc & guest_mask) != 0) {
			misc &= PERF_RECORD_MISC_HYPERVISOR;
			misc |= __map__is_kernel(map)
				? PERF_RECORD_MISC_GUEST_KERNEL
				: PERF_RECORD_MISC_GUEST_USER;
		} else {
			misc &= PERF_RECORD_MISC_HYPERVISOR;
			misc |= __map__is_kernel(map)
				? PERF_RECORD_MISC_KERNEL
				: PERF_RECORD_MISC_USER;
		}
	}
	dso = map__dso(map);
	if (inject->build_id_style == BID_RWS__INJECT_HEADER_LAZY) {
		if (dso && !dso__hit(dso)) {
			/*
			 * The sample is just read for identifiers which we want
			 * to match the for the event of the sample.
			 */
			dso__set_hit(dso);
			tool__inject_build_id(tool, sample, machine,
					     misc, dso__long_name(dso), dso,
					     map__flags(map));
		}
	} else if (inject->build_id_style == BID_RWS__MMAP2_BUILDID_LAZY) {
		if (!map__hit(map)) {
			const struct build_id null_bid = { .size = 0 };
			const struct build_id *bid = dso ? dso__bid(dso) : &null_bid;
			const char *filename = dso ? dso__long_name(dso) : "";
			struct evsel *saved_evsel = sample->evsel;

			map__set_hit(map);
			/* Creating a new mmap2 event which has an evsel for the mmap event. */
			sample->evsel = mmap_evsel;
			perf_event__synthesize_mmap2_build_id(tool, sample, machine,
								perf_event__repipe,
								misc,
								sample->pid, sample->tid,
								map__start(map),
								map__end(map) - map__start(map),
								map__pgoff(map),
								bid,
								map__prot(map),
								map__flags(map),
								filename);
			sample->evsel = saved_evsel;
		}
	}
	return 0;
}

struct mark_dso_hit_args {
	const struct perf_inject *inject;
	const struct perf_tool *tool;
	struct perf_sample *sample;
	struct machine *machine;
	struct evsel *mmap_evsel;
};

static int mark_dso_hit_callback(struct callchain_cursor_node *node, void *data)
{
	struct mark_dso_hit_args *args = data;
	struct map *map = node->ms.map;

	return mark_dso_hit(args->inject, args->tool, args->sample, args->machine,
			    args->mmap_evsel, map, /*sample_in_dso=*/false);
}

static int perf_event__inject_buildid(const struct perf_tool *tool, union perf_event *event,
				      struct perf_sample *sample, struct machine *machine)
{
	struct addr_location al;
	struct thread *thread;
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct mark_dso_hit_args args = {
		.inject = inject,
		.tool = tool,
		/*
		 * Use the parsed sample data of the sample event, which will
		 * have a later timestamp than the mmap event.
		 */
		.sample = sample,
		.machine = machine,
		.mmap_evsel = inject__mmap_evsel(inject),
	};

	addr_location__init(&al);
	thread = machine__findnew_thread(machine, sample->pid, sample->tid);
	if (thread == NULL) {
		pr_err("problem processing %d event, skipping it.\n",
		       event->header.type);
		goto repipe;
	}

	if (thread__find_map(thread, sample->cpumode, sample->ip, &al)) {
		mark_dso_hit(inject, tool, sample, machine, args.mmap_evsel, al.map,
			     /*sample_in_dso=*/true);
	}

	sample__for_each_callchain_node(thread, sample, PERF_MAX_STACK_DEPTH,
					/*symbols=*/false, mark_dso_hit_callback, &args);
	thread__put(thread);
repipe:
	perf_event__repipe(tool, event, sample, machine);
	addr_location__exit(&al);
	return 0;
}

static int perf_inject__sched_process_exit(const struct perf_tool *tool,
					   union perf_event *event __maybe_unused,
					   struct perf_sample *sample,
					   struct machine *machine __maybe_unused)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct event_entry *ent;

	list_for_each_entry(ent, &inject->samples, node) {
		if (sample->tid == ent->tid) {
			list_del_init(&ent->node);
			free(ent);
			break;
		}
	}

	return 0;
}

static int perf_inject__sched_switch(const struct perf_tool *tool,
				     union perf_event *event,
				     struct perf_sample *sample,
				     struct machine *machine)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct event_entry *ent;

	perf_inject__sched_process_exit(tool, event, sample, machine);

	ent = malloc(event->header.size + sizeof(struct event_entry));
	if (ent == NULL) {
		color_fprintf(stderr, PERF_COLOR_RED,
			     "Not enough memory to process sched switch event!");
		return -1;
	}

	ent->tid = sample->tid;
	memcpy(&ent->event, event, event->header.size);
	list_add(&ent->node, &inject->samples);
	return 0;
}

#ifdef HAVE_LIBTRACEEVENT
static int perf_inject__sched_stat(const struct perf_tool *tool,
				   union perf_event *event __maybe_unused,
				   struct perf_sample *sample,
				   struct machine *machine)
{
	struct event_entry *ent;
	union perf_event *event_sw;
	struct perf_sample sample_sw;
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct evsel *evsel = sample->evsel;
	u32 pid = perf_sample__intval(sample, "pid");
	int ret;

	list_for_each_entry(ent, &inject->samples, node) {
		if (pid == ent->tid)
			goto found;
	}

	return 0;
found:
	event_sw = &ent->event[0];
	evsel__parse_sample(evsel, event_sw, &sample_sw);

	sample_sw.period = sample->period;
	sample_sw.time	 = sample->time;
	perf_event__synthesize_sample(event_sw, evsel->core.attr.sample_type,
				      evsel->core.attr.read_format,
				      evsel->core.attr.branch_sample_type, &sample_sw);
	build_id__mark_dso_hit(tool, event_sw, &sample_sw, machine);
	ret = perf_event__repipe(tool, event_sw, &sample_sw, machine);
	perf_sample__exit(&sample_sw);
	return ret;
}
#endif

static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
{
	if (realloc_array_as_needed(gs->vcpu, gs->vcpu_cnt, vcpu, NULL))
		return NULL;
	return &gs->vcpu[vcpu];
}

static int guest_session__output_bytes(struct guest_session *gs, void *buf, size_t sz)
{
	ssize_t ret = writen(gs->tmp_fd, buf, sz);

	return ret < 0 ? ret : 0;
}

static int guest_session__repipe(const struct perf_tool *tool,
				 union perf_event *event,
				 struct perf_sample *sample __maybe_unused,
				 struct machine *machine __maybe_unused)
{
	struct guest_session *gs = container_of(tool, struct guest_session, tool);

	return guest_session__output_bytes(gs, event, event->header.size);
}

static int guest_session__map_tid(struct guest_session *gs, u32 tid, u32 vcpu)
{
	struct guest_tid *guest_tid = zalloc(sizeof(*guest_tid));
	int hash;

	if (!guest_tid)
		return -ENOMEM;

	guest_tid->tid = tid;
	guest_tid->vcpu = vcpu;
	hash = hash_32(guest_tid->tid, PERF_EVLIST__HLIST_BITS);
	hlist_add_head(&guest_tid->node, &gs->tids[hash]);

	return 0;
}

static int host_peek_vm_comms_cb(struct perf_session *session __maybe_unused,
				 union perf_event *event,
				 u64 offset __maybe_unused, void *data)
{
	struct guest_session *gs = data;
	unsigned int vcpu;
	struct guest_vcpu *guest_vcpu;
	int ret;

	if (event->header.type != PERF_RECORD_COMM ||
	    event->comm.pid != gs->machine_pid)
		return 0;

	/*
	 * QEMU option -name debug-threads=on, causes thread names formatted as
	 * below, although it is not an ABI. Also libvirt seems to use this by
	 * default. Here we rely on it to tell us which thread is which VCPU.
	 */
	ret = sscanf(event->comm.comm, "CPU %u/KVM", &vcpu);
	if (ret <= 0)
		return ret;
	pr_debug("Found VCPU: tid %u comm %s vcpu %u\n",
		 event->comm.tid, event->comm.comm, vcpu);
	if (vcpu > INT_MAX) {
		pr_err("Invalid VCPU %u\n", vcpu);
		return -EINVAL;
	}
	guest_vcpu = guest_session__vcpu(gs, vcpu);
	if (!guest_vcpu)
		return -ENOMEM;
	if (guest_vcpu->tid && guest_vcpu->tid != event->comm.tid) {
		pr_err("Fatal error: Two threads found with the same VCPU\n");
		return -EINVAL;
	}
	guest_vcpu->tid = event->comm.tid;

	return guest_session__map_tid(gs, event->comm.tid, vcpu);
}

static int host_peek_vm_comms(struct perf_session *session, struct guest_session *gs)
{
	return perf_session__peek_events(session, session->header.data_offset,
					 session->header.data_size,
					 host_peek_vm_comms_cb, gs);
}

static bool evlist__is_id_used(struct evlist *evlist, u64 id)
{
	return evlist__id2sid(evlist, id);
}

static u64 guest_session__allocate_new_id(struct guest_session *gs, struct evlist *host_evlist)
{
	do {
		gs->highest_id += 1;
	} while (!gs->highest_id || evlist__is_id_used(host_evlist, gs->highest_id));

	return gs->highest_id;
}

static int guest_session__map_id(struct guest_session *gs, u64 id, u64 host_id, u32 vcpu)
{
	struct guest_id *guest_id = zalloc(sizeof(*guest_id));
	int hash;

	if (!guest_id)
		return -ENOMEM;

	guest_id->id = id;
	guest_id->host_id = host_id;
	guest_id->vcpu = vcpu;
	hash = hash_64(guest_id->id, PERF_EVLIST__HLIST_BITS);
	hlist_add_head(&guest_id->node, &gs->heads[hash]);

	return 0;
}

static u64 evlist__find_highest_id(struct evlist *evlist)
{
	struct evsel *evsel;
	u64 highest_id = 1;

	evlist__for_each_entry(evlist, evsel) {
		u32 j;

		for (j = 0; j < evsel->core.ids; j++) {
			u64 id = evsel->core.id[j];

			if (id > highest_id)
				highest_id = id;
		}
	}

	return highest_id;
}

static int guest_session__map_ids(struct guest_session *gs, struct evlist *host_evlist)
{
	struct evlist *evlist = gs->session->evlist;
	struct evsel *evsel;
	int ret;

	evlist__for_each_entry(evlist, evsel) {
		u32 j;

		for (j = 0; j < evsel->core.ids; j++) {
			struct perf_sample_id *sid;
			u64 host_id;
			u64 id;

			id = evsel->core.id[j];
			sid = evlist__id2sid(evlist, id);
			if (!sid || sid->cpu.cpu == -1)
				continue;
			host_id = guest_session__allocate_new_id(gs, host_evlist);
			ret = guest_session__map_id(gs, id, host_id, sid->cpu.cpu);
			if (ret)
				return ret;
		}
	}

	return 0;
}

static struct guest_id *guest_session__lookup_id(struct guest_session *gs, u64 id)
{
	struct hlist_head *head;
	struct guest_id *guest_id;
	int hash;

	hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
	head = &gs->heads[hash];

	hlist_for_each_entry(guest_id, head, node)
		if (guest_id->id == id)
			return guest_id;

	return NULL;
}

static int process_attr(const struct perf_tool *tool, union perf_event *event,
			struct perf_sample *sample __maybe_unused,
			struct machine *machine __maybe_unused)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);

	return perf_event__process_attr(tool, event, &inject->session->evlist);
}

static int guest_session__add_attr(struct guest_session *gs, struct evsel *evsel)
{
	struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
	struct perf_event_attr attr = evsel->core.attr;
	u64 *id_array;
	u32 *vcpu_array;
	int ret = -ENOMEM;
	u32 i;

	id_array = calloc(evsel->core.ids, sizeof(*id_array));
	if (!id_array)
		return -ENOMEM;

	vcpu_array = calloc(evsel->core.ids, sizeof(*vcpu_array));
	if (!vcpu_array)
		goto out;

	for (i = 0; i < evsel->core.ids; i++) {
		u64 id = evsel->core.id[i];
		struct guest_id *guest_id = guest_session__lookup_id(gs, id);

		if (!guest_id) {
			pr_err("Failed to find guest id %"PRIu64"\n", id);
			ret = -EINVAL;
			goto out;
		}
		id_array[i] = guest_id->host_id;
		vcpu_array[i] = guest_id->vcpu;
	}

	attr.sample_type |= PERF_SAMPLE_IDENTIFIER;
	attr.exclude_host = 1;
	attr.exclude_guest = 0;

	ret = perf_event__synthesize_attr(&inject->tool, &attr, evsel->core.ids,
					  id_array, process_attr);
	if (ret)
		pr_err("Failed to add guest attr.\n");

	for (i = 0; i < evsel->core.ids; i++) {
		struct perf_sample_id *sid;
		u32 vcpu = vcpu_array[i];

		sid = evlist__id2sid(inject->session->evlist, id_array[i]);
		/* Guest event is per-thread from the host point of view */
		sid->cpu.cpu = -1;
		sid->tid = gs->vcpu[vcpu].tid;
		sid->machine_pid = gs->machine_pid;
		sid->vcpu.cpu = vcpu;
	}
out:
	free(vcpu_array);
	free(id_array);
	return ret;
}

static int guest_session__add_attrs(struct guest_session *gs)
{
	struct evlist *evlist = gs->session->evlist;
	struct evsel *evsel;
	int ret;

	evlist__for_each_entry(evlist, evsel) {
		ret = guest_session__add_attr(gs, evsel);
		if (ret)
			return ret;
	}

	return 0;
}

static int synthesize_id_index(struct perf_inject *inject, size_t new_cnt)
{
	struct perf_session *session = inject->session;
	struct evlist *evlist = session->evlist;
	struct machine *machine = &session->machines.host;
	size_t from = evlist__nr_entries(evlist) - new_cnt;

	return __perf_event__synthesize_id_index(&inject->tool, perf_event__repipe,
						 evlist, machine, from);
}

static struct guest_tid *guest_session__lookup_tid(struct guest_session *gs, u32 tid)
{
	struct hlist_head *head;
	struct guest_tid *guest_tid;
	int hash;

	hash = hash_32(tid, PERF_EVLIST__HLIST_BITS);
	head = &gs->tids[hash];

	hlist_for_each_entry(guest_tid, head, node)
		if (guest_tid->tid == tid)
			return guest_tid;

	return NULL;
}

static bool dso__is_in_kernel_space(struct dso *dso)
{
	if (dso__is_vdso(dso))
		return false;

	return dso__is_kcore(dso) ||
	       dso__kernel(dso) ||
	       is_kernel_module(dso__long_name(dso), PERF_RECORD_MISC_CPUMODE_UNKNOWN);
}

static u64 evlist__first_id(struct evlist *evlist)
{
	struct evsel *evsel;

	evlist__for_each_entry(evlist, evsel) {
		if (evsel->core.ids)
			return evsel->core.id[0];
	}
	return 0;
}

static int process_build_id(const struct perf_tool *tool,
			    union perf_event *event,
			    struct perf_sample *sample __maybe_unused,
			    struct machine *machine __maybe_unused)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);

	return perf_event__process_build_id(tool, inject->session, event);
}

static int synthesize_build_id(struct perf_inject *inject, struct dso *dso, pid_t machine_pid)
{
	struct machine *machine = perf_session__findnew_machine(inject->session, machine_pid);
	struct perf_sample synth_sample = {
		.evsel	   = inject__mmap_evsel(inject),
		.pid	   = -1,
		.tid	   = -1,
		.time	   = -1,
		.stream_id = -1,
		.cpu	   = -1,
		.period	   = 1,
		.cpumode   = dso__is_in_kernel_space(dso)
		? PERF_RECORD_MISC_GUEST_KERNEL
		: PERF_RECORD_MISC_GUEST_USER,
	};

	if (!machine)
		return -ENOMEM;

	dso__set_hit(dso);

	return perf_event__synthesize_build_id(&inject->tool, &synth_sample, machine,
					       process_build_id,
					       /*misc=*/synth_sample.cpumode,
					       dso__bid(dso), dso__long_name(dso));
}

static int guest_session__add_build_ids_cb(struct dso *dso, void *data)
{
	struct guest_session *gs = data;
	struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);

	if (!dso__has_build_id(dso))
		return 0;

	return synthesize_build_id(inject, dso, gs->machine_pid);

}

static int guest_session__add_build_ids(struct guest_session *gs)
{
	struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);

	/* Build IDs will be put in the Build ID feature section */
	perf_header__set_feat(&inject->session->header, HEADER_BUILD_ID);

	return dsos__for_each_dso(&gs->session->machines.host.dsos,
				  guest_session__add_build_ids_cb,
				  gs);
}

static int guest_session__ksymbol_event(const struct perf_tool *tool,
					union perf_event *event,
					struct perf_sample *sample __maybe_unused,
					struct machine *machine __maybe_unused)
{
	struct guest_session *gs = container_of(tool, struct guest_session, tool);

	/* Only support out-of-line i.e. no BPF support */
	if (event->ksymbol.ksym_type != PERF_RECORD_KSYMBOL_TYPE_OOL)
		return 0;

	return guest_session__output_bytes(gs, event, event->header.size);
}

static int guest_session__start(struct guest_session *gs, const char *name, bool force)
{
	char tmp_file_name[] = "/tmp/perf-inject-guest_session-XXXXXX";
	struct perf_session *session;
	int ret;

	/* Only these events will be injected */
	gs->tool.mmap		= guest_session__repipe;
	gs->tool.mmap2		= guest_session__repipe;
	gs->tool.comm		= guest_session__repipe;
	gs->tool.fork		= guest_session__repipe;
	gs->tool.exit		= guest_session__repipe;
	gs->tool.lost		= guest_session__repipe;
	gs->tool.context_switch	= guest_session__repipe;
	gs->tool.ksymbol	= guest_session__ksymbol_event;
	gs->tool.text_poke	= guest_session__repipe;
	/*
	 * Processing a build ID creates a struct dso with that build ID. Later,
	 * all guest dsos are iterated and the build IDs processed into the host
	 * session where they will be output to the Build ID feature section
	 * when the perf.data file header is written.
	 */
	gs->tool.build_id	= perf_event__process_build_id;
	/* Process the id index to know what VCPU an ID belongs to */
	gs->tool.id_index	= perf_event__process_id_index;

	gs->tool.ordered_events	= true;
	gs->tool.ordering_requires_timestamps = true;

	gs->data.path	= name;
	gs->data.force	= force;
	gs->data.mode	= PERF_DATA_MODE_READ;

	session = perf_session__new(&gs->data, &gs->tool);
	if (IS_ERR(session))
		return PTR_ERR(session);
	gs->session = session;

	/*
	 * Initial events have zero'd ID samples. Get default ID sample size
	 * used for removing them.
	 */
	gs->dflt_id_hdr_size = session->machines.host.id_hdr_size;
	/* And default ID for adding back a host-compatible ID sample */
	gs->dflt_id = evlist__first_id(session->evlist);
	if (!gs->dflt_id) {
		pr_err("Guest data has no sample IDs");
		return -EINVAL;
	}

	/* Temporary file for guest events */
	gs->tmp_file_name = strdup(tmp_file_name);
	if (!gs->tmp_file_name)
		return -ENOMEM;
	gs->tmp_fd = mkstemp(gs->tmp_file_name);
	if (gs->tmp_fd < 0)
		return -errno;

	if (zstd_init(&gs->session->zstd_data, 0) < 0)
		pr_warning("Guest session decompression initialization failed.\n");

	/*
	 * perf does not support processing 2 sessions simultaneously, so output
	 * guest events to a temporary file.
	 */
	ret = perf_session__process_events(gs->session);
	if (ret)
		return ret;

	if (lseek(gs->tmp_fd, 0, SEEK_SET))
		return -errno;

	return 0;
}

/* Free hlist nodes assuming hlist_node is the first member of hlist entries */
static void free_hlist(struct hlist_head *heads, size_t hlist_sz)
{
	struct hlist_node *pos, *n;
	size_t i;

	for (i = 0; i < hlist_sz; ++i) {
		hlist_for_each_safe(pos, n, &heads[i]) {
			hlist_del(pos);
			free(pos);
		}
	}
}

static void guest_session__exit(struct guest_session *gs)
{
	if (gs->session) {
		perf_session__delete(gs->session);
		free_hlist(gs->heads, PERF_EVLIST__HLIST_SIZE);
		free_hlist(gs->tids, PERF_EVLIST__HLIST_SIZE);
	}
	if (gs->tmp_file_name) {
		if (gs->tmp_fd >= 0)
			close(gs->tmp_fd);
		unlink(gs->tmp_file_name);
		zfree(&gs->tmp_file_name);
	}
	zfree(&gs->vcpu);
	zfree(&gs->perf_data_file);
}

static void get_tsc_conv(struct perf_tsc_conversion *tc, struct perf_record_time_conv *time_conv)
{
	tc->time_shift		= time_conv->time_shift;
	tc->time_mult		= time_conv->time_mult;
	tc->time_zero		= time_conv->time_zero;
	tc->time_cycles		= time_conv->time_cycles;
	tc->time_mask		= time_conv->time_mask;
	tc->cap_user_time_zero	= time_conv->cap_user_time_zero;
	tc->cap_user_time_short	= time_conv->cap_user_time_short;
}

static void guest_session__get_tc(struct guest_session *gs)
{
	struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);

	get_tsc_conv(&gs->host_tc, &inject->session->time_conv);
	get_tsc_conv(&gs->guest_tc, &gs->session->time_conv);
}

static void guest_session__convert_time(struct guest_session *gs, u64 guest_time, u64 *host_time)
{
	u64 tsc;

	if (!guest_time) {
		*host_time = 0;
		return;
	}

	if (gs->guest_tc.cap_user_time_zero)
		tsc = perf_time_to_tsc(guest_time, &gs->guest_tc);
	else
		tsc = guest_time;

	/*
	 * This is the correct order of operations for x86 if the TSC Offset and
	 * Multiplier values are used.
	 */
	tsc -= gs->time_offset;
	tsc /= gs->time_scale;

	if (gs->host_tc.cap_user_time_zero)
		*host_time = tsc_to_perf_time(tsc, &gs->host_tc);
	else
		*host_time = tsc;
}

static int guest_session__fetch(struct guest_session *gs)
{
	void *buf;
	struct perf_event_header *hdr;
	size_t hdr_sz = sizeof(*hdr);
	ssize_t ret;

	perf_sample__init(&gs->ev.sample, /*all=*/false);
	buf = gs->ev.event_buf;
	if (!buf) {
		buf = malloc(PERF_SAMPLE_MAX_SIZE);
		if (!buf)
			return -ENOMEM;
		gs->ev.event_buf = buf;
	}
	hdr = buf;
	ret = readn(gs->tmp_fd, buf, hdr_sz);
	if (ret < 0)
		return ret;

	if (!ret) {
		/* Zero size means EOF */
		hdr->size = 0;
		return 0;
	}

	buf += hdr_sz;

	ret = readn(gs->tmp_fd, buf, hdr->size - hdr_sz);
	if (ret < 0)
		return ret;

	gs->ev.event = (union perf_event *)gs->ev.event_buf;
	gs->ev.sample.time = 0;

	if (hdr->type >= PERF_RECORD_USER_TYPE_START) {
		pr_err("Unexpected type fetching guest event");
		return 0;
	}

	ret = evlist__parse_sample(gs->session->evlist, gs->ev.event, &gs->ev.sample);
	if (ret) {
		pr_err("Parse failed fetching guest event");
		return ret;
	}

	if (!gs->have_tc) {
		guest_session__get_tc(gs);
		gs->have_tc = true;
	}

	guest_session__convert_time(gs, gs->ev.sample.time, &gs->ev.sample.time);

	return 0;
}

static int evlist__append_id_sample(struct evlist *evlist, union perf_event *ev,
				    const struct perf_sample *sample)
{
	struct evsel *evsel;
	void *array;
	int ret;

	evsel = evlist__id2evsel(evlist, sample->id);
	array = ev;

	if (!evsel) {
		pr_err("No evsel for id %"PRIu64"\n", sample->id);
		return -EINVAL;
	}

	array += ev->header.size;
	ret = perf_event__synthesize_id_sample(array, evsel->core.attr.sample_type, sample);
	if (ret < 0)
		return ret;

	if (ret & 7) {
		pr_err("Bad id sample size %d\n", ret);
		return -EINVAL;
	}

	ev->header.size += ret;

	return 0;
}

static int guest_session__inject_events(struct guest_session *gs, u64 timestamp)
{
	struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
	int ret;

	if (!gs->ready)
		return 0;

	while (1) {
		struct perf_sample *sample;
		struct guest_id *guest_id;
		union perf_event *ev;
		u16 id_hdr_size;
		u8 cpumode;
		u64 id;

		if (!gs->fetched) {
			ret = guest_session__fetch(gs);
			if (ret)
				break;
			gs->fetched = true;
		}

		ev = gs->ev.event;
		sample = &gs->ev.sample;

		if (!ev->header.size) {
			/* EOF */
			perf_sample__exit(&gs->ev.sample);
			gs->fetched = false;
			ret = 0;
			break;
		}
		if (sample->time > timestamp) {
			ret = 0;
			break;
		}

		/* Change cpumode to guest */
		cpumode = ev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
		if (cpumode & PERF_RECORD_MISC_USER)
			cpumode = PERF_RECORD_MISC_GUEST_USER;
		else
			cpumode = PERF_RECORD_MISC_GUEST_KERNEL;
		ev->header.misc &= ~PERF_RECORD_MISC_CPUMODE_MASK;
		ev->header.misc |= cpumode;

		id = sample->id;
		if (!id) {
			id = gs->dflt_id;
			id_hdr_size = gs->dflt_id_hdr_size;
		} else {
			struct evsel *evsel = evlist__id2evsel(gs->session->evlist, id);

			id_hdr_size = evsel__id_hdr_size(evsel);
		}

		if (id_hdr_size & 7) {
			pr_err("Bad id_hdr_size %u\n", id_hdr_size);
			ret = -EINVAL;
			break;
		}

		if (ev->header.size & 7) {
			pr_err("Bad event size %u\n", ev->header.size);
			ret = -EINVAL;
			break;
		}

		/* Remove guest id sample */
		ev->header.size -= id_hdr_size;

		if (ev->header.size & 7) {
			pr_err("Bad raw event size %u\n", ev->header.size);
			ret = -EINVAL;
			break;
		}

		guest_id = guest_session__lookup_id(gs, id);
		if (!guest_id) {
			pr_err("Guest event with unknown id %llu\n",
			       (unsigned long long)id);
			ret = -EINVAL;
			break;
		}

		/* Change to host ID to avoid conflicting ID values */
		sample->id = guest_id->host_id;
		sample->stream_id = guest_id->host_id;

		if (sample->cpu != (u32)-1) {
			if (sample->cpu >= gs->vcpu_cnt) {
				pr_err("Guest event with unknown VCPU %u\n",
				       sample->cpu);
				return -EINVAL;
			}
			/* Change to host CPU instead of guest VCPU */
			sample->cpu = gs->vcpu[sample->cpu].cpu;
		}

		/* New id sample with new ID and CPU */
		ret = evlist__append_id_sample(inject->session->evlist, ev, sample);
		if (ret)
			break;

		if (ev->header.size & 7) {
			pr_err("Bad new event size %u\n", ev->header.size);
			ret = -EINVAL;
			break;
		}

		ret = output_bytes(inject, ev, ev->header.size);
		if (ret)
			break;

		/* Reset for next guest session event fetch. */
		perf_sample__exit(sample);
		gs->fetched = false;
	}
	if (ret && gs->fetched) {
		/* Clear saved sample state on error. */
		perf_sample__exit(&gs->ev.sample);
		gs->fetched = false;
	}
	return ret;
}

static int guest_session__flush_events(struct guest_session *gs)
{
	return guest_session__inject_events(gs, -1);
}

static int host__repipe(const struct perf_tool *tool,
			union perf_event *event,
			struct perf_sample *sample,
			struct machine *machine)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	int ret;

	ret = guest_session__inject_events(&inject->guest_session, sample->time);
	if (ret)
		return ret;

	return perf_event__repipe(tool, event, sample, machine);
}

static int host__finished_init(const struct perf_tool *tool, struct perf_session *session,
			       union perf_event *event)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	struct guest_session *gs = &inject->guest_session;
	int ret;

	/*
	 * Peek through host COMM events to find QEMU threads and the VCPU they
	 * are running.
	 */
	ret = host_peek_vm_comms(session, gs);
	if (ret)
		return ret;

	if (!gs->vcpu_cnt) {
		pr_err("No VCPU threads found for pid %u\n", gs->machine_pid);
		return -EINVAL;
	}

	/*
	 * Allocate new (unused) host sample IDs and map them to the guest IDs.
	 */
	gs->highest_id = evlist__find_highest_id(session->evlist);
	ret = guest_session__map_ids(gs, session->evlist);
	if (ret)
		return ret;

	ret = guest_session__add_attrs(gs);
	if (ret)
		return ret;

	ret = synthesize_id_index(inject, evlist__nr_entries(gs->session->evlist));
	if (ret) {
		pr_err("Failed to synthesize id_index\n");
		return ret;
	}

	ret = guest_session__add_build_ids(gs);
	if (ret) {
		pr_err("Failed to add guest build IDs\n");
		return ret;
	}

	gs->ready = true;

	ret = guest_session__inject_events(gs, 0);
	if (ret)
		return ret;

	return perf_event__repipe_op2_synth(tool, session, event);
}

/*
 * Obey finished-round ordering. The FINISHED_ROUND event is first processed
 * which flushes host events to file up until the last flush time. Then inject
 * guest events up to the same time. Finally write out the FINISHED_ROUND event
 * itself.
 */
static int host__finished_round(const struct perf_tool *tool,
				union perf_event *event,
				struct ordered_events *oe)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	int ret = perf_event__process_finished_round(tool, event, oe);
	u64 timestamp = ordered_events__last_flush_time(oe);

	if (ret)
		return ret;

	ret = guest_session__inject_events(&inject->guest_session, timestamp);
	if (ret)
		return ret;

	return perf_event__repipe_oe_synth(tool, event, oe);
}

static int host__context_switch(const struct perf_tool *tool,
				union perf_event *event,
				struct perf_sample *sample,
				struct machine *machine)
{
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
	bool out = event->header.misc & PERF_RECORD_MISC_SWITCH_OUT;
	struct guest_session *gs = &inject->guest_session;
	u32 pid = event->context_switch.next_prev_pid;
	u32 tid = event->context_switch.next_prev_tid;
	struct guest_tid *guest_tid;
	u32 vcpu;

	if (out || pid != gs->machine_pid)
		goto out;

	guest_tid = guest_session__lookup_tid(gs, tid);
	if (!guest_tid)
		goto out;

	if (sample->cpu == (u32)-1) {
		pr_err("Switch event does not have CPU\n");
		return -EINVAL;
	}

	vcpu = guest_tid->vcpu;
	if (vcpu >= gs->vcpu_cnt)
		return -EINVAL;

	/* Guest is switching in, record which CPU the VCPU is now running on */
	gs->vcpu[vcpu].cpu = sample->cpu;
out:
	return host__repipe(tool, event, sample, machine);
}

static void sig_handler(int sig __maybe_unused)
{
	session_done = 1;
}

static int evsel__check_stype(struct evsel *evsel, u64 sample_type, const char *sample_msg)
{
	struct perf_event_attr *attr = &evsel->core.attr;
	const char *name = evsel__name(evsel);

	if (!(attr->sample_type & sample_type)) {
		pr_err("Samples for %s event do not have %s attribute set.",
			name, sample_msg);
		return -EINVAL;
	}

	return 0;
}

static int drop_sample(const struct perf_tool *tool __maybe_unused,
		       union perf_event *event __maybe_unused,
		       struct perf_sample *sample __maybe_unused,
		       struct machine *machine __maybe_unused)
{
	return 0;
}

static void strip_init(struct perf_inject *inject)
{
	struct evlist *evlist = inject->session->evlist;
	struct evsel *evsel;

	inject->tool.context_switch = perf_event__drop;

	evlist__for_each_entry(evlist, evsel)
		evsel->handler = drop_sample;
}

static int parse_vm_time_correlation(const struct option *opt, const char *str, int unset)
{
	struct perf_inject *inject = opt->value;
	const char *args;
	char *dry_run;

	if (unset)
		return 0;

	inject->itrace_synth_opts.set = true;
	inject->itrace_synth_opts.vm_time_correlation = true;
	inject->in_place_update = true;

	if (!str)
		return 0;

	dry_run = skip_spaces(str);
	if (!strncmp(dry_run, "dry-run", strlen("dry-run"))) {
		inject->itrace_synth_opts.vm_tm_corr_dry_run = true;
		inject->in_place_update_dry_run = true;
		args = dry_run + strlen("dry-run");
	} else {
		args = str;
	}

	inject->itrace_synth_opts.vm_tm_corr_args = strdup(args);

	return inject->itrace_synth_opts.vm_tm_corr_args ? 0 : -ENOMEM;
}

static int parse_guest_data(const struct option *opt, const char *str, int unset)
{
	struct perf_inject *inject = opt->value;
	struct guest_session *gs = &inject->guest_session;
	char *tok;
	char *s;

	if (unset)
		return 0;

	if (!str)
		goto bad_args;

	s = strdup(str);
	if (!s)
		return -ENOMEM;

	gs->perf_data_file = strsep(&s, ",");
	if (!gs->perf_data_file)
		goto bad_args;

	gs->copy_kcore_dir = has_kcore_dir(gs->perf_data_file);
	if (gs->copy_kcore_dir)
		inject->output.is_dir = true;

	tok = strsep(&s, ",");
	if (!tok)
		goto bad_args;
	gs->machine_pid = strtoul(tok, NULL, 0);
	if (!inject->guest_session.machine_pid)
		goto bad_args;

	gs->time_scale = 1;

	tok = strsep(&s, ",");
	if (!tok)
		goto out;
	gs->time_offset = strtoull(tok, NULL, 0);

	tok = strsep(&s, ",");
	if (!tok)
		goto out;
	gs->time_scale = strtod(tok, NULL);
	if (!gs->time_scale)
		goto bad_args;
out:
	return 0;

bad_args:
	pr_err("--guest-data option requires guest perf.data file name, "
	       "guest machine PID, and optionally guest timestamp offset, "
	       "and guest timestamp scale factor, separated by commas.\n");
	return -1;
}

static int save_section_info_cb(struct perf_file_section *section,
				struct perf_header *ph __maybe_unused,
				int feat, int fd __maybe_unused, void *data)
{
	struct perf_inject *inject = data;

	inject->secs[feat] = *section;
	return 0;
}

static int save_section_info(struct perf_inject *inject)
{
	struct perf_header *header = &inject->session->header;
	int fd = perf_data__fd(inject->session->data);

	return perf_header__process_sections(header, fd, inject, save_section_info_cb);
}

static bool keep_feat(struct perf_inject *inject, int feat)
{
	switch (feat) {
	/* Keep original information that describes the machine or software */
	case HEADER_TRACING_DATA:
	case HEADER_HOSTNAME:
	case HEADER_OSRELEASE:
	case HEADER_VERSION:
	case HEADER_ARCH:
	case HEADER_NRCPUS:
	case HEADER_CPUDESC:
	case HEADER_CPUID:
	case HEADER_TOTAL_MEM:
	case HEADER_CPU_TOPOLOGY:
	case HEADER_NUMA_TOPOLOGY:
	case HEADER_PMU_MAPPINGS:
	case HEADER_CACHE:
	case HEADER_MEM_TOPOLOGY:
	case HEADER_CLOCKID:
	case HEADER_BPF_PROG_INFO:
	case HEADER_BPF_BTF:
	case HEADER_CPU_PMU_CAPS:
	case HEADER_CLOCK_DATA:
	case HEADER_HYBRID_TOPOLOGY:
	case HEADER_PMU_CAPS:
	case HEADER_CPU_DOMAIN_INFO:
	case HEADER_CLN_SIZE:
		return true;
	/* Information that can be updated */
	case HEADER_BUILD_ID:
		return inject->build_id_style == BID_RWS__NONE;
	case HEADER_CMDLINE:
	case HEADER_EVENT_DESC:
	case HEADER_BRANCH_STACK:
	case HEADER_GROUP_DESC:
	case HEADER_AUXTRACE:
	case HEADER_STAT:
	case HEADER_SAMPLE_TIME:
	case HEADER_DIR_FORMAT:
	case HEADER_COMPRESSED:
	default:
		return false;
	};
}

static int read_file(int fd, u64 offs, void *buf, size_t sz)
{
	ssize_t ret = preadn(fd, buf, sz, offs);

	if (ret < 0)
		return -errno;
	if ((size_t)ret != sz)
		return -EINVAL;
	return 0;
}

static int feat_copy(struct perf_inject *inject, int feat, struct feat_writer *fw)
{
	int fd = perf_data__fd(inject->session->data);
	u64 offs = inject->secs[feat].offset;
	size_t sz = inject->secs[feat].size;
	void *buf = malloc(sz);
	int ret;

	if (!buf)
		return -ENOMEM;

	ret = read_file(fd, offs, buf, sz);
	if (ret)
		goto out_free;

	ret = fw->write(fw, buf, sz);
out_free:
	free(buf);
	return ret;
}

struct inject_fc {
	struct feat_copier fc;
	struct perf_inject *inject;
};

static int feat_copy_cb(struct feat_copier *fc, int feat, struct feat_writer *fw)
{
	struct inject_fc *inj_fc = container_of(fc, struct inject_fc, fc);
	struct perf_inject *inject = inj_fc->inject;
	int ret;

	if (!inject->secs[feat].offset ||
	    !keep_feat(inject, feat))
		return 0;

	ret = feat_copy(inject, feat, fw);
	if (ret < 0)
		return ret;

	return 1; /* Feature section copied */
}

static int copy_kcore_dir(struct perf_inject *inject)
{
	char *cmd;
	int ret;

	ret = asprintf(&cmd, "cp -r -n %s/kcore_dir* %s >/dev/null 2>&1",
		       inject->input_name, inject->output.path);
	if (ret < 0)
		return ret;
	pr_debug("%s\n", cmd);
	ret = system(cmd);
	free(cmd);
	return ret;
}

static int guest_session__copy_kcore_dir(struct guest_session *gs)
{
	struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
	char *cmd;
	int ret;

	ret = asprintf(&cmd, "cp -r -n %s/kcore_dir %s/kcore_dir__%u >/dev/null 2>&1",
		       gs->perf_data_file, inject->output.path, gs->machine_pid);
	if (ret < 0)
		return ret;
	pr_debug("%s\n", cmd);
	ret = system(cmd);
	free(cmd);
	return ret;
}

static int output_fd(struct perf_inject *inject)
{
	return inject->in_place_update ? -1 : perf_data__fd(&inject->output);
}

static int __cmd_inject(struct perf_inject *inject)
{
	int ret = -EINVAL;
	struct guest_session *gs = &inject->guest_session;
	struct perf_session *session = inject->session;
	int fd = output_fd(inject);
	u64 output_data_offset = perf_session__data_offset(session->evlist);
	/*
	 * Pipe input hasn't loaded the attributes and will handle them as
	 * events. So that the attributes don't overlap the data, write the
	 * attributes after the data.
	 */
	bool write_attrs_after_data = !inject->output.is_pipe && inject->session->data->is_pipe;

	signal(SIGINT, sig_handler);

	if (inject->build_id_style != BID_RWS__NONE || inject->sched_stat ||
	    inject->itrace_synth_opts.set) {
		inject->tool.mmap	  = perf_event__repipe_mmap;
		inject->tool.mmap2	  = perf_event__repipe_mmap2;
		inject->tool.fork	  = perf_event__repipe_fork;
#ifdef HAVE_LIBTRACEEVENT
		inject->tool.tracing_data = perf_event__repipe_tracing_data;
#endif
	}

	if (inject->build_id_style == BID_RWS__INJECT_HEADER_LAZY ||
	    inject->build_id_style == BID_RWS__MMAP2_BUILDID_LAZY) {
		inject->tool.sample = perf_event__inject_buildid;
	} else if (inject->sched_stat) {
		struct evsel *evsel;

		evlist__for_each_entry(session->evlist, evsel) {
			const char *name = evsel__name(evsel);

			if (!strcmp(name, "sched:sched_switch")) {
				if (evsel__check_stype(evsel, PERF_SAMPLE_TID, "TID"))
					return -EINVAL;

				evsel->handler = perf_inject__sched_switch;
			} else if (!strcmp(name, "sched:sched_process_exit"))
				evsel->handler = perf_inject__sched_process_exit;
#ifdef HAVE_LIBTRACEEVENT
			else if (!strncmp(name, "sched:sched_stat_", 17))
				evsel->handler = perf_inject__sched_stat;
#endif
		}
	} else if (inject->itrace_synth_opts.vm_time_correlation) {
		session->itrace_synth_opts = &inject->itrace_synth_opts;
		memset(&inject->tool, 0, sizeof(inject->tool));
		inject->tool.id_index	    = perf_event__process_id_index;
		inject->tool.auxtrace_info  = perf_event__process_auxtrace_info;
		inject->tool.auxtrace	    = perf_event__process_auxtrace;
		inject->tool.auxtrace_error = perf_event__process_auxtrace_error;
		inject->tool.ordered_events = true;
		inject->tool.ordering_requires_timestamps = true;
	} else if (inject->itrace_synth_opts.set) {
		session->itrace_synth_opts = &inject->itrace_synth_opts;
		inject->itrace_synth_opts.inject = true;
		inject->tool.comm	    = perf_event__repipe_comm;
		inject->tool.namespaces	    = perf_event__repipe_namespaces;
		inject->tool.exit	    = perf_event__repipe_exit;
		inject->tool.id_index	    = perf_event__process_id_index;
		inject->tool.auxtrace_info  = perf_event__process_auxtrace_info;
		inject->tool.auxtrace	    = perf_event__process_auxtrace;
		inject->tool.aux	    = perf_event__drop_aux;
		inject->tool.itrace_start   = perf_event__drop_aux;
		inject->tool.aux_output_hw_id = perf_event__drop_aux;
		inject->tool.ordered_events = true;
		inject->tool.ordering_requires_timestamps = true;
		/* Allow space in the header for new attributes */
		output_data_offset = roundup(8192 + session->header.data_offset, 4096);
		if (inject->strip)
			strip_init(inject);
	} else if (gs->perf_data_file) {
		char *name = gs->perf_data_file;

		/*
		 * Not strictly necessary, but keep these events in order wrt
		 * guest events.
		 */
		inject->tool.mmap		= host__repipe;
		inject->tool.mmap2		= host__repipe;
		inject->tool.comm		= host__repipe;
		inject->tool.fork		= host__repipe;
		inject->tool.exit		= host__repipe;
		inject->tool.lost		= host__repipe;
		inject->tool.context_switch	= host__repipe;
		inject->tool.ksymbol		= host__repipe;
		inject->tool.text_poke		= host__repipe;
		/*
		 * Once the host session has initialized, set up sample ID
		 * mapping and feed in guest attrs, build IDs and initial
		 * events.
		 */
		inject->tool.finished_init	= host__finished_init;
		/* Obey finished round ordering */
		inject->tool.finished_round	= host__finished_round;
		/* Keep track of which CPU a VCPU is runnng on */
		inject->tool.context_switch	= host__context_switch;
		/*
		 * Must order events to be able to obey finished round
		 * ordering.
		 */
		inject->tool.ordered_events	= true;
		inject->tool.ordering_requires_timestamps = true;
		/* Set up a separate session to process guest perf.data file */
		ret = guest_session__start(gs, name, session->data->force);
		if (ret) {
			pr_err("Failed to process %s, error %d\n", name, ret);
			return ret;
		}
		/* Allow space in the header for guest attributes */
		output_data_offset += gs->session->header.data_offset;
		output_data_offset = roundup(output_data_offset, 4096);
	} else if (inject->convert_callchain) {
		inject->tool.sample	= perf_event__convert_sample_callchain;
		inject->tool.fork	= perf_event__repipe_fork;
		inject->tool.comm	= perf_event__repipe_comm;
		inject->tool.exit	= perf_event__repipe_exit;
		inject->tool.mmap	= perf_event__repipe_mmap;
		inject->tool.mmap2	= perf_event__repipe_mmap2;
		inject->tool.ordered_events = true;
		inject->tool.ordering_requires_timestamps = true;
	}

	if (!inject->itrace_synth_opts.set)
		auxtrace_index__free(&session->auxtrace_index);

	if (!inject->output.is_pipe && !inject->in_place_update)
		lseek(fd, output_data_offset, SEEK_SET);

	ret = perf_session__process_events(session);
	if (ret)
		return ret;

	if (gs->session) {
		/*
		 * Remaining guest events have later timestamps. Flush them
		 * out to file.
		 */
		ret = guest_session__flush_events(gs);
		if (ret) {
			pr_err("Failed to flush guest events\n");
			return ret;
		}
	}

	if (!inject->output.is_pipe && !inject->in_place_update) {
		struct inject_fc inj_fc = {
			.fc.copy = feat_copy_cb,
			.inject = inject,
		};

		if (inject->build_id_style == BID_RWS__INJECT_HEADER_LAZY ||
		    inject->build_id_style == BID_RWS__INJECT_HEADER_ALL)
			perf_header__set_feat(&session->header, HEADER_BUILD_ID);
		/*
		 * Keep all buildids when there is unprocessed AUX data because
		 * it is not known which ones the AUX trace hits.
		 */
		if (perf_header__has_feat(&session->header, HEADER_BUILD_ID) &&
		    inject->have_auxtrace && !inject->itrace_synth_opts.set)
			perf_session__dsos_hit_all(session);
		/*
		 * The AUX areas have been removed and replaced with
		 * synthesized hardware events, so clear the feature flag.
		 */
		if (inject->itrace_synth_opts.set) {
			struct evsel *evsel;

			perf_header__clear_feat(&session->header,
						HEADER_AUXTRACE);

			evlist__for_each_entry(session->evlist, evsel) {
				evsel->core.attr.sample_type &= ~PERF_SAMPLE_AUX;
			}

			if (inject->itrace_synth_opts.add_last_branch) {
				perf_header__set_feat(&session->header,
						      HEADER_BRANCH_STACK);

				evlist__for_each_entry(session->evlist, evsel) {
					evsel->core.attr.sample_type |= PERF_SAMPLE_BRANCH_STACK;
					if (evsel->core.attr.size < PERF_ATTR_SIZE_VER2)
						evsel->core.attr.size = PERF_ATTR_SIZE_VER2;
					evsel->core.attr.branch_sample_type |=
						PERF_SAMPLE_BRANCH_HW_INDEX;
				}
			}
		}

		/*
		 * The converted data file won't have stack and registers.
		 * Update the perf_event_attr to remove them before writing.
		 */
		if (inject->convert_callchain) {
			struct evsel *evsel;

			evlist__for_each_entry(session->evlist, evsel) {
				evsel__reset_sample_bit(evsel, REGS_USER);
				evsel__reset_sample_bit(evsel, STACK_USER);
				evsel->core.attr.sample_regs_user = 0;
				evsel->core.attr.sample_stack_user = 0;
				evsel->core.attr.exclude_callchain_user = 0;
			}
		}

		if (inject->aslr)
			aslr_tool__strip_evlist(inject->session->tool, session->evlist);

		session->header.data_offset = output_data_offset;
		session->header.data_size = inject->bytes_written;
		perf_session__inject_header(session, session->evlist, fd, &inj_fc.fc,
					    write_attrs_after_data);

		if (inject->copy_kcore_dir) {
			ret = copy_kcore_dir(inject);
			if (ret) {
				pr_err("Failed to copy kcore\n");
				return ret;
			}
		}
		if (gs->copy_kcore_dir) {
			ret = guest_session__copy_kcore_dir(gs);
			if (ret) {
				pr_err("Failed to copy guest kcore\n");
				return ret;
			}
		}
	}

	return ret;
}

static bool evsel__has_dwarf_callchain(struct evsel *evsel)
{
	struct perf_event_attr *attr = &evsel->core.attr;
	const u64 dwarf_callchain_flags =
		PERF_SAMPLE_STACK_USER | PERF_SAMPLE_REGS_USER | PERF_SAMPLE_CALLCHAIN;

	if (!attr->exclude_callchain_user)
		return false;

	return (attr->sample_type & dwarf_callchain_flags) == dwarf_callchain_flags;
}

int cmd_inject(int argc, const char **argv)
{
	struct perf_inject inject = {
		.input_name  = "-",
		.samples = LIST_HEAD_INIT(inject.samples),
		.output = {
			.path = "-",
			.mode = PERF_DATA_MODE_WRITE,
			.file.use_stdio = true,
		},
	};
	struct perf_data data = {
		.mode = PERF_DATA_MODE_READ,
		.file.use_stdio = true,
	};
	int ret;
	const char *known_build_ids = NULL;
	bool build_ids = false;
	bool build_id_all = false;
	bool mmap2_build_ids = false;
	bool mmap2_build_id_all = false;

	struct option options[] = {
		OPT_BOOLEAN('b', "build-ids", &build_ids,
			    "Inject build-ids into the output stream"),
		OPT_BOOLEAN(0, "buildid-all", &build_id_all,
			    "Inject build-ids of all DSOs into the output stream"),
		OPT_BOOLEAN('B', "mmap2-buildids", &mmap2_build_ids,
			    "Drop unused mmap events, make others mmap2 with build IDs"),
		OPT_BOOLEAN(0, "mmap2-buildid-all", &mmap2_build_id_all,
			    "Rewrite all mmap events as mmap2 events with build IDs"),
		OPT_STRING(0, "known-build-ids", &known_build_ids,
			   "buildid path [,buildid path...]",
			   "build-ids to use for given paths"),
		OPT_STRING('i', "input", &inject.input_name, "file",
			   "input file name"),
		OPT_STRING('o', "output", &inject.output.path, "file",
			   "output file name"),
		OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat,
			    "Merge sched-stat and sched-switch for getting events "
			    "where and how long tasks slept"),
#ifdef HAVE_JITDUMP
		OPT_BOOLEAN('j', "jit", &inject.jit_mode, "merge jitdump files into perf.data file"),
#endif
		OPT_INCR('v', "verbose", &verbose,
			 "be more verbose (show build ids, etc)"),
		OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
			   "file", "vmlinux pathname"),
		OPT_BOOLEAN(0, "ignore-vmlinux", &symbol_conf.ignore_vmlinux,
			    "don't load vmlinux even if found"),
		OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name, "file",
			   "kallsyms pathname"),
		OPT_BOOLEAN('f', "force", &data.force, "don't complain, do it"),
		OPT_CALLBACK_OPTARG(0, "itrace", &inject.itrace_synth_opts,
				    NULL, "opts", "Instruction Tracing options\n"
				    ITRACE_HELP,
				    itrace_parse_synth_opts),
		OPT_BOOLEAN(0, "strip", &inject.strip,
			    "strip non-synthesized events (use with --itrace)"),
		OPT_CALLBACK_OPTARG(0, "vm-time-correlation", &inject, NULL, "opts",
				    "correlate time between VM guests and the host",
				    parse_vm_time_correlation),
		OPT_CALLBACK_OPTARG(0, "guest-data", &inject, NULL, "opts",
				    "inject events from a guest perf.data file",
				    parse_guest_data),
		OPT_STRING(0, "guestmount", &symbol_conf.guestmount, "directory",
			   "guest mount directory under which every guest os"
			   " instance has a subdir"),
		OPT_CALLBACK(0, "unwind-style", NULL, "unwind style",
			     "unwind styles (libdw,libunwind)",
			     unwind__option),
		OPT_BOOLEAN(0, "convert-callchain", &inject.convert_callchain,
			    "Generate callchains using DWARF and drop register/stack data"),
		OPT_BOOLEAN(0, "aslr", &inject.aslr,
			    "Remap virtual memory addresses similar to ASLR"),
		OPT_END()
	};
	const char * const inject_usage[] = {
		"perf inject [<options>]",
		NULL
	};
	bool ordered_events;
	struct perf_tool *tool = &inject.tool;

	if (!inject.itrace_synth_opts.set) {
		/* Disable eager loading of kernel symbols that adds overhead to perf inject. */
		symbol_conf.lazy_load_kernel_maps = true;
	}

#ifndef HAVE_JITDUMP
	set_option_nobuild(options, 'j', "jit", "NO_LIBELF=1", true);
#endif
#ifndef HAVE_LIBDW_SUPPORT
	set_option_nobuild(options, 0, "convert-callchain", "NO_LIBDW=1", true);
#endif
	argc = parse_options(argc, argv, options, inject_usage, 0);

	/*
	 * Any (unrecognized) arguments left?
	 */
	if (argc)
		usage_with_options(inject_usage, options);

	if (inject.aslr && inject.convert_callchain) {
		pr_err("Error: --aslr and --convert-callchain are mutually exclusive features.\n");
		return -EINVAL;
	}

	if (inject.strip && !inject.itrace_synth_opts.set) {
		pr_err("--strip option requires --itrace option\n");
		return -1;
	}

	if (symbol__validate_sym_arguments())
		return -1;

	if (inject.in_place_update) {
		if (!strcmp(inject.input_name, "-")) {
			pr_err("Input file name required for in-place updating\n");
			return -1;
		}
		if (strcmp(inject.output.path, "-")) {
			pr_err("Output file name must not be specified for in-place updating\n");
			return -1;
		}
		if (!data.force && !inject.in_place_update_dry_run) {
			pr_err("The input file would be updated in place, "
				"the --force option is required.\n");
			return -1;
		}
		if (!inject.in_place_update_dry_run)
			data.in_place_update = true;
	} else {
		if (strcmp(inject.output.path, "-") && !inject.strip &&
		    has_kcore_dir(inject.input_name)) {
			inject.output.is_dir = true;
			inject.copy_kcore_dir = true;
		}
		if (perf_data__open(&inject.output)) {
			perror("failed to create output file");
			return -1;
		}
	}
	if (mmap2_build_ids)
		inject.build_id_style = BID_RWS__MMAP2_BUILDID_LAZY;
	if (mmap2_build_id_all)
		inject.build_id_style = BID_RWS__MMAP2_BUILDID_ALL;
	if (build_ids)
		inject.build_id_style = BID_RWS__INJECT_HEADER_LAZY;
	if (build_id_all)
		inject.build_id_style = BID_RWS__INJECT_HEADER_ALL;

	data.path = inject.input_name;

	ordered_events = inject.jit_mode || inject.sched_stat ||
		inject.build_id_style == BID_RWS__INJECT_HEADER_LAZY ||
		inject.build_id_style == BID_RWS__MMAP2_BUILDID_LAZY;
	perf_tool__init(&inject.tool, ordered_events);
	inject.tool.sample		= perf_event__repipe_sample;
	inject.tool.read		= perf_event__repipe_sample;
	inject.tool.mmap		= perf_event__repipe;
	inject.tool.mmap2		= perf_event__repipe;
	inject.tool.comm		= perf_event__repipe;
	inject.tool.namespaces		= perf_event__repipe;
	inject.tool.cgroup		= perf_event__repipe;
	inject.tool.fork		= perf_event__repipe;
	inject.tool.exit		= perf_event__repipe;
	inject.tool.lost		= perf_event__repipe;
	inject.tool.lost_samples	= perf_event__repipe;
	inject.tool.aux			= perf_event__repipe;
	inject.tool.itrace_start	= perf_event__repipe;
	inject.tool.aux_output_hw_id	= perf_event__repipe;
	inject.tool.context_switch	= perf_event__repipe;
	inject.tool.throttle		= perf_event__repipe;
	inject.tool.unthrottle		= perf_event__repipe;
	inject.tool.ksymbol		= perf_event__repipe;
	inject.tool.bpf			= perf_event__repipe;
	inject.tool.text_poke		= perf_event__repipe;
	inject.tool.attr		= perf_event__repipe_attr;
	inject.tool.event_update	= perf_event__repipe_event_update;
	inject.tool.tracing_data	= perf_event__repipe_op2_synth;
	inject.tool.finished_round	= perf_event__repipe_oe_synth;
	inject.tool.build_id		= perf_event__repipe_op2_synth;
	inject.tool.id_index		= perf_event__repipe_op2_synth;
	inject.tool.auxtrace_info	= perf_event__repipe_op2_synth;
	inject.tool.auxtrace_error	= perf_event__repipe_op2_synth;
	inject.tool.time_conv		= perf_event__repipe_op2_synth;
	inject.tool.thread_map		= perf_event__repipe_op2_synth;
	inject.tool.cpu_map		= perf_event__repipe_op2_synth;
	inject.tool.stat_config		= perf_event__repipe_op2_synth;
	inject.tool.stat		= perf_event__repipe_op2_synth;
	inject.tool.stat_round		= perf_event__repipe_op2_synth;
	inject.tool.feature		= perf_event__repipe_op2_synth;
	inject.tool.finished_init	= perf_event__repipe_op2_synth;
	inject.tool.compressed		= perf_event__repipe_op4_synth;
	inject.tool.auxtrace		= perf_event__repipe_auxtrace;
	inject.tool.bpf_metadata	= perf_event__repipe_op2_synth;
	inject.tool.schedstat_cpu	= perf_event__repipe_op2_synth;
	inject.tool.schedstat_domain	= perf_event__repipe_op2_synth;
	inject.tool.dont_split_sample_group = true;
	inject.tool.merge_deferred_callchains = false;
	if (inject.aslr) {
		tool = aslr_tool__new(&inject.tool);
		if (!tool) {
			ret = -ENOMEM;
			goto out_close_output;
		}
	}
	inject.session = __perf_session__new(&data, tool,
					     /*trace_event_repipe=*/inject.output.is_pipe,
					     /*host_env=*/NULL);

	if (IS_ERR(inject.session)) {
		ret = PTR_ERR(inject.session);
		if (inject.aslr)
			aslr_tool__delete(tool);
		goto out_close_output;
	}

	if (zstd_init(&(inject.session->zstd_data), 0) < 0)
		pr_warning("Decompression initialization failed.\n");

	if (inject.aslr) {
		struct evsel *evsel;

		evlist__for_each_entry(inject.session->evlist, evsel) {
			ret = aslr_tool__cache_orig_attrs(tool, evsel);
			if (ret) {
				pr_err("Failed to cache original attributes: %d\n", ret);
				goto out_delete;
			}
		}
	}

	/* Save original section info before feature bits change */
	ret = save_section_info(&inject);
	if (ret)
		goto out_delete;

	if (inject.output.is_pipe) {
		ret = perf_header__write_pipe(perf_data__fd(&inject.output));
		if (ret < 0) {
			pr_err("Couldn't write a new pipe header.\n");
			goto out_delete;
		}

		/*
		 * If the input is already a pipe then the features and
		 * attributes don't need synthesizing, they will be present in
		 * the input.
		 */
		if (!data.is_pipe) {
			if (inject.aslr)
				aslr_tool__strip_evlist(tool, inject.session->evlist);

			ret = perf_event__synthesize_for_pipe(&inject.tool,
							      inject.session,
							      &inject.output,
							      perf_event__repipe);

			if (inject.aslr)
				aslr_tool__restore_evlist(tool, inject.session->evlist);

			if (ret < 0)
				goto out_delete;
		}
	}

	if (inject.build_id_style == BID_RWS__INJECT_HEADER_LAZY ||
	    inject.build_id_style == BID_RWS__MMAP2_BUILDID_LAZY) {
		/*
		 * to make sure the mmap records are ordered correctly
		 * and so that the correct especially due to jitted code
		 * mmaps. We cannot generate the buildid hit list and
		 * inject the jit mmaps at the same time for now.
		 */
		inject.tool.ordering_requires_timestamps = true;
	}
	if (inject.build_id_style != BID_RWS__NONE && known_build_ids != NULL) {
		inject.known_build_ids =
			perf_inject__parse_known_build_ids(known_build_ids);

		if (inject.known_build_ids == NULL) {
			pr_err("Couldn't parse known build ids.\n");
			goto out_delete;
		}
	}

	if (inject.convert_callchain) {
		struct evsel *evsel;

		if (inject.output.is_pipe || inject.session->data->is_pipe) {
			pr_err("--convert-callchain cannot work with pipe\n");
			goto out_delete;
		}

		evlist__for_each_entry(inject.session->evlist, evsel) {
			if (!evsel__has_dwarf_callchain(evsel) && !evsel__is_dummy_event(evsel)) {
				pr_err("--convert-callchain requires DWARF call graph.\n");
				goto out_delete;
			}
		}

		inject.raw_callchain = calloc(PERF_MAX_STACK_DEPTH, sizeof(u64));
		if (inject.raw_callchain == NULL) {
			pr_err("callchain allocation failed\n");
			goto out_delete;
		}
	}

#ifdef HAVE_JITDUMP
	if (inject.jit_mode) {
		inject.tool.mmap2	   = perf_event__repipe_mmap2;
		inject.tool.mmap	   = perf_event__repipe_mmap;
		inject.tool.ordering_requires_timestamps = true;
		/*
		 * JIT MMAP injection injects all MMAP events in one go, so it
		 * does not obey finished_round semantics.
		 */
		inject.tool.finished_round = perf_event__drop_oe;
	}
#endif
	ret = symbol__init(perf_session__env(inject.session));
	if (ret < 0)
		goto out_delete;

	ret = __cmd_inject(&inject);

	guest_session__exit(&inject.guest_session);

out_delete:
	strlist__delete(inject.known_build_ids);
	zstd_fini(&(inject.session->zstd_data));
	perf_session__delete(inject.session);
	if (inject.aslr)
		aslr_tool__delete(tool);
out_close_output:
	if (!inject.in_place_update)
		perf_data__close(&inject.output);
	free(inject.itrace_synth_opts.vm_tm_corr_args);
	free(inject.event_copy);
	free(inject.guest_session.ev.event_buf);
	free(inject.raw_callchain);
	return ret;
}
