Skip to content

Commit 61dd8f0

Browse files
Jakub Kicinskiborkmann
authored andcommitted
nfp: bpf: tabularize generations of compare operations
There are quite a few compare instructions now, use a table to translate BPF instruction code to NFP instruction parameters instead of parameterizing helpers. This saves LOC and makes future extensions easier. Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 6c59500 commit 61dd8f0

File tree

1 file changed

+61
-107
lines changed
  • drivers/net/ethernet/netronome/nfp/bpf

1 file changed

+61
-107
lines changed

drivers/net/ethernet/netronome/nfp/bpf/jit.c

Lines changed: 61 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,45 +1214,79 @@ wrp_test_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
12141214
return 0;
12151215
}
12161216

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)
12201246
{
12211247
const struct bpf_insn *insn = &meta->insn;
12221248
u64 imm = insn->imm; /* sign extend */
1249+
const struct jmp_code_map *code;
12231250
u8 reg = insn->dst_reg * 2;
12241251
swreg tmp_reg;
12251252

1253+
code = nfp_jmp_code_get(meta);
1254+
if (!code)
1255+
return -EINVAL;
1256+
12261257
tmp_reg = ur_load_imm_any(nfp_prog, imm & ~0U, imm_b(nfp_prog));
1227-
if (!swap)
1258+
if (!code->swap)
12281259
emit_alu(nfp_prog, reg_none(), reg_a(reg), ALU_OP_SUB, tmp_reg);
12291260
else
12301261
emit_alu(nfp_prog, reg_none(), tmp_reg, ALU_OP_SUB, reg_a(reg));
12311262

12321263
tmp_reg = ur_load_imm_any(nfp_prog, imm >> 32, imm_b(nfp_prog));
1233-
if (!swap)
1264+
if (!code->swap)
12341265
emit_alu(nfp_prog, reg_none(),
12351266
reg_a(reg + 1), ALU_OP_SUB_C, tmp_reg);
12361267
else
12371268
emit_alu(nfp_prog, reg_none(),
12381269
tmp_reg, ALU_OP_SUB_C, reg_a(reg + 1));
12391270

1240-
emit_br(nfp_prog, br_mask, insn->off, 0);
1271+
emit_br(nfp_prog, code->br_mask, insn->off, 0);
12411272

12421273
return 0;
12431274
}
12441275

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)
12481277
{
12491278
const struct bpf_insn *insn = &meta->insn;
1279+
const struct jmp_code_map *code;
12501280
u8 areg, breg;
12511281

1282+
code = nfp_jmp_code_get(meta);
1283+
if (!code)
1284+
return -EINVAL;
1285+
12521286
areg = insn->dst_reg * 2;
12531287
breg = insn->src_reg * 2;
12541288

1255-
if (swap) {
1289+
if (code->swap) {
12561290
areg ^= breg;
12571291
breg ^= areg;
12581292
areg ^= breg;
@@ -1261,7 +1295,7 @@ wrp_cmp_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
12611295
emit_alu(nfp_prog, reg_none(), reg_a(areg), ALU_OP_SUB, reg_b(breg));
12621296
emit_alu(nfp_prog, reg_none(),
12631297
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);
12651299

12661300
return 0;
12671301
}
@@ -2283,46 +2317,6 @@ static int jeq_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
22832317
return 0;
22842318
}
22852319

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-
23262320
static int jset_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23272321
{
23282322
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)
23922386
return 0;
23932387
}
23942388

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-
24352389
static int jset_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
24362390
{
24372391
return wrp_test_reg(nfp_prog, meta, ALU_OP_AND, BR_BNE);
@@ -2520,25 +2474,25 @@ static const instr_cb_t instr_cb[256] = {
25202474
[BPF_ST | BPF_MEM | BPF_DW] = mem_st8,
25212475
[BPF_JMP | BPF_JA | BPF_K] = jump,
25222476
[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,
25312485
[BPF_JMP | BPF_JSET | BPF_K] = jset_imm,
25322486
[BPF_JMP | BPF_JNE | BPF_K] = jne_imm,
25332487
[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,
25422496
[BPF_JMP | BPF_JSET | BPF_X] = jset_reg,
25432497
[BPF_JMP | BPF_JNE | BPF_X] = jne_reg,
25442498
[BPF_JMP | BPF_CALL] = call,

0 commit comments

Comments
 (0)