diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/align.c')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/align.c | 241 | 
1 files changed, 121 insertions, 120 deletions
| diff --git a/tools/testing/selftests/bpf/prog_tests/align.c b/tools/testing/selftests/bpf/prog_tests/align.c index b92770592563..465c1c3a3d3c 100644 --- a/tools/testing/selftests/bpf/prog_tests/align.c +++ b/tools/testing/selftests/bpf/prog_tests/align.c @@ -6,6 +6,7 @@  struct bpf_reg_match {  	unsigned int line; +	const char *reg;  	const char *match;  }; @@ -39,13 +40,13 @@ static struct bpf_align_test tests[] = {  		},  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.matches = { -			{0, "R1=ctx(off=0,imm=0)"}, -			{0, "R10=fp0"}, -			{0, "R3_w=2"}, -			{1, "R3_w=4"}, -			{2, "R3_w=8"}, -			{3, "R3_w=16"}, -			{4, "R3_w=32"}, +			{0, "R1", "ctx(off=0,imm=0)"}, +			{0, "R10", "fp0"}, +			{0, "R3_w", "2"}, +			{1, "R3_w", "4"}, +			{2, "R3_w", "8"}, +			{3, "R3_w", "16"}, +			{4, "R3_w", "32"},  		},  	},  	{ @@ -67,19 +68,19 @@ static struct bpf_align_test tests[] = {  		},  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.matches = { -			{0, "R1=ctx(off=0,imm=0)"}, -			{0, "R10=fp0"}, -			{0, "R3_w=1"}, -			{1, "R3_w=2"}, -			{2, "R3_w=4"}, -			{3, "R3_w=8"}, -			{4, "R3_w=16"}, -			{5, "R3_w=1"}, -			{6, "R4_w=32"}, -			{7, "R4_w=16"}, -			{8, "R4_w=8"}, -			{9, "R4_w=4"}, -			{10, "R4_w=2"}, +			{0, "R1", "ctx(off=0,imm=0)"}, +			{0, "R10", "fp0"}, +			{0, "R3_w", "1"}, +			{1, "R3_w", "2"}, +			{2, "R3_w", "4"}, +			{3, "R3_w", "8"}, +			{4, "R3_w", "16"}, +			{5, "R3_w", "1"}, +			{6, "R4_w", "32"}, +			{7, "R4_w", "16"}, +			{8, "R4_w", "8"}, +			{9, "R4_w", "4"}, +			{10, "R4_w", "2"},  		},  	},  	{ @@ -96,14 +97,14 @@ static struct bpf_align_test tests[] = {  		},  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.matches = { -			{0, "R1=ctx(off=0,imm=0)"}, -			{0, "R10=fp0"}, -			{0, "R3_w=4"}, -			{1, "R3_w=8"}, -			{2, "R3_w=10"}, -			{3, "R4_w=8"}, -			{4, "R4_w=12"}, -			{5, "R4_w=14"}, +			{0, "R1", "ctx(off=0,imm=0)"}, +			{0, "R10", "fp0"}, +			{0, "R3_w", "4"}, +			{1, "R3_w", "8"}, +			{2, "R3_w", "10"}, +			{3, "R4_w", "8"}, +			{4, "R4_w", "12"}, +			{5, "R4_w", "14"},  		},  	},  	{ @@ -118,12 +119,12 @@ static struct bpf_align_test tests[] = {  		},  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.matches = { -			{0, "R1=ctx(off=0,imm=0)"}, -			{0, "R10=fp0"}, -			{0, "R3_w=7"}, -			{1, "R3_w=7"}, -			{2, "R3_w=14"}, -			{3, "R3_w=56"}, +			{0, "R1", "ctx(off=0,imm=0)"}, +			{0, "R10", "fp0"}, +			{0, "R3_w", "7"}, +			{1, "R3_w", "7"}, +			{2, "R3_w", "14"}, +			{3, "R3_w", "56"},  		},  	}, @@ -161,19 +162,19 @@ static struct bpf_align_test tests[] = {  		},  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.matches = { -			{6, "R0_w=pkt(off=8,r=8,imm=0)"}, -			{6, "R3_w=scalar(umax=255,var_off=(0x0; 0xff))"}, -			{7, "R3_w=scalar(umax=510,var_off=(0x0; 0x1fe))"}, -			{8, "R3_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, -			{9, "R3_w=scalar(umax=2040,var_off=(0x0; 0x7f8))"}, -			{10, "R3_w=scalar(umax=4080,var_off=(0x0; 0xff0))"}, -			{12, "R3_w=pkt_end(off=0,imm=0)"}, -			{17, "R4_w=scalar(umax=255,var_off=(0x0; 0xff))"}, -			{18, "R4_w=scalar(umax=8160,var_off=(0x0; 0x1fe0))"}, -			{19, "R4_w=scalar(umax=4080,var_off=(0x0; 0xff0))"}, -			{20, "R4_w=scalar(umax=2040,var_off=(0x0; 0x7f8))"}, -			{21, "R4_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, -			{22, "R4_w=scalar(umax=510,var_off=(0x0; 0x1fe))"}, +			{6, "R0_w", "pkt(off=8,r=8,imm=0)"}, +			{6, "R3_w", "var_off=(0x0; 0xff)"}, +			{7, "R3_w", "var_off=(0x0; 0x1fe)"}, +			{8, "R3_w", "var_off=(0x0; 0x3fc)"}, +			{9, "R3_w", "var_off=(0x0; 0x7f8)"}, +			{10, "R3_w", "var_off=(0x0; 0xff0)"}, +			{12, "R3_w", "pkt_end(off=0,imm=0)"}, +			{17, "R4_w", "var_off=(0x0; 0xff)"}, +			{18, "R4_w", "var_off=(0x0; 0x1fe0)"}, +			{19, "R4_w", "var_off=(0x0; 0xff0)"}, +			{20, "R4_w", "var_off=(0x0; 0x7f8)"}, +			{21, "R4_w", "var_off=(0x0; 0x3fc)"}, +			{22, "R4_w", "var_off=(0x0; 0x1fe)"},  		},  	},  	{ @@ -194,16 +195,16 @@ static struct bpf_align_test tests[] = {  		},  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.matches = { -			{6, "R3_w=scalar(umax=255,var_off=(0x0; 0xff))"}, -			{7, "R4_w=scalar(id=1,umax=255,var_off=(0x0; 0xff))"}, -			{8, "R4_w=scalar(umax=255,var_off=(0x0; 0xff))"}, -			{9, "R4_w=scalar(id=1,umax=255,var_off=(0x0; 0xff))"}, -			{10, "R4_w=scalar(umax=510,var_off=(0x0; 0x1fe))"}, -			{11, "R4_w=scalar(id=1,umax=255,var_off=(0x0; 0xff))"}, -			{12, "R4_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, -			{13, "R4_w=scalar(id=1,umax=255,var_off=(0x0; 0xff))"}, -			{14, "R4_w=scalar(umax=2040,var_off=(0x0; 0x7f8))"}, -			{15, "R4_w=scalar(umax=4080,var_off=(0x0; 0xff0))"}, +			{6, "R3_w", "var_off=(0x0; 0xff)"}, +			{7, "R4_w", "var_off=(0x0; 0xff)"}, +			{8, "R4_w", "var_off=(0x0; 0xff)"}, +			{9, "R4_w", "var_off=(0x0; 0xff)"}, +			{10, "R4_w", "var_off=(0x0; 0x1fe)"}, +			{11, "R4_w", "var_off=(0x0; 0xff)"}, +			{12, "R4_w", "var_off=(0x0; 0x3fc)"}, +			{13, "R4_w", "var_off=(0x0; 0xff)"}, +			{14, "R4_w", "var_off=(0x0; 0x7f8)"}, +			{15, "R4_w", "var_off=(0x0; 0xff0)"},  		},  	},  	{ @@ -234,14 +235,14 @@ static struct bpf_align_test tests[] = {  		},  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.matches = { -			{2, "R5_w=pkt(off=0,r=0,imm=0)"}, -			{4, "R5_w=pkt(off=14,r=0,imm=0)"}, -			{5, "R4_w=pkt(off=14,r=0,imm=0)"}, -			{9, "R2=pkt(off=0,r=18,imm=0)"}, -			{10, "R5=pkt(off=14,r=18,imm=0)"}, -			{10, "R4_w=scalar(umax=255,var_off=(0x0; 0xff))"}, -			{13, "R4_w=scalar(umax=65535,var_off=(0x0; 0xffff))"}, -			{14, "R4_w=scalar(umax=65535,var_off=(0x0; 0xffff))"}, +			{2, "R5_w", "pkt(off=0,r=0,imm=0)"}, +			{4, "R5_w", "pkt(off=14,r=0,imm=0)"}, +			{5, "R4_w", "pkt(off=14,r=0,imm=0)"}, +			{9, "R2", "pkt(off=0,r=18,imm=0)"}, +			{10, "R5", "pkt(off=14,r=18,imm=0)"}, +			{10, "R4_w", "var_off=(0x0; 0xff)"}, +			{13, "R4_w", "var_off=(0x0; 0xffff)"}, +			{14, "R4_w", "var_off=(0x0; 0xffff)"},  		},  	},  	{ @@ -298,20 +299,20 @@ static struct bpf_align_test tests[] = {  			/* Calculated offset in R6 has unknown value, but known  			 * alignment of 4.  			 */ -			{6, "R2_w=pkt(off=0,r=8,imm=0)"}, -			{7, "R6_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, +			{6, "R2_w", "pkt(off=0,r=8,imm=0)"}, +			{7, "R6_w", "var_off=(0x0; 0x3fc)"},  			/* Offset is added to packet pointer R5, resulting in  			 * known fixed offset, and variable offset from R6.  			 */ -			{11, "R5_w=pkt(id=1,off=14,r=0,umax=1020,var_off=(0x0; 0x3fc))"}, +			{11, "R5_w", "pkt(id=1,off=14,"},  			/* At the time the word size load is performed from R5,  			 * it's total offset is NET_IP_ALIGN + reg->off (0) +  			 * reg->aux_off (14) which is 16.  Then the variable  			 * offset is considered using reg->aux_off_align which  			 * is 4 and meets the load's requirements.  			 */ -			{15, "R4=pkt(id=1,off=18,r=18,umax=1020,var_off=(0x0; 0x3fc))"}, -			{15, "R5=pkt(id=1,off=14,r=18,umax=1020,var_off=(0x0; 0x3fc))"}, +			{15, "R4", "var_off=(0x0; 0x3fc)"}, +			{15, "R5", "var_off=(0x0; 0x3fc)"},  			/* Variable offset is added to R5 packet pointer,  			 * resulting in auxiliary alignment of 4. To avoid BPF  			 * verifier's precision backtracking logging @@ -319,46 +320,46 @@ static struct bpf_align_test tests[] = {  			 * instruction to validate R5 state. We also check  			 * that R4 is what it should be in such case.  			 */ -			{18, "R4_w=pkt(id=2,off=0,r=0,umax=1020,var_off=(0x0; 0x3fc))"}, -			{18, "R5_w=pkt(id=2,off=0,r=0,umax=1020,var_off=(0x0; 0x3fc))"}, +			{18, "R4_w", "var_off=(0x0; 0x3fc)"}, +			{18, "R5_w", "var_off=(0x0; 0x3fc)"},  			/* Constant offset is added to R5, resulting in  			 * reg->off of 14.  			 */ -			{19, "R5_w=pkt(id=2,off=14,r=0,umax=1020,var_off=(0x0; 0x3fc))"}, +			{19, "R5_w", "pkt(id=2,off=14,"},  			/* At the time the word size load is performed from R5,  			 * its total fixed offset is NET_IP_ALIGN + reg->off  			 * (14) which is 16.  Then the variable offset is 4-byte  			 * aligned, so the total offset is 4-byte aligned and  			 * meets the load's requirements.  			 */ -			{24, "R4=pkt(id=2,off=18,r=18,umax=1020,var_off=(0x0; 0x3fc))"}, -			{24, "R5=pkt(id=2,off=14,r=18,umax=1020,var_off=(0x0; 0x3fc))"}, +			{24, "R4", "var_off=(0x0; 0x3fc)"}, +			{24, "R5", "var_off=(0x0; 0x3fc)"},  			/* Constant offset is added to R5 packet pointer,  			 * resulting in reg->off value of 14.  			 */ -			{26, "R5_w=pkt(off=14,r=8"}, +			{26, "R5_w", "pkt(off=14,r=8,"},  			/* Variable offset is added to R5, resulting in a  			 * variable offset of (4n). See comment for insn #18  			 * for R4 = R5 trick.  			 */ -			{28, "R4_w=pkt(id=3,off=14,r=0,umax=1020,var_off=(0x0; 0x3fc))"}, -			{28, "R5_w=pkt(id=3,off=14,r=0,umax=1020,var_off=(0x0; 0x3fc))"}, +			{28, "R4_w", "var_off=(0x0; 0x3fc)"}, +			{28, "R5_w", "var_off=(0x0; 0x3fc)"},  			/* Constant is added to R5 again, setting reg->off to 18. */ -			{29, "R5_w=pkt(id=3,off=18,r=0,umax=1020,var_off=(0x0; 0x3fc))"}, +			{29, "R5_w", "pkt(id=3,off=18,"},  			/* And once more we add a variable; resulting var_off  			 * is still (4n), fixed offset is not changed.  			 * Also, we create a new reg->id.  			 */ -			{31, "R4_w=pkt(id=4,off=18,r=0,umax=2040,var_off=(0x0; 0x7fc)"}, -			{31, "R5_w=pkt(id=4,off=18,r=0,umax=2040,var_off=(0x0; 0x7fc)"}, +			{31, "R4_w", "var_off=(0x0; 0x7fc)"}, +			{31, "R5_w", "var_off=(0x0; 0x7fc)"},  			/* At the time the word size load is performed from R5,  			 * its total fixed offset is NET_IP_ALIGN + reg->off (18)  			 * which is 20.  Then the variable offset is (4n), so  			 * the total offset is 4-byte aligned and meets the  			 * load's requirements.  			 */ -			{35, "R4=pkt(id=4,off=22,r=22,umax=2040,var_off=(0x0; 0x7fc)"}, -			{35, "R5=pkt(id=4,off=18,r=22,umax=2040,var_off=(0x0; 0x7fc)"}, +			{35, "R4", "var_off=(0x0; 0x7fc)"}, +			{35, "R5", "var_off=(0x0; 0x7fc)"},  		},  	},  	{ @@ -396,36 +397,36 @@ static struct bpf_align_test tests[] = {  			/* Calculated offset in R6 has unknown value, but known  			 * alignment of 4.  			 */ -			{6, "R2_w=pkt(off=0,r=8,imm=0)"}, -			{7, "R6_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, +			{6, "R2_w", "pkt(off=0,r=8,imm=0)"}, +			{7, "R6_w", "var_off=(0x0; 0x3fc)"},  			/* Adding 14 makes R6 be (4n+2) */ -			{8, "R6_w=scalar(umin=14,umax=1034,var_off=(0x2; 0x7fc))"}, +			{8, "R6_w", "var_off=(0x2; 0x7fc)"},  			/* Packet pointer has (4n+2) offset */ -			{11, "R5_w=pkt(id=1,off=0,r=0,umin=14,umax=1034,var_off=(0x2; 0x7fc)"}, -			{12, "R4=pkt(id=1,off=4,r=0,umin=14,umax=1034,var_off=(0x2; 0x7fc)"}, +			{11, "R5_w", "var_off=(0x2; 0x7fc)"}, +			{12, "R4", "var_off=(0x2; 0x7fc)"},  			/* At the time the word size load is performed from R5,  			 * its total fixed offset is NET_IP_ALIGN + reg->off (0)  			 * which is 2.  Then the variable offset is (4n+2), so  			 * the total offset is 4-byte aligned and meets the  			 * load's requirements.  			 */ -			{15, "R5=pkt(id=1,off=0,r=4,umin=14,umax=1034,var_off=(0x2; 0x7fc)"}, +			{15, "R5", "var_off=(0x2; 0x7fc)"},  			/* Newly read value in R6 was shifted left by 2, so has  			 * known alignment of 4.  			 */ -			{17, "R6_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, +			{17, "R6_w", "var_off=(0x0; 0x3fc)"},  			/* Added (4n) to packet pointer's (4n+2) var_off, giving  			 * another (4n+2).  			 */ -			{19, "R5_w=pkt(id=2,off=0,r=0,umin=14,umax=2054,var_off=(0x2; 0xffc)"}, -			{20, "R4=pkt(id=2,off=4,r=0,umin=14,umax=2054,var_off=(0x2; 0xffc)"}, +			{19, "R5_w", "var_off=(0x2; 0xffc)"}, +			{20, "R4", "var_off=(0x2; 0xffc)"},  			/* At the time the word size load is performed from R5,  			 * its total fixed offset is NET_IP_ALIGN + reg->off (0)  			 * which is 2.  Then the variable offset is (4n+2), so  			 * the total offset is 4-byte aligned and meets the  			 * load's requirements.  			 */ -			{23, "R5=pkt(id=2,off=0,r=4,umin=14,umax=2054,var_off=(0x2; 0xffc)"}, +			{23, "R5", "var_off=(0x2; 0xffc)"},  		},  	},  	{ @@ -458,18 +459,18 @@ static struct bpf_align_test tests[] = {  		.prog_type = BPF_PROG_TYPE_SCHED_CLS,  		.result = REJECT,  		.matches = { -			{3, "R5_w=pkt_end(off=0,imm=0)"}, +			{3, "R5_w", "pkt_end(off=0,imm=0)"},  			/* (ptr - ptr) << 2 == unknown, (4n) */ -			{5, "R5_w=scalar(smax=9223372036854775804,umax=18446744073709551612,var_off=(0x0; 0xfffffffffffffffc)"}, +			{5, "R5_w", "var_off=(0x0; 0xfffffffffffffffc)"},  			/* (4n) + 14 == (4n+2).  We blow our bounds, because  			 * the add could overflow.  			 */ -			{6, "R5_w=scalar(smin=-9223372036854775806,smax=9223372036854775806,umin=2,umax=18446744073709551614,var_off=(0x2; 0xfffffffffffffffc)"}, +			{6, "R5_w", "var_off=(0x2; 0xfffffffffffffffc)"},  			/* Checked s>=0 */ -			{9, "R5=scalar(umin=2,umax=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"}, +			{9, "R5", "var_off=(0x2; 0x7ffffffffffffffc)"},  			/* packet pointer + nonnegative (4n+2) */ -			{11, "R6_w=pkt(id=1,off=0,r=0,umin=2,umax=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"}, -			{12, "R4_w=pkt(id=1,off=4,r=0,umin=2,umax=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"}, +			{11, "R6_w", "var_off=(0x2; 0x7ffffffffffffffc)"}, +			{12, "R4_w", "var_off=(0x2; 0x7ffffffffffffffc)"},  			/* NET_IP_ALIGN + (4n+2) == (4n), alignment is fine.  			 * We checked the bounds, but it might have been able  			 * to overflow if the packet pointer started in the @@ -477,7 +478,7 @@ static struct bpf_align_test tests[] = {  			 * So we did not get a 'range' on R6, and the access  			 * attempt will fail.  			 */ -			{15, "R6_w=pkt(id=1,off=0,r=0,umin=2,umax=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"}, +			{15, "R6_w", "var_off=(0x2; 0x7ffffffffffffffc)"},  		}  	},  	{ @@ -512,24 +513,23 @@ static struct bpf_align_test tests[] = {  			/* Calculated offset in R6 has unknown value, but known  			 * alignment of 4.  			 */ -			{6, "R2_w=pkt(off=0,r=8,imm=0)"}, -			{8, "R6_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, +			{6, "R2_w", "pkt(off=0,r=8,imm=0)"}, +			{8, "R6_w", "var_off=(0x0; 0x3fc)"},  			/* Adding 14 makes R6 be (4n+2) */ -			{9, "R6_w=scalar(umin=14,umax=1034,var_off=(0x2; 0x7fc))"}, +			{9, "R6_w", "var_off=(0x2; 0x7fc)"},  			/* New unknown value in R7 is (4n) */ -			{10, "R7_w=scalar(umax=1020,var_off=(0x0; 0x3fc))"}, +			{10, "R7_w", "var_off=(0x0; 0x3fc)"},  			/* Subtracting it from R6 blows our unsigned bounds */ -			{11, "R6=scalar(smin=-1006,smax=1034,umin=2,umax=18446744073709551614,var_off=(0x2; 0xfffffffffffffffc)"}, +			{11, "R6", "var_off=(0x2; 0xfffffffffffffffc)"},  			/* Checked s>= 0 */ -			{14, "R6=scalar(umin=2,umax=1034,var_off=(0x2; 0x7fc))"}, +			{14, "R6", "var_off=(0x2; 0x7fc)"},  			/* At the time the word size load is performed from R5,  			 * its total fixed offset is NET_IP_ALIGN + reg->off (0)  			 * which is 2.  Then the variable offset is (4n+2), so  			 * the total offset is 4-byte aligned and meets the  			 * load's requirements.  			 */ -			{20, "R5=pkt(id=2,off=0,r=4,umin=2,umax=1034,var_off=(0x2; 0x7fc)"}, - +			{20, "R5", "var_off=(0x2; 0x7fc)"},  		},  	},  	{ @@ -566,23 +566,23 @@ static struct bpf_align_test tests[] = {  			/* Calculated offset in R6 has unknown value, but known  			 * alignment of 4.  			 */ -			{6, "R2_w=pkt(off=0,r=8,imm=0)"}, -			{9, "R6_w=scalar(umax=60,var_off=(0x0; 0x3c))"}, +			{6, "R2_w", "pkt(off=0,r=8,imm=0)"}, +			{9, "R6_w", "var_off=(0x0; 0x3c)"},  			/* Adding 14 makes R6 be (4n+2) */ -			{10, "R6_w=scalar(umin=14,umax=74,var_off=(0x2; 0x7c))"}, +			{10, "R6_w", "var_off=(0x2; 0x7c)"},  			/* Subtracting from packet pointer overflows ubounds */ -			{13, "R5_w=pkt(id=2,off=0,r=8,umin=18446744073709551542,umax=18446744073709551602,var_off=(0xffffffffffffff82; 0x7c)"}, +			{13, "R5_w", "var_off=(0xffffffffffffff82; 0x7c)"},  			/* New unknown value in R7 is (4n), >= 76 */ -			{14, "R7_w=scalar(umin=76,umax=1096,var_off=(0x0; 0x7fc))"}, +			{14, "R7_w", "var_off=(0x0; 0x7fc)"},  			/* Adding it to packet pointer gives nice bounds again */ -			{16, "R5_w=pkt(id=3,off=0,r=0,umin=2,umax=1082,var_off=(0x2; 0x7fc)"}, +			{16, "R5_w", "var_off=(0x2; 0x7fc)"},  			/* At the time the word size load is performed from R5,  			 * its total fixed offset is NET_IP_ALIGN + reg->off (0)  			 * which is 2.  Then the variable offset is (4n+2), so  			 * the total offset is 4-byte aligned and meets the  			 * load's requirements.  			 */ -			{20, "R5=pkt(id=3,off=0,r=4,umin=2,umax=1082,var_off=(0x2; 0x7fc)"}, +			{20, "R5", "var_off=(0x2; 0x7fc)"},  		},  	},  }; @@ -635,6 +635,7 @@ static int do_test_single(struct bpf_align_test *test)  		line_ptr = strtok(bpf_vlog_copy, "\n");  		for (i = 0; i < MAX_MATCHES; i++) {  			struct bpf_reg_match m = test->matches[i]; +			const char *p;  			int tmp;  			if (!m.match) @@ -649,8 +650,8 @@ static int do_test_single(struct bpf_align_test *test)  				line_ptr = strtok(NULL, "\n");  			}  			if (!line_ptr) { -				printf("Failed to find line %u for match: %s\n", -				       m.line, m.match); +				printf("Failed to find line %u for match: %s=%s\n", +				       m.line, m.reg, m.match);  				ret = 1;  				printf("%s", bpf_vlog);  				break; @@ -667,15 +668,15 @@ static int do_test_single(struct bpf_align_test *test)  			 *   6: R0_w=pkt(off=8,r=8,imm=0) R1=ctx(off=0,imm=0) R2_w=pkt(off=0,r=8,imm=0) R3_w=pkt_end(off=0,imm=0) R10=fp0  			 *   6: (71) r3 = *(u8 *)(r2 +0)           ; R2_w=pkt(off=0,r=8,imm=0) R3_w=scalar(umax=255,var_off=(0x0; 0xff))  			 */ -			while (!strstr(line_ptr, m.match)) { +			while (!(p = strstr(line_ptr, m.reg)) || !strstr(p, m.match)) {  				cur_line = -1;  				line_ptr = strtok(NULL, "\n");  				sscanf(line_ptr ?: "", "%u: ", &cur_line);  				if (!line_ptr || cur_line != m.line)  					break;  			} -			if (cur_line != m.line || !line_ptr || !strstr(line_ptr, m.match)) { -				printf("Failed to find match %u: %s\n", m.line, m.match); +			if (cur_line != m.line || !line_ptr || !(p = strstr(line_ptr, m.reg)) || !strstr(p, m.match)) { +				printf("Failed to find match %u: %s=%s\n", m.line, m.reg, m.match);  				ret = 1;  				printf("%s", bpf_vlog);  				break; | 
