xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/bpf/verifier/jset.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun {
2*4882a593Smuzhiyun 	"jset: functional",
3*4882a593Smuzhiyun 	.insns = {
4*4882a593Smuzhiyun 	BPF_DIRECT_PKT_R2,
5*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun 	/* reg, bit 63 or bit 0 set, taken */
8*4882a593Smuzhiyun 	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
9*4882a593Smuzhiyun 	BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
10*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun 	/* reg, bit 62, not taken */
13*4882a593Smuzhiyun 	BPF_LD_IMM64(BPF_REG_8, 0x4000000000000000),
14*4882a593Smuzhiyun 	BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
15*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
16*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 	/* imm, any bit set, taken */
19*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_7, -1, 1),
20*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	/* imm, bit 31 set, taken */
23*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
24*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 	/* all good - return r0 == 2 */
27*4882a593Smuzhiyun 	BPF_MOV64_IMM(BPF_REG_0, 2),
28*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
29*4882a593Smuzhiyun 	},
30*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
31*4882a593Smuzhiyun 	.result = ACCEPT,
32*4882a593Smuzhiyun 	.runs = 7,
33*4882a593Smuzhiyun 	.retvals = {
34*4882a593Smuzhiyun 		{ .retval = 2,
35*4882a593Smuzhiyun 		  .data64 = { (1ULL << 63) | (1U << 31) | (1U << 0), }
36*4882a593Smuzhiyun 		},
37*4882a593Smuzhiyun 		{ .retval = 2,
38*4882a593Smuzhiyun 		  .data64 = { (1ULL << 63) | (1U << 31), }
39*4882a593Smuzhiyun 		},
40*4882a593Smuzhiyun 		{ .retval = 2,
41*4882a593Smuzhiyun 		  .data64 = { (1ULL << 31) | (1U << 0), }
42*4882a593Smuzhiyun 		},
43*4882a593Smuzhiyun 		{ .retval = 2,
44*4882a593Smuzhiyun 		  .data64 = { (__u32)-1, }
45*4882a593Smuzhiyun 		},
46*4882a593Smuzhiyun 		{ .retval = 2,
47*4882a593Smuzhiyun 		  .data64 = { ~0x4000000000000000ULL, }
48*4882a593Smuzhiyun 		},
49*4882a593Smuzhiyun 		{ .retval = 0,
50*4882a593Smuzhiyun 		  .data64 = { 0, }
51*4882a593Smuzhiyun 		},
52*4882a593Smuzhiyun 		{ .retval = 0,
53*4882a593Smuzhiyun 		  .data64 = { ~0ULL, }
54*4882a593Smuzhiyun 		},
55*4882a593Smuzhiyun 	},
56*4882a593Smuzhiyun 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
57*4882a593Smuzhiyun },
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	"jset: sign-extend",
60*4882a593Smuzhiyun 	.insns = {
61*4882a593Smuzhiyun 	BPF_DIRECT_PKT_R2,
62*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
65*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	BPF_MOV64_IMM(BPF_REG_0, 2),
68*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
69*4882a593Smuzhiyun 	},
70*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
71*4882a593Smuzhiyun 	.result = ACCEPT,
72*4882a593Smuzhiyun 	.retval = 2,
73*4882a593Smuzhiyun 	.data = { 1, 0, 0, 0, 0, 0, 0, 1, },
74*4882a593Smuzhiyun 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
75*4882a593Smuzhiyun },
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	"jset: known const compare",
78*4882a593Smuzhiyun 	.insns = {
79*4882a593Smuzhiyun 	BPF_MOV64_IMM(BPF_REG_0, 1),
80*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
81*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
82*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
83*4882a593Smuzhiyun 	},
84*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
85*4882a593Smuzhiyun 	.errstr_unpriv = "R9 !read_ok",
86*4882a593Smuzhiyun 	.result_unpriv = REJECT,
87*4882a593Smuzhiyun 	.retval = 1,
88*4882a593Smuzhiyun 	.result = ACCEPT,
89*4882a593Smuzhiyun },
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	"jset: known const compare bad",
92*4882a593Smuzhiyun 	.insns = {
93*4882a593Smuzhiyun 	BPF_MOV64_IMM(BPF_REG_0, 0),
94*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
95*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
96*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
97*4882a593Smuzhiyun 	},
98*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
99*4882a593Smuzhiyun 	.errstr_unpriv = "!read_ok",
100*4882a593Smuzhiyun 	.result_unpriv = REJECT,
101*4882a593Smuzhiyun 	.errstr = "!read_ok",
102*4882a593Smuzhiyun 	.result = REJECT,
103*4882a593Smuzhiyun },
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun 	"jset: unknown const compare taken",
106*4882a593Smuzhiyun 	.insns = {
107*4882a593Smuzhiyun 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
108*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
109*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
110*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
111*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
112*4882a593Smuzhiyun 	},
113*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
114*4882a593Smuzhiyun 	.errstr_unpriv = "!read_ok",
115*4882a593Smuzhiyun 	.result_unpriv = REJECT,
116*4882a593Smuzhiyun 	.errstr = "!read_ok",
117*4882a593Smuzhiyun 	.result = REJECT,
118*4882a593Smuzhiyun },
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	"jset: unknown const compare not taken",
121*4882a593Smuzhiyun 	.insns = {
122*4882a593Smuzhiyun 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
123*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
124*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
125*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
126*4882a593Smuzhiyun 	},
127*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
128*4882a593Smuzhiyun 	.errstr_unpriv = "!read_ok",
129*4882a593Smuzhiyun 	.result_unpriv = REJECT,
130*4882a593Smuzhiyun 	.errstr = "!read_ok",
131*4882a593Smuzhiyun 	.result = REJECT,
132*4882a593Smuzhiyun },
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun 	"jset: half-known const compare",
135*4882a593Smuzhiyun 	.insns = {
136*4882a593Smuzhiyun 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
137*4882a593Smuzhiyun 	BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2),
138*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1),
139*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
140*4882a593Smuzhiyun 	BPF_MOV64_IMM(BPF_REG_0, 0),
141*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
142*4882a593Smuzhiyun 	},
143*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
144*4882a593Smuzhiyun 	.errstr_unpriv = "R9 !read_ok",
145*4882a593Smuzhiyun 	.result_unpriv = REJECT,
146*4882a593Smuzhiyun 	.result = ACCEPT,
147*4882a593Smuzhiyun },
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun 	"jset: range",
150*4882a593Smuzhiyun 	.insns = {
151*4882a593Smuzhiyun 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
152*4882a593Smuzhiyun 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
153*4882a593Smuzhiyun 	BPF_MOV64_IMM(BPF_REG_0, 0),
154*4882a593Smuzhiyun 	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff),
155*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3),
156*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1),
157*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
158*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
159*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1),
160*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
161*4882a593Smuzhiyun 	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1),
162*4882a593Smuzhiyun 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
163*4882a593Smuzhiyun 	BPF_EXIT_INSN(),
164*4882a593Smuzhiyun 	},
165*4882a593Smuzhiyun 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
166*4882a593Smuzhiyun 	.errstr_unpriv = "R9 !read_ok",
167*4882a593Smuzhiyun 	.result_unpriv = REJECT,
168*4882a593Smuzhiyun 	.result = ACCEPT,
169*4882a593Smuzhiyun },
170