diff options
Diffstat (limited to 'tools/testing/selftests/bpf/verifier/precise.c')
| -rw-r--r-- | tools/testing/selftests/bpf/verifier/precise.c | 143 | 
1 files changed, 91 insertions, 52 deletions
diff --git a/tools/testing/selftests/bpf/verifier/precise.c b/tools/testing/selftests/bpf/verifier/precise.c index 6c03a7d805f9..99272bb890da 100644 --- a/tools/testing/selftests/bpf/verifier/precise.c +++ b/tools/testing/selftests/bpf/verifier/precise.c @@ -38,25 +38,24 @@  	.fixup_map_array_48b = { 1 },  	.result = VERBOSE_ACCEPT,  	.errstr = -	"26: (85) call bpf_probe_read_kernel#113\ -	last_idx 26 first_idx 20\ -	regs=4 stack=0 before 25\ -	regs=4 stack=0 before 24\ -	regs=4 stack=0 before 23\ -	regs=4 stack=0 before 22\ -	regs=4 stack=0 before 20\ -	parent didn't have regs=4 stack=0 marks\ -	last_idx 19 first_idx 10\ -	regs=4 stack=0 before 19\ -	regs=200 stack=0 before 18\ -	regs=300 stack=0 before 17\ -	regs=201 stack=0 before 15\ -	regs=201 stack=0 before 14\ -	regs=200 stack=0 before 13\ -	regs=200 stack=0 before 12\ -	regs=200 stack=0 before 11\ -	regs=200 stack=0 before 10\ -	parent already had regs=0 stack=0 marks", +	"mark_precise: frame0: last_idx 26 first_idx 20\ +	mark_precise: frame0: regs=r2 stack= before 25\ +	mark_precise: frame0: regs=r2 stack= before 24\ +	mark_precise: frame0: regs=r2 stack= before 23\ +	mark_precise: frame0: regs=r2 stack= before 22\ +	mark_precise: frame0: regs=r2 stack= before 20\ +	mark_precise: frame0: parent state regs=r2 stack=:\ +	mark_precise: frame0: last_idx 19 first_idx 10\ +	mark_precise: frame0: regs=r2,r9 stack= before 19\ +	mark_precise: frame0: regs=r9 stack= before 18\ +	mark_precise: frame0: regs=r8,r9 stack= before 17\ +	mark_precise: frame0: regs=r0,r9 stack= before 15\ +	mark_precise: frame0: regs=r0,r9 stack= before 14\ +	mark_precise: frame0: regs=r9 stack= before 13\ +	mark_precise: frame0: regs=r9 stack= before 12\ +	mark_precise: frame0: regs=r9 stack= before 11\ +	mark_precise: frame0: regs=r9 stack= before 10\ +	mark_precise: frame0: parent state regs= stack=:",  },  {  	"precise: test 2", @@ -100,20 +99,20 @@  	.flags = BPF_F_TEST_STATE_FREQ,  	.errstr =  	"26: (85) call bpf_probe_read_kernel#113\ -	last_idx 26 first_idx 22\ -	regs=4 stack=0 before 25\ -	regs=4 stack=0 before 24\ -	regs=4 stack=0 before 23\ -	regs=4 stack=0 before 22\ -	parent didn't have regs=4 stack=0 marks\ -	last_idx 20 first_idx 20\ -	regs=4 stack=0 before 20\ -	parent didn't have regs=4 stack=0 marks\ -	last_idx 19 first_idx 17\ -	regs=4 stack=0 before 19\ -	regs=200 stack=0 before 18\ -	regs=300 stack=0 before 17\ -	parent already had regs=0 stack=0 marks", +	mark_precise: frame0: last_idx 26 first_idx 22\ +	mark_precise: frame0: regs=r2 stack= before 25\ +	mark_precise: frame0: regs=r2 stack= before 24\ +	mark_precise: frame0: regs=r2 stack= before 23\ +	mark_precise: frame0: regs=r2 stack= before 22\ +	mark_precise: frame0: parent state regs=r2 stack=:\ +	mark_precise: frame0: last_idx 20 first_idx 20\ +	mark_precise: frame0: regs=r2,r9 stack= before 20\ +	mark_precise: frame0: parent state regs=r2,r9 stack=:\ +	mark_precise: frame0: last_idx 19 first_idx 17\ +	mark_precise: frame0: regs=r2,r9 stack= before 19\ +	mark_precise: frame0: regs=r9 stack= before 18\ +	mark_precise: frame0: regs=r8,r9 stack= before 17\ +	mark_precise: frame0: parent state regs= stack=:",  },  {  	"precise: cross frame pruning", @@ -153,15 +152,16 @@  	},  	.prog_type = BPF_PROG_TYPE_XDP,  	.flags = BPF_F_TEST_STATE_FREQ, -	.errstr = "5: (2d) if r4 > r0 goto pc+0\ -	last_idx 5 first_idx 5\ -	parent didn't have regs=10 stack=0 marks\ -	last_idx 4 first_idx 2\ -	regs=10 stack=0 before 4\ -	regs=10 stack=0 before 3\ -	regs=0 stack=1 before 2\ -	last_idx 5 first_idx 5\ -	parent didn't have regs=1 stack=0 marks", +	.errstr = "mark_precise: frame0: last_idx 5 first_idx 5\ +	mark_precise: frame0: parent state regs=r4 stack=:\ +	mark_precise: frame0: last_idx 4 first_idx 2\ +	mark_precise: frame0: regs=r4 stack= before 4\ +	mark_precise: frame0: regs=r4 stack= before 3\ +	mark_precise: frame0: regs= stack=-8 before 2\ +	mark_precise: frame0: falling back to forcing all scalars precise\ +	force_precise: frame0: forcing r0 to be precise\ +	mark_precise: frame0: last_idx 5 first_idx 5\ +	mark_precise: frame0: parent state regs= stack=:",  	.result = VERBOSE_ACCEPT,  	.retval = -1,  }, @@ -179,16 +179,19 @@  	},  	.prog_type = BPF_PROG_TYPE_XDP,  	.flags = BPF_F_TEST_STATE_FREQ, -	.errstr = "last_idx 6 first_idx 6\ -	parent didn't have regs=10 stack=0 marks\ -	last_idx 5 first_idx 3\ -	regs=10 stack=0 before 5\ -	regs=10 stack=0 before 4\ -	regs=0 stack=1 before 3\ -	last_idx 6 first_idx 6\ -	parent didn't have regs=1 stack=0 marks\ -	last_idx 5 first_idx 3\ -	regs=1 stack=0 before 5", +	.errstr = "mark_precise: frame0: last_idx 6 first_idx 6\ +	mark_precise: frame0: parent state regs=r4 stack=:\ +	mark_precise: frame0: last_idx 5 first_idx 3\ +	mark_precise: frame0: regs=r4 stack= before 5\ +	mark_precise: frame0: regs=r4 stack= before 4\ +	mark_precise: frame0: regs= stack=-8 before 3\ +	mark_precise: frame0: falling back to forcing all scalars precise\ +	force_precise: frame0: forcing r0 to be precise\ +	force_precise: frame0: forcing r0 to be precise\ +	force_precise: frame0: forcing r0 to be precise\ +	force_precise: frame0: forcing r0 to be precise\ +	mark_precise: frame0: last_idx 6 first_idx 6\ +	mark_precise: frame0: parent state regs= stack=:",  	.result = VERBOSE_ACCEPT,  	.retval = -1,  }, @@ -217,3 +220,39 @@  	.errstr = "invalid access to memory, mem_size=1 off=42 size=8",  	.result = REJECT,  }, +{ +	"precise: program doesn't prematurely prune branches", +	.insns = { +		BPF_ALU64_IMM(BPF_MOV, BPF_REG_6, 0x400), +		BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), +		BPF_ALU64_IMM(BPF_MOV, BPF_REG_8, 0), +		BPF_ALU64_IMM(BPF_MOV, BPF_REG_9, 0x80000000), +		BPF_ALU64_IMM(BPF_MOD, BPF_REG_6, 0x401), +		BPF_JMP_IMM(BPF_JA, 0, 0, 0), +		BPF_JMP_REG(BPF_JLE, BPF_REG_6, BPF_REG_9, 2), +		BPF_ALU64_IMM(BPF_MOD, BPF_REG_6, 1), +		BPF_ALU64_IMM(BPF_MOV, BPF_REG_9, 0), +		BPF_JMP_REG(BPF_JLE, BPF_REG_6, BPF_REG_9, 1), +		BPF_ALU64_IMM(BPF_MOV, BPF_REG_6, 0), +		BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0), +		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -4), +		BPF_LD_MAP_FD(BPF_REG_4, 0), +		BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_4), +		BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_10), +		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), +		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), +		BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), +		BPF_EXIT_INSN(), +		BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 10), +		BPF_ALU64_IMM(BPF_MUL, BPF_REG_6, 8192), +		BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_0), +		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), +		BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), +		BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_3, 0), +		BPF_EXIT_INSN(), +	}, +	.fixup_map_array_48b = { 13 }, +	.prog_type = BPF_PROG_TYPE_XDP, +	.result = REJECT, +	.errstr = "register with unbounded min value is not allowed", +},  |