@@ -1214,45 +1214,79 @@ wrp_test_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
1214
1214
return 0 ;
1215
1215
}
1216
1216
1217
- static int
1218
- wrp_cmp_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta ,
1219
- enum br_mask br_mask , bool swap )
1217
+ static const struct jmp_code_map {
1218
+ enum br_mask br_mask ;
1219
+ bool swap ;
1220
+ } jmp_code_map [] = {
1221
+ [BPF_JGT >> 4 ] = { BR_BLO , true },
1222
+ [BPF_JGE >> 4 ] = { BR_BHS , false },
1223
+ [BPF_JLT >> 4 ] = { BR_BLO , false },
1224
+ [BPF_JLE >> 4 ] = { BR_BHS , true },
1225
+ [BPF_JSGT >> 4 ] = { BR_BLT , true },
1226
+ [BPF_JSGE >> 4 ] = { BR_BGE , false },
1227
+ [BPF_JSLT >> 4 ] = { BR_BLT , false },
1228
+ [BPF_JSLE >> 4 ] = { BR_BGE , true },
1229
+ };
1230
+
1231
+ static const struct jmp_code_map * nfp_jmp_code_get (struct nfp_insn_meta * meta )
1232
+ {
1233
+ unsigned int op ;
1234
+
1235
+ op = BPF_OP (meta -> insn .code ) >> 4 ;
1236
+ /* br_mask of 0 is BR_BEQ which we don't use in jump code table */
1237
+ if (WARN_ONCE (op >= ARRAY_SIZE (jmp_code_map ) ||
1238
+ !jmp_code_map [op ].br_mask ,
1239
+ "no code found for jump instruction" ))
1240
+ return NULL ;
1241
+
1242
+ return & jmp_code_map [op ];
1243
+ }
1244
+
1245
+ static int cmp_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
1220
1246
{
1221
1247
const struct bpf_insn * insn = & meta -> insn ;
1222
1248
u64 imm = insn -> imm ; /* sign extend */
1249
+ const struct jmp_code_map * code ;
1223
1250
u8 reg = insn -> dst_reg * 2 ;
1224
1251
swreg tmp_reg ;
1225
1252
1253
+ code = nfp_jmp_code_get (meta );
1254
+ if (!code )
1255
+ return - EINVAL ;
1256
+
1226
1257
tmp_reg = ur_load_imm_any (nfp_prog , imm & ~0U , imm_b (nfp_prog ));
1227
- if (!swap )
1258
+ if (!code -> swap )
1228
1259
emit_alu (nfp_prog , reg_none (), reg_a (reg ), ALU_OP_SUB , tmp_reg );
1229
1260
else
1230
1261
emit_alu (nfp_prog , reg_none (), tmp_reg , ALU_OP_SUB , reg_a (reg ));
1231
1262
1232
1263
tmp_reg = ur_load_imm_any (nfp_prog , imm >> 32 , imm_b (nfp_prog ));
1233
- if (!swap )
1264
+ if (!code -> swap )
1234
1265
emit_alu (nfp_prog , reg_none (),
1235
1266
reg_a (reg + 1 ), ALU_OP_SUB_C , tmp_reg );
1236
1267
else
1237
1268
emit_alu (nfp_prog , reg_none (),
1238
1269
tmp_reg , ALU_OP_SUB_C , reg_a (reg + 1 ));
1239
1270
1240
- emit_br (nfp_prog , br_mask , insn -> off , 0 );
1271
+ emit_br (nfp_prog , code -> br_mask , insn -> off , 0 );
1241
1272
1242
1273
return 0 ;
1243
1274
}
1244
1275
1245
- static int
1246
- wrp_cmp_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta ,
1247
- enum br_mask br_mask , bool swap )
1276
+ static int cmp_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
1248
1277
{
1249
1278
const struct bpf_insn * insn = & meta -> insn ;
1279
+ const struct jmp_code_map * code ;
1250
1280
u8 areg , breg ;
1251
1281
1282
+ code = nfp_jmp_code_get (meta );
1283
+ if (!code )
1284
+ return - EINVAL ;
1285
+
1252
1286
areg = insn -> dst_reg * 2 ;
1253
1287
breg = insn -> src_reg * 2 ;
1254
1288
1255
- if (swap ) {
1289
+ if (code -> swap ) {
1256
1290
areg ^= breg ;
1257
1291
breg ^= areg ;
1258
1292
areg ^= breg ;
@@ -1261,7 +1295,7 @@ wrp_cmp_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
1261
1295
emit_alu (nfp_prog , reg_none (), reg_a (areg ), ALU_OP_SUB , reg_b (breg ));
1262
1296
emit_alu (nfp_prog , reg_none (),
1263
1297
reg_a (areg + 1 ), ALU_OP_SUB_C , reg_b (breg + 1 ));
1264
- emit_br (nfp_prog , br_mask , insn -> off , 0 );
1298
+ emit_br (nfp_prog , code -> br_mask , insn -> off , 0 );
1265
1299
1266
1300
return 0 ;
1267
1301
}
@@ -2283,46 +2317,6 @@ static int jeq_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2283
2317
return 0 ;
2284
2318
}
2285
2319
2286
- static int jgt_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2287
- {
2288
- return wrp_cmp_imm (nfp_prog , meta , BR_BLO , true);
2289
- }
2290
-
2291
- static int jge_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2292
- {
2293
- return wrp_cmp_imm (nfp_prog , meta , BR_BHS , false);
2294
- }
2295
-
2296
- static int jlt_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2297
- {
2298
- return wrp_cmp_imm (nfp_prog , meta , BR_BLO , false);
2299
- }
2300
-
2301
- static int jle_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2302
- {
2303
- return wrp_cmp_imm (nfp_prog , meta , BR_BHS , true);
2304
- }
2305
-
2306
- static int jsgt_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2307
- {
2308
- return wrp_cmp_imm (nfp_prog , meta , BR_BLT , true);
2309
- }
2310
-
2311
- static int jsge_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2312
- {
2313
- return wrp_cmp_imm (nfp_prog , meta , BR_BGE , false);
2314
- }
2315
-
2316
- static int jslt_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2317
- {
2318
- return wrp_cmp_imm (nfp_prog , meta , BR_BLT , false);
2319
- }
2320
-
2321
- static int jsle_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2322
- {
2323
- return wrp_cmp_imm (nfp_prog , meta , BR_BGE , true);
2324
- }
2325
-
2326
2320
static int jset_imm (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2327
2321
{
2328
2322
const struct bpf_insn * insn = & meta -> insn ;
@@ -2392,46 +2386,6 @@ static int jeq_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2392
2386
return 0 ;
2393
2387
}
2394
2388
2395
- static int jgt_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2396
- {
2397
- return wrp_cmp_reg (nfp_prog , meta , BR_BLO , true);
2398
- }
2399
-
2400
- static int jge_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2401
- {
2402
- return wrp_cmp_reg (nfp_prog , meta , BR_BHS , false);
2403
- }
2404
-
2405
- static int jlt_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2406
- {
2407
- return wrp_cmp_reg (nfp_prog , meta , BR_BLO , false);
2408
- }
2409
-
2410
- static int jle_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2411
- {
2412
- return wrp_cmp_reg (nfp_prog , meta , BR_BHS , true);
2413
- }
2414
-
2415
- static int jsgt_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2416
- {
2417
- return wrp_cmp_reg (nfp_prog , meta , BR_BLT , true);
2418
- }
2419
-
2420
- static int jsge_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2421
- {
2422
- return wrp_cmp_reg (nfp_prog , meta , BR_BGE , false);
2423
- }
2424
-
2425
- static int jslt_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2426
- {
2427
- return wrp_cmp_reg (nfp_prog , meta , BR_BLT , false);
2428
- }
2429
-
2430
- static int jsle_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2431
- {
2432
- return wrp_cmp_reg (nfp_prog , meta , BR_BGE , true);
2433
- }
2434
-
2435
2389
static int jset_reg (struct nfp_prog * nfp_prog , struct nfp_insn_meta * meta )
2436
2390
{
2437
2391
return wrp_test_reg (nfp_prog , meta , ALU_OP_AND , BR_BNE );
@@ -2520,25 +2474,25 @@ static const instr_cb_t instr_cb[256] = {
2520
2474
[BPF_ST | BPF_MEM | BPF_DW ] = mem_st8 ,
2521
2475
[BPF_JMP | BPF_JA | BPF_K ] = jump ,
2522
2476
[BPF_JMP | BPF_JEQ | BPF_K ] = jeq_imm ,
2523
- [BPF_JMP | BPF_JGT | BPF_K ] = jgt_imm ,
2524
- [BPF_JMP | BPF_JGE | BPF_K ] = jge_imm ,
2525
- [BPF_JMP | BPF_JLT | BPF_K ] = jlt_imm ,
2526
- [BPF_JMP | BPF_JLE | BPF_K ] = jle_imm ,
2527
- [BPF_JMP | BPF_JSGT | BPF_K ] = jsgt_imm ,
2528
- [BPF_JMP | BPF_JSGE | BPF_K ] = jsge_imm ,
2529
- [BPF_JMP | BPF_JSLT | BPF_K ] = jslt_imm ,
2530
- [BPF_JMP | BPF_JSLE | BPF_K ] = jsle_imm ,
2477
+ [BPF_JMP | BPF_JGT | BPF_K ] = cmp_imm ,
2478
+ [BPF_JMP | BPF_JGE | BPF_K ] = cmp_imm ,
2479
+ [BPF_JMP | BPF_JLT | BPF_K ] = cmp_imm ,
2480
+ [BPF_JMP | BPF_JLE | BPF_K ] = cmp_imm ,
2481
+ [BPF_JMP | BPF_JSGT | BPF_K ] = cmp_imm ,
2482
+ [BPF_JMP | BPF_JSGE | BPF_K ] = cmp_imm ,
2483
+ [BPF_JMP | BPF_JSLT | BPF_K ] = cmp_imm ,
2484
+ [BPF_JMP | BPF_JSLE | BPF_K ] = cmp_imm ,
2531
2485
[BPF_JMP | BPF_JSET | BPF_K ] = jset_imm ,
2532
2486
[BPF_JMP | BPF_JNE | BPF_K ] = jne_imm ,
2533
2487
[BPF_JMP | BPF_JEQ | BPF_X ] = jeq_reg ,
2534
- [BPF_JMP | BPF_JGT | BPF_X ] = jgt_reg ,
2535
- [BPF_JMP | BPF_JGE | BPF_X ] = jge_reg ,
2536
- [BPF_JMP | BPF_JLT | BPF_X ] = jlt_reg ,
2537
- [BPF_JMP | BPF_JLE | BPF_X ] = jle_reg ,
2538
- [BPF_JMP | BPF_JSGT | BPF_X ] = jsgt_reg ,
2539
- [BPF_JMP | BPF_JSGE | BPF_X ] = jsge_reg ,
2540
- [BPF_JMP | BPF_JSLT | BPF_X ] = jslt_reg ,
2541
- [BPF_JMP | BPF_JSLE | BPF_X ] = jsle_reg ,
2488
+ [BPF_JMP | BPF_JGT | BPF_X ] = cmp_reg ,
2489
+ [BPF_JMP | BPF_JGE | BPF_X ] = cmp_reg ,
2490
+ [BPF_JMP | BPF_JLT | BPF_X ] = cmp_reg ,
2491
+ [BPF_JMP | BPF_JLE | BPF_X ] = cmp_reg ,
2492
+ [BPF_JMP | BPF_JSGT | BPF_X ] = cmp_reg ,
2493
+ [BPF_JMP | BPF_JSGE | BPF_X ] = cmp_reg ,
2494
+ [BPF_JMP | BPF_JSLT | BPF_X ] = cmp_reg ,
2495
+ [BPF_JMP | BPF_JSLE | BPF_X ] = cmp_reg ,
2542
2496
[BPF_JMP | BPF_JSET | BPF_X ] = jset_reg ,
2543
2497
[BPF_JMP | BPF_JNE | BPF_X ] = jne_reg ,
2544
2498
[BPF_JMP | BPF_CALL ] = call ,
0 commit comments