On Wed, 2023-07-12 at 23:08 -0700, Yonghong Song wrote: > Add unit tests for sdiv/smod insns. > > Signed-off-by: Yonghong Song <yhs@xxxxxx> > --- > .../selftests/bpf/prog_tests/verifier.c | 2 + > .../selftests/bpf/progs/verifier_sdiv.c | 763 ++++++++++++++++++ > 2 files changed, 765 insertions(+) > create mode 100644 tools/testing/selftests/bpf/progs/verifier_sdiv.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/verifier.c b/tools/testing/selftests/bpf/prog_tests/verifier.c > index 885532540bc3..a591d7b673f1 100644 > --- a/tools/testing/selftests/bpf/prog_tests/verifier.c > +++ b/tools/testing/selftests/bpf/prog_tests/verifier.c > @@ -54,6 +54,7 @@ > #include "verifier_ringbuf.skel.h" > #include "verifier_runtime_jit.skel.h" > #include "verifier_scalar_ids.skel.h" > +#include "verifier_sdiv.skel.h" > #include "verifier_search_pruning.skel.h" > #include "verifier_sock.skel.h" > #include "verifier_spill_fill.skel.h" > @@ -159,6 +160,7 @@ void test_verifier_regalloc(void) { RUN(verifier_regalloc); } > void test_verifier_ringbuf(void) { RUN(verifier_ringbuf); } > void test_verifier_runtime_jit(void) { RUN(verifier_runtime_jit); } > void test_verifier_scalar_ids(void) { RUN(verifier_scalar_ids); } > +void test_verifier_sdiv(void) { RUN(verifier_sdiv); } > void test_verifier_search_pruning(void) { RUN(verifier_search_pruning); } > void test_verifier_sock(void) { RUN(verifier_sock); } > void test_verifier_spill_fill(void) { RUN(verifier_spill_fill); } > diff --git a/tools/testing/selftests/bpf/progs/verifier_sdiv.c b/tools/testing/selftests/bpf/progs/verifier_sdiv.c > new file mode 100644 > index 000000000000..d92098d670ef > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/verifier_sdiv.c > @@ -0,0 +1,763 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > +#include "bpf_misc.h" > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 1") > +__success __success_unpriv __retval(-20) > +__naked void sdiv32_non_zero_imm_1(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w0 s/= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 2") > +__success __success_unpriv __retval(-20) > +__naked void sdiv32_non_zero_imm_2(void) > +{ > + asm volatile (" \ > + w0 = 41; \ > + w0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 3") > +__success __success_unpriv __retval(20) > +__naked void sdiv32_non_zero_imm_3(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 4") > +__success __success_unpriv __retval(-21) > +__naked void sdiv32_non_zero_imm_4(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w0 s/= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 5") > +__success __success_unpriv __retval(-21) > +__naked void sdiv32_non_zero_imm_5(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 6") > +__success __success_unpriv __retval(21) > +__naked void sdiv32_non_zero_imm_6(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 7") > +__success __success_unpriv __retval(21) > +__naked void sdiv32_non_zero_imm_7(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w0 s/= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero imm divisor, check 8") > +__success __success_unpriv __retval(20) > +__naked void sdiv32_non_zero_imm_8(void) > +{ > + asm volatile (" \ > + w0 = 41; \ > + w0 s/= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 1") > +__success __success_unpriv __retval(-20) > +__naked void sdiv32_non_zero_reg_1(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w1 = 2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 2") > +__success __success_unpriv __retval(-20) > +__naked void sdiv32_non_zero_reg_2(void) > +{ > + asm volatile (" \ > + w0 = 41; \ > + w1 = -2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 3") > +__success __success_unpriv __retval(20) > +__naked void sdiv32_non_zero_reg_3(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w1 = -2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 4") > +__success __success_unpriv __retval(-21) > +__naked void sdiv32_non_zero_reg_4(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w1 = 2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 5") > +__success __success_unpriv __retval(-21) > +__naked void sdiv32_non_zero_reg_5(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w1 = -2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 6") > +__success __success_unpriv __retval(21) > +__naked void sdiv32_non_zero_reg_6(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w1 = -2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 7") > +__success __success_unpriv __retval(21) > +__naked void sdiv32_non_zero_reg_7(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w1 = 2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, non-zero reg divisor, check 8") > +__success __success_unpriv __retval(20) > +__naked void sdiv32_non_zero_reg_8(void) > +{ > + asm volatile (" \ > + w0 = 41; \ > + w1 = 2; \ > + w0 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero imm divisor, check 1") > +__success __success_unpriv __retval(-20) > +__naked void sdiv64_non_zero_imm_1(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r0 s/= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero imm divisor, check 2") > +__success __success_unpriv __retval(-20) > +__naked void sdiv64_non_zero_imm_2(void) > +{ > + asm volatile (" \ > + r0 = 41; \ > + r0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero imm divisor, check 3") > +__success __success_unpriv __retval(20) > +__naked void sdiv64_non_zero_imm_3(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero imm divisor, check 4") > +__success __success_unpriv __retval(-21) > +__naked void sdiv64_non_zero_imm_4(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r0 s/= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero imm divisor, check 5") > +__success __success_unpriv __retval(-21) > +__naked void sdiv64_non_zero_imm_5(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero imm divisor, check 6") > +__success __success_unpriv __retval(21) > +__naked void sdiv64_non_zero_imm_6(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r0 s/= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero reg divisor, check 1") > +__success __success_unpriv __retval(-20) > +__naked void sdiv64_non_zero_reg_1(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r1 = 2; \ > + r0 s/= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero reg divisor, check 2") > +__success __success_unpriv __retval(-20) > +__naked void sdiv64_non_zero_reg_2(void) > +{ > + asm volatile (" \ > + r0 = 41; \ > + r1 = -2; \ > + r0 s/= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero reg divisor, check 3") > +__success __success_unpriv __retval(20) > +__naked void sdiv64_non_zero_reg_3(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r1 = -2; \ > + r0 s/= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero reg divisor, check 4") > +__success __success_unpriv __retval(-21) > +__naked void sdiv64_non_zero_reg_4(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r1 = 2; \ > + r0 s/= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero reg divisor, check 5") > +__success __success_unpriv __retval(-21) > +__naked void sdiv64_non_zero_reg_5(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r1 = -2; \ > + r0 s/= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV64, non-zero reg divisor, check 6") > +__success __success_unpriv __retval(21) > +__naked void sdiv64_non_zero_reg_6(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r1 = -2; \ > + r0 s/= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero imm divisor, check 1") > +__success __success_unpriv __retval(-1) > +__naked void smod32_non_zero_imm_1(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w0 s%%= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero imm divisor, check 2") > +__success __success_unpriv __retval(1) > +__naked void smod32_non_zero_imm_2(void) > +{ > + asm volatile (" \ > + w0 = 41; \ > + w0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero imm divisor, check 3") > +__success __success_unpriv __retval(-1) > +__naked void smod32_non_zero_imm_3(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero imm divisor, check 4") > +__success __success_unpriv __retval(0) > +__naked void smod32_non_zero_imm_4(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w0 s%%= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero imm divisor, check 5") > +__success __success_unpriv __retval(0) > +__naked void smod32_non_zero_imm_5(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero imm divisor, check 6") > +__success __success_unpriv __retval(0) > +__naked void smod32_non_zero_imm_6(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero reg divisor, check 1") > +__success __success_unpriv __retval(-1) > +__naked void smod32_non_zero_reg_1(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w1 = 2; \ > + w0 s%%= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero reg divisor, check 2") > +__success __success_unpriv __retval(1) > +__naked void smod32_non_zero_reg_2(void) > +{ > + asm volatile (" \ > + w0 = 41; \ > + w1 = -2; \ > + w0 s%%= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero reg divisor, check 3") > +__success __success_unpriv __retval(-1) > +__naked void smod32_non_zero_reg_3(void) > +{ > + asm volatile (" \ > + w0 = -41; \ > + w1 = -2; \ > + w0 s%%= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero reg divisor, check 4") > +__success __success_unpriv __retval(0) > +__naked void smod32_non_zero_reg_4(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w1 = 2; \ > + w0 s%%= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero reg divisor, check 5") > +__success __success_unpriv __retval(0) > +__naked void smod32_non_zero_reg_5(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w1 = -2; \ > + w0 s%%= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, non-zero reg divisor, check 6") > +__success __success_unpriv __retval(0) > +__naked void smod32_non_zero_reg_6(void) > +{ > + asm volatile (" \ > + w0 = -42; \ > + w1 = -2; \ > + w0 s%%= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 1") > +__success __success_unpriv __retval(-1) > +__naked void smod64_non_zero_imm_1(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r0 s%%= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 2") > +__success __success_unpriv __retval(1) > +__naked void smod64_non_zero_imm_2(void) > +{ > + asm volatile (" \ > + r0 = 41; \ > + r0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 3") > +__success __success_unpriv __retval(-1) > +__naked void smod64_non_zero_imm_3(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 4") > +__success __success_unpriv __retval(0) > +__naked void smod64_non_zero_imm_4(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r0 s%%= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 5") > +__success __success_unpriv __retval(-0) > +__naked void smod64_non_zero_imm_5(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 6") > +__success __success_unpriv __retval(0) > +__naked void smod64_non_zero_imm_6(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r0 s%%= -2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 7") > +__success __success_unpriv __retval(0) > +__naked void smod64_non_zero_imm_7(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r0 s%%= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero imm divisor, check 8") > +__success __success_unpriv __retval(1) > +__naked void smod64_non_zero_imm_8(void) > +{ > + asm volatile (" \ > + r0 = 41; \ > + r0 s%%= 2; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 1") > +__success __success_unpriv __retval(-1) > +__naked void smod64_non_zero_reg_1(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r1 = 2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 2") > +__success __success_unpriv __retval(1) > +__naked void smod64_non_zero_reg_2(void) > +{ > + asm volatile (" \ > + r0 = 41; \ > + r1 = -2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 3") > +__success __success_unpriv __retval(-1) > +__naked void smod64_non_zero_reg_3(void) > +{ > + asm volatile (" \ > + r0 = -41; \ > + r1 = -2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 4") > +__success __success_unpriv __retval(0) > +__naked void smod64_non_zero_reg_4(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r1 = 2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 5") > +__success __success_unpriv __retval(0) > +__naked void smod64_non_zero_reg_5(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r1 = -2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 6") > +__success __success_unpriv __retval(0) > +__naked void smod64_non_zero_reg_6(void) > +{ > + asm volatile (" \ > + r0 = -42; \ > + r1 = -2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 7") > +__success __success_unpriv __retval(0) > +__naked void smod64_non_zero_reg_7(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r1 = 2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, non-zero reg divisor, check 8") > +__success __success_unpriv __retval(1) > +__naked void smod64_non_zero_reg_8(void) > +{ > + asm volatile (" \ > + r0 = 41; \ > + r1 = 2; \ > + r0 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SDIV32, zero divisor") > +__success __success_unpriv __retval(42) > +__naked void sdiv32_zero_divisor(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w1 = 0; \ > + w2 = -1; \ > + w2 s/= w1; \ > + exit; \ > +" ::: __clobber_all); > +} Maybe add "w0 = w2" in the end to check how division by zero modifies the DST register? > + > +SEC("socket") > +__description("SDIV64, zero divisor") > +__success __success_unpriv __retval(42) > +__naked void sdiv64_zero_divisor(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r1 = 0; \ > + r2 = -1; \ > + r2 s/= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD32, zero divisor") > +__success __success_unpriv __retval(42) > +__naked void smod32_zero_divisor(void) > +{ > + asm volatile (" \ > + w0 = 42; \ > + w1 = 0; \ > + w2 = -1; \ > + w2 s%%= w1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +SEC("socket") > +__description("SMOD64, zero divisor") > +__success __success_unpriv __retval(42) > +__naked void smod64_zero_divisor(void) > +{ > + asm volatile (" \ > + r0 = 42; \ > + r1 = 0; \ > + r2 = -1; \ > + r2 s%%= r1; \ > + exit; \ > +" ::: __clobber_all); > +} > + > +char _license[] SEC("license") = "GPL";