diff options
Diffstat (limited to 'tools/testing/selftests/bpf/verifier/runtime_jit.c')
| -rw-r--r-- | tools/testing/selftests/bpf/verifier/runtime_jit.c | 151 | 
1 files changed, 151 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/verifier/runtime_jit.c b/tools/testing/selftests/bpf/verifier/runtime_jit.c index a9a8f620e71c..94c399d1faca 100644 --- a/tools/testing/selftests/bpf/verifier/runtime_jit.c +++ b/tools/testing/selftests/bpf/verifier/runtime_jit.c @@ -27,6 +27,19 @@  {  	"runtime/jit: tail_call within bounds, no prog",  	.insns = { +	BPF_MOV64_IMM(BPF_REG_3, 3), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), +	BPF_MOV64_IMM(BPF_REG_0, 1), +	BPF_EXIT_INSN(), +	}, +	.fixup_prog1 = { 1 }, +	.result = ACCEPT, +	.retval = 1, +}, +{ +	"runtime/jit: tail_call within bounds, key 2", +	.insns = {  	BPF_MOV64_IMM(BPF_REG_3, 2),  	BPF_LD_MAP_FD(BPF_REG_2, 0),  	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), @@ -35,9 +48,147 @@  	},  	.fixup_prog1 = { 1 },  	.result = ACCEPT, +	.retval = 24, +}, +{ +	"runtime/jit: tail_call within bounds, key 2 / key 2, first branch", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 13), +	BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 13, 4), +	BPF_MOV64_IMM(BPF_REG_3, 2), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_JMP_IMM(BPF_JA, 0, 0, 3), +	BPF_MOV64_IMM(BPF_REG_3, 2), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), +	BPF_MOV64_IMM(BPF_REG_0, 1), +	BPF_EXIT_INSN(), +	}, +	.fixup_prog1 = { 5, 9 }, +	.result = ACCEPT, +	.retval = 24, +}, +{ +	"runtime/jit: tail_call within bounds, key 2 / key 2, second branch", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 14), +	BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 13, 4), +	BPF_MOV64_IMM(BPF_REG_3, 2), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_JMP_IMM(BPF_JA, 0, 0, 3), +	BPF_MOV64_IMM(BPF_REG_3, 2), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), +	BPF_MOV64_IMM(BPF_REG_0, 1), +	BPF_EXIT_INSN(), +	}, +	.fixup_prog1 = { 5, 9 }, +	.result = ACCEPT, +	.retval = 24, +}, +{ +	"runtime/jit: tail_call within bounds, key 0 / key 2, first branch", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 13), +	BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 13, 4), +	BPF_MOV64_IMM(BPF_REG_3, 0), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_JMP_IMM(BPF_JA, 0, 0, 3), +	BPF_MOV64_IMM(BPF_REG_3, 2), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), +	BPF_MOV64_IMM(BPF_REG_0, 1), +	BPF_EXIT_INSN(), +	}, +	.fixup_prog1 = { 5, 9 }, +	.result = ACCEPT, +	.retval = 24, +}, +{ +	"runtime/jit: tail_call within bounds, key 0 / key 2, second branch", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 14), +	BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 13, 4), +	BPF_MOV64_IMM(BPF_REG_3, 0), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_JMP_IMM(BPF_JA, 0, 0, 3), +	BPF_MOV64_IMM(BPF_REG_3, 2), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), +	BPF_MOV64_IMM(BPF_REG_0, 1), +	BPF_EXIT_INSN(), +	}, +	.fixup_prog1 = { 5, 9 }, +	.result = ACCEPT, +	.retval = 42, +}, +{ +	"runtime/jit: tail_call within bounds, different maps, first branch", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 13), +	BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 13, 4), +	BPF_MOV64_IMM(BPF_REG_3, 0), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_JMP_IMM(BPF_JA, 0, 0, 3), +	BPF_MOV64_IMM(BPF_REG_3, 0), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), +	BPF_MOV64_IMM(BPF_REG_0, 1), +	BPF_EXIT_INSN(), +	}, +	.fixup_prog1 = { 5 }, +	.fixup_prog2 = { 9 }, +	.result_unpriv = REJECT, +	.errstr_unpriv = "tail_call abusing map_ptr", +	.result = ACCEPT,  	.retval = 1,  },  { +	"runtime/jit: tail_call within bounds, different maps, second branch", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 14), +	BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, +		    offsetof(struct __sk_buff, cb[0])), +	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 13, 4), +	BPF_MOV64_IMM(BPF_REG_3, 0), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_JMP_IMM(BPF_JA, 0, 0, 3), +	BPF_MOV64_IMM(BPF_REG_3, 0), +	BPF_LD_MAP_FD(BPF_REG_2, 0), +	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), +	BPF_MOV64_IMM(BPF_REG_0, 1), +	BPF_EXIT_INSN(), +	}, +	.fixup_prog1 = { 5 }, +	.fixup_prog2 = { 9 }, +	.result_unpriv = REJECT, +	.errstr_unpriv = "tail_call abusing map_ptr", +	.result = ACCEPT, +	.retval = 42, +}, +{  	"runtime/jit: tail_call out of bounds",  	.insns = {  	BPF_MOV64_IMM(BPF_REG_3, 256),  |