// SPDX-License-Identifier: GPL-2.0
/*
 * dlfilter-test-api-v0.c: test original (v0) API for perf --dlfilter shared object
 * Copyright (c) 2021, Intel Corporation.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

/*
 * Copy original (v0) API instead of including current API
 */
#include <linux/perf_event.h>
#include <linux/types.h>

/* Definitions for perf_dlfilter_sample flags */
enum {
	PERF_DLFILTER_FLAG_BRANCH	= 1ULL << 0,
	PERF_DLFILTER_FLAG_CALL		= 1ULL << 1,
	PERF_DLFILTER_FLAG_RETURN	= 1ULL << 2,
	PERF_DLFILTER_FLAG_CONDITIONAL	= 1ULL << 3,
	PERF_DLFILTER_FLAG_SYSCALLRET	= 1ULL << 4,
	PERF_DLFILTER_FLAG_ASYNC	= 1ULL << 5,
	PERF_DLFILTER_FLAG_INTERRUPT	= 1ULL << 6,
	PERF_DLFILTER_FLAG_TX_ABORT	= 1ULL << 7,
	PERF_DLFILTER_FLAG_TRACE_BEGIN	= 1ULL << 8,
	PERF_DLFILTER_FLAG_TRACE_END	= 1ULL << 9,
	PERF_DLFILTER_FLAG_IN_TX	= 1ULL << 10,
	PERF_DLFILTER_FLAG_VMENTRY	= 1ULL << 11,
	PERF_DLFILTER_FLAG_VMEXIT	= 1ULL << 12,
};

/*
 * perf sample event information (as per perf script and <linux/perf_event.h>)
 */
struct perf_dlfilter_sample {
	__u32 size; /* Size of this structure (for compatibility checking) */
	__u16 ins_lat;		/* Refer PERF_SAMPLE_WEIGHT_TYPE in <linux/perf_event.h> */
	__u16 p_stage_cyc;	/* Refer PERF_SAMPLE_WEIGHT_TYPE in <linux/perf_event.h> */
	__u64 ip;
	__s32 pid;
	__s32 tid;
	__u64 time;
	__u64 addr;
	__u64 id;
	__u64 stream_id;
	__u64 period;
	__u64 weight;		/* Refer PERF_SAMPLE_WEIGHT_TYPE in <linux/perf_event.h> */
	__u64 transaction;	/* Refer PERF_SAMPLE_TRANSACTION in <linux/perf_event.h> */
	__u64 insn_cnt;	/* For instructions-per-cycle (IPC) */
	__u64 cyc_cnt;		/* For instructions-per-cycle (IPC) */
	__s32 cpu;
	__u32 flags;		/* Refer PERF_DLFILTER_FLAG_* above */
	__u64 data_src;		/* Refer PERF_SAMPLE_DATA_SRC in <linux/perf_event.h> */
	__u64 phys_addr;	/* Refer PERF_SAMPLE_PHYS_ADDR in <linux/perf_event.h> */
	__u64 data_page_size;	/* Refer PERF_SAMPLE_DATA_PAGE_SIZE in <linux/perf_event.h> */
	__u64 code_page_size;	/* Refer PERF_SAMPLE_CODE_PAGE_SIZE in <linux/perf_event.h> */
	__u64 cgroup;		/* Refer PERF_SAMPLE_CGROUP in <linux/perf_event.h> */
	__u8  cpumode;		/* Refer CPUMODE_MASK etc in <linux/perf_event.h> */
	__u8  addr_correlates_sym; /* True => resolve_addr() can be called */
	__u16 misc;		/* Refer perf_event_header in <linux/perf_event.h> */
	__u32 raw_size;		/* Refer PERF_SAMPLE_RAW in <linux/perf_event.h> */
	const void *raw_data;	/* Refer PERF_SAMPLE_RAW in <linux/perf_event.h> */
	__u64 brstack_nr;	/* Number of brstack entries */
	const struct perf_branch_entry *brstack; /* Refer <linux/perf_event.h> */
	__u64 raw_callchain_nr;	/* Number of raw_callchain entries */
	const __u64 *raw_callchain; /* Refer <linux/perf_event.h> */
	const char *event;
};

/*
 * Address location (as per perf script)
 */
struct perf_dlfilter_al {
	__u32 size; /* Size of this structure (for compatibility checking) */
	__u32 symoff;
	const char *sym;
	__u64 addr; /* Mapped address (from dso) */
	__u64 sym_start;
	__u64 sym_end;
	const char *dso;
	__u8  sym_binding; /* STB_LOCAL, STB_GLOBAL or STB_WEAK, refer <elf.h> */
	__u8  is_64_bit; /* Only valid if dso is not NULL */
	__u8  is_kernel_ip; /* True if in kernel space */
	__u32 buildid_size;
	__u8 *buildid;
	/* Below members are only populated by resolve_ip() */
	__u8 filtered; /* True if this sample event will be filtered out */
	const char *comm;
};

struct perf_dlfilter_fns {
	/* Return information about ip */
	const struct perf_dlfilter_al *(*resolve_ip)(void *ctx);
	/* Return information about addr (if addr_correlates_sym) */
	const struct perf_dlfilter_al *(*resolve_addr)(void *ctx);
	/* Return arguments from --dlarg option */
	char **(*args)(void *ctx, int *dlargc);
	/*
	 * Return information about address (al->size must be set before
	 * calling). Returns 0 on success, -1 otherwise.
	 */
	__s32 (*resolve_address)(void *ctx, __u64 address, struct perf_dlfilter_al *al);
	/* Return instruction bytes and length */
	const __u8 *(*insn)(void *ctx, __u32 *length);
	/* Return source file name and line number */
	const char *(*srcline)(void *ctx, __u32 *line_number);
	/* Return perf_event_attr, refer <linux/perf_event.h> */
	struct perf_event_attr *(*attr)(void *ctx);
	/* Read object code, return numbers of bytes read */
	__s32 (*object_code)(void *ctx, __u64 ip, void *buf, __u32 len);
	/* Reserved */
	void *(*reserved[120])(void *);
};

struct perf_dlfilter_fns perf_dlfilter_fns;

static int verbose;

#define pr_debug(fmt, ...) do { \
		if (verbose > 0) \
			fprintf(stderr, fmt, ##__VA_ARGS__); \
	} while (0)

static int test_fail(const char *msg)
{
	pr_debug("%s\n", msg);
	return -1;
}

#define CHECK(x) do { \
		if (!(x)) \
			return test_fail("Check '" #x "' failed\n"); \
	} while (0)

struct filter_data {
	__u64 ip;
	__u64 addr;
	int do_early;
	int early_filter_cnt;
	int filter_cnt;
};

static struct filter_data *filt_dat;

int start(void **data, void *ctx)
{
	int dlargc;
	char **dlargv;
	struct filter_data *d;
	static bool called;

	verbose = 1;

	CHECK(!filt_dat && !called);
	called = true;

	d = calloc(1, sizeof(*d));
	if (!d)
		test_fail("Failed to allocate memory");
	filt_dat = d;
	*data = d;

	dlargv = perf_dlfilter_fns.args(ctx, &dlargc);

	CHECK(dlargc == 6);
	CHECK(!strcmp(dlargv[0], "first"));
	verbose = strtol(dlargv[1], NULL, 0);
	d->ip = strtoull(dlargv[2], NULL, 0);
	d->addr = strtoull(dlargv[3], NULL, 0);
	d->do_early = strtol(dlargv[4], NULL, 0);
	CHECK(!strcmp(dlargv[5], "last"));

	pr_debug("%s API\n", __func__);

	return 0;
}

#define CHECK_SAMPLE(x) do { \
		if (sample->x != expected.x) \
			return test_fail("'" #x "' not expected value\n"); \
	} while (0)

static int check_sample(struct filter_data *d, const struct perf_dlfilter_sample *sample)
{
	struct perf_dlfilter_sample expected = {
		.ip		= d->ip,
		.pid		= 12345,
		.tid		= 12346,
		.time		= 1234567890,
		.addr		= d->addr,
		.id		= 99,
		.stream_id	= 101,
		.period		= 543212345,
		.cpu		= 31,
		.cpumode	= PERF_RECORD_MISC_USER,
		.addr_correlates_sym = 1,
		.misc		= PERF_RECORD_MISC_USER,
	};

	CHECK(sample->size >= sizeof(struct perf_dlfilter_sample));

	CHECK_SAMPLE(ip);
	CHECK_SAMPLE(pid);
	CHECK_SAMPLE(tid);
	CHECK_SAMPLE(time);
	CHECK_SAMPLE(addr);
	CHECK_SAMPLE(id);
	CHECK_SAMPLE(stream_id);
	CHECK_SAMPLE(period);
	CHECK_SAMPLE(cpu);
	CHECK_SAMPLE(cpumode);
	CHECK_SAMPLE(addr_correlates_sym);
	CHECK_SAMPLE(misc);

	CHECK(!sample->raw_data);
	CHECK_SAMPLE(brstack_nr);
	CHECK(!sample->brstack);
	CHECK_SAMPLE(raw_callchain_nr);
	CHECK(!sample->raw_callchain);

#define EVENT_NAME "branches:"
	CHECK(!strncmp(sample->event, EVENT_NAME, strlen(EVENT_NAME)));

	return 0;
}

static int check_al(void *ctx)
{
	const struct perf_dlfilter_al *al;

	al = perf_dlfilter_fns.resolve_ip(ctx);
	if (!al)
		return test_fail("resolve_ip() failed");

	CHECK(al->sym && !strcmp("foo", al->sym));
	CHECK(!al->symoff);

	return 0;
}

static int check_addr_al(void *ctx)
{
	const struct perf_dlfilter_al *addr_al;

	addr_al = perf_dlfilter_fns.resolve_addr(ctx);
	if (!addr_al)
		return test_fail("resolve_addr() failed");

	CHECK(addr_al->sym && !strcmp("bar", addr_al->sym));
	CHECK(!addr_al->symoff);

	return 0;
}

static int check_attr(void *ctx)
{
	struct perf_event_attr *attr = perf_dlfilter_fns.attr(ctx);

	CHECK(attr);
	CHECK(attr->type == PERF_TYPE_HARDWARE);
	CHECK(attr->config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS);

	return 0;
}

static int do_checks(void *data, const struct perf_dlfilter_sample *sample, void *ctx, bool early)
{
	struct filter_data *d = data;

	CHECK(data && filt_dat == data);

	if (early) {
		CHECK(!d->early_filter_cnt);
		d->early_filter_cnt += 1;
	} else {
		CHECK(!d->filter_cnt);
		CHECK(d->early_filter_cnt);
		CHECK(d->do_early != 2);
		d->filter_cnt += 1;
	}

	if (check_sample(data, sample))
		return -1;

	if (check_attr(ctx))
		return -1;

	if (early && !d->do_early)
		return 0;

	if (check_al(ctx) || check_addr_al(ctx))
		return -1;

	if (early)
		return d->do_early == 2;

	return 1;
}

int filter_event_early(void *data, const struct perf_dlfilter_sample *sample, void *ctx)
{
	pr_debug("%s API\n", __func__);

	return do_checks(data, sample, ctx, true);
}

int filter_event(void *data, const struct perf_dlfilter_sample *sample, void *ctx)
{
	pr_debug("%s API\n", __func__);

	return do_checks(data, sample, ctx, false);
}

int stop(void *data, void *ctx)
{
	static bool called;

	pr_debug("%s API\n", __func__);

	CHECK(data && filt_dat == data && !called);
	called = true;

	free(data);
	filt_dat = NULL;
	return 0;
}

const char *filter_description(const char **long_description)
{
	*long_description = "Filter used by the 'dlfilter C API' perf test";
	return "dlfilter to test v0 C API";
}
