0001 {
0002 "jset32: BPF_K",
0003 .insns = {
0004 BPF_DIRECT_PKT_R2,
0005 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0006
0007 BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, -2, 1),
0008 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0009 BPF_EXIT_INSN(),
0010
0011 BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 1, 1),
0012 BPF_EXIT_INSN(),
0013 BPF_MOV64_IMM(BPF_REG_0, 2),
0014 BPF_EXIT_INSN(),
0015 },
0016 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0017 .result = ACCEPT,
0018 .runs = 3,
0019 .retvals = {
0020 { .retval = 0,
0021 .data64 = { 1ULL << 63, }
0022 },
0023 { .retval = 2,
0024 .data64 = { 1, }
0025 },
0026 { .retval = 2,
0027 .data64 = { 1ULL << 63 | 1, }
0028 },
0029 },
0030 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0031 },
0032 {
0033 "jset32: BPF_X",
0034 .insns = {
0035 BPF_DIRECT_PKT_R2,
0036 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0037 BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
0038 BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
0039 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0040 BPF_EXIT_INSN(),
0041
0042 BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
0043 BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
0044 BPF_EXIT_INSN(),
0045 BPF_MOV64_IMM(BPF_REG_0, 2),
0046 BPF_EXIT_INSN(),
0047 },
0048 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0049 .result = ACCEPT,
0050 .runs = 3,
0051 .retvals = {
0052 { .retval = 0,
0053 .data64 = { 1ULL << 63, }
0054 },
0055 { .retval = 2,
0056 .data64 = { 1, }
0057 },
0058 { .retval = 2,
0059 .data64 = { 1ULL << 63 | 1, }
0060 },
0061 },
0062 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0063 },
0064 {
0065 "jset32: ignores upper bits",
0066 .insns = {
0067 BPF_MOV64_IMM(BPF_REG_0, 0),
0068 BPF_LD_IMM64(BPF_REG_7, 0x8000000000000000),
0069 BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
0070 BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
0071 BPF_EXIT_INSN(),
0072 BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
0073 BPF_MOV64_IMM(BPF_REG_0, 2),
0074 BPF_EXIT_INSN(),
0075 },
0076 .result = ACCEPT,
0077 .retval = 2,
0078 },
0079 {
0080 "jset32: min/max deduction",
0081 .insns = {
0082 BPF_RAND_UEXT_R7,
0083 BPF_MOV64_IMM(BPF_REG_0, 0),
0084 BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 0x10, 1),
0085 BPF_EXIT_INSN(),
0086 BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x10, 1),
0087 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0088 BPF_EXIT_INSN(),
0089 },
0090 .errstr_unpriv = "R9 !read_ok",
0091 .result_unpriv = REJECT,
0092 .result = ACCEPT,
0093 },
0094 {
0095 "jeq32: BPF_K",
0096 .insns = {
0097 BPF_DIRECT_PKT_R2,
0098 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0099 BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, -1, 1),
0100 BPF_EXIT_INSN(),
0101 BPF_MOV64_IMM(BPF_REG_0, 2),
0102 BPF_EXIT_INSN(),
0103 },
0104 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0105 .result = ACCEPT,
0106 .runs = 2,
0107 .retvals = {
0108 { .retval = 0,
0109 .data64 = { -2, }
0110 },
0111 { .retval = 2,
0112 .data64 = { -1, }
0113 },
0114 },
0115 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0116 },
0117 {
0118 "jeq32: BPF_X",
0119 .insns = {
0120 BPF_DIRECT_PKT_R2,
0121 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0122 BPF_LD_IMM64(BPF_REG_8, 0x7000000000000001),
0123 BPF_JMP32_REG(BPF_JEQ, BPF_REG_7, BPF_REG_8, 1),
0124 BPF_EXIT_INSN(),
0125 BPF_MOV64_IMM(BPF_REG_0, 2),
0126 BPF_EXIT_INSN(),
0127 },
0128 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0129 .result = ACCEPT,
0130 .runs = 3,
0131 .retvals = {
0132 { .retval = 0,
0133 .data64 = { 2, }
0134 },
0135 { .retval = 2,
0136 .data64 = { 1, }
0137 },
0138 { .retval = 2,
0139 .data64 = { 1ULL << 63 | 1, }
0140 },
0141 },
0142 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0143 },
0144 {
0145 "jeq32: min/max deduction",
0146 .insns = {
0147 BPF_RAND_UEXT_R7,
0148 BPF_MOV64_IMM(BPF_REG_0, 0),
0149 BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, 0x10, 1),
0150 BPF_EXIT_INSN(),
0151 BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, 0xf, 1),
0152 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0153 BPF_EXIT_INSN(),
0154 },
0155 .errstr_unpriv = "R9 !read_ok",
0156 .result_unpriv = REJECT,
0157 .result = ACCEPT,
0158 },
0159 {
0160 "jne32: BPF_K",
0161 .insns = {
0162 BPF_DIRECT_PKT_R2,
0163 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0164 BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, -1, 1),
0165 BPF_EXIT_INSN(),
0166 BPF_MOV64_IMM(BPF_REG_0, 2),
0167 BPF_EXIT_INSN(),
0168 },
0169 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0170 .result = ACCEPT,
0171 .runs = 2,
0172 .retvals = {
0173 { .retval = 2,
0174 .data64 = { 1, }
0175 },
0176 { .retval = 0,
0177 .data64 = { -1, }
0178 },
0179 },
0180 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0181 },
0182 {
0183 "jne32: BPF_X",
0184 .insns = {
0185 BPF_DIRECT_PKT_R2,
0186 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0187 BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
0188 BPF_JMP32_REG(BPF_JNE, BPF_REG_7, BPF_REG_8, 1),
0189 BPF_EXIT_INSN(),
0190 BPF_MOV64_IMM(BPF_REG_0, 2),
0191 BPF_EXIT_INSN(),
0192 },
0193 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0194 .result = ACCEPT,
0195 .runs = 3,
0196 .retvals = {
0197 { .retval = 0,
0198 .data64 = { 1, }
0199 },
0200 { .retval = 2,
0201 .data64 = { 2, }
0202 },
0203 { .retval = 2,
0204 .data64 = { 1ULL << 63 | 2, }
0205 },
0206 },
0207 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0208 },
0209 {
0210 "jne32: min/max deduction",
0211 .insns = {
0212 BPF_RAND_UEXT_R7,
0213 BPF_MOV64_IMM(BPF_REG_0, 0),
0214 BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
0215 BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
0216 BPF_EXIT_INSN(),
0217 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0218 BPF_EXIT_INSN(),
0219 },
0220 .errstr_unpriv = "R9 !read_ok",
0221 .result_unpriv = REJECT,
0222 .result = ACCEPT,
0223 },
0224 {
0225 "jge32: BPF_K",
0226 .insns = {
0227 BPF_DIRECT_PKT_R2,
0228 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0229 BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, UINT_MAX - 1, 1),
0230 BPF_EXIT_INSN(),
0231 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0232 BPF_EXIT_INSN(),
0233 },
0234 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0235 .result = ACCEPT,
0236 .runs = 3,
0237 .retvals = {
0238 { .retval = 2,
0239 .data64 = { UINT_MAX, }
0240 },
0241 { .retval = 2,
0242 .data64 = { UINT_MAX - 1, }
0243 },
0244 { .retval = 0,
0245 .data64 = { 0, }
0246 },
0247 },
0248 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0249 },
0250 {
0251 "jge32: BPF_X",
0252 .insns = {
0253 BPF_DIRECT_PKT_R2,
0254 BPF_LD_IMM64(BPF_REG_8, UINT_MAX | 1ULL << 32),
0255 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0256 BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
0257 BPF_EXIT_INSN(),
0258 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0259 BPF_EXIT_INSN(),
0260 },
0261 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0262 .result = ACCEPT,
0263 .runs = 3,
0264 .retvals = {
0265 { .retval = 2,
0266 .data64 = { UINT_MAX, }
0267 },
0268 { .retval = 0,
0269 .data64 = { INT_MAX, }
0270 },
0271 { .retval = 0,
0272 .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
0273 },
0274 },
0275 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0276 },
0277 {
0278 "jge32: min/max deduction",
0279 .insns = {
0280 BPF_RAND_UEXT_R7,
0281 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0282 BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
0283 BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
0284 BPF_EXIT_INSN(),
0285 BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x7ffffff0, 1),
0286 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0287 BPF_EXIT_INSN(),
0288 },
0289 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0290 .result_unpriv = REJECT,
0291 .result = ACCEPT,
0292 .retval = 2,
0293 },
0294 {
0295 "jgt32: BPF_K",
0296 .insns = {
0297 BPF_DIRECT_PKT_R2,
0298 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0299 BPF_JMP32_IMM(BPF_JGT, BPF_REG_7, UINT_MAX - 1, 1),
0300 BPF_EXIT_INSN(),
0301 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0302 BPF_EXIT_INSN(),
0303 },
0304 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0305 .result = ACCEPT,
0306 .runs = 3,
0307 .retvals = {
0308 { .retval = 2,
0309 .data64 = { UINT_MAX, }
0310 },
0311 { .retval = 0,
0312 .data64 = { UINT_MAX - 1, }
0313 },
0314 { .retval = 0,
0315 .data64 = { 0, }
0316 },
0317 },
0318 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0319 },
0320 {
0321 "jgt32: BPF_X",
0322 .insns = {
0323 BPF_DIRECT_PKT_R2,
0324 BPF_LD_IMM64(BPF_REG_8, (UINT_MAX - 1) | 1ULL << 32),
0325 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0326 BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
0327 BPF_EXIT_INSN(),
0328 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0329 BPF_EXIT_INSN(),
0330 },
0331 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0332 .result = ACCEPT,
0333 .runs = 3,
0334 .retvals = {
0335 { .retval = 2,
0336 .data64 = { UINT_MAX, }
0337 },
0338 { .retval = 0,
0339 .data64 = { UINT_MAX - 1, }
0340 },
0341 { .retval = 0,
0342 .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
0343 },
0344 },
0345 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0346 },
0347 {
0348 "jgt32: min/max deduction",
0349 .insns = {
0350 BPF_RAND_UEXT_R7,
0351 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0352 BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
0353 BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
0354 BPF_EXIT_INSN(),
0355 BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 0x7ffffff0, 1),
0356 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0357 BPF_EXIT_INSN(),
0358 },
0359 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0360 .result_unpriv = REJECT,
0361 .result = ACCEPT,
0362 .retval = 2,
0363 },
0364 {
0365 "jle32: BPF_K",
0366 .insns = {
0367 BPF_DIRECT_PKT_R2,
0368 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0369 BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, INT_MAX, 1),
0370 BPF_EXIT_INSN(),
0371 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0372 BPF_EXIT_INSN(),
0373 },
0374 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0375 .result = ACCEPT,
0376 .runs = 3,
0377 .retvals = {
0378 { .retval = 2,
0379 .data64 = { INT_MAX - 1, }
0380 },
0381 { .retval = 0,
0382 .data64 = { UINT_MAX, }
0383 },
0384 { .retval = 2,
0385 .data64 = { INT_MAX, }
0386 },
0387 },
0388 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0389 },
0390 {
0391 "jle32: BPF_X",
0392 .insns = {
0393 BPF_DIRECT_PKT_R2,
0394 BPF_LD_IMM64(BPF_REG_8, (INT_MAX - 1) | 2ULL << 32),
0395 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0396 BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
0397 BPF_EXIT_INSN(),
0398 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0399 BPF_EXIT_INSN(),
0400 },
0401 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0402 .result = ACCEPT,
0403 .runs = 3,
0404 .retvals = {
0405 { .retval = 0,
0406 .data64 = { INT_MAX | 1ULL << 32, }
0407 },
0408 { .retval = 2,
0409 .data64 = { INT_MAX - 2, }
0410 },
0411 { .retval = 0,
0412 .data64 = { UINT_MAX, }
0413 },
0414 },
0415 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0416 },
0417 {
0418 "jle32: min/max deduction",
0419 .insns = {
0420 BPF_RAND_UEXT_R7,
0421 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0422 BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
0423 BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
0424 BPF_EXIT_INSN(),
0425 BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, 0x7ffffff0, 1),
0426 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0427 BPF_EXIT_INSN(),
0428 },
0429 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0430 .result_unpriv = REJECT,
0431 .result = ACCEPT,
0432 .retval = 2,
0433 },
0434 {
0435 "jlt32: BPF_K",
0436 .insns = {
0437 BPF_DIRECT_PKT_R2,
0438 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0439 BPF_JMP32_IMM(BPF_JLT, BPF_REG_7, INT_MAX, 1),
0440 BPF_EXIT_INSN(),
0441 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0442 BPF_EXIT_INSN(),
0443 },
0444 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0445 .result = ACCEPT,
0446 .runs = 3,
0447 .retvals = {
0448 { .retval = 0,
0449 .data64 = { INT_MAX, }
0450 },
0451 { .retval = 0,
0452 .data64 = { UINT_MAX, }
0453 },
0454 { .retval = 2,
0455 .data64 = { INT_MAX - 1, }
0456 },
0457 },
0458 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0459 },
0460 {
0461 "jlt32: BPF_X",
0462 .insns = {
0463 BPF_DIRECT_PKT_R2,
0464 BPF_LD_IMM64(BPF_REG_8, INT_MAX | 2ULL << 32),
0465 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0466 BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
0467 BPF_EXIT_INSN(),
0468 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0469 BPF_EXIT_INSN(),
0470 },
0471 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0472 .result = ACCEPT,
0473 .runs = 3,
0474 .retvals = {
0475 { .retval = 0,
0476 .data64 = { INT_MAX | 1ULL << 32, }
0477 },
0478 { .retval = 0,
0479 .data64 = { UINT_MAX, }
0480 },
0481 { .retval = 2,
0482 .data64 = { (INT_MAX - 1) | 3ULL << 32, }
0483 },
0484 },
0485 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0486 },
0487 {
0488 "jlt32: min/max deduction",
0489 .insns = {
0490 BPF_RAND_UEXT_R7,
0491 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0492 BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
0493 BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
0494 BPF_EXIT_INSN(),
0495 BPF_JMP_IMM(BPF_JSLT, BPF_REG_7, 0x7ffffff0, 1),
0496 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0497 BPF_EXIT_INSN(),
0498 },
0499 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0500 .result_unpriv = REJECT,
0501 .result = ACCEPT,
0502 .retval = 2,
0503 },
0504 {
0505 "jsge32: BPF_K",
0506 .insns = {
0507 BPF_DIRECT_PKT_R2,
0508 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0509 BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, -1, 1),
0510 BPF_EXIT_INSN(),
0511 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0512 BPF_EXIT_INSN(),
0513 },
0514 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0515 .result = ACCEPT,
0516 .runs = 3,
0517 .retvals = {
0518 { .retval = 2,
0519 .data64 = { 0, }
0520 },
0521 { .retval = 2,
0522 .data64 = { -1, }
0523 },
0524 { .retval = 0,
0525 .data64 = { -2, }
0526 },
0527 },
0528 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0529 },
0530 {
0531 "jsge32: BPF_X",
0532 .insns = {
0533 BPF_DIRECT_PKT_R2,
0534 BPF_LD_IMM64(BPF_REG_8, (__u32)-1 | 2ULL << 32),
0535 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0536 BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
0537 BPF_EXIT_INSN(),
0538 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0539 BPF_EXIT_INSN(),
0540 },
0541 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0542 .result = ACCEPT,
0543 .runs = 3,
0544 .retvals = {
0545 { .retval = 2,
0546 .data64 = { -1, }
0547 },
0548 { .retval = 2,
0549 .data64 = { 0x7fffffff | 1ULL << 32, }
0550 },
0551 { .retval = 0,
0552 .data64 = { -2, }
0553 },
0554 },
0555 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0556 },
0557 {
0558 "jsge32: min/max deduction",
0559 .insns = {
0560 BPF_RAND_UEXT_R7,
0561 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0562 BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
0563 BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
0564 BPF_EXIT_INSN(),
0565 BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0x7ffffff0, 1),
0566 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0567 BPF_EXIT_INSN(),
0568 },
0569 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0570 .result_unpriv = REJECT,
0571 .result = ACCEPT,
0572 .retval = 2,
0573 },
0574 {
0575 "jsgt32: BPF_K",
0576 .insns = {
0577 BPF_DIRECT_PKT_R2,
0578 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0579 BPF_JMP32_IMM(BPF_JSGT, BPF_REG_7, -1, 1),
0580 BPF_EXIT_INSN(),
0581 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0582 BPF_EXIT_INSN(),
0583 },
0584 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0585 .result = ACCEPT,
0586 .runs = 3,
0587 .retvals = {
0588 { .retval = 0,
0589 .data64 = { (__u32)-2, }
0590 },
0591 { .retval = 0,
0592 .data64 = { -1, }
0593 },
0594 { .retval = 2,
0595 .data64 = { 1, }
0596 },
0597 },
0598 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0599 },
0600 {
0601 "jsgt32: BPF_X",
0602 .insns = {
0603 BPF_DIRECT_PKT_R2,
0604 BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
0605 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0606 BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
0607 BPF_EXIT_INSN(),
0608 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0609 BPF_EXIT_INSN(),
0610 },
0611 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0612 .result = ACCEPT,
0613 .runs = 3,
0614 .retvals = {
0615 { .retval = 0,
0616 .data64 = { 0x7ffffffe, }
0617 },
0618 { .retval = 0,
0619 .data64 = { 0x1ffffffffULL, }
0620 },
0621 { .retval = 2,
0622 .data64 = { 0x7fffffff, }
0623 },
0624 },
0625 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0626 },
0627 {
0628 "jsgt32: min/max deduction",
0629 .insns = {
0630 BPF_RAND_SEXT_R7,
0631 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0632 BPF_LD_IMM64(BPF_REG_8, (__u32)(-2) | 1ULL << 32),
0633 BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
0634 BPF_EXIT_INSN(),
0635 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, -2, 1),
0636 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0637 BPF_EXIT_INSN(),
0638 },
0639 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0640 .result_unpriv = REJECT,
0641 .result = ACCEPT,
0642 .retval = 2,
0643 },
0644 {
0645 "jsle32: BPF_K",
0646 .insns = {
0647 BPF_DIRECT_PKT_R2,
0648 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0649 BPF_JMP32_IMM(BPF_JSLE, BPF_REG_7, -1, 1),
0650 BPF_EXIT_INSN(),
0651 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0652 BPF_EXIT_INSN(),
0653 },
0654 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0655 .result = ACCEPT,
0656 .runs = 3,
0657 .retvals = {
0658 { .retval = 2,
0659 .data64 = { (__u32)-2, }
0660 },
0661 { .retval = 2,
0662 .data64 = { -1, }
0663 },
0664 { .retval = 0,
0665 .data64 = { 1, }
0666 },
0667 },
0668 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0669 },
0670 {
0671 "jsle32: BPF_X",
0672 .insns = {
0673 BPF_DIRECT_PKT_R2,
0674 BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
0675 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0676 BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
0677 BPF_EXIT_INSN(),
0678 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0679 BPF_EXIT_INSN(),
0680 },
0681 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0682 .result = ACCEPT,
0683 .runs = 3,
0684 .retvals = {
0685 { .retval = 2,
0686 .data64 = { 0x7ffffffe, }
0687 },
0688 { .retval = 2,
0689 .data64 = { (__u32)-1, }
0690 },
0691 { .retval = 0,
0692 .data64 = { 0x7fffffff | 2ULL << 32, }
0693 },
0694 },
0695 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0696 },
0697 {
0698 "jsle32: min/max deduction",
0699 .insns = {
0700 BPF_RAND_UEXT_R7,
0701 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0702 BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
0703 BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
0704 BPF_EXIT_INSN(),
0705 BPF_JMP_IMM(BPF_JSLE, BPF_REG_7, 0x7ffffff0, 1),
0706 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0707 BPF_EXIT_INSN(),
0708 },
0709 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0710 .result_unpriv = REJECT,
0711 .result = ACCEPT,
0712 .retval = 2,
0713 },
0714 {
0715 "jslt32: BPF_K",
0716 .insns = {
0717 BPF_DIRECT_PKT_R2,
0718 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0719 BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
0720 BPF_EXIT_INSN(),
0721 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0722 BPF_EXIT_INSN(),
0723 },
0724 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0725 .result = ACCEPT,
0726 .runs = 3,
0727 .retvals = {
0728 { .retval = 2,
0729 .data64 = { (__u32)-2, }
0730 },
0731 { .retval = 0,
0732 .data64 = { -1, }
0733 },
0734 { .retval = 0,
0735 .data64 = { 1, }
0736 },
0737 },
0738 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0739 },
0740 {
0741 "jslt32: BPF_X",
0742 .insns = {
0743 BPF_DIRECT_PKT_R2,
0744 BPF_LD_IMM64(BPF_REG_8, 0x7fffffff | 1ULL << 32),
0745 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0746 BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
0747 BPF_EXIT_INSN(),
0748 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0749 BPF_EXIT_INSN(),
0750 },
0751 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0752 .result = ACCEPT,
0753 .runs = 3,
0754 .retvals = {
0755 { .retval = 2,
0756 .data64 = { 0x7ffffffe, }
0757 },
0758 { .retval = 2,
0759 .data64 = { 0xffffffff, }
0760 },
0761 { .retval = 0,
0762 .data64 = { 0x7fffffff | 2ULL << 32, }
0763 },
0764 },
0765 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0766 },
0767 {
0768 "jslt32: min/max deduction",
0769 .insns = {
0770 BPF_RAND_SEXT_R7,
0771 BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
0772 BPF_LD_IMM64(BPF_REG_8, (__u32)(-1) | 1ULL << 32),
0773 BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
0774 BPF_EXIT_INSN(),
0775 BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
0776 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
0777 BPF_EXIT_INSN(),
0778 },
0779 .errstr_unpriv = "R0 invalid mem access 'scalar'",
0780 .result_unpriv = REJECT,
0781 .result = ACCEPT,
0782 .retval = 2,
0783 },
0784 {
0785 "jgt32: range bound deduction, reg op imm",
0786 .insns = {
0787 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0788 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
0789 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0790 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0791 BPF_LD_MAP_FD(BPF_REG_1, 0),
0792 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
0793 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
0794 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
0795 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
0796 BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
0797 BPF_JMP32_IMM(BPF_JGT, BPF_REG_0, 1, 5),
0798 BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
0799 BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
0800 BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
0801 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
0802 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
0803 BPF_MOV32_IMM(BPF_REG_0, 0),
0804 BPF_EXIT_INSN(),
0805 },
0806 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0807 .fixup_map_hash_48b = { 4 },
0808 .result = ACCEPT,
0809 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0810 },
0811 {
0812 "jgt32: range bound deduction, reg1 op reg2, reg1 unknown",
0813 .insns = {
0814 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0815 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
0816 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0817 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0818 BPF_LD_MAP_FD(BPF_REG_1, 0),
0819 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
0820 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
0821 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
0822 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
0823 BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
0824 BPF_MOV32_IMM(BPF_REG_2, 1),
0825 BPF_JMP32_REG(BPF_JGT, BPF_REG_0, BPF_REG_2, 5),
0826 BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
0827 BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
0828 BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
0829 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
0830 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
0831 BPF_MOV32_IMM(BPF_REG_0, 0),
0832 BPF_EXIT_INSN(),
0833 },
0834 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0835 .fixup_map_hash_48b = { 4 },
0836 .result = ACCEPT,
0837 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0838 },
0839 {
0840 "jle32: range bound deduction, reg1 op reg2, reg2 unknown",
0841 .insns = {
0842 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0843 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
0844 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0845 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0846 BPF_LD_MAP_FD(BPF_REG_1, 0),
0847 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
0848 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
0849 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
0850 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
0851 BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
0852 BPF_MOV32_IMM(BPF_REG_2, 1),
0853 BPF_JMP32_REG(BPF_JLE, BPF_REG_2, BPF_REG_0, 5),
0854 BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
0855 BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
0856 BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
0857 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
0858 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
0859 BPF_MOV32_IMM(BPF_REG_0, 0),
0860 BPF_EXIT_INSN(),
0861 },
0862 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0863 .fixup_map_hash_48b = { 4 },
0864 .result = ACCEPT,
0865 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0866 },
0867 {
0868 "jeq32/jne32: bounds checking",
0869 .insns = {
0870 BPF_MOV64_IMM(BPF_REG_6, 563),
0871 BPF_MOV64_IMM(BPF_REG_2, 0),
0872 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
0873 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
0874 BPF_ALU32_REG(BPF_OR, BPF_REG_2, BPF_REG_6),
0875 BPF_JMP32_IMM(BPF_JNE, BPF_REG_2, 8, 5),
0876 BPF_JMP_IMM(BPF_JSGE, BPF_REG_2, 500, 2),
0877 BPF_MOV64_IMM(BPF_REG_0, 2),
0878 BPF_EXIT_INSN(),
0879 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
0880 BPF_EXIT_INSN(),
0881 BPF_MOV64_IMM(BPF_REG_0, 1),
0882 BPF_EXIT_INSN(),
0883 },
0884 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0885 .result = ACCEPT,
0886 .retval = 1,
0887 },