// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2019 Facebook */

#include <stdint.h>
#include <stdbool.h>
#include <linux/ptrace.h>
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

/* non-existing BPF helper, to test dead code elimination */
static int (*bpf_missing_helper)(const void *arg1, int arg2) = (void *) 999;

extern int LINUX_KERNEL_VERSION __kconfig;
extern int LINUX_UNKNOWN_VIRTUAL_EXTERN __kconfig __weak;
extern bool CONFIG_BPF_SYSCALL __kconfig; /* strong */
extern enum libbpf_tristate CONFIG_TRISTATE __kconfig __weak;
extern bool CONFIG_BOOL __kconfig __weak;
extern char CONFIG_CHAR __kconfig __weak;
extern uint16_t CONFIG_USHORT __kconfig __weak;
extern int CONFIG_INT __kconfig __weak;
extern uint64_t CONFIG_ULONG __kconfig __weak;
extern const char CONFIG_STR[8] __kconfig __weak;
extern uint64_t CONFIG_MISSING __kconfig __weak;

uint64_t kern_ver = -1;
uint64_t unkn_virt_val = -1;
uint64_t bpf_syscall = -1;
uint64_t tristate_val = -1;
uint64_t bool_val = -1;
uint64_t char_val = -1;
uint64_t ushort_val = -1;
uint64_t int_val = -1;
uint64_t ulong_val = -1;
char str_val[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
uint64_t missing_val = -1;

SEC("raw_tp/sys_enter")
int handle_sys_enter(struct pt_regs *ctx)
{
	int i;

	kern_ver = LINUX_KERNEL_VERSION;
	unkn_virt_val = LINUX_UNKNOWN_VIRTUAL_EXTERN;
	bpf_syscall = CONFIG_BPF_SYSCALL;
	tristate_val = CONFIG_TRISTATE;
	bool_val = CONFIG_BOOL;
	char_val = CONFIG_CHAR;
	ushort_val = CONFIG_USHORT;
	int_val = CONFIG_INT;
	ulong_val = CONFIG_ULONG;

	for (i = 0; i < sizeof(CONFIG_STR); i++) {
		str_val[i] = CONFIG_STR[i];
	}

	if (CONFIG_MISSING)
		/* invalid, but dead code - never executed */
		missing_val = bpf_missing_helper(ctx, 123);
	else
		missing_val = 0xDEADC0DE;

	return 0;
}

char _license[] SEC("license") = "GPL";
