As opt_hard_wire_dead_code_branches() was changed to react to accumulated branch prediction flags for conditional jumps, add tests for various possible predictions. Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx> --- .../selftests/bpf/prog_tests/verifier.c | 2 + .../selftests/bpf/progs/verifier_dead_code.c | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/verifier_dead_code.c diff --git a/tools/testing/selftests/bpf/prog_tests/verifier.c b/tools/testing/selftests/bpf/prog_tests/verifier.c index 75f7a2ce334b..efd42c07f58a 100644 --- a/tools/testing/selftests/bpf/prog_tests/verifier.c +++ b/tools/testing/selftests/bpf/prog_tests/verifier.c @@ -26,6 +26,7 @@ #include "verifier_ctx.skel.h" #include "verifier_ctx_sk_msg.skel.h" #include "verifier_d_path.skel.h" +#include "verifier_dead_code.skel.h" #include "verifier_direct_packet_access.skel.h" #include "verifier_direct_stack_access_wraparound.skel.h" #include "verifier_div0.skel.h" @@ -154,6 +155,7 @@ void test_verifier_const_or(void) { RUN(verifier_const_or); } void test_verifier_ctx(void) { RUN(verifier_ctx); } void test_verifier_ctx_sk_msg(void) { RUN(verifier_ctx_sk_msg); } void test_verifier_d_path(void) { RUN(verifier_d_path); } +void test_verifier_dead_code(void) { RUN(verifier_dead_code); } void test_verifier_direct_packet_access(void) { RUN(verifier_direct_packet_access); } void test_verifier_direct_stack_access_wraparound(void) { RUN(verifier_direct_stack_access_wraparound); } void test_verifier_div0(void) { RUN(verifier_div0); } diff --git a/tools/testing/selftests/bpf/progs/verifier_dead_code.c b/tools/testing/selftests/bpf/progs/verifier_dead_code.c new file mode 100644 index 000000000000..b2eed6be0d42 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/verifier_dead_code.c @@ -0,0 +1,63 @@ +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> +#include "bpf_misc.h" + +SEC("socket") +__xlated("0: r1 = 1") +__xlated("1: r0 = 42") +__xlated("2: r0 = 24") +__xlated("3: exit") +__success +__retval(24) +__naked void cond_always_false(void) +{ + asm volatile ( + "r1 = 1;" + "r0 = 42;" + "if r1 != 1 goto +1;" + "r0 = 24;" + "exit;" + ::: __clobber_all + ); +} + +SEC("socket") +__xlated("0: r1 = 2") +__xlated("1: r0 = 42") +__xlated("2: exit") +__success +__retval(42) +__naked void cond_always_true(void) +{ + asm volatile ( + "r1 = 2;" + "r0 = 42;" + "if r1 != 1 goto +1;" + "r0 = 24;" + "exit;" + ::: __clobber_all + ); +} + +SEC("socket") +__xlated("0: call") +__xlated("1: r1 = r0") +__xlated("2: r0 = 42") +__xlated("3: if r1 != 0x1 goto pc+1") +__xlated("4: r0 = 24") +__xlated("5: exit") +__success +__naked void cond_unknown(void) +{ + asm volatile ( + "call %[bpf_get_prandom_u32];" + "r1 = r0;" + "r0 = 42;" + "if r1 != 1 goto +1;" + "r0 = 24;" + "exit;" + : + : __imm(bpf_get_prandom_u32) + : __clobber_all + ); +} -- 2.47.0