mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 15:29:16 +00:00
selftests/bpf: add tests confirming type logic in kernel for __arg_ctx
Add a bunch of global subprogs across variety of program types to validate expected kernel type enforcement logic for __arg_ctx arguments. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/r/20240118033143.3384355-5-andrii@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
0ba971511d
commit
989410cde8
@ -3,6 +3,7 @@
|
||||
|
||||
#include <vmlinux.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include <bpf/bpf_tracing.h>
|
||||
#include "bpf_misc.h"
|
||||
#include "xdp_metadata.h"
|
||||
#include "bpf_kfuncs.h"
|
||||
@ -138,25 +139,182 @@ __weak int subprog_ctx_tag(void *ctx __arg_ctx)
|
||||
return bpf_get_stack(ctx, stack, sizeof(stack), 0);
|
||||
}
|
||||
|
||||
__weak int raw_tp_canonical(struct bpf_raw_tracepoint_args *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int raw_tp_u64_array(u64 *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?raw_tp")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_raw_tp(void *ctx)
|
||||
{
|
||||
return subprog_ctx_tag(ctx);
|
||||
return subprog_ctx_tag(ctx) + raw_tp_canonical(ctx) + raw_tp_u64_array(ctx);
|
||||
}
|
||||
|
||||
SEC("?raw_tp.w")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_raw_tp_writable(void *ctx)
|
||||
{
|
||||
return subprog_ctx_tag(ctx) + raw_tp_canonical(ctx) + raw_tp_u64_array(ctx);
|
||||
}
|
||||
|
||||
SEC("?tp_btf/sys_enter")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_raw_tp_btf(void *ctx)
|
||||
{
|
||||
return subprog_ctx_tag(ctx) + raw_tp_canonical(ctx) + raw_tp_u64_array(ctx);
|
||||
}
|
||||
|
||||
struct whatever { };
|
||||
|
||||
__weak int tp_whatever(struct whatever *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?tp")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_tp(void *ctx)
|
||||
{
|
||||
return subprog_ctx_tag(ctx);
|
||||
return subprog_ctx_tag(ctx) + tp_whatever(ctx);
|
||||
}
|
||||
|
||||
__weak int kprobe_subprog_pt_regs(struct pt_regs *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int kprobe_subprog_typedef(bpf_user_pt_regs_t *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?kprobe")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_kprobe(void *ctx)
|
||||
{
|
||||
return subprog_ctx_tag(ctx);
|
||||
return subprog_ctx_tag(ctx) +
|
||||
kprobe_subprog_pt_regs(ctx) +
|
||||
kprobe_subprog_typedef(ctx);
|
||||
}
|
||||
|
||||
__weak int perf_subprog_regs(
|
||||
#if defined(bpf_target_riscv)
|
||||
struct user_regs_struct *ctx __arg_ctx
|
||||
#elif defined(bpf_target_s390)
|
||||
/* user_pt_regs typedef is anonymous struct, so only `void *` works */
|
||||
void *ctx __arg_ctx
|
||||
#elif defined(bpf_target_loongarch) || defined(bpf_target_arm64) || defined(bpf_target_powerpc)
|
||||
struct user_pt_regs *ctx __arg_ctx
|
||||
#else
|
||||
struct pt_regs *ctx __arg_ctx
|
||||
#endif
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int perf_subprog_typedef(bpf_user_pt_regs_t *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int perf_subprog_canonical(struct bpf_perf_event_data *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?perf_event")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_perf(void *ctx)
|
||||
{
|
||||
return subprog_ctx_tag(ctx) +
|
||||
perf_subprog_regs(ctx) +
|
||||
perf_subprog_typedef(ctx) +
|
||||
perf_subprog_canonical(ctx);
|
||||
}
|
||||
|
||||
__weak int iter_subprog_void(void *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int iter_subprog_typed(struct bpf_iter__task *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?iter/task")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_iter_task(struct bpf_iter__task *ctx)
|
||||
{
|
||||
return (iter_subprog_void(ctx) + iter_subprog_typed(ctx)) & 1;
|
||||
}
|
||||
|
||||
__weak int tracing_subprog_void(void *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int tracing_subprog_u64(u64 *ctx __arg_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acc;
|
||||
|
||||
SEC("?fentry/" SYS_PREFIX "sys_nanosleep")
|
||||
__success __log_level(2)
|
||||
int BPF_PROG(arg_tag_ctx_fentry)
|
||||
{
|
||||
acc += tracing_subprog_void(ctx) + tracing_subprog_u64(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?fexit/" SYS_PREFIX "sys_nanosleep")
|
||||
__success __log_level(2)
|
||||
int BPF_PROG(arg_tag_ctx_fexit)
|
||||
{
|
||||
acc += tracing_subprog_void(ctx) + tracing_subprog_u64(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?fmod_ret/" SYS_PREFIX "sys_nanosleep")
|
||||
__success __log_level(2)
|
||||
int BPF_PROG(arg_tag_ctx_fmod_ret)
|
||||
{
|
||||
return tracing_subprog_void(ctx) + tracing_subprog_u64(ctx);
|
||||
}
|
||||
|
||||
SEC("?lsm/bpf")
|
||||
__success __log_level(2)
|
||||
int BPF_PROG(arg_tag_ctx_lsm)
|
||||
{
|
||||
return tracing_subprog_void(ctx) + tracing_subprog_u64(ctx);
|
||||
}
|
||||
|
||||
SEC("?struct_ops/test_1")
|
||||
__success __log_level(2)
|
||||
int BPF_PROG(arg_tag_ctx_struct_ops)
|
||||
{
|
||||
return tracing_subprog_void(ctx) + tracing_subprog_u64(ctx);
|
||||
}
|
||||
|
||||
SEC(".struct_ops")
|
||||
struct bpf_dummy_ops dummy_1 = {
|
||||
.test_1 = (void *)arg_tag_ctx_struct_ops,
|
||||
};
|
||||
|
||||
SEC("?syscall")
|
||||
__success __log_level(2)
|
||||
int arg_tag_ctx_syscall(void *ctx)
|
||||
{
|
||||
return tracing_subprog_void(ctx) + tracing_subprog_u64(ctx) + tp_whatever(ctx);
|
||||
}
|
||||
|
||||
__weak int subprog_dynptr(struct bpf_dynptr *dptr)
|
||||
|
Loading…
x
Reference in New Issue
Block a user