1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/bitops.h>
17#include <linux/errno.h>
18#include <linux/filter.h>
19#include <linux/bpf.h>
20#include <linux/slab.h>
21#include <asm/bitops.h>
22#include <asm/byteorder.h>
23#include <asm/cacheflush.h>
24#include <asm/cpu-features.h>
25#include <asm/uasm.h>
26
27
28#define MIPS_R_ZERO 0
29#define MIPS_R_AT 1
30#define MIPS_R_V0 2
31#define MIPS_R_V1 3
32#define MIPS_R_A0 4
33#define MIPS_R_A1 5
34#define MIPS_R_A2 6
35#define MIPS_R_A3 7
36#define MIPS_R_A4 8
37#define MIPS_R_T4 12
38#define MIPS_R_T5 13
39#define MIPS_R_T6 14
40#define MIPS_R_T7 15
41#define MIPS_R_S0 16
42#define MIPS_R_S1 17
43#define MIPS_R_S2 18
44#define MIPS_R_S3 19
45#define MIPS_R_S4 20
46#define MIPS_R_S5 21
47#define MIPS_R_S6 22
48#define MIPS_R_S7 23
49#define MIPS_R_T8 24
50#define MIPS_R_T9 25
51#define MIPS_R_SP 29
52#define MIPS_R_RA 31
53
54
55#define EBPF_SAVE_S0 BIT(0)
56#define EBPF_SAVE_S1 BIT(1)
57#define EBPF_SAVE_S2 BIT(2)
58#define EBPF_SAVE_S3 BIT(3)
59#define EBPF_SAVE_S4 BIT(4)
60#define EBPF_SAVE_RA BIT(5)
61#define EBPF_SEEN_FP BIT(6)
62#define EBPF_SEEN_TC BIT(7)
63#define EBPF_TCC_IN_V1 BIT(8)
64
65
66
67
68
69
70
71
72
73enum reg_val_type {
74
75 REG_UNKNOWN,
76
77 REG_64BIT,
78
79 REG_64BIT_32BIT,
80
81 REG_32BIT,
82
83 REG_32BIT_ZERO_EX,
84
85 REG_32BIT_POS
86};
87
88
89
90
91
92#define OFFSETS_B_CONV BIT(31)
93
94
95
96
97
98
99
100
101
102
103
104
105struct jit_ctx {
106 const struct bpf_prog *skf;
107 int stack_size;
108 int tmp_offset;
109 u32 idx;
110 u32 flags;
111 u32 *offsets;
112 u32 *target;
113 u64 *reg_val_types;
114 unsigned int long_b_conversion:1;
115 unsigned int gen_b_offsets:1;
116 unsigned int use_bbit_insns:1;
117};
118
119static void set_reg_val_type(u64 *rvt, int reg, enum reg_val_type type)
120{
121 *rvt &= ~(7ull << (reg * 3));
122 *rvt |= ((u64)type << (reg * 3));
123}
124
125static enum reg_val_type get_reg_val_type(const struct jit_ctx *ctx,
126 int index, int reg)
127{
128 return (ctx->reg_val_types[index] >> (reg * 3)) & 7;
129}
130
131
132#define emit_instr(ctx, func, ...) \
133do { \
134 if ((ctx)->target != NULL) { \
135 u32 *p = &(ctx)->target[ctx->idx]; \
136 uasm_i_##func(&p, ##__VA_ARGS__); \
137 } \
138 (ctx)->idx++; \
139} while (0)
140
141static unsigned int j_target(struct jit_ctx *ctx, int target_idx)
142{
143 unsigned long target_va, base_va;
144 unsigned int r;
145
146 if (!ctx->target)
147 return 0;
148
149 base_va = (unsigned long)ctx->target;
150 target_va = base_va + (ctx->offsets[target_idx] & ~OFFSETS_B_CONV);
151
152 if ((base_va & ~0x0ffffffful) != (target_va & ~0x0ffffffful))
153 return (unsigned int)-1;
154 r = target_va & 0x0ffffffful;
155 return r;
156}
157
158
159static u32 b_imm(unsigned int tgt, struct jit_ctx *ctx)
160{
161 if (!ctx->gen_b_offsets)
162 return 0;
163
164
165
166
167
168
169
170
171
172
173
174
175
176 return (ctx->offsets[tgt] & ~OFFSETS_B_CONV) -
177 (ctx->idx * 4) - 4;
178}
179
180enum which_ebpf_reg {
181 src_reg,
182 src_reg_no_fp,
183 dst_reg,
184 dst_reg_fp_ok
185};
186
187
188
189
190
191
192
193int ebpf_to_mips_reg(struct jit_ctx *ctx, const struct bpf_insn *insn,
194 enum which_ebpf_reg w)
195{
196 int ebpf_reg = (w == src_reg || w == src_reg_no_fp) ?
197 insn->src_reg : insn->dst_reg;
198
199 switch (ebpf_reg) {
200 case BPF_REG_0:
201 return MIPS_R_V0;
202 case BPF_REG_1:
203 return MIPS_R_A0;
204 case BPF_REG_2:
205 return MIPS_R_A1;
206 case BPF_REG_3:
207 return MIPS_R_A2;
208 case BPF_REG_4:
209 return MIPS_R_A3;
210 case BPF_REG_5:
211 return MIPS_R_A4;
212 case BPF_REG_6:
213 ctx->flags |= EBPF_SAVE_S0;
214 return MIPS_R_S0;
215 case BPF_REG_7:
216 ctx->flags |= EBPF_SAVE_S1;
217 return MIPS_R_S1;
218 case BPF_REG_8:
219 ctx->flags |= EBPF_SAVE_S2;
220 return MIPS_R_S2;
221 case BPF_REG_9:
222 ctx->flags |= EBPF_SAVE_S3;
223 return MIPS_R_S3;
224 case BPF_REG_10:
225 if (w == dst_reg || w == src_reg_no_fp)
226 goto bad_reg;
227 ctx->flags |= EBPF_SEEN_FP;
228
229
230
231
232 return MIPS_R_ZERO;
233 case BPF_REG_AX:
234 return MIPS_R_T4;
235 default:
236bad_reg:
237 WARN(1, "Illegal bpf reg: %d\n", ebpf_reg);
238 return -EINVAL;
239 }
240}
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269static int gen_int_prologue(struct jit_ctx *ctx)
270{
271 int stack_adjust = 0;
272 int store_offset;
273 int locals_size;
274
275 if (ctx->flags & EBPF_SAVE_RA)
276
277
278
279
280 stack_adjust += 16;
281 if (ctx->flags & EBPF_SAVE_S0)
282 stack_adjust += 8;
283 if (ctx->flags & EBPF_SAVE_S1)
284 stack_adjust += 8;
285 if (ctx->flags & EBPF_SAVE_S2)
286 stack_adjust += 8;
287 if (ctx->flags & EBPF_SAVE_S3)
288 stack_adjust += 8;
289 if (ctx->flags & EBPF_SAVE_S4)
290 stack_adjust += 8;
291
292 BUILD_BUG_ON(MAX_BPF_STACK & 7);
293 locals_size = (ctx->flags & EBPF_SEEN_FP) ? MAX_BPF_STACK : 0;
294
295 stack_adjust += locals_size;
296 ctx->tmp_offset = locals_size;
297
298 ctx->stack_size = stack_adjust;
299
300
301
302
303
304
305 emit_instr(ctx, daddiu, MIPS_R_V1, MIPS_R_ZERO, MAX_TAIL_CALL_CNT);
306 if (stack_adjust)
307 emit_instr(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, -stack_adjust);
308 else
309 return 0;
310
311 store_offset = stack_adjust - 8;
312
313 if (ctx->flags & EBPF_SAVE_RA) {
314 emit_instr(ctx, sd, MIPS_R_RA, store_offset, MIPS_R_SP);
315 store_offset -= 8;
316 }
317 if (ctx->flags & EBPF_SAVE_S0) {
318 emit_instr(ctx, sd, MIPS_R_S0, store_offset, MIPS_R_SP);
319 store_offset -= 8;
320 }
321 if (ctx->flags & EBPF_SAVE_S1) {
322 emit_instr(ctx, sd, MIPS_R_S1, store_offset, MIPS_R_SP);
323 store_offset -= 8;
324 }
325 if (ctx->flags & EBPF_SAVE_S2) {
326 emit_instr(ctx, sd, MIPS_R_S2, store_offset, MIPS_R_SP);
327 store_offset -= 8;
328 }
329 if (ctx->flags & EBPF_SAVE_S3) {
330 emit_instr(ctx, sd, MIPS_R_S3, store_offset, MIPS_R_SP);
331 store_offset -= 8;
332 }
333 if (ctx->flags & EBPF_SAVE_S4) {
334 emit_instr(ctx, sd, MIPS_R_S4, store_offset, MIPS_R_SP);
335 store_offset -= 8;
336 }
337
338 if ((ctx->flags & EBPF_SEEN_TC) && !(ctx->flags & EBPF_TCC_IN_V1))
339 emit_instr(ctx, daddu, MIPS_R_S4, MIPS_R_V1, MIPS_R_ZERO);
340
341 return 0;
342}
343
344static int build_int_epilogue(struct jit_ctx *ctx, int dest_reg)
345{
346 const struct bpf_prog *prog = ctx->skf;
347 int stack_adjust = ctx->stack_size;
348 int store_offset = stack_adjust - 8;
349 int r0 = MIPS_R_V0;
350
351 if (dest_reg == MIPS_R_RA &&
352 get_reg_val_type(ctx, prog->len, BPF_REG_0) == REG_32BIT_ZERO_EX)
353
354 emit_instr(ctx, sll, r0, r0, 0);
355
356 if (ctx->flags & EBPF_SAVE_RA) {
357 emit_instr(ctx, ld, MIPS_R_RA, store_offset, MIPS_R_SP);
358 store_offset -= 8;
359 }
360 if (ctx->flags & EBPF_SAVE_S0) {
361 emit_instr(ctx, ld, MIPS_R_S0, store_offset, MIPS_R_SP);
362 store_offset -= 8;
363 }
364 if (ctx->flags & EBPF_SAVE_S1) {
365 emit_instr(ctx, ld, MIPS_R_S1, store_offset, MIPS_R_SP);
366 store_offset -= 8;
367 }
368 if (ctx->flags & EBPF_SAVE_S2) {
369 emit_instr(ctx, ld, MIPS_R_S2, store_offset, MIPS_R_SP);
370 store_offset -= 8;
371 }
372 if (ctx->flags & EBPF_SAVE_S3) {
373 emit_instr(ctx, ld, MIPS_R_S3, store_offset, MIPS_R_SP);
374 store_offset -= 8;
375 }
376 if (ctx->flags & EBPF_SAVE_S4) {
377 emit_instr(ctx, ld, MIPS_R_S4, store_offset, MIPS_R_SP);
378 store_offset -= 8;
379 }
380 emit_instr(ctx, jr, dest_reg);
381
382 if (stack_adjust)
383 emit_instr(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, stack_adjust);
384 else
385 emit_instr(ctx, nop);
386
387 return 0;
388}
389
390static void gen_imm_to_reg(const struct bpf_insn *insn, int reg,
391 struct jit_ctx *ctx)
392{
393 if (insn->imm >= S16_MIN && insn->imm <= S16_MAX) {
394 emit_instr(ctx, addiu, reg, MIPS_R_ZERO, insn->imm);
395 } else {
396 int lower = (s16)(insn->imm & 0xffff);
397 int upper = insn->imm - lower;
398
399 emit_instr(ctx, lui, reg, upper >> 16);
400 emit_instr(ctx, addiu, reg, reg, lower);
401 }
402
403}
404
405static int gen_imm_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
406 int idx)
407{
408 int upper_bound, lower_bound;
409 int dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
410
411 if (dst < 0)
412 return dst;
413
414 switch (BPF_OP(insn->code)) {
415 case BPF_MOV:
416 case BPF_ADD:
417 upper_bound = S16_MAX;
418 lower_bound = S16_MIN;
419 break;
420 case BPF_SUB:
421 upper_bound = -(int)S16_MIN;
422 lower_bound = -(int)S16_MAX;
423 break;
424 case BPF_AND:
425 case BPF_OR:
426 case BPF_XOR:
427 upper_bound = 0xffff;
428 lower_bound = 0;
429 break;
430 case BPF_RSH:
431 case BPF_LSH:
432 case BPF_ARSH:
433
434 upper_bound = S32_MAX;
435 lower_bound = S32_MIN;
436 break;
437 default:
438 return -EINVAL;
439 }
440
441
442
443
444
445 if (BPF_CLASS(insn->code) == BPF_ALU64 &&
446 BPF_OP(insn->code) != BPF_MOV &&
447 get_reg_val_type(ctx, idx, insn->dst_reg) == REG_32BIT)
448 emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
449
450 if (BPF_CLASS(insn->code) == BPF_ALU &&
451 BPF_OP(insn->code) != BPF_LSH &&
452 BPF_OP(insn->code) != BPF_MOV &&
453 get_reg_val_type(ctx, idx, insn->dst_reg) != REG_32BIT)
454 emit_instr(ctx, sll, dst, dst, 0);
455
456 if (insn->imm >= lower_bound && insn->imm <= upper_bound) {
457
458 switch (BPF_OP(insn->code) | BPF_CLASS(insn->code)) {
459 case BPF_ALU64 | BPF_MOV:
460 emit_instr(ctx, daddiu, dst, MIPS_R_ZERO, insn->imm);
461 break;
462 case BPF_ALU64 | BPF_AND:
463 case BPF_ALU | BPF_AND:
464 emit_instr(ctx, andi, dst, dst, insn->imm);
465 break;
466 case BPF_ALU64 | BPF_OR:
467 case BPF_ALU | BPF_OR:
468 emit_instr(ctx, ori, dst, dst, insn->imm);
469 break;
470 case BPF_ALU64 | BPF_XOR:
471 case BPF_ALU | BPF_XOR:
472 emit_instr(ctx, xori, dst, dst, insn->imm);
473 break;
474 case BPF_ALU64 | BPF_ADD:
475 emit_instr(ctx, daddiu, dst, dst, insn->imm);
476 break;
477 case BPF_ALU64 | BPF_SUB:
478 emit_instr(ctx, daddiu, dst, dst, -insn->imm);
479 break;
480 case BPF_ALU64 | BPF_RSH:
481 emit_instr(ctx, dsrl_safe, dst, dst, insn->imm & 0x3f);
482 break;
483 case BPF_ALU | BPF_RSH:
484 emit_instr(ctx, srl, dst, dst, insn->imm & 0x1f);
485 break;
486 case BPF_ALU64 | BPF_LSH:
487 emit_instr(ctx, dsll_safe, dst, dst, insn->imm & 0x3f);
488 break;
489 case BPF_ALU | BPF_LSH:
490 emit_instr(ctx, sll, dst, dst, insn->imm & 0x1f);
491 break;
492 case BPF_ALU64 | BPF_ARSH:
493 emit_instr(ctx, dsra_safe, dst, dst, insn->imm & 0x3f);
494 break;
495 case BPF_ALU | BPF_ARSH:
496 emit_instr(ctx, sra, dst, dst, insn->imm & 0x1f);
497 break;
498 case BPF_ALU | BPF_MOV:
499 emit_instr(ctx, addiu, dst, MIPS_R_ZERO, insn->imm);
500 break;
501 case BPF_ALU | BPF_ADD:
502 emit_instr(ctx, addiu, dst, dst, insn->imm);
503 break;
504 case BPF_ALU | BPF_SUB:
505 emit_instr(ctx, addiu, dst, dst, -insn->imm);
506 break;
507 default:
508 return -EINVAL;
509 }
510 } else {
511
512 if (BPF_OP(insn->code) == BPF_MOV) {
513 gen_imm_to_reg(insn, dst, ctx);
514 } else {
515 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
516 switch (BPF_OP(insn->code) | BPF_CLASS(insn->code)) {
517 case BPF_ALU64 | BPF_AND:
518 case BPF_ALU | BPF_AND:
519 emit_instr(ctx, and, dst, dst, MIPS_R_AT);
520 break;
521 case BPF_ALU64 | BPF_OR:
522 case BPF_ALU | BPF_OR:
523 emit_instr(ctx, or, dst, dst, MIPS_R_AT);
524 break;
525 case BPF_ALU64 | BPF_XOR:
526 case BPF_ALU | BPF_XOR:
527 emit_instr(ctx, xor, dst, dst, MIPS_R_AT);
528 break;
529 case BPF_ALU64 | BPF_ADD:
530 emit_instr(ctx, daddu, dst, dst, MIPS_R_AT);
531 break;
532 case BPF_ALU64 | BPF_SUB:
533 emit_instr(ctx, dsubu, dst, dst, MIPS_R_AT);
534 break;
535 case BPF_ALU | BPF_ADD:
536 emit_instr(ctx, addu, dst, dst, MIPS_R_AT);
537 break;
538 case BPF_ALU | BPF_SUB:
539 emit_instr(ctx, subu, dst, dst, MIPS_R_AT);
540 break;
541 default:
542 return -EINVAL;
543 }
544 }
545 }
546
547 return 0;
548}
549
550static void * __must_check
551ool_skb_header_pointer(const struct sk_buff *skb, int offset,
552 int len, void *buffer)
553{
554 return skb_header_pointer(skb, offset, len, buffer);
555}
556
557static int size_to_len(const struct bpf_insn *insn)
558{
559 switch (BPF_SIZE(insn->code)) {
560 case BPF_B:
561 return 1;
562 case BPF_H:
563 return 2;
564 case BPF_W:
565 return 4;
566 case BPF_DW:
567 return 8;
568 }
569 return 0;
570}
571
572static void emit_const_to_reg(struct jit_ctx *ctx, int dst, u64 value)
573{
574 if (value >= 0xffffffffffff8000ull || value < 0x8000ull) {
575 emit_instr(ctx, daddiu, dst, MIPS_R_ZERO, (int)value);
576 } else if (value >= 0xffffffff80000000ull ||
577 (value < 0x80000000 && value > 0xffff)) {
578 emit_instr(ctx, lui, dst, (s32)(s16)(value >> 16));
579 emit_instr(ctx, ori, dst, dst, (unsigned int)(value & 0xffff));
580 } else {
581 int i;
582 bool seen_part = false;
583 int needed_shift = 0;
584
585 for (i = 0; i < 4; i++) {
586 u64 part = (value >> (16 * (3 - i))) & 0xffff;
587
588 if (seen_part && needed_shift > 0 && (part || i == 3)) {
589 emit_instr(ctx, dsll_safe, dst, dst, needed_shift);
590 needed_shift = 0;
591 }
592 if (part) {
593 if (i == 0 || (!seen_part && i < 3 && part < 0x8000)) {
594 emit_instr(ctx, lui, dst, (s32)(s16)part);
595 needed_shift = -16;
596 } else {
597 emit_instr(ctx, ori, dst,
598 seen_part ? dst : MIPS_R_ZERO,
599 (unsigned int)part);
600 }
601 seen_part = true;
602 }
603 if (seen_part)
604 needed_shift += 16;
605 }
606 }
607}
608
609static int emit_bpf_tail_call(struct jit_ctx *ctx, int this_idx)
610{
611 int off, b_off;
612
613 ctx->flags |= EBPF_SEEN_TC;
614
615
616
617
618 off = offsetof(struct bpf_array, map.max_entries);
619 emit_instr(ctx, lwu, MIPS_R_T5, off, MIPS_R_A1);
620 emit_instr(ctx, sltu, MIPS_R_AT, MIPS_R_T5, MIPS_R_A2);
621 b_off = b_imm(this_idx + 1, ctx);
622 emit_instr(ctx, bne, MIPS_R_AT, MIPS_R_ZERO, b_off);
623
624
625
626
627
628 emit_instr(ctx, daddiu, MIPS_R_T5,
629 (ctx->flags & EBPF_TCC_IN_V1) ? MIPS_R_V1 : MIPS_R_S4, -1);
630 b_off = b_imm(this_idx + 1, ctx);
631 emit_instr(ctx, bltz, MIPS_R_T5, b_off);
632
633
634
635
636
637
638 emit_instr(ctx, dsll, MIPS_R_T8, MIPS_R_A2, 3);
639 emit_instr(ctx, daddu, MIPS_R_T8, MIPS_R_T8, MIPS_R_A1);
640 off = offsetof(struct bpf_array, ptrs);
641 emit_instr(ctx, ld, MIPS_R_AT, off, MIPS_R_T8);
642 b_off = b_imm(this_idx + 1, ctx);
643 emit_instr(ctx, beq, MIPS_R_AT, MIPS_R_ZERO, b_off);
644
645 emit_instr(ctx, nop);
646
647
648 off = offsetof(struct bpf_prog, bpf_func);
649 emit_instr(ctx, ld, MIPS_R_T9, off, MIPS_R_AT);
650
651 emit_instr(ctx, daddu, MIPS_R_V1, MIPS_R_T5, MIPS_R_ZERO);
652
653 emit_instr(ctx, daddiu, MIPS_R_T9, MIPS_R_T9, 4);
654 return build_int_epilogue(ctx, MIPS_R_T9);
655}
656
657static bool is_bad_offset(int b_off)
658{
659 return b_off > 0x1ffff || b_off < -0x20000;
660}
661
662
663static int build_one_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
664 int this_idx, int exit_idx)
665{
666 int src, dst, r, td, ts, mem_off, b_off;
667 bool need_swap, did_move, cmp_eq;
668 unsigned int target = 0;
669 u64 t64;
670 s64 t64s;
671 int bpf_op = BPF_OP(insn->code);
672
673 switch (insn->code) {
674 case BPF_ALU64 | BPF_ADD | BPF_K:
675 case BPF_ALU64 | BPF_SUB | BPF_K:
676 case BPF_ALU64 | BPF_OR | BPF_K:
677 case BPF_ALU64 | BPF_AND | BPF_K:
678 case BPF_ALU64 | BPF_LSH | BPF_K:
679 case BPF_ALU64 | BPF_RSH | BPF_K:
680 case BPF_ALU64 | BPF_XOR | BPF_K:
681 case BPF_ALU64 | BPF_ARSH | BPF_K:
682 case BPF_ALU64 | BPF_MOV | BPF_K:
683 case BPF_ALU | BPF_MOV | BPF_K:
684 case BPF_ALU | BPF_ADD | BPF_K:
685 case BPF_ALU | BPF_SUB | BPF_K:
686 case BPF_ALU | BPF_OR | BPF_K:
687 case BPF_ALU | BPF_AND | BPF_K:
688 case BPF_ALU | BPF_LSH | BPF_K:
689 case BPF_ALU | BPF_RSH | BPF_K:
690 case BPF_ALU | BPF_XOR | BPF_K:
691 case BPF_ALU | BPF_ARSH | BPF_K:
692 r = gen_imm_insn(insn, ctx, this_idx);
693 if (r < 0)
694 return r;
695 break;
696 case BPF_ALU64 | BPF_MUL | BPF_K:
697 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
698 if (dst < 0)
699 return dst;
700 if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
701 emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
702 if (insn->imm == 1)
703 break;
704 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
705 emit_instr(ctx, dmultu, MIPS_R_AT, dst);
706 emit_instr(ctx, mflo, dst);
707 break;
708 case BPF_ALU64 | BPF_NEG | BPF_K:
709 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
710 if (dst < 0)
711 return dst;
712 if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
713 emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
714 emit_instr(ctx, dsubu, dst, MIPS_R_ZERO, dst);
715 break;
716 case BPF_ALU | BPF_MUL | BPF_K:
717 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
718 if (dst < 0)
719 return dst;
720 td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
721 if (td == REG_64BIT || td == REG_32BIT_ZERO_EX) {
722
723 emit_instr(ctx, sll, dst, dst, 0);
724 }
725 if (insn->imm == 1)
726 break;
727 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
728 emit_instr(ctx, multu, dst, MIPS_R_AT);
729 emit_instr(ctx, mflo, dst);
730 break;
731 case BPF_ALU | BPF_NEG | BPF_K:
732 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
733 if (dst < 0)
734 return dst;
735 td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
736 if (td == REG_64BIT || td == REG_32BIT_ZERO_EX) {
737
738 emit_instr(ctx, sll, dst, dst, 0);
739 }
740 emit_instr(ctx, subu, dst, MIPS_R_ZERO, dst);
741 break;
742 case BPF_ALU | BPF_DIV | BPF_K:
743 case BPF_ALU | BPF_MOD | BPF_K:
744 if (insn->imm == 0)
745 return -EINVAL;
746 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
747 if (dst < 0)
748 return dst;
749 td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
750 if (td == REG_64BIT || td == REG_32BIT_ZERO_EX)
751
752 emit_instr(ctx, sll, dst, dst, 0);
753 if (insn->imm == 1) {
754
755 if (bpf_op == BPF_MOD)
756 emit_instr(ctx, addu, dst, MIPS_R_ZERO, MIPS_R_ZERO);
757 break;
758 }
759 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
760 emit_instr(ctx, divu, dst, MIPS_R_AT);
761 if (bpf_op == BPF_DIV)
762 emit_instr(ctx, mflo, dst);
763 else
764 emit_instr(ctx, mfhi, dst);
765 break;
766 case BPF_ALU64 | BPF_DIV | BPF_K:
767 case BPF_ALU64 | BPF_MOD | BPF_K:
768 if (insn->imm == 0)
769 return -EINVAL;
770 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
771 if (dst < 0)
772 return dst;
773 if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
774 emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
775 if (insn->imm == 1) {
776
777 if (bpf_op == BPF_MOD)
778 emit_instr(ctx, addu, dst, MIPS_R_ZERO, MIPS_R_ZERO);
779 break;
780 }
781 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
782 emit_instr(ctx, ddivu, dst, MIPS_R_AT);
783 if (bpf_op == BPF_DIV)
784 emit_instr(ctx, mflo, dst);
785 else
786 emit_instr(ctx, mfhi, dst);
787 break;
788 case BPF_ALU64 | BPF_MOV | BPF_X:
789 case BPF_ALU64 | BPF_ADD | BPF_X:
790 case BPF_ALU64 | BPF_SUB | BPF_X:
791 case BPF_ALU64 | BPF_XOR | BPF_X:
792 case BPF_ALU64 | BPF_OR | BPF_X:
793 case BPF_ALU64 | BPF_AND | BPF_X:
794 case BPF_ALU64 | BPF_MUL | BPF_X:
795 case BPF_ALU64 | BPF_DIV | BPF_X:
796 case BPF_ALU64 | BPF_MOD | BPF_X:
797 case BPF_ALU64 | BPF_LSH | BPF_X:
798 case BPF_ALU64 | BPF_RSH | BPF_X:
799 case BPF_ALU64 | BPF_ARSH | BPF_X:
800 src = ebpf_to_mips_reg(ctx, insn, src_reg);
801 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
802 if (src < 0 || dst < 0)
803 return -EINVAL;
804 if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
805 emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
806 did_move = false;
807 if (insn->src_reg == BPF_REG_10) {
808 if (bpf_op == BPF_MOV) {
809 emit_instr(ctx, daddiu, dst, MIPS_R_SP, MAX_BPF_STACK);
810 did_move = true;
811 } else {
812 emit_instr(ctx, daddiu, MIPS_R_AT, MIPS_R_SP, MAX_BPF_STACK);
813 src = MIPS_R_AT;
814 }
815 } else if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
816 int tmp_reg = MIPS_R_AT;
817
818 if (bpf_op == BPF_MOV) {
819 tmp_reg = dst;
820 did_move = true;
821 }
822 emit_instr(ctx, daddu, tmp_reg, src, MIPS_R_ZERO);
823 emit_instr(ctx, dinsu, tmp_reg, MIPS_R_ZERO, 32, 32);
824 src = MIPS_R_AT;
825 }
826 switch (bpf_op) {
827 case BPF_MOV:
828 if (!did_move)
829 emit_instr(ctx, daddu, dst, src, MIPS_R_ZERO);
830 break;
831 case BPF_ADD:
832 emit_instr(ctx, daddu, dst, dst, src);
833 break;
834 case BPF_SUB:
835 emit_instr(ctx, dsubu, dst, dst, src);
836 break;
837 case BPF_XOR:
838 emit_instr(ctx, xor, dst, dst, src);
839 break;
840 case BPF_OR:
841 emit_instr(ctx, or, dst, dst, src);
842 break;
843 case BPF_AND:
844 emit_instr(ctx, and, dst, dst, src);
845 break;
846 case BPF_MUL:
847 emit_instr(ctx, dmultu, dst, src);
848 emit_instr(ctx, mflo, dst);
849 break;
850 case BPF_DIV:
851 case BPF_MOD:
852 emit_instr(ctx, ddivu, dst, src);
853 if (bpf_op == BPF_DIV)
854 emit_instr(ctx, mflo, dst);
855 else
856 emit_instr(ctx, mfhi, dst);
857 break;
858 case BPF_LSH:
859 emit_instr(ctx, dsllv, dst, dst, src);
860 break;
861 case BPF_RSH:
862 emit_instr(ctx, dsrlv, dst, dst, src);
863 break;
864 case BPF_ARSH:
865 emit_instr(ctx, dsrav, dst, dst, src);
866 break;
867 default:
868 pr_err("ALU64_REG NOT HANDLED\n");
869 return -EINVAL;
870 }
871 break;
872 case BPF_ALU | BPF_MOV | BPF_X:
873 case BPF_ALU | BPF_ADD | BPF_X:
874 case BPF_ALU | BPF_SUB | BPF_X:
875 case BPF_ALU | BPF_XOR | BPF_X:
876 case BPF_ALU | BPF_OR | BPF_X:
877 case BPF_ALU | BPF_AND | BPF_X:
878 case BPF_ALU | BPF_MUL | BPF_X:
879 case BPF_ALU | BPF_DIV | BPF_X:
880 case BPF_ALU | BPF_MOD | BPF_X:
881 case BPF_ALU | BPF_LSH | BPF_X:
882 case BPF_ALU | BPF_RSH | BPF_X:
883 src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
884 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
885 if (src < 0 || dst < 0)
886 return -EINVAL;
887 td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
888 if (td == REG_64BIT || td == REG_32BIT_ZERO_EX) {
889
890 emit_instr(ctx, sll, dst, dst, 0);
891 }
892 did_move = false;
893 ts = get_reg_val_type(ctx, this_idx, insn->src_reg);
894 if (ts == REG_64BIT || ts == REG_32BIT_ZERO_EX) {
895 int tmp_reg = MIPS_R_AT;
896
897 if (bpf_op == BPF_MOV) {
898 tmp_reg = dst;
899 did_move = true;
900 }
901
902 emit_instr(ctx, sll, tmp_reg, src, 0);
903 src = MIPS_R_AT;
904 }
905 switch (bpf_op) {
906 case BPF_MOV:
907 if (!did_move)
908 emit_instr(ctx, addu, dst, src, MIPS_R_ZERO);
909 break;
910 case BPF_ADD:
911 emit_instr(ctx, addu, dst, dst, src);
912 break;
913 case BPF_SUB:
914 emit_instr(ctx, subu, dst, dst, src);
915 break;
916 case BPF_XOR:
917 emit_instr(ctx, xor, dst, dst, src);
918 break;
919 case BPF_OR:
920 emit_instr(ctx, or, dst, dst, src);
921 break;
922 case BPF_AND:
923 emit_instr(ctx, and, dst, dst, src);
924 break;
925 case BPF_MUL:
926 emit_instr(ctx, mul, dst, dst, src);
927 break;
928 case BPF_DIV:
929 case BPF_MOD:
930 emit_instr(ctx, divu, dst, src);
931 if (bpf_op == BPF_DIV)
932 emit_instr(ctx, mflo, dst);
933 else
934 emit_instr(ctx, mfhi, dst);
935 break;
936 case BPF_LSH:
937 emit_instr(ctx, sllv, dst, dst, src);
938 break;
939 case BPF_RSH:
940 emit_instr(ctx, srlv, dst, dst, src);
941 break;
942 default:
943 pr_err("ALU_REG NOT HANDLED\n");
944 return -EINVAL;
945 }
946 break;
947 case BPF_JMP | BPF_EXIT:
948 if (this_idx + 1 < exit_idx) {
949 b_off = b_imm(exit_idx, ctx);
950 if (is_bad_offset(b_off))
951 return -E2BIG;
952 emit_instr(ctx, beq, MIPS_R_ZERO, MIPS_R_ZERO, b_off);
953 emit_instr(ctx, nop);
954 }
955 break;
956 case BPF_JMP | BPF_JEQ | BPF_K:
957 case BPF_JMP | BPF_JNE | BPF_K:
958 cmp_eq = (bpf_op == BPF_JEQ);
959 dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
960 if (dst < 0)
961 return dst;
962 if (insn->imm == 0) {
963 src = MIPS_R_ZERO;
964 } else {
965 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
966 src = MIPS_R_AT;
967 }
968 goto jeq_common;
969 case BPF_JMP | BPF_JEQ | BPF_X:
970 case BPF_JMP | BPF_JNE | BPF_X:
971 case BPF_JMP | BPF_JSLT | BPF_X:
972 case BPF_JMP | BPF_JSLE | BPF_X:
973 case BPF_JMP | BPF_JSGT | BPF_X:
974 case BPF_JMP | BPF_JSGE | BPF_X:
975 case BPF_JMP | BPF_JLT | BPF_X:
976 case BPF_JMP | BPF_JLE | BPF_X:
977 case BPF_JMP | BPF_JGT | BPF_X:
978 case BPF_JMP | BPF_JGE | BPF_X:
979 case BPF_JMP | BPF_JSET | BPF_X:
980 src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
981 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
982 if (src < 0 || dst < 0)
983 return -EINVAL;
984 td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
985 ts = get_reg_val_type(ctx, this_idx, insn->src_reg);
986 if (td == REG_32BIT && ts != REG_32BIT) {
987 emit_instr(ctx, sll, MIPS_R_AT, src, 0);
988 src = MIPS_R_AT;
989 } else if (ts == REG_32BIT && td != REG_32BIT) {
990 emit_instr(ctx, sll, MIPS_R_AT, dst, 0);
991 dst = MIPS_R_AT;
992 }
993 if (bpf_op == BPF_JSET) {
994 emit_instr(ctx, and, MIPS_R_AT, dst, src);
995 cmp_eq = false;
996 dst = MIPS_R_AT;
997 src = MIPS_R_ZERO;
998 } else if (bpf_op == BPF_JSGT || bpf_op == BPF_JSLE) {
999 emit_instr(ctx, dsubu, MIPS_R_AT, dst, src);
1000 if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1001 b_off = b_imm(exit_idx, ctx);
1002 if (is_bad_offset(b_off))
1003 return -E2BIG;
1004 if (bpf_op == BPF_JSGT)
1005 emit_instr(ctx, blez, MIPS_R_AT, b_off);
1006 else
1007 emit_instr(ctx, bgtz, MIPS_R_AT, b_off);
1008 emit_instr(ctx, nop);
1009 return 2;
1010 }
1011 b_off = b_imm(this_idx + insn->off + 1, ctx);
1012 if (is_bad_offset(b_off))
1013 return -E2BIG;
1014 if (bpf_op == BPF_JSGT)
1015 emit_instr(ctx, bgtz, MIPS_R_AT, b_off);
1016 else
1017 emit_instr(ctx, blez, MIPS_R_AT, b_off);
1018 emit_instr(ctx, nop);
1019 break;
1020 } else if (bpf_op == BPF_JSGE || bpf_op == BPF_JSLT) {
1021 emit_instr(ctx, slt, MIPS_R_AT, dst, src);
1022 cmp_eq = bpf_op == BPF_JSGE;
1023 dst = MIPS_R_AT;
1024 src = MIPS_R_ZERO;
1025 } else if (bpf_op == BPF_JGT || bpf_op == BPF_JLE) {
1026
1027 emit_instr(ctx, dsubu, MIPS_R_T8, dst, src);
1028 emit_instr(ctx, sltu, MIPS_R_AT, dst, src);
1029
1030 emit_instr(ctx, movz, MIPS_R_T9, MIPS_R_SP, MIPS_R_T8);
1031 emit_instr(ctx, movn, MIPS_R_T9, MIPS_R_ZERO, MIPS_R_T8);
1032 emit_instr(ctx, or, MIPS_R_AT, MIPS_R_T9, MIPS_R_AT);
1033 cmp_eq = bpf_op == BPF_JGT;
1034 dst = MIPS_R_AT;
1035 src = MIPS_R_ZERO;
1036 } else if (bpf_op == BPF_JGE || bpf_op == BPF_JLT) {
1037 emit_instr(ctx, sltu, MIPS_R_AT, dst, src);
1038 cmp_eq = bpf_op == BPF_JGE;
1039 dst = MIPS_R_AT;
1040 src = MIPS_R_ZERO;
1041 } else {
1042 cmp_eq = (bpf_op == BPF_JEQ);
1043 }
1044jeq_common:
1045
1046
1047
1048
1049
1050
1051 if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1052 b_off = b_imm(exit_idx, ctx);
1053 if (is_bad_offset(b_off)) {
1054 target = j_target(ctx, exit_idx);
1055 if (target == (unsigned int)-1)
1056 return -E2BIG;
1057 cmp_eq = !cmp_eq;
1058 b_off = 4 * 3;
1059 if (!(ctx->offsets[this_idx] & OFFSETS_B_CONV)) {
1060 ctx->offsets[this_idx] |= OFFSETS_B_CONV;
1061 ctx->long_b_conversion = 1;
1062 }
1063 }
1064
1065 if (cmp_eq)
1066 emit_instr(ctx, bne, dst, src, b_off);
1067 else
1068 emit_instr(ctx, beq, dst, src, b_off);
1069 emit_instr(ctx, nop);
1070 if (ctx->offsets[this_idx] & OFFSETS_B_CONV) {
1071 emit_instr(ctx, j, target);
1072 emit_instr(ctx, nop);
1073 }
1074 return 2;
1075 }
1076 b_off = b_imm(this_idx + insn->off + 1, ctx);
1077 if (is_bad_offset(b_off)) {
1078 target = j_target(ctx, this_idx + insn->off + 1);
1079 if (target == (unsigned int)-1)
1080 return -E2BIG;
1081 cmp_eq = !cmp_eq;
1082 b_off = 4 * 3;
1083 if (!(ctx->offsets[this_idx] & OFFSETS_B_CONV)) {
1084 ctx->offsets[this_idx] |= OFFSETS_B_CONV;
1085 ctx->long_b_conversion = 1;
1086 }
1087 }
1088
1089 if (cmp_eq)
1090 emit_instr(ctx, beq, dst, src, b_off);
1091 else
1092 emit_instr(ctx, bne, dst, src, b_off);
1093 emit_instr(ctx, nop);
1094 if (ctx->offsets[this_idx] & OFFSETS_B_CONV) {
1095 emit_instr(ctx, j, target);
1096 emit_instr(ctx, nop);
1097 }
1098 break;
1099 case BPF_JMP | BPF_JSGT | BPF_K:
1100 case BPF_JMP | BPF_JSGE | BPF_K:
1101 case BPF_JMP | BPF_JSLT | BPF_K:
1102 case BPF_JMP | BPF_JSLE | BPF_K:
1103 cmp_eq = (bpf_op == BPF_JSGE);
1104 dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
1105 if (dst < 0)
1106 return dst;
1107
1108 if (insn->imm == 0) {
1109 if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1110 b_off = b_imm(exit_idx, ctx);
1111 if (is_bad_offset(b_off))
1112 return -E2BIG;
1113 switch (bpf_op) {
1114 case BPF_JSGT:
1115 emit_instr(ctx, blez, dst, b_off);
1116 break;
1117 case BPF_JSGE:
1118 emit_instr(ctx, bltz, dst, b_off);
1119 break;
1120 case BPF_JSLT:
1121 emit_instr(ctx, bgez, dst, b_off);
1122 break;
1123 case BPF_JSLE:
1124 emit_instr(ctx, bgtz, dst, b_off);
1125 break;
1126 }
1127 emit_instr(ctx, nop);
1128 return 2;
1129 }
1130 b_off = b_imm(this_idx + insn->off + 1, ctx);
1131 if (is_bad_offset(b_off))
1132 return -E2BIG;
1133 switch (bpf_op) {
1134 case BPF_JSGT:
1135 emit_instr(ctx, bgtz, dst, b_off);
1136 break;
1137 case BPF_JSGE:
1138 emit_instr(ctx, bgez, dst, b_off);
1139 break;
1140 case BPF_JSLT:
1141 emit_instr(ctx, bltz, dst, b_off);
1142 break;
1143 case BPF_JSLE:
1144 emit_instr(ctx, blez, dst, b_off);
1145 break;
1146 }
1147 emit_instr(ctx, nop);
1148 break;
1149 }
1150
1151
1152
1153
1154 if (bpf_op == BPF_JSGT)
1155 t64s = insn->imm + 1;
1156 else if (bpf_op == BPF_JSLE)
1157 t64s = insn->imm + 1;
1158 else
1159 t64s = insn->imm;
1160
1161 cmp_eq = bpf_op == BPF_JSGT || bpf_op == BPF_JSGE;
1162 if (t64s >= S16_MIN && t64s <= S16_MAX) {
1163 emit_instr(ctx, slti, MIPS_R_AT, dst, (int)t64s);
1164 src = MIPS_R_AT;
1165 dst = MIPS_R_ZERO;
1166 goto jeq_common;
1167 }
1168 emit_const_to_reg(ctx, MIPS_R_AT, (u64)t64s);
1169 emit_instr(ctx, slt, MIPS_R_AT, dst, MIPS_R_AT);
1170 src = MIPS_R_AT;
1171 dst = MIPS_R_ZERO;
1172 goto jeq_common;
1173
1174 case BPF_JMP | BPF_JGT | BPF_K:
1175 case BPF_JMP | BPF_JGE | BPF_K:
1176 case BPF_JMP | BPF_JLT | BPF_K:
1177 case BPF_JMP | BPF_JLE | BPF_K:
1178 cmp_eq = (bpf_op == BPF_JGE);
1179 dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
1180 if (dst < 0)
1181 return dst;
1182
1183
1184
1185
1186 if (bpf_op == BPF_JGT)
1187 t64s = (u64)(u32)(insn->imm) + 1;
1188 else if (bpf_op == BPF_JLE)
1189 t64s = (u64)(u32)(insn->imm) + 1;
1190 else
1191 t64s = (u64)(u32)(insn->imm);
1192
1193 cmp_eq = bpf_op == BPF_JGT || bpf_op == BPF_JGE;
1194
1195 emit_const_to_reg(ctx, MIPS_R_AT, (u64)t64s);
1196 emit_instr(ctx, sltu, MIPS_R_AT, dst, MIPS_R_AT);
1197 src = MIPS_R_AT;
1198 dst = MIPS_R_ZERO;
1199 goto jeq_common;
1200
1201 case BPF_JMP | BPF_JSET | BPF_K:
1202 dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
1203 if (dst < 0)
1204 return dst;
1205
1206 if (ctx->use_bbit_insns && hweight32((u32)insn->imm) == 1) {
1207 if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1208 b_off = b_imm(exit_idx, ctx);
1209 if (is_bad_offset(b_off))
1210 return -E2BIG;
1211 emit_instr(ctx, bbit0, dst, ffs((u32)insn->imm) - 1, b_off);
1212 emit_instr(ctx, nop);
1213 return 2;
1214 }
1215 b_off = b_imm(this_idx + insn->off + 1, ctx);
1216 if (is_bad_offset(b_off))
1217 return -E2BIG;
1218 emit_instr(ctx, bbit1, dst, ffs((u32)insn->imm) - 1, b_off);
1219 emit_instr(ctx, nop);
1220 break;
1221 }
1222 t64 = (u32)insn->imm;
1223 emit_const_to_reg(ctx, MIPS_R_AT, t64);
1224 emit_instr(ctx, and, MIPS_R_AT, dst, MIPS_R_AT);
1225 src = MIPS_R_AT;
1226 dst = MIPS_R_ZERO;
1227 cmp_eq = false;
1228 goto jeq_common;
1229
1230 case BPF_JMP | BPF_JA:
1231
1232
1233
1234
1235 b_off = b_imm(this_idx + insn->off + 1, ctx);
1236 if (is_bad_offset(b_off)) {
1237 target = j_target(ctx, this_idx + insn->off + 1);
1238 if (target == (unsigned int)-1)
1239 return -E2BIG;
1240 emit_instr(ctx, j, target);
1241 } else {
1242 emit_instr(ctx, b, b_off);
1243 }
1244 emit_instr(ctx, nop);
1245 break;
1246 case BPF_LD | BPF_DW | BPF_IMM:
1247 if (insn->src_reg != 0)
1248 return -EINVAL;
1249 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1250 if (dst < 0)
1251 return dst;
1252 t64 = ((u64)(u32)insn->imm) | ((u64)(insn + 1)->imm << 32);
1253 emit_const_to_reg(ctx, dst, t64);
1254 return 2;
1255
1256 case BPF_JMP | BPF_CALL:
1257 ctx->flags |= EBPF_SAVE_RA;
1258 t64s = (s64)insn->imm + (s64)__bpf_call_base;
1259 emit_const_to_reg(ctx, MIPS_R_T9, (u64)t64s);
1260 emit_instr(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
1261
1262 emit_instr(ctx, nop);
1263 break;
1264
1265 case BPF_JMP | BPF_TAIL_CALL:
1266 if (emit_bpf_tail_call(ctx, this_idx))
1267 return -EINVAL;
1268 break;
1269
1270 case BPF_LD | BPF_B | BPF_ABS:
1271 case BPF_LD | BPF_H | BPF_ABS:
1272 case BPF_LD | BPF_W | BPF_ABS:
1273 case BPF_LD | BPF_DW | BPF_ABS:
1274 ctx->flags |= EBPF_SAVE_RA;
1275
1276 gen_imm_to_reg(insn, MIPS_R_A1, ctx);
1277 emit_instr(ctx, addiu, MIPS_R_A2, MIPS_R_ZERO, size_to_len(insn));
1278
1279 if (insn->imm < 0) {
1280 emit_const_to_reg(ctx, MIPS_R_T9, (u64)bpf_internal_load_pointer_neg_helper);
1281 } else {
1282 emit_const_to_reg(ctx, MIPS_R_T9, (u64)ool_skb_header_pointer);
1283 emit_instr(ctx, daddiu, MIPS_R_A3, MIPS_R_SP, ctx->tmp_offset);
1284 }
1285 goto ld_skb_common;
1286
1287 case BPF_LD | BPF_B | BPF_IND:
1288 case BPF_LD | BPF_H | BPF_IND:
1289 case BPF_LD | BPF_W | BPF_IND:
1290 case BPF_LD | BPF_DW | BPF_IND:
1291 ctx->flags |= EBPF_SAVE_RA;
1292 src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
1293 if (src < 0)
1294 return src;
1295 ts = get_reg_val_type(ctx, this_idx, insn->src_reg);
1296 if (ts == REG_32BIT_ZERO_EX) {
1297
1298 emit_instr(ctx, sll, MIPS_R_A1, src, 0);
1299 src = MIPS_R_A1;
1300 }
1301 if (insn->imm >= S16_MIN && insn->imm <= S16_MAX) {
1302 emit_instr(ctx, daddiu, MIPS_R_A1, src, insn->imm);
1303 } else {
1304 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
1305 emit_instr(ctx, daddu, MIPS_R_A1, MIPS_R_AT, src);
1306 }
1307
1308 emit_instr(ctx, sll, MIPS_R_A1, MIPS_R_A1, 0);
1309 emit_instr(ctx, daddiu, MIPS_R_A3, MIPS_R_SP, ctx->tmp_offset);
1310 emit_instr(ctx, slt, MIPS_R_AT, MIPS_R_A1, MIPS_R_ZERO);
1311
1312 emit_const_to_reg(ctx, MIPS_R_T8, (u64)bpf_internal_load_pointer_neg_helper);
1313 emit_const_to_reg(ctx, MIPS_R_T9, (u64)ool_skb_header_pointer);
1314 emit_instr(ctx, addiu, MIPS_R_A2, MIPS_R_ZERO, size_to_len(insn));
1315 emit_instr(ctx, movn, MIPS_R_T9, MIPS_R_T8, MIPS_R_AT);
1316
1317ld_skb_common:
1318 emit_instr(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
1319
1320 emit_instr(ctx, daddu, MIPS_R_A0, MIPS_R_S0, MIPS_R_ZERO);
1321
1322
1323 b_off = b_imm(exit_idx, ctx);
1324 if (is_bad_offset(b_off)) {
1325 target = j_target(ctx, exit_idx);
1326 if (target == (unsigned int)-1)
1327 return -E2BIG;
1328
1329 if (!(ctx->offsets[this_idx] & OFFSETS_B_CONV)) {
1330 ctx->offsets[this_idx] |= OFFSETS_B_CONV;
1331 ctx->long_b_conversion = 1;
1332 }
1333 emit_instr(ctx, bne, MIPS_R_V0, MIPS_R_ZERO, 4 * 3);
1334 emit_instr(ctx, nop);
1335 emit_instr(ctx, j, target);
1336 emit_instr(ctx, nop);
1337 } else {
1338 emit_instr(ctx, beq, MIPS_R_V0, MIPS_R_ZERO, b_off);
1339 emit_instr(ctx, nop);
1340 }
1341
1342#ifdef __BIG_ENDIAN
1343 need_swap = false;
1344#else
1345 need_swap = true;
1346#endif
1347 dst = MIPS_R_V0;
1348 switch (BPF_SIZE(insn->code)) {
1349 case BPF_B:
1350 emit_instr(ctx, lbu, dst, 0, MIPS_R_V0);
1351 break;
1352 case BPF_H:
1353 emit_instr(ctx, lhu, dst, 0, MIPS_R_V0);
1354 if (need_swap)
1355 emit_instr(ctx, wsbh, dst, dst);
1356 break;
1357 case BPF_W:
1358 emit_instr(ctx, lw, dst, 0, MIPS_R_V0);
1359 if (need_swap) {
1360 emit_instr(ctx, wsbh, dst, dst);
1361 emit_instr(ctx, rotr, dst, dst, 16);
1362 }
1363 break;
1364 case BPF_DW:
1365 emit_instr(ctx, ld, dst, 0, MIPS_R_V0);
1366 if (need_swap) {
1367 emit_instr(ctx, dsbh, dst, dst);
1368 emit_instr(ctx, dshd, dst, dst);
1369 }
1370 break;
1371 }
1372
1373 break;
1374 case BPF_ALU | BPF_END | BPF_FROM_BE:
1375 case BPF_ALU | BPF_END | BPF_FROM_LE:
1376 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1377 if (dst < 0)
1378 return dst;
1379 td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
1380 if (insn->imm == 64 && td == REG_32BIT)
1381 emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
1382
1383 if (insn->imm != 64 &&
1384 (td == REG_64BIT || td == REG_32BIT_ZERO_EX)) {
1385
1386 emit_instr(ctx, sll, dst, dst, 0);
1387 }
1388
1389#ifdef __BIG_ENDIAN
1390 need_swap = (BPF_SRC(insn->code) == BPF_FROM_LE);
1391#else
1392 need_swap = (BPF_SRC(insn->code) == BPF_FROM_BE);
1393#endif
1394 if (insn->imm == 16) {
1395 if (need_swap)
1396 emit_instr(ctx, wsbh, dst, dst);
1397 emit_instr(ctx, andi, dst, dst, 0xffff);
1398 } else if (insn->imm == 32) {
1399 if (need_swap) {
1400 emit_instr(ctx, wsbh, dst, dst);
1401 emit_instr(ctx, rotr, dst, dst, 16);
1402 }
1403 } else {
1404 if (need_swap) {
1405 emit_instr(ctx, dsbh, dst, dst);
1406 emit_instr(ctx, dshd, dst, dst);
1407 }
1408 }
1409 break;
1410
1411 case BPF_ST | BPF_B | BPF_MEM:
1412 case BPF_ST | BPF_H | BPF_MEM:
1413 case BPF_ST | BPF_W | BPF_MEM:
1414 case BPF_ST | BPF_DW | BPF_MEM:
1415 if (insn->dst_reg == BPF_REG_10) {
1416 ctx->flags |= EBPF_SEEN_FP;
1417 dst = MIPS_R_SP;
1418 mem_off = insn->off + MAX_BPF_STACK;
1419 } else {
1420 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1421 if (dst < 0)
1422 return dst;
1423 mem_off = insn->off;
1424 }
1425 gen_imm_to_reg(insn, MIPS_R_AT, ctx);
1426 switch (BPF_SIZE(insn->code)) {
1427 case BPF_B:
1428 emit_instr(ctx, sb, MIPS_R_AT, mem_off, dst);
1429 break;
1430 case BPF_H:
1431 emit_instr(ctx, sh, MIPS_R_AT, mem_off, dst);
1432 break;
1433 case BPF_W:
1434 emit_instr(ctx, sw, MIPS_R_AT, mem_off, dst);
1435 break;
1436 case BPF_DW:
1437 emit_instr(ctx, sd, MIPS_R_AT, mem_off, dst);
1438 break;
1439 }
1440 break;
1441
1442 case BPF_LDX | BPF_B | BPF_MEM:
1443 case BPF_LDX | BPF_H | BPF_MEM:
1444 case BPF_LDX | BPF_W | BPF_MEM:
1445 case BPF_LDX | BPF_DW | BPF_MEM:
1446 if (insn->src_reg == BPF_REG_10) {
1447 ctx->flags |= EBPF_SEEN_FP;
1448 src = MIPS_R_SP;
1449 mem_off = insn->off + MAX_BPF_STACK;
1450 } else {
1451 src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
1452 if (src < 0)
1453 return src;
1454 mem_off = insn->off;
1455 }
1456 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1457 if (dst < 0)
1458 return dst;
1459 switch (BPF_SIZE(insn->code)) {
1460 case BPF_B:
1461 emit_instr(ctx, lbu, dst, mem_off, src);
1462 break;
1463 case BPF_H:
1464 emit_instr(ctx, lhu, dst, mem_off, src);
1465 break;
1466 case BPF_W:
1467 emit_instr(ctx, lw, dst, mem_off, src);
1468 break;
1469 case BPF_DW:
1470 emit_instr(ctx, ld, dst, mem_off, src);
1471 break;
1472 }
1473 break;
1474
1475 case BPF_STX | BPF_B | BPF_MEM:
1476 case BPF_STX | BPF_H | BPF_MEM:
1477 case BPF_STX | BPF_W | BPF_MEM:
1478 case BPF_STX | BPF_DW | BPF_MEM:
1479 case BPF_STX | BPF_W | BPF_XADD:
1480 case BPF_STX | BPF_DW | BPF_XADD:
1481 if (insn->dst_reg == BPF_REG_10) {
1482 ctx->flags |= EBPF_SEEN_FP;
1483 dst = MIPS_R_SP;
1484 mem_off = insn->off + MAX_BPF_STACK;
1485 } else {
1486 dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1487 if (dst < 0)
1488 return dst;
1489 mem_off = insn->off;
1490 }
1491 src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
1492 if (src < 0)
1493 return src;
1494 if (BPF_MODE(insn->code) == BPF_XADD) {
1495 switch (BPF_SIZE(insn->code)) {
1496 case BPF_W:
1497 if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
1498 emit_instr(ctx, sll, MIPS_R_AT, src, 0);
1499 src = MIPS_R_AT;
1500 }
1501 emit_instr(ctx, ll, MIPS_R_T8, mem_off, dst);
1502 emit_instr(ctx, addu, MIPS_R_T8, MIPS_R_T8, src);
1503 emit_instr(ctx, sc, MIPS_R_T8, mem_off, dst);
1504
1505
1506
1507
1508 emit_instr(ctx, beq, MIPS_R_T8, MIPS_R_ZERO, -4 * 4);
1509 emit_instr(ctx, nop);
1510 break;
1511 case BPF_DW:
1512 if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
1513 emit_instr(ctx, daddu, MIPS_R_AT, src, MIPS_R_ZERO);
1514 emit_instr(ctx, dinsu, MIPS_R_AT, MIPS_R_ZERO, 32, 32);
1515 src = MIPS_R_AT;
1516 }
1517 emit_instr(ctx, lld, MIPS_R_T8, mem_off, dst);
1518 emit_instr(ctx, daddu, MIPS_R_T8, MIPS_R_T8, src);
1519 emit_instr(ctx, scd, MIPS_R_T8, mem_off, dst);
1520 emit_instr(ctx, beq, MIPS_R_T8, MIPS_R_ZERO, -4 * 4);
1521 emit_instr(ctx, nop);
1522 break;
1523 }
1524 } else {
1525 switch (BPF_SIZE(insn->code)) {
1526 case BPF_B:
1527 emit_instr(ctx, sb, src, mem_off, dst);
1528 break;
1529 case BPF_H:
1530 emit_instr(ctx, sh, src, mem_off, dst);
1531 break;
1532 case BPF_W:
1533 emit_instr(ctx, sw, src, mem_off, dst);
1534 break;
1535 case BPF_DW:
1536 if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
1537 emit_instr(ctx, daddu, MIPS_R_AT, src, MIPS_R_ZERO);
1538 emit_instr(ctx, dinsu, MIPS_R_AT, MIPS_R_ZERO, 32, 32);
1539 src = MIPS_R_AT;
1540 }
1541 emit_instr(ctx, sd, src, mem_off, dst);
1542 break;
1543 }
1544 }
1545 break;
1546
1547 default:
1548 pr_err("NOT HANDLED %d - (%02x)\n",
1549 this_idx, (unsigned int)insn->code);
1550 return -EINVAL;
1551 }
1552 return 1;
1553}
1554
1555#define RVT_VISITED_MASK 0xc000000000000000ull
1556#define RVT_FALL_THROUGH 0x4000000000000000ull
1557#define RVT_BRANCH_TAKEN 0x8000000000000000ull
1558#define RVT_DONE (RVT_FALL_THROUGH | RVT_BRANCH_TAKEN)
1559
1560static int build_int_body(struct jit_ctx *ctx)
1561{
1562 const struct bpf_prog *prog = ctx->skf;
1563 const struct bpf_insn *insn;
1564 int i, r;
1565
1566 for (i = 0; i < prog->len; ) {
1567 insn = prog->insnsi + i;
1568 if ((ctx->reg_val_types[i] & RVT_VISITED_MASK) == 0) {
1569
1570 i++;
1571 continue;
1572 }
1573
1574 if (ctx->target == NULL)
1575 ctx->offsets[i] = (ctx->offsets[i] & OFFSETS_B_CONV) | (ctx->idx * 4);
1576
1577 r = build_one_insn(insn, ctx, i, prog->len);
1578 if (r < 0)
1579 return r;
1580 i += r;
1581 }
1582
1583 if (ctx->target == NULL)
1584 ctx->offsets[i] = ctx->idx * 4;
1585
1586
1587
1588
1589
1590
1591 if (ctx->target == NULL)
1592 for (i = 0; i < prog->len; i++) {
1593 insn = prog->insnsi + i;
1594 if (insn->code == (BPF_JMP | BPF_EXIT))
1595 ctx->offsets[i] = ctx->idx * 4;
1596 }
1597 return 0;
1598}
1599
1600
1601static int reg_val_propagate_range(struct jit_ctx *ctx, u64 initial_rvt,
1602 int start_idx, bool follow_taken)
1603{
1604 const struct bpf_prog *prog = ctx->skf;
1605 const struct bpf_insn *insn;
1606 u64 exit_rvt = initial_rvt;
1607 u64 *rvt = ctx->reg_val_types;
1608 int idx;
1609 int reg;
1610
1611 for (idx = start_idx; idx < prog->len; idx++) {
1612 rvt[idx] = (rvt[idx] & RVT_VISITED_MASK) | exit_rvt;
1613 insn = prog->insnsi + idx;
1614 switch (BPF_CLASS(insn->code)) {
1615 case BPF_ALU:
1616 switch (BPF_OP(insn->code)) {
1617 case BPF_ADD:
1618 case BPF_SUB:
1619 case BPF_MUL:
1620 case BPF_DIV:
1621 case BPF_OR:
1622 case BPF_AND:
1623 case BPF_LSH:
1624 case BPF_RSH:
1625 case BPF_NEG:
1626 case BPF_MOD:
1627 case BPF_XOR:
1628 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1629 break;
1630 case BPF_MOV:
1631 if (BPF_SRC(insn->code)) {
1632 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1633 } else {
1634
1635 if (insn->imm >= 0)
1636 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1637 else
1638 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1639 }
1640 break;
1641 case BPF_END:
1642 if (insn->imm == 64)
1643 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1644 else if (insn->imm == 32)
1645 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1646 else
1647 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1648 break;
1649 }
1650 rvt[idx] |= RVT_DONE;
1651 break;
1652 case BPF_ALU64:
1653 switch (BPF_OP(insn->code)) {
1654 case BPF_MOV:
1655 if (BPF_SRC(insn->code)) {
1656
1657 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1658 } else {
1659
1660 if (insn->imm >= 0)
1661 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1662 else
1663 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT_32BIT);
1664 }
1665 break;
1666 default:
1667 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1668 }
1669 rvt[idx] |= RVT_DONE;
1670 break;
1671 case BPF_LD:
1672 switch (BPF_SIZE(insn->code)) {
1673 case BPF_DW:
1674 if (BPF_MODE(insn->code) == BPF_IMM) {
1675 s64 val;
1676
1677 val = (s64)((u32)insn->imm | ((u64)(insn + 1)->imm << 32));
1678 if (val > 0 && val <= S32_MAX)
1679 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1680 else if (val >= S32_MIN && val <= S32_MAX)
1681 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT_32BIT);
1682 else
1683 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1684 rvt[idx] |= RVT_DONE;
1685 idx++;
1686 } else {
1687 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1688 }
1689 break;
1690 case BPF_B:
1691 case BPF_H:
1692 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1693 break;
1694 case BPF_W:
1695 if (BPF_MODE(insn->code) == BPF_IMM)
1696 set_reg_val_type(&exit_rvt, insn->dst_reg,
1697 insn->imm >= 0 ? REG_32BIT_POS : REG_32BIT);
1698 else
1699 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1700 break;
1701 }
1702 rvt[idx] |= RVT_DONE;
1703 break;
1704 case BPF_LDX:
1705 switch (BPF_SIZE(insn->code)) {
1706 case BPF_DW:
1707 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1708 break;
1709 case BPF_B:
1710 case BPF_H:
1711 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1712 break;
1713 case BPF_W:
1714 set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1715 break;
1716 }
1717 rvt[idx] |= RVT_DONE;
1718 break;
1719 case BPF_JMP:
1720 switch (BPF_OP(insn->code)) {
1721 case BPF_EXIT:
1722 rvt[idx] = RVT_DONE | exit_rvt;
1723 rvt[prog->len] = exit_rvt;
1724 return idx;
1725 case BPF_JA:
1726 rvt[idx] |= RVT_DONE;
1727 idx += insn->off;
1728 break;
1729 case BPF_JEQ:
1730 case BPF_JGT:
1731 case BPF_JGE:
1732 case BPF_JLT:
1733 case BPF_JLE:
1734 case BPF_JSET:
1735 case BPF_JNE:
1736 case BPF_JSGT:
1737 case BPF_JSGE:
1738 case BPF_JSLT:
1739 case BPF_JSLE:
1740 if (follow_taken) {
1741 rvt[idx] |= RVT_BRANCH_TAKEN;
1742 idx += insn->off;
1743 follow_taken = false;
1744 } else {
1745 rvt[idx] |= RVT_FALL_THROUGH;
1746 }
1747 break;
1748 case BPF_CALL:
1749 set_reg_val_type(&exit_rvt, BPF_REG_0, REG_64BIT);
1750
1751 for (reg = BPF_REG_0; reg <= BPF_REG_5; reg++)
1752 set_reg_val_type(&exit_rvt, reg, REG_64BIT);
1753
1754 rvt[idx] |= RVT_DONE;
1755 break;
1756 default:
1757 WARN(1, "Unhandled BPF_JMP case.\n");
1758 rvt[idx] |= RVT_DONE;
1759 break;
1760 }
1761 break;
1762 default:
1763 rvt[idx] |= RVT_DONE;
1764 break;
1765 }
1766 }
1767 return idx;
1768}
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778static int reg_val_propagate(struct jit_ctx *ctx)
1779{
1780 const struct bpf_prog *prog = ctx->skf;
1781 u64 exit_rvt;
1782 int reg;
1783 int i;
1784
1785
1786
1787
1788
1789 exit_rvt = 0;
1790
1791
1792 for (reg = BPF_REG_1; reg <= BPF_REG_5; reg++)
1793 set_reg_val_type(&exit_rvt, reg, REG_64BIT);
1794
1795
1796
1797
1798
1799 reg_val_propagate_range(ctx, exit_rvt, 0, false);
1800restart_search:
1801
1802
1803
1804
1805
1806
1807 for (i = 0; i < prog->len; i++) {
1808 u64 rvt = ctx->reg_val_types[i];
1809
1810 if ((rvt & RVT_VISITED_MASK) == RVT_DONE ||
1811 (rvt & RVT_VISITED_MASK) == 0)
1812 continue;
1813 if ((rvt & RVT_VISITED_MASK) == RVT_FALL_THROUGH) {
1814 reg_val_propagate_range(ctx, rvt & ~RVT_VISITED_MASK, i, true);
1815 } else {
1816 WARN(1, "Unexpected RVT_BRANCH_TAKEN case.\n");
1817 reg_val_propagate_range(ctx, rvt & ~RVT_VISITED_MASK, i, false);
1818 }
1819 goto restart_search;
1820 }
1821
1822
1823
1824
1825
1826
1827 return 0;
1828}
1829
1830static void jit_fill_hole(void *area, unsigned int size)
1831{
1832 u32 *p;
1833
1834
1835 for (p = area; size >= sizeof(u32); size -= sizeof(u32))
1836 uasm_i_break(&p, BRK_BUG);
1837}
1838
1839struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
1840{
1841 struct bpf_prog *orig_prog = prog;
1842 bool tmp_blinded = false;
1843 struct bpf_prog *tmp;
1844 struct bpf_binary_header *header = NULL;
1845 struct jit_ctx ctx;
1846 unsigned int image_size;
1847 u8 *image_ptr;
1848
1849 if (!prog->jit_requested || !cpu_has_mips64r2)
1850 return prog;
1851
1852 tmp = bpf_jit_blind_constants(prog);
1853
1854
1855
1856 if (IS_ERR(tmp))
1857 return orig_prog;
1858 if (tmp != prog) {
1859 tmp_blinded = true;
1860 prog = tmp;
1861 }
1862
1863 memset(&ctx, 0, sizeof(ctx));
1864
1865 preempt_disable();
1866 switch (current_cpu_type()) {
1867 case CPU_CAVIUM_OCTEON:
1868 case CPU_CAVIUM_OCTEON_PLUS:
1869 case CPU_CAVIUM_OCTEON2:
1870 case CPU_CAVIUM_OCTEON3:
1871 ctx.use_bbit_insns = 1;
1872 break;
1873 default:
1874 ctx.use_bbit_insns = 0;
1875 }
1876 preempt_enable();
1877
1878 ctx.offsets = kcalloc(prog->len + 1, sizeof(*ctx.offsets), GFP_KERNEL);
1879 if (ctx.offsets == NULL)
1880 goto out_err;
1881
1882 ctx.reg_val_types = kcalloc(prog->len + 1, sizeof(*ctx.reg_val_types), GFP_KERNEL);
1883 if (ctx.reg_val_types == NULL)
1884 goto out_err;
1885
1886 ctx.skf = prog;
1887
1888 if (reg_val_propagate(&ctx))
1889 goto out_err;
1890
1891
1892
1893
1894
1895 if (build_int_body(&ctx))
1896 goto out_err;
1897
1898
1899
1900
1901
1902 if (ctx.flags & EBPF_SEEN_TC) {
1903 if (ctx.flags & EBPF_SAVE_RA)
1904 ctx.flags |= EBPF_SAVE_S4;
1905 else
1906 ctx.flags |= EBPF_TCC_IN_V1;
1907 }
1908
1909
1910
1911
1912
1913
1914
1915
1916 do {
1917 ctx.idx = 0;
1918 ctx.gen_b_offsets = 1;
1919 ctx.long_b_conversion = 0;
1920 if (gen_int_prologue(&ctx))
1921 goto out_err;
1922 if (build_int_body(&ctx))
1923 goto out_err;
1924 if (build_int_epilogue(&ctx, MIPS_R_RA))
1925 goto out_err;
1926 } while (ctx.long_b_conversion);
1927
1928 image_size = 4 * ctx.idx;
1929
1930 header = bpf_jit_binary_alloc(image_size, &image_ptr,
1931 sizeof(u32), jit_fill_hole);
1932 if (header == NULL)
1933 goto out_err;
1934
1935 ctx.target = (u32 *)image_ptr;
1936
1937
1938 ctx.idx = 0;
1939 if (gen_int_prologue(&ctx))
1940 goto out_err;
1941 if (build_int_body(&ctx))
1942 goto out_err;
1943 if (build_int_epilogue(&ctx, MIPS_R_RA))
1944 goto out_err;
1945
1946
1947 flush_icache_range((unsigned long)ctx.target,
1948 (unsigned long)(ctx.target + ctx.idx * sizeof(u32)));
1949
1950 if (bpf_jit_enable > 1)
1951
1952 bpf_jit_dump(prog->len, image_size, 2, ctx.target);
1953
1954 bpf_jit_binary_lock_ro(header);
1955 prog->bpf_func = (void *)ctx.target;
1956 prog->jited = 1;
1957 prog->jited_len = image_size;
1958out_normal:
1959 if (tmp_blinded)
1960 bpf_jit_prog_release_other(prog, prog == orig_prog ?
1961 tmp : orig_prog);
1962 kfree(ctx.offsets);
1963 kfree(ctx.reg_val_types);
1964
1965 return prog;
1966
1967out_err:
1968 prog = orig_prog;
1969 if (header)
1970 bpf_jit_binary_free(header);
1971 goto out_normal;
1972}
1973