/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2015, Wang Nan <wangnan0@huawei.com>
 * Copyright (C) 2015, Huawei Inc.
 */
#ifndef __BPF_LOADER_H
#define __BPF_LOADER_H

#include <linux/compiler.h>
#include <linux/err.h>

#ifdef HAVE_LIBBPF_SUPPORT
#include <bpf/libbpf.h>

enum bpf_loader_errno {
	__BPF_LOADER_ERRNO__START = __LIBBPF_ERRNO__START - 100,
	/* Invalid config string */
	BPF_LOADER_ERRNO__CONFIG = __BPF_LOADER_ERRNO__START,
	BPF_LOADER_ERRNO__GROUP,	/* Invalid group name */
	BPF_LOADER_ERRNO__EVENTNAME,	/* Event name is missing */
	BPF_LOADER_ERRNO__INTERNAL,	/* BPF loader internal error */
	BPF_LOADER_ERRNO__COMPILE,	/* Error when compiling BPF scriptlet */
	BPF_LOADER_ERRNO__PROGCONF_TERM,/* Invalid program config term in config string */
	BPF_LOADER_ERRNO__PROLOGUE,	/* Failed to generate prologue */
	BPF_LOADER_ERRNO__PROLOGUE2BIG,	/* Prologue too big for program */
	BPF_LOADER_ERRNO__PROLOGUEOOB,	/* Offset out of bound for prologue */
	BPF_LOADER_ERRNO__OBJCONF_OPT,	/* Invalid object config option */
	BPF_LOADER_ERRNO__OBJCONF_CONF,	/* Config value not set (lost '=')) */
	BPF_LOADER_ERRNO__OBJCONF_MAP_OPT,	/* Invalid object map config option */
	BPF_LOADER_ERRNO__OBJCONF_MAP_NOTEXIST,	/* Target map not exist */
	BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE,	/* Incorrect value type for map */
	BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE,	/* Incorrect map type */
	BPF_LOADER_ERRNO__OBJCONF_MAP_KEYSIZE,	/* Incorrect map key size */
	BPF_LOADER_ERRNO__OBJCONF_MAP_VALUESIZE,/* Incorrect map value size */
	BPF_LOADER_ERRNO__OBJCONF_MAP_NOEVT,	/* Event not found for map setting */
	BPF_LOADER_ERRNO__OBJCONF_MAP_MAPSIZE,	/* Invalid map size for event setting */
	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTDIM,	/* Event dimension too large */
	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTINH,	/* Doesn't support inherit event */
	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTTYPE,	/* Wrong event type for map */
	BPF_LOADER_ERRNO__OBJCONF_MAP_IDX2BIG,	/* Index too large */
	__BPF_LOADER_ERRNO__END,
};
#endif // HAVE_LIBBPF_SUPPORT

struct evsel;
struct evlist;
struct bpf_object;
struct parse_events_term;
#define PERF_BPF_PROBE_GROUP "perf_bpf_probe"

typedef int (*bpf_prog_iter_callback_t)(const char *group, const char *event,
					int fd, struct bpf_object *obj, void *arg);

#ifdef HAVE_LIBBPF_SUPPORT
struct bpf_object *bpf__prepare_load(const char *filename, bool source);
int bpf__strerror_prepare_load(const char *filename, bool source,
			       int err, char *buf, size_t size);

struct bpf_object *bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz,
					    const char *name);

void bpf__clear(void);

int bpf__probe(struct bpf_object *obj);
int bpf__unprobe(struct bpf_object *obj);
int bpf__strerror_probe(struct bpf_object *obj, int err,
			char *buf, size_t size);

int bpf__load(struct bpf_object *obj);
int bpf__strerror_load(struct bpf_object *obj, int err,
		       char *buf, size_t size);
int bpf__foreach_event(struct bpf_object *obj,
		       bpf_prog_iter_callback_t func, void *arg);

int bpf__config_obj(struct bpf_object *obj, struct parse_events_term *term,
		    struct evlist *evlist, int *error_pos);
int bpf__strerror_config_obj(struct bpf_object *obj,
			     struct parse_events_term *term,
			     struct evlist *evlist,
			     int *error_pos, int err, char *buf,
			     size_t size);
int bpf__apply_obj_config(void);
int bpf__strerror_apply_obj_config(int err, char *buf, size_t size);

int bpf__setup_stdout(struct evlist *evlist);
struct evsel *bpf__setup_output_event(struct evlist *evlist, const char *name);
int bpf__strerror_setup_output_event(struct evlist *evlist, int err, char *buf, size_t size);
#else
#include <errno.h>
#include <string.h>
#include "debug.h"

static inline struct bpf_object *
bpf__prepare_load(const char *filename __maybe_unused,
		  bool source __maybe_unused)
{
	pr_debug("ERROR: eBPF object loading is disabled during compiling.\n");
	return ERR_PTR(-ENOTSUP);
}

static inline struct bpf_object *
bpf__prepare_load_buffer(void *obj_buf __maybe_unused,
					   size_t obj_buf_sz __maybe_unused)
{
	return ERR_PTR(-ENOTSUP);
}

static inline void bpf__clear(void) { }

static inline int bpf__probe(struct bpf_object *obj __maybe_unused) { return 0;}
static inline int bpf__unprobe(struct bpf_object *obj __maybe_unused) { return 0;}
static inline int bpf__load(struct bpf_object *obj __maybe_unused) { return 0; }

static inline int
bpf__foreach_event(struct bpf_object *obj __maybe_unused,
		   bpf_prog_iter_callback_t func __maybe_unused,
		   void *arg __maybe_unused)
{
	return 0;
}

static inline int
bpf__config_obj(struct bpf_object *obj __maybe_unused,
		struct parse_events_term *term __maybe_unused,
		struct evlist *evlist __maybe_unused,
		int *error_pos __maybe_unused)
{
	return 0;
}

static inline int
bpf__apply_obj_config(void)
{
	return 0;
}

static inline int
bpf__setup_stdout(struct evlist *evlist __maybe_unused)
{
	return 0;
}

static inline struct evsel *
bpf__setup_output_event(struct evlist *evlist __maybe_unused, const char *name __maybe_unused)
{
	return NULL;
}

static inline int
__bpf_strerror(char *buf, size_t size)
{
	if (!size)
		return 0;
	strncpy(buf,
		"ERROR: eBPF object loading is disabled during compiling.\n",
		size);
	buf[size - 1] = '\0';
	return 0;
}

static inline
int bpf__strerror_prepare_load(const char *filename __maybe_unused,
			       bool source __maybe_unused,
			       int err __maybe_unused,
			       char *buf, size_t size)
{
	return __bpf_strerror(buf, size);
}

static inline int
bpf__strerror_probe(struct bpf_object *obj __maybe_unused,
		    int err __maybe_unused,
		    char *buf, size_t size)
{
	return __bpf_strerror(buf, size);
}

static inline int bpf__strerror_load(struct bpf_object *obj __maybe_unused,
				     int err __maybe_unused,
				     char *buf, size_t size)
{
	return __bpf_strerror(buf, size);
}

static inline int
bpf__strerror_config_obj(struct bpf_object *obj __maybe_unused,
			 struct parse_events_term *term __maybe_unused,
			 struct evlist *evlist __maybe_unused,
			 int *error_pos __maybe_unused,
			 int err __maybe_unused,
			 char *buf, size_t size)
{
	return __bpf_strerror(buf, size);
}

static inline int
bpf__strerror_apply_obj_config(int err __maybe_unused,
			       char *buf, size_t size)
{
	return __bpf_strerror(buf, size);
}

static inline int
bpf__strerror_setup_output_event(struct evlist *evlist __maybe_unused,
				 int err __maybe_unused, char *buf, size_t size)
{
	return __bpf_strerror(buf, size);
}

#endif

static inline int bpf__strerror_setup_stdout(struct evlist *evlist, int err, char *buf, size_t size)
{
	return bpf__strerror_setup_output_event(evlist, err, buf, size);
}
#endif
