mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-05 10:47:34 +00:00
selftests/bpf: Add unit tests with __bpf_trap() kfunc
Add some inline-asm tests and C tests where __bpf_trap() or __builtin_trap() is used in the code. The __builtin_trap() test is guarded with llvm21 ([1]) since otherwise the compilation failure will happen. [1] https://github.com/llvm/llvm-project/pull/131731 Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Link: https://lore.kernel.org/r/20250523205331.1291734-1-yonghong.song@linux.dev Tested-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
f95695f2c4
commit
92de53d247
@@ -14,6 +14,7 @@
|
||||
#include "verifier_bounds_deduction_non_const.skel.h"
|
||||
#include "verifier_bounds_mix_sign_unsign.skel.h"
|
||||
#include "verifier_bpf_get_stack.skel.h"
|
||||
#include "verifier_bpf_trap.skel.h"
|
||||
#include "verifier_bswap.skel.h"
|
||||
#include "verifier_btf_ctx_access.skel.h"
|
||||
#include "verifier_btf_unreliable_prog.skel.h"
|
||||
@@ -148,6 +149,7 @@ void test_verifier_bounds_deduction(void) { RUN(verifier_bounds_deduction);
|
||||
void test_verifier_bounds_deduction_non_const(void) { RUN(verifier_bounds_deduction_non_const); }
|
||||
void test_verifier_bounds_mix_sign_unsign(void) { RUN(verifier_bounds_mix_sign_unsign); }
|
||||
void test_verifier_bpf_get_stack(void) { RUN(verifier_bpf_get_stack); }
|
||||
void test_verifier_bpf_trap(void) { RUN(verifier_bpf_trap); }
|
||||
void test_verifier_bswap(void) { RUN(verifier_bswap); }
|
||||
void test_verifier_btf_ctx_access(void) { RUN(verifier_btf_ctx_access); }
|
||||
void test_verifier_btf_unreliable_prog(void) { RUN(verifier_btf_unreliable_prog); }
|
||||
|
||||
71
tools/testing/selftests/bpf/progs/verifier_bpf_trap.c
Normal file
71
tools/testing/selftests/bpf/progs/verifier_bpf_trap.c
Normal file
@@ -0,0 +1,71 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
|
||||
#include <vmlinux.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include "bpf_misc.h"
|
||||
|
||||
#if __clang_major__ >= 21 && 0
|
||||
SEC("socket")
|
||||
__description("__builtin_trap with simple c code")
|
||||
__failure __msg("unexpected __bpf_trap() due to uninitialized variable?")
|
||||
void bpf_builtin_trap_with_simple_c(void)
|
||||
{
|
||||
__builtin_trap();
|
||||
}
|
||||
#endif
|
||||
|
||||
SEC("socket")
|
||||
__description("__bpf_trap with simple c code")
|
||||
__failure __msg("unexpected __bpf_trap() due to uninitialized variable?")
|
||||
void bpf_trap_with_simple_c(void)
|
||||
{
|
||||
__bpf_trap();
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("__bpf_trap as the second-from-last insn")
|
||||
__failure __msg("unexpected __bpf_trap() due to uninitialized variable?")
|
||||
__naked void bpf_trap_at_func_end(void)
|
||||
{
|
||||
asm volatile (
|
||||
"r0 = 0;"
|
||||
"call %[__bpf_trap];"
|
||||
"exit;"
|
||||
:
|
||||
: __imm(__bpf_trap)
|
||||
: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("dead code __bpf_trap in the middle of code")
|
||||
__success
|
||||
__naked void dead_bpf_trap_in_middle(void)
|
||||
{
|
||||
asm volatile (
|
||||
"r0 = 0;"
|
||||
"if r0 == 0 goto +1;"
|
||||
"call %[__bpf_trap];"
|
||||
"r0 = 2;"
|
||||
"exit;"
|
||||
:
|
||||
: __imm(__bpf_trap)
|
||||
: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("reachable __bpf_trap in the middle of code")
|
||||
__failure __msg("unexpected __bpf_trap() due to uninitialized variable?")
|
||||
__naked void live_bpf_trap_in_middle(void)
|
||||
{
|
||||
asm volatile (
|
||||
"r0 = 0;"
|
||||
"if r0 == 1 goto +1;"
|
||||
"call %[__bpf_trap];"
|
||||
"r0 = 2;"
|
||||
"exit;"
|
||||
:
|
||||
: __imm(__bpf_trap)
|
||||
: __clobber_all);
|
||||
}
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
Reference in New Issue
Block a user