mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
selftests/bpf: verifier/cfg.c converted to inline assembly
Test verifier/cfg.c automatically converted to use inline assembly. Signed-off-by: Eduard Zingerman <eddyz87@gmail.com> Link: https://lore.kernel.org/r/20230325025524.144043-12-eddyz87@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
b14a702afd
commit
2f2047c22c
|
|
@ -8,6 +8,7 @@
|
|||
#include "verifier_basic_stack.skel.h"
|
||||
#include "verifier_bounds_deduction.skel.h"
|
||||
#include "verifier_bounds_mix_sign_unsign.skel.h"
|
||||
#include "verifier_cfg.skel.h"
|
||||
|
||||
__maybe_unused
|
||||
static void run_tests_aux(const char *skel_name, skel_elf_bytes_fn elf_bytes_factory)
|
||||
|
|
@ -38,3 +39,4 @@ void test_verifier_array_access(void) { RUN(verifier_array_access); }
|
|||
void test_verifier_basic_stack(void) { RUN(verifier_basic_stack); }
|
||||
void test_verifier_bounds_deduction(void) { RUN(verifier_bounds_deduction); }
|
||||
void test_verifier_bounds_mix_sign_unsign(void) { RUN(verifier_bounds_mix_sign_unsign); }
|
||||
void test_verifier_cfg(void) { RUN(verifier_cfg); }
|
||||
|
|
|
|||
100
tools/testing/selftests/bpf/progs/verifier_cfg.c
Normal file
100
tools/testing/selftests/bpf/progs/verifier_cfg.c
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Converted from tools/testing/selftests/bpf/verifier/cfg.c */
|
||||
|
||||
#include <linux/bpf.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include "bpf_misc.h"
|
||||
|
||||
SEC("socket")
|
||||
__description("unreachable")
|
||||
__failure __msg("unreachable")
|
||||
__failure_unpriv
|
||||
__naked void unreachable(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
exit; \
|
||||
exit; \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("unreachable2")
|
||||
__failure __msg("unreachable")
|
||||
__failure_unpriv
|
||||
__naked void unreachable2(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
goto l0_%=; \
|
||||
goto l0_%=; \
|
||||
l0_%=: exit; \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("out of range jump")
|
||||
__failure __msg("jump out of range")
|
||||
__failure_unpriv
|
||||
__naked void out_of_range_jump(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
goto l0_%=; \
|
||||
exit; \
|
||||
l0_%=: \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("out of range jump2")
|
||||
__failure __msg("jump out of range")
|
||||
__failure_unpriv
|
||||
__naked void out_of_range_jump2(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
goto -2; \
|
||||
exit; \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("loop (back-edge)")
|
||||
__failure __msg("unreachable insn 1")
|
||||
__msg_unpriv("back-edge")
|
||||
__naked void loop_back_edge(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
l0_%=: goto l0_%=; \
|
||||
exit; \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("loop2 (back-edge)")
|
||||
__failure __msg("unreachable insn 4")
|
||||
__msg_unpriv("back-edge")
|
||||
__naked void loop2_back_edge(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
l0_%=: r1 = r0; \
|
||||
r2 = r0; \
|
||||
r3 = r0; \
|
||||
goto l0_%=; \
|
||||
exit; \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
SEC("socket")
|
||||
__description("conditional loop")
|
||||
__failure __msg("infinite loop detected")
|
||||
__msg_unpriv("back-edge")
|
||||
__naked void conditional_loop(void)
|
||||
{
|
||||
asm volatile (" \
|
||||
r0 = r1; \
|
||||
l0_%=: r2 = r0; \
|
||||
r3 = r0; \
|
||||
if r1 == 0 goto l0_%=; \
|
||||
exit; \
|
||||
" ::: __clobber_all);
|
||||
}
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
{
|
||||
"unreachable",
|
||||
.insns = {
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "unreachable",
|
||||
.result = REJECT,
|
||||
},
|
||||
{
|
||||
"unreachable2",
|
||||
.insns = {
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, 1),
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "unreachable",
|
||||
.result = REJECT,
|
||||
},
|
||||
{
|
||||
"out of range jump",
|
||||
.insns = {
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "jump out of range",
|
||||
.result = REJECT,
|
||||
},
|
||||
{
|
||||
"out of range jump2",
|
||||
.insns = {
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, -2),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "jump out of range",
|
||||
.result = REJECT,
|
||||
},
|
||||
{
|
||||
"loop (back-edge)",
|
||||
.insns = {
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, -1),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "unreachable insn 1",
|
||||
.errstr_unpriv = "back-edge",
|
||||
.result = REJECT,
|
||||
},
|
||||
{
|
||||
"loop2 (back-edge)",
|
||||
.insns = {
|
||||
BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
|
||||
BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, -4),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "unreachable insn 4",
|
||||
.errstr_unpriv = "back-edge",
|
||||
.result = REJECT,
|
||||
},
|
||||
{
|
||||
"conditional loop",
|
||||
.insns = {
|
||||
BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
|
||||
BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
|
||||
BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "infinite loop detected",
|
||||
.errstr_unpriv = "back-edge",
|
||||
.result = REJECT,
|
||||
},
|
||||
Loading…
Reference in New Issue
Block a user