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