Skip to content

Commit 3e18ff4

Browse files
Pu LehuiAlexei Starovoitov
authored andcommitted
riscv, bpf: Support signed div/mod insns
Add support signed div/mod instructions for RV64. Signed-off-by: Pu Lehui <pulehui@huawei.com> Acked-by: Björn Töpel <bjorn@kernel.org> Link: https://lore.kernel.org/r/20230824095001.3408573-6-pulehui@huaweicloud.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent d9839f1 commit 3e18ff4

File tree

2 files changed

+40
-6
lines changed

2 files changed

+40
-6
lines changed

arch/riscv/net/bpf_jit.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,11 +431,21 @@ static inline u32 rv_mulhu(u8 rd, u8 rs1, u8 rs2)
431431
return rv_r_insn(1, rs2, rs1, 3, rd, 0x33);
432432
}
433433

434+
static inline u32 rv_div(u8 rd, u8 rs1, u8 rs2)
435+
{
436+
return rv_r_insn(1, rs2, rs1, 4, rd, 0x33);
437+
}
438+
434439
static inline u32 rv_divu(u8 rd, u8 rs1, u8 rs2)
435440
{
436441
return rv_r_insn(1, rs2, rs1, 5, rd, 0x33);
437442
}
438443

444+
static inline u32 rv_rem(u8 rd, u8 rs1, u8 rs2)
445+
{
446+
return rv_r_insn(1, rs2, rs1, 6, rd, 0x33);
447+
}
448+
439449
static inline u32 rv_remu(u8 rd, u8 rs1, u8 rs2)
440450
{
441451
return rv_r_insn(1, rs2, rs1, 7, rd, 0x33);
@@ -776,11 +786,21 @@ static inline u32 rv_mulw(u8 rd, u8 rs1, u8 rs2)
776786
return rv_r_insn(1, rs2, rs1, 0, rd, 0x3b);
777787
}
778788

789+
static inline u32 rv_divw(u8 rd, u8 rs1, u8 rs2)
790+
{
791+
return rv_r_insn(1, rs2, rs1, 4, rd, 0x3b);
792+
}
793+
779794
static inline u32 rv_divuw(u8 rd, u8 rs1, u8 rs2)
780795
{
781796
return rv_r_insn(1, rs2, rs1, 5, rd, 0x3b);
782797
}
783798

799+
static inline u32 rv_remw(u8 rd, u8 rs1, u8 rs2)
800+
{
801+
return rv_r_insn(1, rs2, rs1, 6, rd, 0x3b);
802+
}
803+
784804
static inline u32 rv_remuw(u8 rd, u8 rs1, u8 rs2)
785805
{
786806
return rv_r_insn(1, rs2, rs1, 7, rd, 0x3b);

arch/riscv/net/bpf_jit_comp64.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,13 +1107,19 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
11071107
break;
11081108
case BPF_ALU | BPF_DIV | BPF_X:
11091109
case BPF_ALU64 | BPF_DIV | BPF_X:
1110-
emit(is64 ? rv_divu(rd, rd, rs) : rv_divuw(rd, rd, rs), ctx);
1110+
if (off)
1111+
emit(is64 ? rv_div(rd, rd, rs) : rv_divw(rd, rd, rs), ctx);
1112+
else
1113+
emit(is64 ? rv_divu(rd, rd, rs) : rv_divuw(rd, rd, rs), ctx);
11111114
if (!is64 && !aux->verifier_zext)
11121115
emit_zext_32(rd, ctx);
11131116
break;
11141117
case BPF_ALU | BPF_MOD | BPF_X:
11151118
case BPF_ALU64 | BPF_MOD | BPF_X:
1116-
emit(is64 ? rv_remu(rd, rd, rs) : rv_remuw(rd, rd, rs), ctx);
1119+
if (off)
1120+
emit(is64 ? rv_rem(rd, rd, rs) : rv_remw(rd, rd, rs), ctx);
1121+
else
1122+
emit(is64 ? rv_remu(rd, rd, rs) : rv_remuw(rd, rd, rs), ctx);
11171123
if (!is64 && !aux->verifier_zext)
11181124
emit_zext_32(rd, ctx);
11191125
break;
@@ -1284,16 +1290,24 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
12841290
case BPF_ALU | BPF_DIV | BPF_K:
12851291
case BPF_ALU64 | BPF_DIV | BPF_K:
12861292
emit_imm(RV_REG_T1, imm, ctx);
1287-
emit(is64 ? rv_divu(rd, rd, RV_REG_T1) :
1288-
rv_divuw(rd, rd, RV_REG_T1), ctx);
1293+
if (off)
1294+
emit(is64 ? rv_div(rd, rd, RV_REG_T1) :
1295+
rv_divw(rd, rd, RV_REG_T1), ctx);
1296+
else
1297+
emit(is64 ? rv_divu(rd, rd, RV_REG_T1) :
1298+
rv_divuw(rd, rd, RV_REG_T1), ctx);
12891299
if (!is64 && !aux->verifier_zext)
12901300
emit_zext_32(rd, ctx);
12911301
break;
12921302
case BPF_ALU | BPF_MOD | BPF_K:
12931303
case BPF_ALU64 | BPF_MOD | BPF_K:
12941304
emit_imm(RV_REG_T1, imm, ctx);
1295-
emit(is64 ? rv_remu(rd, rd, RV_REG_T1) :
1296-
rv_remuw(rd, rd, RV_REG_T1), ctx);
1305+
if (off)
1306+
emit(is64 ? rv_rem(rd, rd, RV_REG_T1) :
1307+
rv_remw(rd, rd, RV_REG_T1), ctx);
1308+
else
1309+
emit(is64 ? rv_remu(rd, rd, RV_REG_T1) :
1310+
rv_remuw(rd, rd, RV_REG_T1), ctx);
12971311
if (!is64 && !aux->verifier_zext)
12981312
emit_zext_32(rd, ctx);
12991313
break;

0 commit comments

Comments
 (0)