File Index
Files and directories
Sign in
FILE

jset.c

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/bpf/verifier/jset.c C
  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	/* unpriv: nospec (inserted to prevent "R9 !read_ok") */
 82	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
 83	BPF_EXIT_INSN(),
 84	},
 85	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
 86	.retval = 1,
 87	.result = ACCEPT,
 88},
 89{
 90	"jset: known const compare bad",
 91	.insns = {
 92	BPF_MOV64_IMM(BPF_REG_0, 0),
 93	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
 94	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
 95	BPF_EXIT_INSN(),
 96	},
 97	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
 98	.errstr_unpriv = "!read_ok",
 99	.result_unpriv = REJECT,
100	.errstr = "!read_ok",
101	.result = REJECT,
102},
103{
104	"jset: unknown const compare taken",
105	.insns = {
106	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
107	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
108	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
109	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
110	BPF_EXIT_INSN(),
111	},
112	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
113	.errstr_unpriv = "!read_ok",
114	.result_unpriv = REJECT,
115	.errstr = "!read_ok",
116	.result = REJECT,
117},
118{
119	"jset: unknown const compare not taken",
120	.insns = {
121	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
122	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
123	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
124	BPF_EXIT_INSN(),
125	},
126	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
127	.errstr_unpriv = "!read_ok",
128	.result_unpriv = REJECT,
129	.errstr = "!read_ok",
130	.result = REJECT,
131},
132{
133	"jset: half-known const compare",
134	.insns = {
135	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
136	BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2),
137	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1),
138	/* unpriv: nospec (inserted to prevent "R9 !read_ok") */
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	.result = ACCEPT,
145},
146{
147	"jset: range",
148	.insns = {
149	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
150	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
151	BPF_MOV64_IMM(BPF_REG_0, 0),
152	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff),
153	BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3),
154	BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1),
155	/* unpriv: nospec (inserted to prevent "R9 !read_ok") */
156	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
157	BPF_EXIT_INSN(),
158	BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1),
159	BPF_EXIT_INSN(),
160	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1),
161	/* unpriv: nospec (inserted to prevent "R9 !read_ok") */
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	.result = ACCEPT,
167},
~/ Read-only file preview.