1*0af15f30SKumar Kartikeya Dwivedi // SPDX-License-Identifier: GPL-2.0
2*0af15f30SKumar Kartikeya Dwivedi /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3*0af15f30SKumar Kartikeya Dwivedi
4*0af15f30SKumar Kartikeya Dwivedi #include <vmlinux.h>
5*0af15f30SKumar Kartikeya Dwivedi #include <bpf/bpf_helpers.h>
6*0af15f30SKumar Kartikeya Dwivedi #include <bpf/bpf_tracing.h>
7*0af15f30SKumar Kartikeya Dwivedi #include <errno.h>
8*0af15f30SKumar Kartikeya Dwivedi
9*0af15f30SKumar Kartikeya Dwivedi extern int bpf_kfunc_implicit_arg(int a) __weak __ksym;
10*0af15f30SKumar Kartikeya Dwivedi
11*0af15f30SKumar Kartikeya Dwivedi char _license[] SEC("license") = "GPL";
12*0af15f30SKumar Kartikeya Dwivedi
13*0af15f30SKumar Kartikeya Dwivedi /* Shared arg checks; reports arg count and aux, returns 1 on success. */
14*0af15f30SKumar Kartikeya Dwivedi static __always_inline __u64
check_implicit_args(void * ctx,__u64 * arg_cnt,__u64 * aux_arg)15*0af15f30SKumar Kartikeya Dwivedi check_implicit_args(void *ctx, __u64 *arg_cnt, __u64 *aux_arg)
16*0af15f30SKumar Kartikeya Dwivedi {
17*0af15f30SKumar Kartikeya Dwivedi __u64 a = 0, aux = 0, z = 0;
18*0af15f30SKumar Kartikeya Dwivedi __u64 result;
19*0af15f30SKumar Kartikeya Dwivedi __s64 err;
20*0af15f30SKumar Kartikeya Dwivedi
21*0af15f30SKumar Kartikeya Dwivedi *arg_cnt = bpf_get_func_arg_cnt(ctx);
22*0af15f30SKumar Kartikeya Dwivedi result = *arg_cnt == 2;
23*0af15f30SKumar Kartikeya Dwivedi
24*0af15f30SKumar Kartikeya Dwivedi err = bpf_get_func_arg(ctx, 0, &a);
25*0af15f30SKumar Kartikeya Dwivedi result &= err == 0 && (int)a == 5;
26*0af15f30SKumar Kartikeya Dwivedi
27*0af15f30SKumar Kartikeya Dwivedi err = bpf_get_func_arg(ctx, 1, &aux);
28*0af15f30SKumar Kartikeya Dwivedi *aux_arg = aux;
29*0af15f30SKumar Kartikeya Dwivedi result &= err == 0 && aux != 0;
30*0af15f30SKumar Kartikeya Dwivedi
31*0af15f30SKumar Kartikeya Dwivedi err = bpf_get_func_arg(ctx, 2, &z);
32*0af15f30SKumar Kartikeya Dwivedi result &= err == -EINVAL;
33*0af15f30SKumar Kartikeya Dwivedi
34*0af15f30SKumar Kartikeya Dwivedi return result;
35*0af15f30SKumar Kartikeya Dwivedi }
36*0af15f30SKumar Kartikeya Dwivedi
37*0af15f30SKumar Kartikeya Dwivedi __u64 fentry_result;
38*0af15f30SKumar Kartikeya Dwivedi __u64 fentry_arg_cnt;
39*0af15f30SKumar Kartikeya Dwivedi __u64 fentry_aux_arg;
40*0af15f30SKumar Kartikeya Dwivedi
41*0af15f30SKumar Kartikeya Dwivedi SEC("fentry/bpf_kfunc_implicit_arg")
BPF_PROG(trace_implicit_arg_fentry)42*0af15f30SKumar Kartikeya Dwivedi int BPF_PROG(trace_implicit_arg_fentry)
43*0af15f30SKumar Kartikeya Dwivedi {
44*0af15f30SKumar Kartikeya Dwivedi __u64 ret = 0;
45*0af15f30SKumar Kartikeya Dwivedi __s64 err;
46*0af15f30SKumar Kartikeya Dwivedi
47*0af15f30SKumar Kartikeya Dwivedi fentry_result = check_implicit_args(ctx, &fentry_arg_cnt, &fentry_aux_arg);
48*0af15f30SKumar Kartikeya Dwivedi
49*0af15f30SKumar Kartikeya Dwivedi err = bpf_get_func_ret(ctx, &ret);
50*0af15f30SKumar Kartikeya Dwivedi fentry_result &= err == -EOPNOTSUPP;
51*0af15f30SKumar Kartikeya Dwivedi
52*0af15f30SKumar Kartikeya Dwivedi return 0;
53*0af15f30SKumar Kartikeya Dwivedi }
54*0af15f30SKumar Kartikeya Dwivedi
55*0af15f30SKumar Kartikeya Dwivedi __u64 fexit_result;
56*0af15f30SKumar Kartikeya Dwivedi __u64 fexit_arg_cnt;
57*0af15f30SKumar Kartikeya Dwivedi __u64 fexit_aux_arg;
58*0af15f30SKumar Kartikeya Dwivedi
59*0af15f30SKumar Kartikeya Dwivedi SEC("fexit/bpf_kfunc_implicit_arg")
BPF_PROG(trace_implicit_arg_fexit)60*0af15f30SKumar Kartikeya Dwivedi int BPF_PROG(trace_implicit_arg_fexit)
61*0af15f30SKumar Kartikeya Dwivedi {
62*0af15f30SKumar Kartikeya Dwivedi __u64 ret = 0;
63*0af15f30SKumar Kartikeya Dwivedi __s64 err;
64*0af15f30SKumar Kartikeya Dwivedi
65*0af15f30SKumar Kartikeya Dwivedi fexit_result = check_implicit_args(ctx, &fexit_arg_cnt, &fexit_aux_arg);
66*0af15f30SKumar Kartikeya Dwivedi
67*0af15f30SKumar Kartikeya Dwivedi err = bpf_get_func_ret(ctx, &ret);
68*0af15f30SKumar Kartikeya Dwivedi fexit_result &= err == 0 && ret == 5;
69*0af15f30SKumar Kartikeya Dwivedi
70*0af15f30SKumar Kartikeya Dwivedi return 0;
71*0af15f30SKumar Kartikeya Dwivedi }
72*0af15f30SKumar Kartikeya Dwivedi
73*0af15f30SKumar Kartikeya Dwivedi SEC("syscall")
trigger_implicit_arg(void * ctx)74*0af15f30SKumar Kartikeya Dwivedi int trigger_implicit_arg(void *ctx)
75*0af15f30SKumar Kartikeya Dwivedi {
76*0af15f30SKumar Kartikeya Dwivedi return bpf_kfunc_implicit_arg(5);
77*0af15f30SKumar Kartikeya Dwivedi }
78