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

#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>

#ifndef PERF_MAX_STACK_DEPTH
#define PERF_MAX_STACK_DEPTH         127
#endif

typedef __u64 stack_trace_t[PERF_MAX_STACK_DEPTH];

struct {
	__uint(type, BPF_MAP_TYPE_STACK_TRACE);
	__uint(max_entries, 16384);
	__type(key, __u32);
	__type(value, stack_trace_t);
} stackmap SEC(".maps");

extern bool CONFIG_UNWINDER_ORC __kconfig __weak;

/*
 * This function is here to have CONFIG_UNWINDER_ORC
 * used and added to object BTF.
 */
int unused(void)
{
	return CONFIG_UNWINDER_ORC ? 0 : 1;
}

__u32 stack_key;

SEC("kprobe")
int kprobe_test(struct pt_regs *ctx)
{
	stack_key = bpf_get_stackid(ctx, &stackmap, 0);
	return 0;
}

SEC("kprobe.multi")
int kprobe_multi_test(struct pt_regs *ctx)
{
	stack_key = bpf_get_stackid(ctx, &stackmap, 0);
	return 0;
}

SEC("raw_tp/bpf_testmod_test_read")
int rawtp_test(void *ctx)
{
	/* Skip ebpf program entry in the stack. */
	stack_key = bpf_get_stackid(ctx, &stackmap, 0);
	return 0;
}

SEC("fentry/bpf_testmod_stacktrace_test")
int fentry_test(struct pt_regs *ctx)
{
	/*
	 * Skip 2 bpf_program/trampoline stack entries:
	 * - bpf_prog_bd1f7a949f55fb03_fentry_test
	 * - bpf_trampoline_182536277701
	 */
	stack_key = bpf_get_stackid(ctx, &stackmap, 2);
	return 0;
}

SEC("fexit/bpf_testmod_stacktrace_test")
int fexit_test(struct pt_regs *ctx)
{
	/* Skip 2 bpf_program/trampoline stack entries, check fentry_test. */
	stack_key = bpf_get_stackid(ctx, &stackmap, 2);
	return 0;
}

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