1 // SPDX-License-Identifier: GPL-2.0
3 * BPF JIT compiler for RV32G
5 * Copyright (c) 2020 Luke Nelson <luke.r.nels@gmail.com>
6 * Copyright (c) 2020 Xi Wang <xi.wang@gmail.com>
8 * The code is based on the BPF JIT compiler for RV64G by Björn Töpel and
9 * the BPF JIT compiler for 32-bit ARM by Shubham Bansal and Mircea Gherzan.
12 #include <linux/bpf.h>
13 #include <linux/filter.h>
17 * Stack layout during BPF program execution:
20 * RV32 fp => +----------+
22 * | saved fp | RV32 callee-saved registers
24 * +----------+ <= (fp - 4 * NR_SAVED_REGISTERS)
27 * | hi(R7) | JIT scratch space for BPF registers
30 * BPF_REG_FP => +----------+ <= (fp - 4 * NR_SAVED_REGISTERS
31 * | | - 4 * BPF_JIT_SCRATCH_REGS)
33 * | ... | BPF program stack
35 * RV32 sp => +----------+
37 * | ... | Function call stack
44 /* Stack layout - these are offsets from top of JIT scratch space. */
55 /* Stack space for BPF_REG_6 through BPF_REG_9 and BPF_REG_AX. */
59 /* Number of callee-saved registers stored to stack: ra, fp, s1--s7. */
60 #define NR_SAVED_REGISTERS 9
62 /* Offset from fp for BPF registers stored on stack. */
63 #define STACK_OFFSET(k) (-4 - (4 * NR_SAVED_REGISTERS) - (4 * (k)))
65 #define TMP_REG_1 (MAX_BPF_JIT_REG + 0)
66 #define TMP_REG_2 (MAX_BPF_JIT_REG + 1)
68 #define RV_REG_TCC RV_REG_T6
69 #define RV_REG_TCC_SAVED RV_REG_S7
71 static const s8 bpf2rv32
[][2] = {
72 /* Return value from in-kernel function, and exit value from eBPF. */
73 [BPF_REG_0
] = {RV_REG_S2
, RV_REG_S1
},
74 /* Arguments from eBPF program to in-kernel function. */
75 [BPF_REG_1
] = {RV_REG_A1
, RV_REG_A0
},
76 [BPF_REG_2
] = {RV_REG_A3
, RV_REG_A2
},
77 [BPF_REG_3
] = {RV_REG_A5
, RV_REG_A4
},
78 [BPF_REG_4
] = {RV_REG_A7
, RV_REG_A6
},
79 [BPF_REG_5
] = {RV_REG_S4
, RV_REG_S3
},
81 * Callee-saved registers that in-kernel function will preserve.
82 * Stored on the stack.
84 [BPF_REG_6
] = {STACK_OFFSET(BPF_R6_HI
), STACK_OFFSET(BPF_R6_LO
)},
85 [BPF_REG_7
] = {STACK_OFFSET(BPF_R7_HI
), STACK_OFFSET(BPF_R7_LO
)},
86 [BPF_REG_8
] = {STACK_OFFSET(BPF_R8_HI
), STACK_OFFSET(BPF_R8_LO
)},
87 [BPF_REG_9
] = {STACK_OFFSET(BPF_R9_HI
), STACK_OFFSET(BPF_R9_LO
)},
88 /* Read-only frame pointer to access BPF stack. */
89 [BPF_REG_FP
] = {RV_REG_S6
, RV_REG_S5
},
90 /* Temporary register for blinding constants. Stored on the stack. */
91 [BPF_REG_AX
] = {STACK_OFFSET(BPF_AX_HI
), STACK_OFFSET(BPF_AX_LO
)},
93 * Temporary registers used by the JIT to operate on registers stored
94 * on the stack. Save t0 and t1 to be used as temporaries in generated
97 [TMP_REG_1
] = {RV_REG_T3
, RV_REG_T2
},
98 [TMP_REG_2
] = {RV_REG_T5
, RV_REG_T4
},
101 static s8
hi(const s8
*r
)
106 static s8
lo(const s8
*r
)
111 static void emit_imm(const s8 rd
, s32 imm
, struct rv_jit_context
*ctx
)
113 u32 upper
= (imm
+ (1 << 11)) >> 12;
114 u32 lower
= imm
& 0xfff;
117 emit(rv_lui(rd
, upper
), ctx
);
118 emit(rv_addi(rd
, rd
, lower
), ctx
);
120 emit(rv_addi(rd
, RV_REG_ZERO
, lower
), ctx
);
124 static void emit_imm32(const s8
*rd
, s32 imm
, struct rv_jit_context
*ctx
)
126 /* Emit immediate into lower bits. */
127 emit_imm(lo(rd
), imm
, ctx
);
129 /* Sign-extend into upper bits. */
131 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
133 emit(rv_addi(hi(rd
), RV_REG_ZERO
, -1), ctx
);
136 static void emit_imm64(const s8
*rd
, s32 imm_hi
, s32 imm_lo
,
137 struct rv_jit_context
*ctx
)
139 emit_imm(lo(rd
), imm_lo
, ctx
);
140 emit_imm(hi(rd
), imm_hi
, ctx
);
143 static void __build_epilogue(bool is_tail_call
, struct rv_jit_context
*ctx
)
145 int stack_adjust
= ctx
->stack_size
;
146 const s8
*r0
= bpf2rv32
[BPF_REG_0
];
148 /* Set return value if not tail call. */
150 emit(rv_addi(RV_REG_A0
, lo(r0
), 0), ctx
);
151 emit(rv_addi(RV_REG_A1
, hi(r0
), 0), ctx
);
154 /* Restore callee-saved registers. */
155 emit(rv_lw(RV_REG_RA
, stack_adjust
- 4, RV_REG_SP
), ctx
);
156 emit(rv_lw(RV_REG_FP
, stack_adjust
- 8, RV_REG_SP
), ctx
);
157 emit(rv_lw(RV_REG_S1
, stack_adjust
- 12, RV_REG_SP
), ctx
);
158 emit(rv_lw(RV_REG_S2
, stack_adjust
- 16, RV_REG_SP
), ctx
);
159 emit(rv_lw(RV_REG_S3
, stack_adjust
- 20, RV_REG_SP
), ctx
);
160 emit(rv_lw(RV_REG_S4
, stack_adjust
- 24, RV_REG_SP
), ctx
);
161 emit(rv_lw(RV_REG_S5
, stack_adjust
- 28, RV_REG_SP
), ctx
);
162 emit(rv_lw(RV_REG_S6
, stack_adjust
- 32, RV_REG_SP
), ctx
);
163 emit(rv_lw(RV_REG_S7
, stack_adjust
- 36, RV_REG_SP
), ctx
);
165 emit(rv_addi(RV_REG_SP
, RV_REG_SP
, stack_adjust
), ctx
);
170 * Skips first instruction of prologue which initializes tail
171 * call counter. Assumes t0 contains address of target program,
172 * see emit_bpf_tail_call.
174 emit(rv_jalr(RV_REG_ZERO
, RV_REG_T0
, 4), ctx
);
176 emit(rv_jalr(RV_REG_ZERO
, RV_REG_RA
, 0), ctx
);
180 static bool is_stacked(s8 reg
)
185 static const s8
*bpf_get_reg64(const s8
*reg
, const s8
*tmp
,
186 struct rv_jit_context
*ctx
)
188 if (is_stacked(hi(reg
))) {
189 emit(rv_lw(hi(tmp
), hi(reg
), RV_REG_FP
), ctx
);
190 emit(rv_lw(lo(tmp
), lo(reg
), RV_REG_FP
), ctx
);
196 static void bpf_put_reg64(const s8
*reg
, const s8
*src
,
197 struct rv_jit_context
*ctx
)
199 if (is_stacked(hi(reg
))) {
200 emit(rv_sw(RV_REG_FP
, hi(reg
), hi(src
)), ctx
);
201 emit(rv_sw(RV_REG_FP
, lo(reg
), lo(src
)), ctx
);
205 static const s8
*bpf_get_reg32(const s8
*reg
, const s8
*tmp
,
206 struct rv_jit_context
*ctx
)
208 if (is_stacked(lo(reg
))) {
209 emit(rv_lw(lo(tmp
), lo(reg
), RV_REG_FP
), ctx
);
215 static void bpf_put_reg32(const s8
*reg
, const s8
*src
,
216 struct rv_jit_context
*ctx
)
218 if (is_stacked(lo(reg
))) {
219 emit(rv_sw(RV_REG_FP
, lo(reg
), lo(src
)), ctx
);
220 if (!ctx
->prog
->aux
->verifier_zext
)
221 emit(rv_sw(RV_REG_FP
, hi(reg
), RV_REG_ZERO
), ctx
);
222 } else if (!ctx
->prog
->aux
->verifier_zext
) {
223 emit(rv_addi(hi(reg
), RV_REG_ZERO
, 0), ctx
);
227 static void emit_jump_and_link(u8 rd
, s32 rvoff
, bool force_jalr
,
228 struct rv_jit_context
*ctx
)
232 if (rvoff
&& is_21b_int(rvoff
) && !force_jalr
) {
233 emit(rv_jal(rd
, rvoff
>> 1), ctx
);
237 upper
= (rvoff
+ (1 << 11)) >> 12;
238 lower
= rvoff
& 0xfff;
239 emit(rv_auipc(RV_REG_T1
, upper
), ctx
);
240 emit(rv_jalr(rd
, RV_REG_T1
, lower
), ctx
);
243 static void emit_alu_i64(const s8
*dst
, s32 imm
,
244 struct rv_jit_context
*ctx
, const u8 op
)
246 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
247 const s8
*rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
251 emit_imm32(rd
, imm
, ctx
);
254 if (is_12b_int(imm
)) {
255 emit(rv_andi(lo(rd
), lo(rd
), imm
), ctx
);
257 emit_imm(RV_REG_T0
, imm
, ctx
);
258 emit(rv_and(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
261 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
264 if (is_12b_int(imm
)) {
265 emit(rv_ori(lo(rd
), lo(rd
), imm
), ctx
);
267 emit_imm(RV_REG_T0
, imm
, ctx
);
268 emit(rv_or(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
271 emit(rv_ori(hi(rd
), RV_REG_ZERO
, -1), ctx
);
274 if (is_12b_int(imm
)) {
275 emit(rv_xori(lo(rd
), lo(rd
), imm
), ctx
);
277 emit_imm(RV_REG_T0
, imm
, ctx
);
278 emit(rv_xor(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
281 emit(rv_xori(hi(rd
), hi(rd
), -1), ctx
);
285 emit(rv_slli(hi(rd
), lo(rd
), imm
- 32), ctx
);
286 emit(rv_addi(lo(rd
), RV_REG_ZERO
, 0), ctx
);
287 } else if (imm
== 0) {
290 emit(rv_srli(RV_REG_T0
, lo(rd
), 32 - imm
), ctx
);
291 emit(rv_slli(hi(rd
), hi(rd
), imm
), ctx
);
292 emit(rv_or(hi(rd
), RV_REG_T0
, hi(rd
)), ctx
);
293 emit(rv_slli(lo(rd
), lo(rd
), imm
), ctx
);
298 emit(rv_srli(lo(rd
), hi(rd
), imm
- 32), ctx
);
299 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
300 } else if (imm
== 0) {
303 emit(rv_slli(RV_REG_T0
, hi(rd
), 32 - imm
), ctx
);
304 emit(rv_srli(lo(rd
), lo(rd
), imm
), ctx
);
305 emit(rv_or(lo(rd
), RV_REG_T0
, lo(rd
)), ctx
);
306 emit(rv_srli(hi(rd
), hi(rd
), imm
), ctx
);
311 emit(rv_srai(lo(rd
), hi(rd
), imm
- 32), ctx
);
312 emit(rv_srai(hi(rd
), hi(rd
), 31), ctx
);
313 } else if (imm
== 0) {
316 emit(rv_slli(RV_REG_T0
, hi(rd
), 32 - imm
), ctx
);
317 emit(rv_srli(lo(rd
), lo(rd
), imm
), ctx
);
318 emit(rv_or(lo(rd
), RV_REG_T0
, lo(rd
)), ctx
);
319 emit(rv_srai(hi(rd
), hi(rd
), imm
), ctx
);
324 bpf_put_reg64(dst
, rd
, ctx
);
327 static void emit_alu_i32(const s8
*dst
, s32 imm
,
328 struct rv_jit_context
*ctx
, const u8 op
)
330 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
331 const s8
*rd
= bpf_get_reg32(dst
, tmp1
, ctx
);
335 emit_imm(lo(rd
), imm
, ctx
);
338 if (is_12b_int(imm
)) {
339 emit(rv_addi(lo(rd
), lo(rd
), imm
), ctx
);
341 emit_imm(RV_REG_T0
, imm
, ctx
);
342 emit(rv_add(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
346 if (is_12b_int(-imm
)) {
347 emit(rv_addi(lo(rd
), lo(rd
), -imm
), ctx
);
349 emit_imm(RV_REG_T0
, imm
, ctx
);
350 emit(rv_sub(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
354 if (is_12b_int(imm
)) {
355 emit(rv_andi(lo(rd
), lo(rd
), imm
), ctx
);
357 emit_imm(RV_REG_T0
, imm
, ctx
);
358 emit(rv_and(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
362 if (is_12b_int(imm
)) {
363 emit(rv_ori(lo(rd
), lo(rd
), imm
), ctx
);
365 emit_imm(RV_REG_T0
, imm
, ctx
);
366 emit(rv_or(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
370 if (is_12b_int(imm
)) {
371 emit(rv_xori(lo(rd
), lo(rd
), imm
), ctx
);
373 emit_imm(RV_REG_T0
, imm
, ctx
);
374 emit(rv_xor(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
378 if (is_12b_int(imm
)) {
379 emit(rv_slli(lo(rd
), lo(rd
), imm
), ctx
);
381 emit_imm(RV_REG_T0
, imm
, ctx
);
382 emit(rv_sll(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
386 if (is_12b_int(imm
)) {
387 emit(rv_srli(lo(rd
), lo(rd
), imm
), ctx
);
389 emit_imm(RV_REG_T0
, imm
, ctx
);
390 emit(rv_srl(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
394 if (is_12b_int(imm
)) {
395 emit(rv_srai(lo(rd
), lo(rd
), imm
), ctx
);
397 emit_imm(RV_REG_T0
, imm
, ctx
);
398 emit(rv_sra(lo(rd
), lo(rd
), RV_REG_T0
), ctx
);
403 bpf_put_reg32(dst
, rd
, ctx
);
406 static void emit_alu_r64(const s8
*dst
, const s8
*src
,
407 struct rv_jit_context
*ctx
, const u8 op
)
409 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
410 const s8
*tmp2
= bpf2rv32
[TMP_REG_2
];
411 const s8
*rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
412 const s8
*rs
= bpf_get_reg64(src
, tmp2
, ctx
);
416 emit(rv_addi(lo(rd
), lo(rs
), 0), ctx
);
417 emit(rv_addi(hi(rd
), hi(rs
), 0), ctx
);
421 emit(rv_srli(RV_REG_T0
, lo(rd
), 31), ctx
);
422 emit(rv_slli(hi(rd
), hi(rd
), 1), ctx
);
423 emit(rv_or(hi(rd
), RV_REG_T0
, hi(rd
)), ctx
);
424 emit(rv_slli(lo(rd
), lo(rd
), 1), ctx
);
426 emit(rv_add(lo(rd
), lo(rd
), lo(rs
)), ctx
);
427 emit(rv_sltu(RV_REG_T0
, lo(rd
), lo(rs
)), ctx
);
428 emit(rv_add(hi(rd
), hi(rd
), hi(rs
)), ctx
);
429 emit(rv_add(hi(rd
), hi(rd
), RV_REG_T0
), ctx
);
433 emit(rv_sub(RV_REG_T1
, hi(rd
), hi(rs
)), ctx
);
434 emit(rv_sltu(RV_REG_T0
, lo(rd
), lo(rs
)), ctx
);
435 emit(rv_sub(hi(rd
), RV_REG_T1
, RV_REG_T0
), ctx
);
436 emit(rv_sub(lo(rd
), lo(rd
), lo(rs
)), ctx
);
439 emit(rv_and(lo(rd
), lo(rd
), lo(rs
)), ctx
);
440 emit(rv_and(hi(rd
), hi(rd
), hi(rs
)), ctx
);
443 emit(rv_or(lo(rd
), lo(rd
), lo(rs
)), ctx
);
444 emit(rv_or(hi(rd
), hi(rd
), hi(rs
)), ctx
);
447 emit(rv_xor(lo(rd
), lo(rd
), lo(rs
)), ctx
);
448 emit(rv_xor(hi(rd
), hi(rd
), hi(rs
)), ctx
);
451 emit(rv_mul(RV_REG_T0
, hi(rs
), lo(rd
)), ctx
);
452 emit(rv_mul(hi(rd
), hi(rd
), lo(rs
)), ctx
);
453 emit(rv_mulhu(RV_REG_T1
, lo(rd
), lo(rs
)), ctx
);
454 emit(rv_add(hi(rd
), hi(rd
), RV_REG_T0
), ctx
);
455 emit(rv_mul(lo(rd
), lo(rd
), lo(rs
)), ctx
);
456 emit(rv_add(hi(rd
), hi(rd
), RV_REG_T1
), ctx
);
459 emit(rv_addi(RV_REG_T0
, lo(rs
), -32), ctx
);
460 emit(rv_blt(RV_REG_T0
, RV_REG_ZERO
, 8), ctx
);
461 emit(rv_sll(hi(rd
), lo(rd
), RV_REG_T0
), ctx
);
462 emit(rv_addi(lo(rd
), RV_REG_ZERO
, 0), ctx
);
463 emit(rv_jal(RV_REG_ZERO
, 16), ctx
);
464 emit(rv_addi(RV_REG_T1
, RV_REG_ZERO
, 31), ctx
);
465 emit(rv_srli(RV_REG_T0
, lo(rd
), 1), ctx
);
466 emit(rv_sub(RV_REG_T1
, RV_REG_T1
, lo(rs
)), ctx
);
467 emit(rv_srl(RV_REG_T0
, RV_REG_T0
, RV_REG_T1
), ctx
);
468 emit(rv_sll(hi(rd
), hi(rd
), lo(rs
)), ctx
);
469 emit(rv_or(hi(rd
), RV_REG_T0
, hi(rd
)), ctx
);
470 emit(rv_sll(lo(rd
), lo(rd
), lo(rs
)), ctx
);
473 emit(rv_addi(RV_REG_T0
, lo(rs
), -32), ctx
);
474 emit(rv_blt(RV_REG_T0
, RV_REG_ZERO
, 8), ctx
);
475 emit(rv_srl(lo(rd
), hi(rd
), RV_REG_T0
), ctx
);
476 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
477 emit(rv_jal(RV_REG_ZERO
, 16), ctx
);
478 emit(rv_addi(RV_REG_T1
, RV_REG_ZERO
, 31), ctx
);
479 emit(rv_slli(RV_REG_T0
, hi(rd
), 1), ctx
);
480 emit(rv_sub(RV_REG_T1
, RV_REG_T1
, lo(rs
)), ctx
);
481 emit(rv_sll(RV_REG_T0
, RV_REG_T0
, RV_REG_T1
), ctx
);
482 emit(rv_srl(lo(rd
), lo(rd
), lo(rs
)), ctx
);
483 emit(rv_or(lo(rd
), RV_REG_T0
, lo(rd
)), ctx
);
484 emit(rv_srl(hi(rd
), hi(rd
), lo(rs
)), ctx
);
487 emit(rv_addi(RV_REG_T0
, lo(rs
), -32), ctx
);
488 emit(rv_blt(RV_REG_T0
, RV_REG_ZERO
, 8), ctx
);
489 emit(rv_sra(lo(rd
), hi(rd
), RV_REG_T0
), ctx
);
490 emit(rv_srai(hi(rd
), hi(rd
), 31), ctx
);
491 emit(rv_jal(RV_REG_ZERO
, 16), ctx
);
492 emit(rv_addi(RV_REG_T1
, RV_REG_ZERO
, 31), ctx
);
493 emit(rv_slli(RV_REG_T0
, hi(rd
), 1), ctx
);
494 emit(rv_sub(RV_REG_T1
, RV_REG_T1
, lo(rs
)), ctx
);
495 emit(rv_sll(RV_REG_T0
, RV_REG_T0
, RV_REG_T1
), ctx
);
496 emit(rv_srl(lo(rd
), lo(rd
), lo(rs
)), ctx
);
497 emit(rv_or(lo(rd
), RV_REG_T0
, lo(rd
)), ctx
);
498 emit(rv_sra(hi(rd
), hi(rd
), lo(rs
)), ctx
);
501 emit(rv_sub(lo(rd
), RV_REG_ZERO
, lo(rd
)), ctx
);
502 emit(rv_sltu(RV_REG_T0
, RV_REG_ZERO
, lo(rd
)), ctx
);
503 emit(rv_sub(hi(rd
), RV_REG_ZERO
, hi(rd
)), ctx
);
504 emit(rv_sub(hi(rd
), hi(rd
), RV_REG_T0
), ctx
);
508 bpf_put_reg64(dst
, rd
, ctx
);
511 static void emit_alu_r32(const s8
*dst
, const s8
*src
,
512 struct rv_jit_context
*ctx
, const u8 op
)
514 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
515 const s8
*tmp2
= bpf2rv32
[TMP_REG_2
];
516 const s8
*rd
= bpf_get_reg32(dst
, tmp1
, ctx
);
517 const s8
*rs
= bpf_get_reg32(src
, tmp2
, ctx
);
521 emit(rv_addi(lo(rd
), lo(rs
), 0), ctx
);
524 emit(rv_add(lo(rd
), lo(rd
), lo(rs
)), ctx
);
527 emit(rv_sub(lo(rd
), lo(rd
), lo(rs
)), ctx
);
530 emit(rv_and(lo(rd
), lo(rd
), lo(rs
)), ctx
);
533 emit(rv_or(lo(rd
), lo(rd
), lo(rs
)), ctx
);
536 emit(rv_xor(lo(rd
), lo(rd
), lo(rs
)), ctx
);
539 emit(rv_mul(lo(rd
), lo(rd
), lo(rs
)), ctx
);
542 emit(rv_divu(lo(rd
), lo(rd
), lo(rs
)), ctx
);
545 emit(rv_remu(lo(rd
), lo(rd
), lo(rs
)), ctx
);
548 emit(rv_sll(lo(rd
), lo(rd
), lo(rs
)), ctx
);
551 emit(rv_srl(lo(rd
), lo(rd
), lo(rs
)), ctx
);
554 emit(rv_sra(lo(rd
), lo(rd
), lo(rs
)), ctx
);
557 emit(rv_sub(lo(rd
), RV_REG_ZERO
, lo(rd
)), ctx
);
561 bpf_put_reg32(dst
, rd
, ctx
);
564 static int emit_branch_r64(const s8
*src1
, const s8
*src2
, s32 rvoff
,
565 struct rv_jit_context
*ctx
, const u8 op
)
567 int e
, s
= ctx
->ninsns
;
568 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
569 const s8
*tmp2
= bpf2rv32
[TMP_REG_2
];
571 const s8
*rs1
= bpf_get_reg64(src1
, tmp1
, ctx
);
572 const s8
*rs2
= bpf_get_reg64(src2
, tmp2
, ctx
);
575 * NO_JUMP skips over the rest of the instructions and the
576 * emit_jump_and_link, meaning the BPF branch is not taken.
577 * JUMP skips directly to the emit_jump_and_link, meaning
578 * the BPF branch is taken.
580 * The fallthrough case results in the BPF branch being taken.
582 #define NO_JUMP(idx) (6 + (2 * (idx)))
583 #define JUMP(idx) (2 + (2 * (idx)))
587 emit(rv_bne(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
588 emit(rv_bne(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
591 emit(rv_bgtu(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
592 emit(rv_bltu(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
593 emit(rv_bleu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
596 emit(rv_bltu(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
597 emit(rv_bgtu(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
598 emit(rv_bgeu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
601 emit(rv_bgtu(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
602 emit(rv_bltu(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
603 emit(rv_bltu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
606 emit(rv_bltu(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
607 emit(rv_bgtu(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
608 emit(rv_bgtu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
611 emit(rv_bne(hi(rs1
), hi(rs2
), JUMP(1)), ctx
);
612 emit(rv_beq(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
615 emit(rv_bgt(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
616 emit(rv_blt(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
617 emit(rv_bleu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
620 emit(rv_blt(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
621 emit(rv_bgt(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
622 emit(rv_bgeu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
625 emit(rv_bgt(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
626 emit(rv_blt(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
627 emit(rv_bltu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
630 emit(rv_blt(hi(rs1
), hi(rs2
), JUMP(2)), ctx
);
631 emit(rv_bgt(hi(rs1
), hi(rs2
), NO_JUMP(1)), ctx
);
632 emit(rv_bgtu(lo(rs1
), lo(rs2
), NO_JUMP(0)), ctx
);
635 emit(rv_and(RV_REG_T0
, hi(rs1
), hi(rs2
)), ctx
);
636 emit(rv_bne(RV_REG_T0
, RV_REG_ZERO
, JUMP(2)), ctx
);
637 emit(rv_and(RV_REG_T0
, lo(rs1
), lo(rs2
)), ctx
);
638 emit(rv_beq(RV_REG_T0
, RV_REG_ZERO
, NO_JUMP(0)), ctx
);
646 /* Adjust for extra insns. */
647 rvoff
-= ninsns_rvoff(e
- s
);
648 emit_jump_and_link(RV_REG_ZERO
, rvoff
, true, ctx
);
652 static int emit_bcc(u8 op
, u8 rd
, u8 rs
, int rvoff
, struct rv_jit_context
*ctx
)
654 int e
, s
= ctx
->ninsns
;
658 if (op
== BPF_JSET
) {
660 * BPF_JSET is a special case: it has no inverse so we always
661 * treat it as a far branch.
664 } else if (!is_13b_int(rvoff
)) {
665 op
= invert_bpf_cond(op
);
670 * For a far branch, the condition is negated and we jump over the
671 * branch itself, and the two instructions from emit_jump_and_link.
672 * For a near branch, just use rvoff.
674 off
= far
? 6 : (rvoff
>> 1);
678 emit(rv_beq(rd
, rs
, off
), ctx
);
681 emit(rv_bgtu(rd
, rs
, off
), ctx
);
684 emit(rv_bltu(rd
, rs
, off
), ctx
);
687 emit(rv_bgeu(rd
, rs
, off
), ctx
);
690 emit(rv_bleu(rd
, rs
, off
), ctx
);
693 emit(rv_bne(rd
, rs
, off
), ctx
);
696 emit(rv_bgt(rd
, rs
, off
), ctx
);
699 emit(rv_blt(rd
, rs
, off
), ctx
);
702 emit(rv_bge(rd
, rs
, off
), ctx
);
705 emit(rv_ble(rd
, rs
, off
), ctx
);
708 emit(rv_and(RV_REG_T0
, rd
, rs
), ctx
);
709 emit(rv_beq(RV_REG_T0
, RV_REG_ZERO
, off
), ctx
);
715 /* Adjust for extra insns. */
716 rvoff
-= ninsns_rvoff(e
- s
);
717 emit_jump_and_link(RV_REG_ZERO
, rvoff
, true, ctx
);
722 static int emit_branch_r32(const s8
*src1
, const s8
*src2
, s32 rvoff
,
723 struct rv_jit_context
*ctx
, const u8 op
)
725 int e
, s
= ctx
->ninsns
;
726 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
727 const s8
*tmp2
= bpf2rv32
[TMP_REG_2
];
729 const s8
*rs1
= bpf_get_reg32(src1
, tmp1
, ctx
);
730 const s8
*rs2
= bpf_get_reg32(src2
, tmp2
, ctx
);
733 /* Adjust for extra insns. */
734 rvoff
-= ninsns_rvoff(e
- s
);
736 if (emit_bcc(op
, lo(rs1
), lo(rs2
), rvoff
, ctx
))
742 static void emit_call(bool fixed
, u64 addr
, struct rv_jit_context
*ctx
)
744 const s8
*r0
= bpf2rv32
[BPF_REG_0
];
745 const s8
*r5
= bpf2rv32
[BPF_REG_5
];
746 u32 upper
= ((u32
)addr
+ (1 << 11)) >> 12;
747 u32 lower
= addr
& 0xfff;
749 /* R1-R4 already in correct registers---need to push R5 to stack. */
750 emit(rv_addi(RV_REG_SP
, RV_REG_SP
, -16), ctx
);
751 emit(rv_sw(RV_REG_SP
, 0, lo(r5
)), ctx
);
752 emit(rv_sw(RV_REG_SP
, 4, hi(r5
)), ctx
);
755 emit(rv_addi(RV_REG_TCC_SAVED
, RV_REG_TCC
, 0), ctx
);
758 * Use lui/jalr pair to jump to absolute address. Don't use emit_imm as
759 * the number of emitted instructions should not depend on the value of
762 emit(rv_lui(RV_REG_T1
, upper
), ctx
);
763 emit(rv_jalr(RV_REG_RA
, RV_REG_T1
, lower
), ctx
);
766 emit(rv_addi(RV_REG_TCC
, RV_REG_TCC_SAVED
, 0), ctx
);
768 /* Set return value and restore stack. */
769 emit(rv_addi(lo(r0
), RV_REG_A0
, 0), ctx
);
770 emit(rv_addi(hi(r0
), RV_REG_A1
, 0), ctx
);
771 emit(rv_addi(RV_REG_SP
, RV_REG_SP
, 16), ctx
);
774 static int emit_bpf_tail_call(int insn
, struct rv_jit_context
*ctx
)
781 int tc_ninsn
, off
, start_insn
= ctx
->ninsns
;
782 const s8
*arr_reg
= bpf2rv32
[BPF_REG_2
];
783 const s8
*idx_reg
= bpf2rv32
[BPF_REG_3
];
785 tc_ninsn
= insn
? ctx
->offset
[insn
] - ctx
->offset
[insn
- 1] :
788 /* max_entries = array->map.max_entries; */
789 off
= offsetof(struct bpf_array
, map
.max_entries
);
790 if (is_12b_check(off
, insn
))
792 emit(rv_lw(RV_REG_T1
, off
, lo(arr_reg
)), ctx
);
795 * if (index >= max_entries)
798 off
= ninsns_rvoff(tc_ninsn
- (ctx
->ninsns
- start_insn
));
799 emit_bcc(BPF_JGE
, lo(idx_reg
), RV_REG_T1
, off
, ctx
);
805 emit(rv_addi(RV_REG_TCC
, RV_REG_TCC
, -1), ctx
);
806 off
= ninsns_rvoff(tc_ninsn
- (ctx
->ninsns
- start_insn
));
807 emit_bcc(BPF_JSLT
, RV_REG_TCC
, RV_REG_ZERO
, off
, ctx
);
810 * prog = array->ptrs[index];
814 emit_sh2add(RV_REG_T0
, lo(idx_reg
), lo(arr_reg
), ctx
);
815 off
= offsetof(struct bpf_array
, ptrs
);
816 if (is_12b_check(off
, insn
))
818 emit(rv_lw(RV_REG_T0
, off
, RV_REG_T0
), ctx
);
819 off
= ninsns_rvoff(tc_ninsn
- (ctx
->ninsns
- start_insn
));
820 emit_bcc(BPF_JEQ
, RV_REG_T0
, RV_REG_ZERO
, off
, ctx
);
824 * goto *(prog->bpf_func + 4);
826 off
= offsetof(struct bpf_prog
, bpf_func
);
827 if (is_12b_check(off
, insn
))
829 emit(rv_lw(RV_REG_T0
, off
, RV_REG_T0
), ctx
);
830 /* Epilogue jumps to *(t0 + 4). */
831 __build_epilogue(true, ctx
);
835 static int emit_load_r64(const s8
*dst
, const s8
*src
, s16 off
,
836 struct rv_jit_context
*ctx
, const u8 size
)
838 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
839 const s8
*tmp2
= bpf2rv32
[TMP_REG_2
];
840 const s8
*rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
841 const s8
*rs
= bpf_get_reg64(src
, tmp2
, ctx
);
843 emit_imm(RV_REG_T0
, off
, ctx
);
844 emit(rv_add(RV_REG_T0
, RV_REG_T0
, lo(rs
)), ctx
);
848 emit(rv_lbu(lo(rd
), 0, RV_REG_T0
), ctx
);
849 if (!ctx
->prog
->aux
->verifier_zext
)
850 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
853 emit(rv_lhu(lo(rd
), 0, RV_REG_T0
), ctx
);
854 if (!ctx
->prog
->aux
->verifier_zext
)
855 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
858 emit(rv_lw(lo(rd
), 0, RV_REG_T0
), ctx
);
859 if (!ctx
->prog
->aux
->verifier_zext
)
860 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
863 emit(rv_lw(lo(rd
), 0, RV_REG_T0
), ctx
);
864 emit(rv_lw(hi(rd
), 4, RV_REG_T0
), ctx
);
868 bpf_put_reg64(dst
, rd
, ctx
);
872 static int emit_store_r64(const s8
*dst
, const s8
*src
, s16 off
,
873 struct rv_jit_context
*ctx
, const u8 size
,
876 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
877 const s8
*tmp2
= bpf2rv32
[TMP_REG_2
];
878 const s8
*rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
879 const s8
*rs
= bpf_get_reg64(src
, tmp2
, ctx
);
881 if (mode
== BPF_ATOMIC
&& size
!= BPF_W
)
884 emit_imm(RV_REG_T0
, off
, ctx
);
885 emit(rv_add(RV_REG_T0
, RV_REG_T0
, lo(rd
)), ctx
);
889 emit(rv_sb(RV_REG_T0
, 0, lo(rs
)), ctx
);
892 emit(rv_sh(RV_REG_T0
, 0, lo(rs
)), ctx
);
897 emit(rv_sw(RV_REG_T0
, 0, lo(rs
)), ctx
);
899 case BPF_ATOMIC
: /* Only BPF_ADD supported */
900 emit(rv_amoadd_w(RV_REG_ZERO
, lo(rs
), RV_REG_T0
, 0, 0),
906 emit(rv_sw(RV_REG_T0
, 0, lo(rs
)), ctx
);
907 emit(rv_sw(RV_REG_T0
, 4, hi(rs
)), ctx
);
914 static void emit_rev16(const s8 rd
, struct rv_jit_context
*ctx
)
916 emit(rv_slli(rd
, rd
, 16), ctx
);
917 emit(rv_slli(RV_REG_T1
, rd
, 8), ctx
);
918 emit(rv_srli(rd
, rd
, 8), ctx
);
919 emit(rv_add(RV_REG_T1
, rd
, RV_REG_T1
), ctx
);
920 emit(rv_srli(rd
, RV_REG_T1
, 16), ctx
);
923 static void emit_rev32(const s8 rd
, struct rv_jit_context
*ctx
)
925 emit(rv_addi(RV_REG_T1
, RV_REG_ZERO
, 0), ctx
);
926 emit(rv_andi(RV_REG_T0
, rd
, 255), ctx
);
927 emit(rv_add(RV_REG_T1
, RV_REG_T1
, RV_REG_T0
), ctx
);
928 emit(rv_slli(RV_REG_T1
, RV_REG_T1
, 8), ctx
);
929 emit(rv_srli(rd
, rd
, 8), ctx
);
930 emit(rv_andi(RV_REG_T0
, rd
, 255), ctx
);
931 emit(rv_add(RV_REG_T1
, RV_REG_T1
, RV_REG_T0
), ctx
);
932 emit(rv_slli(RV_REG_T1
, RV_REG_T1
, 8), ctx
);
933 emit(rv_srli(rd
, rd
, 8), ctx
);
934 emit(rv_andi(RV_REG_T0
, rd
, 255), ctx
);
935 emit(rv_add(RV_REG_T1
, RV_REG_T1
, RV_REG_T0
), ctx
);
936 emit(rv_slli(RV_REG_T1
, RV_REG_T1
, 8), ctx
);
937 emit(rv_srli(rd
, rd
, 8), ctx
);
938 emit(rv_andi(RV_REG_T0
, rd
, 255), ctx
);
939 emit(rv_add(RV_REG_T1
, RV_REG_T1
, RV_REG_T0
), ctx
);
940 emit(rv_addi(rd
, RV_REG_T1
, 0), ctx
);
943 static void emit_zext64(const s8
*dst
, struct rv_jit_context
*ctx
)
946 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
948 rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
949 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
950 bpf_put_reg64(dst
, rd
, ctx
);
953 int bpf_jit_emit_insn(const struct bpf_insn
*insn
, struct rv_jit_context
*ctx
,
956 bool is64
= BPF_CLASS(insn
->code
) == BPF_ALU64
||
957 BPF_CLASS(insn
->code
) == BPF_JMP
;
958 int s
, e
, rvoff
, i
= insn
- ctx
->prog
->insnsi
;
959 u8 code
= insn
->code
;
963 const s8
*dst
= bpf2rv32
[insn
->dst_reg
];
964 const s8
*src
= bpf2rv32
[insn
->src_reg
];
965 const s8
*tmp1
= bpf2rv32
[TMP_REG_1
];
966 const s8
*tmp2
= bpf2rv32
[TMP_REG_2
];
969 case BPF_ALU64
| BPF_MOV
| BPF_X
:
971 case BPF_ALU64
| BPF_ADD
| BPF_X
:
972 case BPF_ALU64
| BPF_ADD
| BPF_K
:
974 case BPF_ALU64
| BPF_SUB
| BPF_X
:
975 case BPF_ALU64
| BPF_SUB
| BPF_K
:
977 case BPF_ALU64
| BPF_AND
| BPF_X
:
978 case BPF_ALU64
| BPF_OR
| BPF_X
:
979 case BPF_ALU64
| BPF_XOR
| BPF_X
:
981 case BPF_ALU64
| BPF_MUL
| BPF_X
:
982 case BPF_ALU64
| BPF_MUL
| BPF_K
:
984 case BPF_ALU64
| BPF_LSH
| BPF_X
:
985 case BPF_ALU64
| BPF_RSH
| BPF_X
:
986 case BPF_ALU64
| BPF_ARSH
| BPF_X
:
987 if (BPF_SRC(code
) == BPF_K
) {
988 emit_imm32(tmp2
, imm
, ctx
);
991 emit_alu_r64(dst
, src
, ctx
, BPF_OP(code
));
994 case BPF_ALU64
| BPF_NEG
:
995 emit_alu_r64(dst
, tmp2
, ctx
, BPF_OP(code
));
998 case BPF_ALU64
| BPF_DIV
| BPF_X
:
999 case BPF_ALU64
| BPF_DIV
| BPF_K
:
1000 case BPF_ALU64
| BPF_MOD
| BPF_X
:
1001 case BPF_ALU64
| BPF_MOD
| BPF_K
:
1004 case BPF_ALU64
| BPF_MOV
| BPF_K
:
1005 case BPF_ALU64
| BPF_AND
| BPF_K
:
1006 case BPF_ALU64
| BPF_OR
| BPF_K
:
1007 case BPF_ALU64
| BPF_XOR
| BPF_K
:
1008 case BPF_ALU64
| BPF_LSH
| BPF_K
:
1009 case BPF_ALU64
| BPF_RSH
| BPF_K
:
1010 case BPF_ALU64
| BPF_ARSH
| BPF_K
:
1011 emit_alu_i64(dst
, imm
, ctx
, BPF_OP(code
));
1014 case BPF_ALU
| BPF_MOV
| BPF_X
:
1016 /* Special mov32 for zext. */
1017 emit_zext64(dst
, ctx
);
1022 case BPF_ALU
| BPF_ADD
| BPF_X
:
1023 case BPF_ALU
| BPF_SUB
| BPF_X
:
1024 case BPF_ALU
| BPF_AND
| BPF_X
:
1025 case BPF_ALU
| BPF_OR
| BPF_X
:
1026 case BPF_ALU
| BPF_XOR
| BPF_X
:
1028 case BPF_ALU
| BPF_MUL
| BPF_X
:
1029 case BPF_ALU
| BPF_MUL
| BPF_K
:
1031 case BPF_ALU
| BPF_DIV
| BPF_X
:
1032 case BPF_ALU
| BPF_DIV
| BPF_K
:
1034 case BPF_ALU
| BPF_MOD
| BPF_X
:
1035 case BPF_ALU
| BPF_MOD
| BPF_K
:
1037 case BPF_ALU
| BPF_LSH
| BPF_X
:
1038 case BPF_ALU
| BPF_RSH
| BPF_X
:
1039 case BPF_ALU
| BPF_ARSH
| BPF_X
:
1040 if (BPF_SRC(code
) == BPF_K
) {
1041 emit_imm32(tmp2
, imm
, ctx
);
1044 emit_alu_r32(dst
, src
, ctx
, BPF_OP(code
));
1047 case BPF_ALU
| BPF_MOV
| BPF_K
:
1048 case BPF_ALU
| BPF_ADD
| BPF_K
:
1049 case BPF_ALU
| BPF_SUB
| BPF_K
:
1050 case BPF_ALU
| BPF_AND
| BPF_K
:
1051 case BPF_ALU
| BPF_OR
| BPF_K
:
1052 case BPF_ALU
| BPF_XOR
| BPF_K
:
1053 case BPF_ALU
| BPF_LSH
| BPF_K
:
1054 case BPF_ALU
| BPF_RSH
| BPF_K
:
1055 case BPF_ALU
| BPF_ARSH
| BPF_K
:
1057 * mul,div,mod are handled in the BPF_X case since there are
1058 * no RISC-V I-type equivalents.
1060 emit_alu_i32(dst
, imm
, ctx
, BPF_OP(code
));
1063 case BPF_ALU
| BPF_NEG
:
1065 * src is ignored---choose tmp2 as a dummy register since it
1066 * is not on the stack.
1068 emit_alu_r32(dst
, tmp2
, ctx
, BPF_OP(code
));
1071 case BPF_ALU
| BPF_END
| BPF_FROM_LE
:
1073 const s8
*rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
1077 emit(rv_slli(lo(rd
), lo(rd
), 16), ctx
);
1078 emit(rv_srli(lo(rd
), lo(rd
), 16), ctx
);
1081 if (!ctx
->prog
->aux
->verifier_zext
)
1082 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
1088 pr_err("bpf-jit: BPF_END imm %d invalid\n", imm
);
1092 bpf_put_reg64(dst
, rd
, ctx
);
1096 case BPF_ALU
| BPF_END
| BPF_FROM_BE
:
1098 const s8
*rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
1102 emit_rev16(lo(rd
), ctx
);
1103 if (!ctx
->prog
->aux
->verifier_zext
)
1104 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
1107 emit_rev32(lo(rd
), ctx
);
1108 if (!ctx
->prog
->aux
->verifier_zext
)
1109 emit(rv_addi(hi(rd
), RV_REG_ZERO
, 0), ctx
);
1112 /* Swap upper and lower halves. */
1113 emit(rv_addi(RV_REG_T0
, lo(rd
), 0), ctx
);
1114 emit(rv_addi(lo(rd
), hi(rd
), 0), ctx
);
1115 emit(rv_addi(hi(rd
), RV_REG_T0
, 0), ctx
);
1117 /* Swap each half. */
1118 emit_rev32(lo(rd
), ctx
);
1119 emit_rev32(hi(rd
), ctx
);
1122 pr_err("bpf-jit: BPF_END imm %d invalid\n", imm
);
1126 bpf_put_reg64(dst
, rd
, ctx
);
1130 case BPF_JMP
| BPF_JA
:
1131 rvoff
= rv_offset(i
, off
, ctx
);
1132 emit_jump_and_link(RV_REG_ZERO
, rvoff
, false, ctx
);
1135 case BPF_JMP
| BPF_CALL
:
1141 ret
= bpf_jit_get_func_addr(ctx
->prog
, insn
, extra_pass
, &addr
,
1145 emit_call(fixed
, addr
, ctx
);
1149 case BPF_JMP
| BPF_TAIL_CALL
:
1150 if (emit_bpf_tail_call(i
, ctx
))
1154 case BPF_JMP
| BPF_JEQ
| BPF_X
:
1155 case BPF_JMP
| BPF_JEQ
| BPF_K
:
1156 case BPF_JMP32
| BPF_JEQ
| BPF_X
:
1157 case BPF_JMP32
| BPF_JEQ
| BPF_K
:
1159 case BPF_JMP
| BPF_JNE
| BPF_X
:
1160 case BPF_JMP
| BPF_JNE
| BPF_K
:
1161 case BPF_JMP32
| BPF_JNE
| BPF_X
:
1162 case BPF_JMP32
| BPF_JNE
| BPF_K
:
1164 case BPF_JMP
| BPF_JLE
| BPF_X
:
1165 case BPF_JMP
| BPF_JLE
| BPF_K
:
1166 case BPF_JMP32
| BPF_JLE
| BPF_X
:
1167 case BPF_JMP32
| BPF_JLE
| BPF_K
:
1169 case BPF_JMP
| BPF_JLT
| BPF_X
:
1170 case BPF_JMP
| BPF_JLT
| BPF_K
:
1171 case BPF_JMP32
| BPF_JLT
| BPF_X
:
1172 case BPF_JMP32
| BPF_JLT
| BPF_K
:
1174 case BPF_JMP
| BPF_JGE
| BPF_X
:
1175 case BPF_JMP
| BPF_JGE
| BPF_K
:
1176 case BPF_JMP32
| BPF_JGE
| BPF_X
:
1177 case BPF_JMP32
| BPF_JGE
| BPF_K
:
1179 case BPF_JMP
| BPF_JGT
| BPF_X
:
1180 case BPF_JMP
| BPF_JGT
| BPF_K
:
1181 case BPF_JMP32
| BPF_JGT
| BPF_X
:
1182 case BPF_JMP32
| BPF_JGT
| BPF_K
:
1184 case BPF_JMP
| BPF_JSLE
| BPF_X
:
1185 case BPF_JMP
| BPF_JSLE
| BPF_K
:
1186 case BPF_JMP32
| BPF_JSLE
| BPF_X
:
1187 case BPF_JMP32
| BPF_JSLE
| BPF_K
:
1189 case BPF_JMP
| BPF_JSLT
| BPF_X
:
1190 case BPF_JMP
| BPF_JSLT
| BPF_K
:
1191 case BPF_JMP32
| BPF_JSLT
| BPF_X
:
1192 case BPF_JMP32
| BPF_JSLT
| BPF_K
:
1194 case BPF_JMP
| BPF_JSGE
| BPF_X
:
1195 case BPF_JMP
| BPF_JSGE
| BPF_K
:
1196 case BPF_JMP32
| BPF_JSGE
| BPF_X
:
1197 case BPF_JMP32
| BPF_JSGE
| BPF_K
:
1199 case BPF_JMP
| BPF_JSGT
| BPF_X
:
1200 case BPF_JMP
| BPF_JSGT
| BPF_K
:
1201 case BPF_JMP32
| BPF_JSGT
| BPF_X
:
1202 case BPF_JMP32
| BPF_JSGT
| BPF_K
:
1204 case BPF_JMP
| BPF_JSET
| BPF_X
:
1205 case BPF_JMP
| BPF_JSET
| BPF_K
:
1206 case BPF_JMP32
| BPF_JSET
| BPF_X
:
1207 case BPF_JMP32
| BPF_JSET
| BPF_K
:
1208 rvoff
= rv_offset(i
, off
, ctx
);
1209 if (BPF_SRC(code
) == BPF_K
) {
1211 emit_imm32(tmp2
, imm
, ctx
);
1214 rvoff
-= ninsns_rvoff(e
- s
);
1218 emit_branch_r64(dst
, src
, rvoff
, ctx
, BPF_OP(code
));
1220 emit_branch_r32(dst
, src
, rvoff
, ctx
, BPF_OP(code
));
1223 case BPF_JMP
| BPF_EXIT
:
1224 if (i
== ctx
->prog
->len
- 1)
1227 rvoff
= epilogue_offset(ctx
);
1228 emit_jump_and_link(RV_REG_ZERO
, rvoff
, false, ctx
);
1231 case BPF_LD
| BPF_IMM
| BPF_DW
:
1233 struct bpf_insn insn1
= insn
[1];
1235 s32 imm_hi
= insn1
.imm
;
1236 const s8
*rd
= bpf_get_reg64(dst
, tmp1
, ctx
);
1238 emit_imm64(rd
, imm_hi
, imm_lo
, ctx
);
1239 bpf_put_reg64(dst
, rd
, ctx
);
1243 case BPF_LDX
| BPF_MEM
| BPF_B
:
1244 case BPF_LDX
| BPF_MEM
| BPF_H
:
1245 case BPF_LDX
| BPF_MEM
| BPF_W
:
1246 case BPF_LDX
| BPF_MEM
| BPF_DW
:
1247 if (emit_load_r64(dst
, src
, off
, ctx
, BPF_SIZE(code
)))
1251 /* speculation barrier */
1252 case BPF_ST
| BPF_NOSPEC
:
1255 case BPF_ST
| BPF_MEM
| BPF_B
:
1256 case BPF_ST
| BPF_MEM
| BPF_H
:
1257 case BPF_ST
| BPF_MEM
| BPF_W
:
1258 case BPF_ST
| BPF_MEM
| BPF_DW
:
1260 case BPF_STX
| BPF_MEM
| BPF_B
:
1261 case BPF_STX
| BPF_MEM
| BPF_H
:
1262 case BPF_STX
| BPF_MEM
| BPF_W
:
1263 case BPF_STX
| BPF_MEM
| BPF_DW
:
1264 if (BPF_CLASS(code
) == BPF_ST
) {
1265 emit_imm32(tmp2
, imm
, ctx
);
1269 if (emit_store_r64(dst
, src
, off
, ctx
, BPF_SIZE(code
),
1274 case BPF_STX
| BPF_ATOMIC
| BPF_W
:
1275 if (insn
->imm
!= BPF_ADD
) {
1277 "bpf-jit: not supported: atomic operation %02x ***\n",
1282 if (emit_store_r64(dst
, src
, off
, ctx
, BPF_SIZE(code
),
1287 /* No hardware support for 8-byte atomics in RV32. */
1288 case BPF_STX
| BPF_ATOMIC
| BPF_DW
:
1292 pr_info_once("bpf-jit: not supported: opcode %02x ***\n", code
);
1296 pr_err("bpf-jit: unknown opcode %02x\n", code
);
1303 void bpf_jit_build_prologue(struct rv_jit_context
*ctx
, bool is_subprog
)
1305 const s8
*fp
= bpf2rv32
[BPF_REG_FP
];
1306 const s8
*r1
= bpf2rv32
[BPF_REG_1
];
1307 int stack_adjust
= 0;
1308 int bpf_stack_adjust
=
1309 round_up(ctx
->prog
->aux
->stack_depth
, STACK_ALIGN
);
1311 /* Make space for callee-saved registers. */
1312 stack_adjust
+= NR_SAVED_REGISTERS
* sizeof(u32
);
1313 /* Make space for BPF registers on stack. */
1314 stack_adjust
+= BPF_JIT_SCRATCH_REGS
* sizeof(u32
);
1315 /* Make space for BPF stack. */
1316 stack_adjust
+= bpf_stack_adjust
;
1317 /* Round up for stack alignment. */
1318 stack_adjust
= round_up(stack_adjust
, STACK_ALIGN
);
1321 * The first instruction sets the tail-call-counter (TCC) register.
1322 * This instruction is skipped by tail calls.
1324 emit(rv_addi(RV_REG_TCC
, RV_REG_ZERO
, MAX_TAIL_CALL_CNT
), ctx
);
1326 emit(rv_addi(RV_REG_SP
, RV_REG_SP
, -stack_adjust
), ctx
);
1328 /* Save callee-save registers. */
1329 emit(rv_sw(RV_REG_SP
, stack_adjust
- 4, RV_REG_RA
), ctx
);
1330 emit(rv_sw(RV_REG_SP
, stack_adjust
- 8, RV_REG_FP
), ctx
);
1331 emit(rv_sw(RV_REG_SP
, stack_adjust
- 12, RV_REG_S1
), ctx
);
1332 emit(rv_sw(RV_REG_SP
, stack_adjust
- 16, RV_REG_S2
), ctx
);
1333 emit(rv_sw(RV_REG_SP
, stack_adjust
- 20, RV_REG_S3
), ctx
);
1334 emit(rv_sw(RV_REG_SP
, stack_adjust
- 24, RV_REG_S4
), ctx
);
1335 emit(rv_sw(RV_REG_SP
, stack_adjust
- 28, RV_REG_S5
), ctx
);
1336 emit(rv_sw(RV_REG_SP
, stack_adjust
- 32, RV_REG_S6
), ctx
);
1337 emit(rv_sw(RV_REG_SP
, stack_adjust
- 36, RV_REG_S7
), ctx
);
1339 /* Set fp: used as the base address for stacked BPF registers. */
1340 emit(rv_addi(RV_REG_FP
, RV_REG_SP
, stack_adjust
), ctx
);
1342 /* Set up BPF frame pointer. */
1343 emit(rv_addi(lo(fp
), RV_REG_SP
, bpf_stack_adjust
), ctx
);
1344 emit(rv_addi(hi(fp
), RV_REG_ZERO
, 0), ctx
);
1346 /* Set up BPF context pointer. */
1347 emit(rv_addi(lo(r1
), RV_REG_A0
, 0), ctx
);
1348 emit(rv_addi(hi(r1
), RV_REG_ZERO
, 0), ctx
);
1350 ctx
->stack_size
= stack_adjust
;
1353 void bpf_jit_build_epilogue(struct rv_jit_context
*ctx
)
1355 __build_epilogue(false, ctx
);