Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bpf: test case to check whether src/dst regs got mangled by xadd

We currently do not have such a test case in test_verifier selftests
but it's important to test under bpf_jit_enable=1 to make sure JIT
implementations do not mistakenly mess with src/dst reg for xadd/{w,dw}.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Daniel Borkmann and committed by
Alexei Starovoitov
fa47a16b b9c1e60e

+40
+40
tools/testing/selftests/bpf/test_verifier.c
··· 12005 12005 .prog_type = BPF_PROG_TYPE_XDP, 12006 12006 }, 12007 12007 { 12008 + "xadd/w check whether src/dst got mangled, 1", 12009 + .insns = { 12010 + BPF_MOV64_IMM(BPF_REG_0, 1), 12011 + BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 12012 + BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 12013 + BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 12014 + BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 12015 + BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 12016 + BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 12017 + BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 12018 + BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 12019 + BPF_EXIT_INSN(), 12020 + BPF_MOV64_IMM(BPF_REG_0, 42), 12021 + BPF_EXIT_INSN(), 12022 + }, 12023 + .result = ACCEPT, 12024 + .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12025 + .retval = 3, 12026 + }, 12027 + { 12028 + "xadd/w check whether src/dst got mangled, 2", 12029 + .insns = { 12030 + BPF_MOV64_IMM(BPF_REG_0, 1), 12031 + BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 12032 + BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 12033 + BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8), 12034 + BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 12035 + BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 12036 + BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 12037 + BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 12038 + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 12039 + BPF_EXIT_INSN(), 12040 + BPF_MOV64_IMM(BPF_REG_0, 42), 12041 + BPF_EXIT_INSN(), 12042 + }, 12043 + .result = ACCEPT, 12044 + .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12045 + .retval = 3, 12046 + }, 12047 + { 12008 12048 "bpf_get_stack return R0 within range", 12009 12049 .insns = { 12010 12050 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),