1 // SPDX-License-Identifier: GPL-2.0
2 /* BPF JIT compiler for RV64G
4 * Copyright(c) 2019 Björn Töpel <bjorn.topel@gmail.com>
9 #include <linux/filter.h>
12 #define RV_REG_TCC RV_REG_A6
13 #define RV_REG_TCC_SAVED RV_REG_S6 /* Store A6 in S6 if program do calls */
15 static const int regmap
[] = {
16 [BPF_REG_0
] = RV_REG_A5
,
17 [BPF_REG_1
] = RV_REG_A0
,
18 [BPF_REG_2
] = RV_REG_A1
,
19 [BPF_REG_3
] = RV_REG_A2
,
20 [BPF_REG_4
] = RV_REG_A3
,
21 [BPF_REG_5
] = RV_REG_A4
,
22 [BPF_REG_6
] = RV_REG_S1
,
23 [BPF_REG_7
] = RV_REG_S2
,
24 [BPF_REG_8
] = RV_REG_S3
,
25 [BPF_REG_9
] = RV_REG_S4
,
26 [BPF_REG_FP
] = RV_REG_S5
,
27 [BPF_REG_AX
] = RV_REG_T0
,
31 RV_CTX_F_SEEN_TAIL_CALL
= 0,
32 RV_CTX_F_SEEN_CALL
= RV_REG_RA
,
33 RV_CTX_F_SEEN_S1
= RV_REG_S1
,
34 RV_CTX_F_SEEN_S2
= RV_REG_S2
,
35 RV_CTX_F_SEEN_S3
= RV_REG_S3
,
36 RV_CTX_F_SEEN_S4
= RV_REG_S4
,
37 RV_CTX_F_SEEN_S5
= RV_REG_S5
,
38 RV_CTX_F_SEEN_S6
= RV_REG_S6
,
41 static u8
bpf_to_rv_reg(int bpf_reg
, struct rv_jit_context
*ctx
)
43 u8 reg
= regmap
[bpf_reg
];
46 case RV_CTX_F_SEEN_S1
:
47 case RV_CTX_F_SEEN_S2
:
48 case RV_CTX_F_SEEN_S3
:
49 case RV_CTX_F_SEEN_S4
:
50 case RV_CTX_F_SEEN_S5
:
51 case RV_CTX_F_SEEN_S6
:
52 __set_bit(reg
, &ctx
->flags
);
57 static bool seen_reg(int reg
, struct rv_jit_context
*ctx
)
60 case RV_CTX_F_SEEN_CALL
:
61 case RV_CTX_F_SEEN_S1
:
62 case RV_CTX_F_SEEN_S2
:
63 case RV_CTX_F_SEEN_S3
:
64 case RV_CTX_F_SEEN_S4
:
65 case RV_CTX_F_SEEN_S5
:
66 case RV_CTX_F_SEEN_S6
:
67 return test_bit(reg
, &ctx
->flags
);
72 static void mark_fp(struct rv_jit_context
*ctx
)
74 __set_bit(RV_CTX_F_SEEN_S5
, &ctx
->flags
);
77 static void mark_call(struct rv_jit_context
*ctx
)
79 __set_bit(RV_CTX_F_SEEN_CALL
, &ctx
->flags
);
82 static bool seen_call(struct rv_jit_context
*ctx
)
84 return test_bit(RV_CTX_F_SEEN_CALL
, &ctx
->flags
);
87 static void mark_tail_call(struct rv_jit_context
*ctx
)
89 __set_bit(RV_CTX_F_SEEN_TAIL_CALL
, &ctx
->flags
);
92 static bool seen_tail_call(struct rv_jit_context
*ctx
)
94 return test_bit(RV_CTX_F_SEEN_TAIL_CALL
, &ctx
->flags
);
97 static u8
rv_tail_call_reg(struct rv_jit_context
*ctx
)
101 if (seen_call(ctx
)) {
102 __set_bit(RV_CTX_F_SEEN_S6
, &ctx
->flags
);
108 static bool is_32b_int(s64 val
)
110 return -(1L << 31) <= val
&& val
< (1L << 31);
113 static bool in_auipc_jalr_range(s64 val
)
116 * auipc+jalr can reach any signed PC-relative offset in the range
117 * [-2^31 - 2^11, 2^31 - 2^11).
119 return (-(1L << 31) - (1L << 11)) <= val
&&
120 val
< ((1L << 31) - (1L << 11));
123 static void emit_imm(u8 rd
, s64 val
, struct rv_jit_context
*ctx
)
125 /* Note that the immediate from the add is sign-extended,
126 * which means that we need to compensate this by adding 2^12,
127 * when the 12th bit is set. A simpler way of doing this, and
128 * getting rid of the check, is to just add 2**11 before the
129 * shift. The "Loading a 32-Bit constant" example from the
130 * "Computer Organization and Design, RISC-V edition" book by
131 * Patterson/Hennessy highlights this fact.
133 * This also means that we need to process LSB to MSB.
135 s64 upper
= (val
+ (1 << 11)) >> 12;
136 /* Sign-extend lower 12 bits to 64 bits since immediates for li, addiw,
137 * and addi are signed and RVC checks will perform signed comparisons.
139 s64 lower
= ((val
& 0xfff) << 52) >> 52;
142 if (is_32b_int(val
)) {
144 emit_lui(rd
, upper
, ctx
);
147 emit_li(rd
, lower
, ctx
);
151 emit_addiw(rd
, rd
, lower
, ctx
);
155 shift
= __ffs(upper
);
159 emit_imm(rd
, upper
, ctx
);
161 emit_slli(rd
, rd
, shift
, ctx
);
163 emit_addi(rd
, rd
, lower
, ctx
);
166 static void __build_epilogue(bool is_tail_call
, struct rv_jit_context
*ctx
)
168 int stack_adjust
= ctx
->stack_size
, store_offset
= stack_adjust
- 8;
170 if (seen_reg(RV_REG_RA
, ctx
)) {
171 emit_ld(RV_REG_RA
, store_offset
, RV_REG_SP
, ctx
);
174 emit_ld(RV_REG_FP
, store_offset
, RV_REG_SP
, ctx
);
176 if (seen_reg(RV_REG_S1
, ctx
)) {
177 emit_ld(RV_REG_S1
, store_offset
, RV_REG_SP
, ctx
);
180 if (seen_reg(RV_REG_S2
, ctx
)) {
181 emit_ld(RV_REG_S2
, store_offset
, RV_REG_SP
, ctx
);
184 if (seen_reg(RV_REG_S3
, ctx
)) {
185 emit_ld(RV_REG_S3
, store_offset
, RV_REG_SP
, ctx
);
188 if (seen_reg(RV_REG_S4
, ctx
)) {
189 emit_ld(RV_REG_S4
, store_offset
, RV_REG_SP
, ctx
);
192 if (seen_reg(RV_REG_S5
, ctx
)) {
193 emit_ld(RV_REG_S5
, store_offset
, RV_REG_SP
, ctx
);
196 if (seen_reg(RV_REG_S6
, ctx
)) {
197 emit_ld(RV_REG_S6
, store_offset
, RV_REG_SP
, ctx
);
201 emit_addi(RV_REG_SP
, RV_REG_SP
, stack_adjust
, ctx
);
202 /* Set return value. */
204 emit_mv(RV_REG_A0
, RV_REG_A5
, ctx
);
205 emit_jalr(RV_REG_ZERO
, is_tail_call
? RV_REG_T3
: RV_REG_RA
,
206 is_tail_call
? 4 : 0, /* skip TCC init */
210 static void emit_bcc(u8 cond
, u8 rd
, u8 rs
, int rvoff
,
211 struct rv_jit_context
*ctx
)
215 emit(rv_beq(rd
, rs
, rvoff
>> 1), ctx
);
218 emit(rv_bltu(rs
, rd
, rvoff
>> 1), ctx
);
221 emit(rv_bltu(rd
, rs
, rvoff
>> 1), ctx
);
224 emit(rv_bgeu(rd
, rs
, rvoff
>> 1), ctx
);
227 emit(rv_bgeu(rs
, rd
, rvoff
>> 1), ctx
);
230 emit(rv_bne(rd
, rs
, rvoff
>> 1), ctx
);
233 emit(rv_blt(rs
, rd
, rvoff
>> 1), ctx
);
236 emit(rv_blt(rd
, rs
, rvoff
>> 1), ctx
);
239 emit(rv_bge(rd
, rs
, rvoff
>> 1), ctx
);
242 emit(rv_bge(rs
, rd
, rvoff
>> 1), ctx
);
246 static void emit_branch(u8 cond
, u8 rd
, u8 rs
, int rvoff
,
247 struct rv_jit_context
*ctx
)
251 if (is_13b_int(rvoff
)) {
252 emit_bcc(cond
, rd
, rs
, rvoff
, ctx
);
267 cond
= invert_bpf_cond(cond
);
268 if (is_21b_int(rvoff
)) {
269 emit_bcc(cond
, rd
, rs
, 8, ctx
);
270 emit(rv_jal(RV_REG_ZERO
, rvoff
>> 1), ctx
);
274 /* 32b No need for an additional rvoff adjustment, since we
275 * get that from the auipc at PC', where PC = PC' + 4.
277 upper
= (rvoff
+ (1 << 11)) >> 12;
278 lower
= rvoff
& 0xfff;
280 emit_bcc(cond
, rd
, rs
, 12, ctx
);
281 emit(rv_auipc(RV_REG_T1
, upper
), ctx
);
282 emit(rv_jalr(RV_REG_ZERO
, RV_REG_T1
, lower
), ctx
);
285 static void emit_zext_32(u8 reg
, struct rv_jit_context
*ctx
)
287 emit_slli(reg
, reg
, 32, ctx
);
288 emit_srli(reg
, reg
, 32, ctx
);
291 static int emit_bpf_tail_call(int insn
, struct rv_jit_context
*ctx
)
293 int tc_ninsn
, off
, start_insn
= ctx
->ninsns
;
294 u8 tcc
= rv_tail_call_reg(ctx
);
300 * if (index >= array->map.max_entries)
303 tc_ninsn
= insn
? ctx
->offset
[insn
] - ctx
->offset
[insn
- 1] :
305 emit_zext_32(RV_REG_A2
, ctx
);
307 off
= offsetof(struct bpf_array
, map
.max_entries
);
308 if (is_12b_check(off
, insn
))
310 emit(rv_lwu(RV_REG_T1
, off
, RV_REG_A1
), ctx
);
311 off
= ninsns_rvoff(tc_ninsn
- (ctx
->ninsns
- start_insn
));
312 emit_branch(BPF_JGE
, RV_REG_A2
, RV_REG_T1
, off
, ctx
);
317 emit_addi(RV_REG_T1
, tcc
, -1, ctx
);
318 off
= ninsns_rvoff(tc_ninsn
- (ctx
->ninsns
- start_insn
));
319 emit_branch(BPF_JSLT
, tcc
, RV_REG_ZERO
, off
, ctx
);
321 /* prog = array->ptrs[index];
325 emit_slli(RV_REG_T2
, RV_REG_A2
, 3, ctx
);
326 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_A1
, ctx
);
327 off
= offsetof(struct bpf_array
, ptrs
);
328 if (is_12b_check(off
, insn
))
330 emit_ld(RV_REG_T2
, off
, RV_REG_T2
, ctx
);
331 off
= ninsns_rvoff(tc_ninsn
- (ctx
->ninsns
- start_insn
));
332 emit_branch(BPF_JEQ
, RV_REG_T2
, RV_REG_ZERO
, off
, ctx
);
334 /* goto *(prog->bpf_func + 4); */
335 off
= offsetof(struct bpf_prog
, bpf_func
);
336 if (is_12b_check(off
, insn
))
338 emit_ld(RV_REG_T3
, off
, RV_REG_T2
, ctx
);
339 emit_mv(RV_REG_TCC
, RV_REG_T1
, ctx
);
340 __build_epilogue(true, ctx
);
344 static void init_regs(u8
*rd
, u8
*rs
, const struct bpf_insn
*insn
,
345 struct rv_jit_context
*ctx
)
347 u8 code
= insn
->code
;
350 case BPF_JMP
| BPF_JA
:
351 case BPF_JMP
| BPF_CALL
:
352 case BPF_JMP
| BPF_EXIT
:
353 case BPF_JMP
| BPF_TAIL_CALL
:
356 *rd
= bpf_to_rv_reg(insn
->dst_reg
, ctx
);
359 if (code
& (BPF_ALU
| BPF_X
) || code
& (BPF_ALU64
| BPF_X
) ||
360 code
& (BPF_JMP
| BPF_X
) || code
& (BPF_JMP32
| BPF_X
) ||
361 code
& BPF_LDX
|| code
& BPF_STX
)
362 *rs
= bpf_to_rv_reg(insn
->src_reg
, ctx
);
365 static void emit_zext_32_rd_rs(u8
*rd
, u8
*rs
, struct rv_jit_context
*ctx
)
367 emit_mv(RV_REG_T2
, *rd
, ctx
);
368 emit_zext_32(RV_REG_T2
, ctx
);
369 emit_mv(RV_REG_T1
, *rs
, ctx
);
370 emit_zext_32(RV_REG_T1
, ctx
);
375 static void emit_sext_32_rd_rs(u8
*rd
, u8
*rs
, struct rv_jit_context
*ctx
)
377 emit_addiw(RV_REG_T2
, *rd
, 0, ctx
);
378 emit_addiw(RV_REG_T1
, *rs
, 0, ctx
);
383 static void emit_zext_32_rd_t1(u8
*rd
, struct rv_jit_context
*ctx
)
385 emit_mv(RV_REG_T2
, *rd
, ctx
);
386 emit_zext_32(RV_REG_T2
, ctx
);
387 emit_zext_32(RV_REG_T1
, ctx
);
391 static void emit_sext_32_rd(u8
*rd
, struct rv_jit_context
*ctx
)
393 emit_addiw(RV_REG_T2
, *rd
, 0, ctx
);
397 static int emit_jump_and_link(u8 rd
, s64 rvoff
, bool force_jalr
,
398 struct rv_jit_context
*ctx
)
402 if (rvoff
&& is_21b_int(rvoff
) && !force_jalr
) {
403 emit(rv_jal(rd
, rvoff
>> 1), ctx
);
405 } else if (in_auipc_jalr_range(rvoff
)) {
406 upper
= (rvoff
+ (1 << 11)) >> 12;
407 lower
= rvoff
& 0xfff;
408 emit(rv_auipc(RV_REG_T1
, upper
), ctx
);
409 emit(rv_jalr(rd
, RV_REG_T1
, lower
), ctx
);
413 pr_err("bpf-jit: target offset 0x%llx is out of range\n", rvoff
);
417 static bool is_signed_bpf_cond(u8 cond
)
419 return cond
== BPF_JSGT
|| cond
== BPF_JSLT
||
420 cond
== BPF_JSGE
|| cond
== BPF_JSLE
;
423 static int emit_call(bool fixed
, u64 addr
, struct rv_jit_context
*ctx
)
430 if (addr
&& ctx
->insns
) {
431 ip
= (u64
)(long)(ctx
->insns
+ ctx
->ninsns
);
435 ret
= emit_jump_and_link(RV_REG_RA
, off
, !fixed
, ctx
);
438 rd
= bpf_to_rv_reg(BPF_REG_0
, ctx
);
439 emit_mv(rd
, RV_REG_A0
, ctx
);
443 int bpf_jit_emit_insn(const struct bpf_insn
*insn
, struct rv_jit_context
*ctx
,
446 bool is64
= BPF_CLASS(insn
->code
) == BPF_ALU64
||
447 BPF_CLASS(insn
->code
) == BPF_JMP
;
448 int s
, e
, rvoff
, ret
, i
= insn
- ctx
->prog
->insnsi
;
449 struct bpf_prog_aux
*aux
= ctx
->prog
->aux
;
450 u8 rd
= -1, rs
= -1, code
= insn
->code
;
454 init_regs(&rd
, &rs
, insn
, ctx
);
458 case BPF_ALU
| BPF_MOV
| BPF_X
:
459 case BPF_ALU64
| BPF_MOV
| BPF_X
:
461 /* Special mov32 for zext */
462 emit_zext_32(rd
, ctx
);
465 emit_mv(rd
, rs
, ctx
);
466 if (!is64
&& !aux
->verifier_zext
)
467 emit_zext_32(rd
, ctx
);
470 /* dst = dst OP src */
471 case BPF_ALU
| BPF_ADD
| BPF_X
:
472 case BPF_ALU64
| BPF_ADD
| BPF_X
:
473 emit_add(rd
, rd
, rs
, ctx
);
474 if (!is64
&& !aux
->verifier_zext
)
475 emit_zext_32(rd
, ctx
);
477 case BPF_ALU
| BPF_SUB
| BPF_X
:
478 case BPF_ALU64
| BPF_SUB
| BPF_X
:
480 emit_sub(rd
, rd
, rs
, ctx
);
482 emit_subw(rd
, rd
, rs
, ctx
);
484 if (!is64
&& !aux
->verifier_zext
)
485 emit_zext_32(rd
, ctx
);
487 case BPF_ALU
| BPF_AND
| BPF_X
:
488 case BPF_ALU64
| BPF_AND
| BPF_X
:
489 emit_and(rd
, rd
, rs
, ctx
);
490 if (!is64
&& !aux
->verifier_zext
)
491 emit_zext_32(rd
, ctx
);
493 case BPF_ALU
| BPF_OR
| BPF_X
:
494 case BPF_ALU64
| BPF_OR
| BPF_X
:
495 emit_or(rd
, rd
, rs
, ctx
);
496 if (!is64
&& !aux
->verifier_zext
)
497 emit_zext_32(rd
, ctx
);
499 case BPF_ALU
| BPF_XOR
| BPF_X
:
500 case BPF_ALU64
| BPF_XOR
| BPF_X
:
501 emit_xor(rd
, rd
, rs
, ctx
);
502 if (!is64
&& !aux
->verifier_zext
)
503 emit_zext_32(rd
, ctx
);
505 case BPF_ALU
| BPF_MUL
| BPF_X
:
506 case BPF_ALU64
| BPF_MUL
| BPF_X
:
507 emit(is64
? rv_mul(rd
, rd
, rs
) : rv_mulw(rd
, rd
, rs
), ctx
);
508 if (!is64
&& !aux
->verifier_zext
)
509 emit_zext_32(rd
, ctx
);
511 case BPF_ALU
| BPF_DIV
| BPF_X
:
512 case BPF_ALU64
| BPF_DIV
| BPF_X
:
513 emit(is64
? rv_divu(rd
, rd
, rs
) : rv_divuw(rd
, rd
, rs
), ctx
);
514 if (!is64
&& !aux
->verifier_zext
)
515 emit_zext_32(rd
, ctx
);
517 case BPF_ALU
| BPF_MOD
| BPF_X
:
518 case BPF_ALU64
| BPF_MOD
| BPF_X
:
519 emit(is64
? rv_remu(rd
, rd
, rs
) : rv_remuw(rd
, rd
, rs
), ctx
);
520 if (!is64
&& !aux
->verifier_zext
)
521 emit_zext_32(rd
, ctx
);
523 case BPF_ALU
| BPF_LSH
| BPF_X
:
524 case BPF_ALU64
| BPF_LSH
| BPF_X
:
525 emit(is64
? rv_sll(rd
, rd
, rs
) : rv_sllw(rd
, rd
, rs
), ctx
);
526 if (!is64
&& !aux
->verifier_zext
)
527 emit_zext_32(rd
, ctx
);
529 case BPF_ALU
| BPF_RSH
| BPF_X
:
530 case BPF_ALU64
| BPF_RSH
| BPF_X
:
531 emit(is64
? rv_srl(rd
, rd
, rs
) : rv_srlw(rd
, rd
, rs
), ctx
);
532 if (!is64
&& !aux
->verifier_zext
)
533 emit_zext_32(rd
, ctx
);
535 case BPF_ALU
| BPF_ARSH
| BPF_X
:
536 case BPF_ALU64
| BPF_ARSH
| BPF_X
:
537 emit(is64
? rv_sra(rd
, rd
, rs
) : rv_sraw(rd
, rd
, rs
), ctx
);
538 if (!is64
&& !aux
->verifier_zext
)
539 emit_zext_32(rd
, ctx
);
543 case BPF_ALU
| BPF_NEG
:
544 case BPF_ALU64
| BPF_NEG
:
545 emit_sub(rd
, RV_REG_ZERO
, rd
, ctx
);
546 if (!is64
&& !aux
->verifier_zext
)
547 emit_zext_32(rd
, ctx
);
550 /* dst = BSWAP##imm(dst) */
551 case BPF_ALU
| BPF_END
| BPF_FROM_LE
:
554 emit_slli(rd
, rd
, 48, ctx
);
555 emit_srli(rd
, rd
, 48, ctx
);
558 if (!aux
->verifier_zext
)
559 emit_zext_32(rd
, ctx
);
567 case BPF_ALU
| BPF_END
| BPF_FROM_BE
:
568 emit_li(RV_REG_T2
, 0, ctx
);
570 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
571 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
572 emit_slli(RV_REG_T2
, RV_REG_T2
, 8, ctx
);
573 emit_srli(rd
, rd
, 8, ctx
);
577 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
578 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
579 emit_slli(RV_REG_T2
, RV_REG_T2
, 8, ctx
);
580 emit_srli(rd
, rd
, 8, ctx
);
582 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
583 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
584 emit_slli(RV_REG_T2
, RV_REG_T2
, 8, ctx
);
585 emit_srli(rd
, rd
, 8, ctx
);
589 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
590 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
591 emit_slli(RV_REG_T2
, RV_REG_T2
, 8, ctx
);
592 emit_srli(rd
, rd
, 8, ctx
);
594 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
595 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
596 emit_slli(RV_REG_T2
, RV_REG_T2
, 8, ctx
);
597 emit_srli(rd
, rd
, 8, ctx
);
599 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
600 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
601 emit_slli(RV_REG_T2
, RV_REG_T2
, 8, ctx
);
602 emit_srli(rd
, rd
, 8, ctx
);
604 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
605 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
606 emit_slli(RV_REG_T2
, RV_REG_T2
, 8, ctx
);
607 emit_srli(rd
, rd
, 8, ctx
);
609 emit_andi(RV_REG_T1
, rd
, 0xff, ctx
);
610 emit_add(RV_REG_T2
, RV_REG_T2
, RV_REG_T1
, ctx
);
612 emit_mv(rd
, RV_REG_T2
, ctx
);
616 case BPF_ALU
| BPF_MOV
| BPF_K
:
617 case BPF_ALU64
| BPF_MOV
| BPF_K
:
618 emit_imm(rd
, imm
, ctx
);
619 if (!is64
&& !aux
->verifier_zext
)
620 emit_zext_32(rd
, ctx
);
623 /* dst = dst OP imm */
624 case BPF_ALU
| BPF_ADD
| BPF_K
:
625 case BPF_ALU64
| BPF_ADD
| BPF_K
:
626 if (is_12b_int(imm
)) {
627 emit_addi(rd
, rd
, imm
, ctx
);
629 emit_imm(RV_REG_T1
, imm
, ctx
);
630 emit_add(rd
, rd
, RV_REG_T1
, ctx
);
632 if (!is64
&& !aux
->verifier_zext
)
633 emit_zext_32(rd
, ctx
);
635 case BPF_ALU
| BPF_SUB
| BPF_K
:
636 case BPF_ALU64
| BPF_SUB
| BPF_K
:
637 if (is_12b_int(-imm
)) {
638 emit_addi(rd
, rd
, -imm
, ctx
);
640 emit_imm(RV_REG_T1
, imm
, ctx
);
641 emit_sub(rd
, rd
, RV_REG_T1
, ctx
);
643 if (!is64
&& !aux
->verifier_zext
)
644 emit_zext_32(rd
, ctx
);
646 case BPF_ALU
| BPF_AND
| BPF_K
:
647 case BPF_ALU64
| BPF_AND
| BPF_K
:
648 if (is_12b_int(imm
)) {
649 emit_andi(rd
, rd
, imm
, ctx
);
651 emit_imm(RV_REG_T1
, imm
, ctx
);
652 emit_and(rd
, rd
, RV_REG_T1
, ctx
);
654 if (!is64
&& !aux
->verifier_zext
)
655 emit_zext_32(rd
, ctx
);
657 case BPF_ALU
| BPF_OR
| BPF_K
:
658 case BPF_ALU64
| BPF_OR
| BPF_K
:
659 if (is_12b_int(imm
)) {
660 emit(rv_ori(rd
, rd
, imm
), ctx
);
662 emit_imm(RV_REG_T1
, imm
, ctx
);
663 emit_or(rd
, rd
, RV_REG_T1
, ctx
);
665 if (!is64
&& !aux
->verifier_zext
)
666 emit_zext_32(rd
, ctx
);
668 case BPF_ALU
| BPF_XOR
| BPF_K
:
669 case BPF_ALU64
| BPF_XOR
| BPF_K
:
670 if (is_12b_int(imm
)) {
671 emit(rv_xori(rd
, rd
, imm
), ctx
);
673 emit_imm(RV_REG_T1
, imm
, ctx
);
674 emit_xor(rd
, rd
, RV_REG_T1
, ctx
);
676 if (!is64
&& !aux
->verifier_zext
)
677 emit_zext_32(rd
, ctx
);
679 case BPF_ALU
| BPF_MUL
| BPF_K
:
680 case BPF_ALU64
| BPF_MUL
| BPF_K
:
681 emit_imm(RV_REG_T1
, imm
, ctx
);
682 emit(is64
? rv_mul(rd
, rd
, RV_REG_T1
) :
683 rv_mulw(rd
, rd
, RV_REG_T1
), ctx
);
684 if (!is64
&& !aux
->verifier_zext
)
685 emit_zext_32(rd
, ctx
);
687 case BPF_ALU
| BPF_DIV
| BPF_K
:
688 case BPF_ALU64
| BPF_DIV
| BPF_K
:
689 emit_imm(RV_REG_T1
, imm
, ctx
);
690 emit(is64
? rv_divu(rd
, rd
, RV_REG_T1
) :
691 rv_divuw(rd
, rd
, RV_REG_T1
), ctx
);
692 if (!is64
&& !aux
->verifier_zext
)
693 emit_zext_32(rd
, ctx
);
695 case BPF_ALU
| BPF_MOD
| BPF_K
:
696 case BPF_ALU64
| BPF_MOD
| BPF_K
:
697 emit_imm(RV_REG_T1
, imm
, ctx
);
698 emit(is64
? rv_remu(rd
, rd
, RV_REG_T1
) :
699 rv_remuw(rd
, rd
, RV_REG_T1
), ctx
);
700 if (!is64
&& !aux
->verifier_zext
)
701 emit_zext_32(rd
, ctx
);
703 case BPF_ALU
| BPF_LSH
| BPF_K
:
704 case BPF_ALU64
| BPF_LSH
| BPF_K
:
705 emit_slli(rd
, rd
, imm
, ctx
);
707 if (!is64
&& !aux
->verifier_zext
)
708 emit_zext_32(rd
, ctx
);
710 case BPF_ALU
| BPF_RSH
| BPF_K
:
711 case BPF_ALU64
| BPF_RSH
| BPF_K
:
713 emit_srli(rd
, rd
, imm
, ctx
);
715 emit(rv_srliw(rd
, rd
, imm
), ctx
);
717 if (!is64
&& !aux
->verifier_zext
)
718 emit_zext_32(rd
, ctx
);
720 case BPF_ALU
| BPF_ARSH
| BPF_K
:
721 case BPF_ALU64
| BPF_ARSH
| BPF_K
:
723 emit_srai(rd
, rd
, imm
, ctx
);
725 emit(rv_sraiw(rd
, rd
, imm
), ctx
);
727 if (!is64
&& !aux
->verifier_zext
)
728 emit_zext_32(rd
, ctx
);
732 case BPF_JMP
| BPF_JA
:
733 rvoff
= rv_offset(i
, off
, ctx
);
734 ret
= emit_jump_and_link(RV_REG_ZERO
, rvoff
, false, ctx
);
739 /* IF (dst COND src) JUMP off */
740 case BPF_JMP
| BPF_JEQ
| BPF_X
:
741 case BPF_JMP32
| BPF_JEQ
| BPF_X
:
742 case BPF_JMP
| BPF_JGT
| BPF_X
:
743 case BPF_JMP32
| BPF_JGT
| BPF_X
:
744 case BPF_JMP
| BPF_JLT
| BPF_X
:
745 case BPF_JMP32
| BPF_JLT
| BPF_X
:
746 case BPF_JMP
| BPF_JGE
| BPF_X
:
747 case BPF_JMP32
| BPF_JGE
| BPF_X
:
748 case BPF_JMP
| BPF_JLE
| BPF_X
:
749 case BPF_JMP32
| BPF_JLE
| BPF_X
:
750 case BPF_JMP
| BPF_JNE
| BPF_X
:
751 case BPF_JMP32
| BPF_JNE
| BPF_X
:
752 case BPF_JMP
| BPF_JSGT
| BPF_X
:
753 case BPF_JMP32
| BPF_JSGT
| BPF_X
:
754 case BPF_JMP
| BPF_JSLT
| BPF_X
:
755 case BPF_JMP32
| BPF_JSLT
| BPF_X
:
756 case BPF_JMP
| BPF_JSGE
| BPF_X
:
757 case BPF_JMP32
| BPF_JSGE
| BPF_X
:
758 case BPF_JMP
| BPF_JSLE
| BPF_X
:
759 case BPF_JMP32
| BPF_JSLE
| BPF_X
:
760 case BPF_JMP
| BPF_JSET
| BPF_X
:
761 case BPF_JMP32
| BPF_JSET
| BPF_X
:
762 rvoff
= rv_offset(i
, off
, ctx
);
765 if (is_signed_bpf_cond(BPF_OP(code
)))
766 emit_sext_32_rd_rs(&rd
, &rs
, ctx
);
768 emit_zext_32_rd_rs(&rd
, &rs
, ctx
);
771 /* Adjust for extra insns */
772 rvoff
-= ninsns_rvoff(e
- s
);
775 if (BPF_OP(code
) == BPF_JSET
) {
778 emit_and(RV_REG_T1
, rd
, rs
, ctx
);
779 emit_branch(BPF_JNE
, RV_REG_T1
, RV_REG_ZERO
, rvoff
,
782 emit_branch(BPF_OP(code
), rd
, rs
, rvoff
, ctx
);
786 /* IF (dst COND imm) JUMP off */
787 case BPF_JMP
| BPF_JEQ
| BPF_K
:
788 case BPF_JMP32
| BPF_JEQ
| BPF_K
:
789 case BPF_JMP
| BPF_JGT
| BPF_K
:
790 case BPF_JMP32
| BPF_JGT
| BPF_K
:
791 case BPF_JMP
| BPF_JLT
| BPF_K
:
792 case BPF_JMP32
| BPF_JLT
| BPF_K
:
793 case BPF_JMP
| BPF_JGE
| BPF_K
:
794 case BPF_JMP32
| BPF_JGE
| BPF_K
:
795 case BPF_JMP
| BPF_JLE
| BPF_K
:
796 case BPF_JMP32
| BPF_JLE
| BPF_K
:
797 case BPF_JMP
| BPF_JNE
| BPF_K
:
798 case BPF_JMP32
| BPF_JNE
| BPF_K
:
799 case BPF_JMP
| BPF_JSGT
| BPF_K
:
800 case BPF_JMP32
| BPF_JSGT
| BPF_K
:
801 case BPF_JMP
| BPF_JSLT
| BPF_K
:
802 case BPF_JMP32
| BPF_JSLT
| BPF_K
:
803 case BPF_JMP
| BPF_JSGE
| BPF_K
:
804 case BPF_JMP32
| BPF_JSGE
| BPF_K
:
805 case BPF_JMP
| BPF_JSLE
| BPF_K
:
806 case BPF_JMP32
| BPF_JSLE
| BPF_K
:
807 rvoff
= rv_offset(i
, off
, ctx
);
810 emit_imm(RV_REG_T1
, imm
, ctx
);
813 /* If imm is 0, simply use zero register. */
817 if (is_signed_bpf_cond(BPF_OP(code
)))
818 emit_sext_32_rd(&rd
, ctx
);
820 emit_zext_32_rd_t1(&rd
, ctx
);
824 /* Adjust for extra insns */
825 rvoff
-= ninsns_rvoff(e
- s
);
826 emit_branch(BPF_OP(code
), rd
, rs
, rvoff
, ctx
);
829 case BPF_JMP
| BPF_JSET
| BPF_K
:
830 case BPF_JMP32
| BPF_JSET
| BPF_K
:
831 rvoff
= rv_offset(i
, off
, ctx
);
833 if (is_12b_int(imm
)) {
834 emit_andi(RV_REG_T1
, rd
, imm
, ctx
);
836 emit_imm(RV_REG_T1
, imm
, ctx
);
837 emit_and(RV_REG_T1
, rd
, RV_REG_T1
, ctx
);
839 /* For jset32, we should clear the upper 32 bits of t1, but
840 * sign-extension is sufficient here and saves one instruction,
841 * as t1 is used only in comparison against zero.
843 if (!is64
&& imm
< 0)
844 emit_addiw(RV_REG_T1
, RV_REG_T1
, 0, ctx
);
846 rvoff
-= ninsns_rvoff(e
- s
);
847 emit_branch(BPF_JNE
, RV_REG_T1
, RV_REG_ZERO
, rvoff
, ctx
);
851 case BPF_JMP
| BPF_CALL
:
857 ret
= bpf_jit_get_func_addr(ctx
->prog
, insn
, extra_pass
, &addr
,
861 ret
= emit_call(fixed
, addr
, ctx
);
867 case BPF_JMP
| BPF_TAIL_CALL
:
868 if (emit_bpf_tail_call(i
, ctx
))
872 /* function return */
873 case BPF_JMP
| BPF_EXIT
:
874 if (i
== ctx
->prog
->len
- 1)
877 rvoff
= epilogue_offset(ctx
);
878 ret
= emit_jump_and_link(RV_REG_ZERO
, rvoff
, false, ctx
);
884 case BPF_LD
| BPF_IMM
| BPF_DW
:
886 struct bpf_insn insn1
= insn
[1];
889 imm64
= (u64
)insn1
.imm
<< 32 | (u32
)imm
;
890 emit_imm(rd
, imm64
, ctx
);
894 /* LDX: dst = *(size *)(src + off) */
895 case BPF_LDX
| BPF_MEM
| BPF_B
:
896 if (is_12b_int(off
)) {
897 emit(rv_lbu(rd
, off
, rs
), ctx
);
901 emit_imm(RV_REG_T1
, off
, ctx
);
902 emit_add(RV_REG_T1
, RV_REG_T1
, rs
, ctx
);
903 emit(rv_lbu(rd
, 0, RV_REG_T1
), ctx
);
904 if (insn_is_zext(&insn
[1]))
907 case BPF_LDX
| BPF_MEM
| BPF_H
:
908 if (is_12b_int(off
)) {
909 emit(rv_lhu(rd
, off
, rs
), ctx
);
913 emit_imm(RV_REG_T1
, off
, ctx
);
914 emit_add(RV_REG_T1
, RV_REG_T1
, rs
, ctx
);
915 emit(rv_lhu(rd
, 0, RV_REG_T1
), ctx
);
916 if (insn_is_zext(&insn
[1]))
919 case BPF_LDX
| BPF_MEM
| BPF_W
:
920 if (is_12b_int(off
)) {
921 emit(rv_lwu(rd
, off
, rs
), ctx
);
925 emit_imm(RV_REG_T1
, off
, ctx
);
926 emit_add(RV_REG_T1
, RV_REG_T1
, rs
, ctx
);
927 emit(rv_lwu(rd
, 0, RV_REG_T1
), ctx
);
928 if (insn_is_zext(&insn
[1]))
931 case BPF_LDX
| BPF_MEM
| BPF_DW
:
932 if (is_12b_int(off
)) {
933 emit_ld(rd
, off
, rs
, ctx
);
937 emit_imm(RV_REG_T1
, off
, ctx
);
938 emit_add(RV_REG_T1
, RV_REG_T1
, rs
, ctx
);
939 emit_ld(rd
, 0, RV_REG_T1
, ctx
);
942 /* ST: *(size *)(dst + off) = imm */
943 case BPF_ST
| BPF_MEM
| BPF_B
:
944 emit_imm(RV_REG_T1
, imm
, ctx
);
945 if (is_12b_int(off
)) {
946 emit(rv_sb(rd
, off
, RV_REG_T1
), ctx
);
950 emit_imm(RV_REG_T2
, off
, ctx
);
951 emit_add(RV_REG_T2
, RV_REG_T2
, rd
, ctx
);
952 emit(rv_sb(RV_REG_T2
, 0, RV_REG_T1
), ctx
);
955 case BPF_ST
| BPF_MEM
| BPF_H
:
956 emit_imm(RV_REG_T1
, imm
, ctx
);
957 if (is_12b_int(off
)) {
958 emit(rv_sh(rd
, off
, RV_REG_T1
), ctx
);
962 emit_imm(RV_REG_T2
, off
, ctx
);
963 emit_add(RV_REG_T2
, RV_REG_T2
, rd
, ctx
);
964 emit(rv_sh(RV_REG_T2
, 0, RV_REG_T1
), ctx
);
966 case BPF_ST
| BPF_MEM
| BPF_W
:
967 emit_imm(RV_REG_T1
, imm
, ctx
);
968 if (is_12b_int(off
)) {
969 emit_sw(rd
, off
, RV_REG_T1
, ctx
);
973 emit_imm(RV_REG_T2
, off
, ctx
);
974 emit_add(RV_REG_T2
, RV_REG_T2
, rd
, ctx
);
975 emit_sw(RV_REG_T2
, 0, RV_REG_T1
, ctx
);
977 case BPF_ST
| BPF_MEM
| BPF_DW
:
978 emit_imm(RV_REG_T1
, imm
, ctx
);
979 if (is_12b_int(off
)) {
980 emit_sd(rd
, off
, RV_REG_T1
, ctx
);
984 emit_imm(RV_REG_T2
, off
, ctx
);
985 emit_add(RV_REG_T2
, RV_REG_T2
, rd
, ctx
);
986 emit_sd(RV_REG_T2
, 0, RV_REG_T1
, ctx
);
989 /* STX: *(size *)(dst + off) = src */
990 case BPF_STX
| BPF_MEM
| BPF_B
:
991 if (is_12b_int(off
)) {
992 emit(rv_sb(rd
, off
, rs
), ctx
);
996 emit_imm(RV_REG_T1
, off
, ctx
);
997 emit_add(RV_REG_T1
, RV_REG_T1
, rd
, ctx
);
998 emit(rv_sb(RV_REG_T1
, 0, rs
), ctx
);
1000 case BPF_STX
| BPF_MEM
| BPF_H
:
1001 if (is_12b_int(off
)) {
1002 emit(rv_sh(rd
, off
, rs
), ctx
);
1006 emit_imm(RV_REG_T1
, off
, ctx
);
1007 emit_add(RV_REG_T1
, RV_REG_T1
, rd
, ctx
);
1008 emit(rv_sh(RV_REG_T1
, 0, rs
), ctx
);
1010 case BPF_STX
| BPF_MEM
| BPF_W
:
1011 if (is_12b_int(off
)) {
1012 emit_sw(rd
, off
, rs
, ctx
);
1016 emit_imm(RV_REG_T1
, off
, ctx
);
1017 emit_add(RV_REG_T1
, RV_REG_T1
, rd
, ctx
);
1018 emit_sw(RV_REG_T1
, 0, rs
, ctx
);
1020 case BPF_STX
| BPF_MEM
| BPF_DW
:
1021 if (is_12b_int(off
)) {
1022 emit_sd(rd
, off
, rs
, ctx
);
1026 emit_imm(RV_REG_T1
, off
, ctx
);
1027 emit_add(RV_REG_T1
, RV_REG_T1
, rd
, ctx
);
1028 emit_sd(RV_REG_T1
, 0, rs
, ctx
);
1030 /* STX XADD: lock *(u32 *)(dst + off) += src */
1031 case BPF_STX
| BPF_XADD
| BPF_W
:
1032 /* STX XADD: lock *(u64 *)(dst + off) += src */
1033 case BPF_STX
| BPF_XADD
| BPF_DW
:
1035 if (is_12b_int(off
)) {
1036 emit_addi(RV_REG_T1
, rd
, off
, ctx
);
1038 emit_imm(RV_REG_T1
, off
, ctx
);
1039 emit_add(RV_REG_T1
, RV_REG_T1
, rd
, ctx
);
1045 emit(BPF_SIZE(code
) == BPF_W
?
1046 rv_amoadd_w(RV_REG_ZERO
, rs
, rd
, 0, 0) :
1047 rv_amoadd_d(RV_REG_ZERO
, rs
, rd
, 0, 0), ctx
);
1050 pr_err("bpf-jit: unknown opcode %02x\n", code
);
1057 void bpf_jit_build_prologue(struct rv_jit_context
*ctx
)
1059 int stack_adjust
= 0, store_offset
, bpf_stack_adjust
;
1061 bpf_stack_adjust
= round_up(ctx
->prog
->aux
->stack_depth
, 16);
1062 if (bpf_stack_adjust
)
1065 if (seen_reg(RV_REG_RA
, ctx
))
1067 stack_adjust
+= 8; /* RV_REG_FP */
1068 if (seen_reg(RV_REG_S1
, ctx
))
1070 if (seen_reg(RV_REG_S2
, ctx
))
1072 if (seen_reg(RV_REG_S3
, ctx
))
1074 if (seen_reg(RV_REG_S4
, ctx
))
1076 if (seen_reg(RV_REG_S5
, ctx
))
1078 if (seen_reg(RV_REG_S6
, ctx
))
1081 stack_adjust
= round_up(stack_adjust
, 16);
1082 stack_adjust
+= bpf_stack_adjust
;
1084 store_offset
= stack_adjust
- 8;
1086 /* First instruction is always setting the tail-call-counter
1087 * (TCC) register. This instruction is skipped for tail calls.
1088 * Force using a 4-byte (non-compressed) instruction.
1090 emit(rv_addi(RV_REG_TCC
, RV_REG_ZERO
, MAX_TAIL_CALL_CNT
), ctx
);
1092 emit_addi(RV_REG_SP
, RV_REG_SP
, -stack_adjust
, ctx
);
1094 if (seen_reg(RV_REG_RA
, ctx
)) {
1095 emit_sd(RV_REG_SP
, store_offset
, RV_REG_RA
, ctx
);
1098 emit_sd(RV_REG_SP
, store_offset
, RV_REG_FP
, ctx
);
1100 if (seen_reg(RV_REG_S1
, ctx
)) {
1101 emit_sd(RV_REG_SP
, store_offset
, RV_REG_S1
, ctx
);
1104 if (seen_reg(RV_REG_S2
, ctx
)) {
1105 emit_sd(RV_REG_SP
, store_offset
, RV_REG_S2
, ctx
);
1108 if (seen_reg(RV_REG_S3
, ctx
)) {
1109 emit_sd(RV_REG_SP
, store_offset
, RV_REG_S3
, ctx
);
1112 if (seen_reg(RV_REG_S4
, ctx
)) {
1113 emit_sd(RV_REG_SP
, store_offset
, RV_REG_S4
, ctx
);
1116 if (seen_reg(RV_REG_S5
, ctx
)) {
1117 emit_sd(RV_REG_SP
, store_offset
, RV_REG_S5
, ctx
);
1120 if (seen_reg(RV_REG_S6
, ctx
)) {
1121 emit_sd(RV_REG_SP
, store_offset
, RV_REG_S6
, ctx
);
1125 emit_addi(RV_REG_FP
, RV_REG_SP
, stack_adjust
, ctx
);
1127 if (bpf_stack_adjust
)
1128 emit_addi(RV_REG_S5
, RV_REG_SP
, bpf_stack_adjust
, ctx
);
1130 /* Program contains calls and tail calls, so RV_REG_TCC need
1131 * to be saved across calls.
1133 if (seen_tail_call(ctx
) && seen_call(ctx
))
1134 emit_mv(RV_REG_TCC_SAVED
, RV_REG_TCC
, ctx
);
1136 ctx
->stack_size
= stack_adjust
;
1139 void bpf_jit_build_epilogue(struct rv_jit_context
*ctx
)
1141 __build_epilogue(false, ctx
);
1144 void *bpf_jit_alloc_exec(unsigned long size
)
1146 return __vmalloc_node_range(size
, PAGE_SIZE
, BPF_JIT_REGION_START
,
1147 BPF_JIT_REGION_END
, GFP_KERNEL
,
1148 PAGE_KERNEL_EXEC
, 0, NUMA_NO_NODE
,
1149 __builtin_return_address(0));
1152 void bpf_jit_free_exec(void *addr
)