blob: 2b2f3c3335cef92656c9ab22591b8c99fd84e66e [file] [log] [blame]
David S. Miller7a12b502017-04-17 18:44:36 -07001#include <linux/moduleloader.h>
2#include <linux/workqueue.h>
3#include <linux/netdevice.h>
4#include <linux/filter.h>
5#include <linux/bpf.h>
6#include <linux/cache.h>
7#include <linux/if_vlan.h>
8
9#include <asm/cacheflush.h>
10#include <asm/ptrace.h>
11
12#include "bpf_jit_64.h"
13
14int bpf_jit_enable __read_mostly;
15
16static inline bool is_simm13(unsigned int value)
17{
18 return value + 0x1000 < 0x2000;
19}
20
David S. Millere3a724e2017-04-24 15:56:21 -070021static inline bool is_simm10(unsigned int value)
22{
23 return value + 0x200 < 0x400;
24}
25
26static inline bool is_simm5(unsigned int value)
27{
28 return value + 0x10 < 0x20;
29}
30
David S. Miller7a12b502017-04-17 18:44:36 -070031static void bpf_flush_icache(void *start_, void *end_)
32{
33 /* Cheetah's I-cache is fully coherent. */
34 if (tlb_type == spitfire) {
35 unsigned long start = (unsigned long) start_;
36 unsigned long end = (unsigned long) end_;
37
38 start &= ~7UL;
39 end = (end + 7UL) & ~7UL;
40 while (start < end) {
41 flushi(start);
42 start += 32;
43 }
44 }
45}
46
47#define SEEN_DATAREF 1 /* might call external helpers */
48#define SEEN_XREG 2 /* ebx is used */
49#define SEEN_MEM 4 /* use mem[] for temporary storage */
50
51#define S13(X) ((X) & 0x1fff)
David S. Millere3a724e2017-04-24 15:56:21 -070052#define S5(X) ((X) & 0x1f)
David S. Miller7a12b502017-04-17 18:44:36 -070053#define IMMED 0x00002000
54#define RD(X) ((X) << 25)
55#define RS1(X) ((X) << 14)
56#define RS2(X) ((X))
57#define OP(X) ((X) << 30)
58#define OP2(X) ((X) << 22)
59#define OP3(X) ((X) << 19)
David S. Millere3a724e2017-04-24 15:56:21 -070060#define COND(X) (((X) & 0xf) << 25)
61#define CBCOND(X) (((X) & 0x1f) << 25)
David S. Miller7a12b502017-04-17 18:44:36 -070062#define F1(X) OP(X)
63#define F2(X, Y) (OP(X) | OP2(Y))
64#define F3(X, Y) (OP(X) | OP3(Y))
65#define ASI(X) (((X) & 0xff) << 5)
66
67#define CONDN COND(0x0)
68#define CONDE COND(0x1)
69#define CONDLE COND(0x2)
70#define CONDL COND(0x3)
71#define CONDLEU COND(0x4)
72#define CONDCS COND(0x5)
73#define CONDNEG COND(0x6)
74#define CONDVC COND(0x7)
75#define CONDA COND(0x8)
76#define CONDNE COND(0x9)
77#define CONDG COND(0xa)
78#define CONDGE COND(0xb)
79#define CONDGU COND(0xc)
80#define CONDCC COND(0xd)
81#define CONDPOS COND(0xe)
82#define CONDVS COND(0xf)
83
84#define CONDGEU CONDCC
85#define CONDLU CONDCS
86
87#define WDISP22(X) (((X) >> 2) & 0x3fffff)
88#define WDISP19(X) (((X) >> 2) & 0x7ffff)
89
David S. Millere3a724e2017-04-24 15:56:21 -070090/* The 10-bit branch displacement for CBCOND is split into two fields */
91static u32 WDISP10(u32 off)
92{
93 u32 ret = ((off >> 2) & 0xff) << 5;
94
95 ret |= ((off >> (2 + 8)) & 0x03) << 19;
96
97 return ret;
98}
99
100#define CBCONDE CBCOND(0x09)
101#define CBCONDLE CBCOND(0x0a)
102#define CBCONDL CBCOND(0x0b)
103#define CBCONDLEU CBCOND(0x0c)
104#define CBCONDCS CBCOND(0x0d)
105#define CBCONDN CBCOND(0x0e)
106#define CBCONDVS CBCOND(0x0f)
107#define CBCONDNE CBCOND(0x19)
108#define CBCONDG CBCOND(0x1a)
109#define CBCONDGE CBCOND(0x1b)
110#define CBCONDGU CBCOND(0x1c)
111#define CBCONDCC CBCOND(0x1d)
112#define CBCONDPOS CBCOND(0x1e)
113#define CBCONDVC CBCOND(0x1f)
114
115#define CBCONDGEU CBCONDCC
116#define CBCONDLU CBCONDCS
117
David S. Miller7a12b502017-04-17 18:44:36 -0700118#define ANNUL (1 << 29)
119#define XCC (1 << 21)
120
121#define BRANCH (F2(0, 1) | XCC)
David S. Millere3a724e2017-04-24 15:56:21 -0700122#define CBCOND_OP (F2(0, 3) | XCC)
David S. Miller7a12b502017-04-17 18:44:36 -0700123
124#define BA (BRANCH | CONDA)
125#define BG (BRANCH | CONDG)
126#define BGU (BRANCH | CONDGU)
127#define BLEU (BRANCH | CONDLEU)
128#define BGE (BRANCH | CONDGE)
129#define BGEU (BRANCH | CONDGEU)
130#define BLU (BRANCH | CONDLU)
131#define BE (BRANCH | CONDE)
132#define BNE (BRANCH | CONDNE)
133
134#define SETHI(K, REG) \
135 (F2(0, 0x4) | RD(REG) | (((K) >> 10) & 0x3fffff))
136#define OR_LO(K, REG) \
137 (F3(2, 0x02) | IMMED | RS1(REG) | ((K) & 0x3ff) | RD(REG))
138
139#define ADD F3(2, 0x00)
140#define AND F3(2, 0x01)
141#define ANDCC F3(2, 0x11)
142#define OR F3(2, 0x02)
143#define XOR F3(2, 0x03)
144#define SUB F3(2, 0x04)
145#define SUBCC F3(2, 0x14)
146#define MUL F3(2, 0x0a)
147#define MULX F3(2, 0x09)
148#define UDIVX F3(2, 0x0d)
149#define DIV F3(2, 0x0e)
150#define SLL F3(2, 0x25)
151#define SLLX (F3(2, 0x25)|(1<<12))
152#define SRA F3(2, 0x27)
153#define SRAX (F3(2, 0x27)|(1<<12))
154#define SRL F3(2, 0x26)
155#define SRLX (F3(2, 0x26)|(1<<12))
156#define JMPL F3(2, 0x38)
157#define SAVE F3(2, 0x3c)
158#define RESTORE F3(2, 0x3d)
159#define CALL F1(1)
160#define BR F2(0, 0x01)
161#define RD_Y F3(2, 0x28)
162#define WR_Y F3(2, 0x30)
163
164#define LD32 F3(3, 0x00)
165#define LD8 F3(3, 0x01)
166#define LD16 F3(3, 0x02)
167#define LD64 F3(3, 0x0b)
168#define LD64A F3(3, 0x1b)
169#define ST8 F3(3, 0x05)
170#define ST16 F3(3, 0x06)
171#define ST32 F3(3, 0x04)
172#define ST64 F3(3, 0x0e)
173
174#define CAS F3(3, 0x3c)
175#define CASX F3(3, 0x3e)
176
177#define LDPTR LD64
178#define BASE_STACKFRAME 176
179
180#define LD32I (LD32 | IMMED)
181#define LD8I (LD8 | IMMED)
182#define LD16I (LD16 | IMMED)
183#define LD64I (LD64 | IMMED)
184#define LDPTRI (LDPTR | IMMED)
185#define ST32I (ST32 | IMMED)
186
187struct jit_ctx {
188 struct bpf_prog *prog;
189 unsigned int *offset;
190 int idx;
191 int epilogue_offset;
192 bool tmp_1_used;
193 bool tmp_2_used;
194 bool tmp_3_used;
195 bool saw_ld_abs_ind;
196 bool saw_frame_pointer;
197 bool saw_call;
198 bool saw_tail_call;
199 u32 *image;
200};
201
202#define TMP_REG_1 (MAX_BPF_JIT_REG + 0)
203#define TMP_REG_2 (MAX_BPF_JIT_REG + 1)
204#define SKB_HLEN_REG (MAX_BPF_JIT_REG + 2)
205#define SKB_DATA_REG (MAX_BPF_JIT_REG + 3)
206#define TMP_REG_3 (MAX_BPF_JIT_REG + 4)
207
208/* Map BPF registers to SPARC registers */
209static const int bpf2sparc[] = {
210 /* return value from in-kernel function, and exit value from eBPF */
211 [BPF_REG_0] = O5,
212
213 /* arguments from eBPF program to in-kernel function */
214 [BPF_REG_1] = O0,
215 [BPF_REG_2] = O1,
216 [BPF_REG_3] = O2,
217 [BPF_REG_4] = O3,
218 [BPF_REG_5] = O4,
219
220 /* callee saved registers that in-kernel function will preserve */
221 [BPF_REG_6] = L0,
222 [BPF_REG_7] = L1,
223 [BPF_REG_8] = L2,
224 [BPF_REG_9] = L3,
225
226 /* read-only frame pointer to access stack */
227 [BPF_REG_FP] = L6,
228
229 [BPF_REG_AX] = G7,
230
231 /* temporary register for internal BPF JIT */
232 [TMP_REG_1] = G1,
233 [TMP_REG_2] = G2,
234 [TMP_REG_3] = G3,
235
236 [SKB_HLEN_REG] = L4,
237 [SKB_DATA_REG] = L5,
238};
239
240static void emit(const u32 insn, struct jit_ctx *ctx)
241{
242 if (ctx->image != NULL)
243 ctx->image[ctx->idx] = insn;
244
245 ctx->idx++;
246}
247
248static void emit_call(u32 *func, struct jit_ctx *ctx)
249{
250 if (ctx->image != NULL) {
251 void *here = &ctx->image[ctx->idx];
252 unsigned int off;
253
254 off = (void *)func - here;
255 ctx->image[ctx->idx] = CALL | ((off >> 2) & 0x3fffffff);
256 }
257 ctx->idx++;
258}
259
260static void emit_nop(struct jit_ctx *ctx)
261{
262 emit(SETHI(0, G0), ctx);
263}
264
265static void emit_reg_move(u32 from, u32 to, struct jit_ctx *ctx)
266{
267 emit(OR | RS1(G0) | RS2(from) | RD(to), ctx);
268}
269
270/* Emit 32-bit constant, zero extended. */
271static void emit_set_const(s32 K, u32 reg, struct jit_ctx *ctx)
272{
273 emit(SETHI(K, reg), ctx);
274 emit(OR_LO(K, reg), ctx);
275}
276
277/* Emit 32-bit constant, sign extended. */
278static void emit_set_const_sext(s32 K, u32 reg, struct jit_ctx *ctx)
279{
280 if (K >= 0) {
281 emit(SETHI(K, reg), ctx);
282 emit(OR_LO(K, reg), ctx);
283 } else {
284 u32 hbits = ~(u32) K;
285 u32 lbits = -0x400 | (u32) K;
286
287 emit(SETHI(hbits, reg), ctx);
288 emit(XOR | IMMED | RS1(reg) | S13(lbits) | RD(reg), ctx);
289 }
290}
291
292static void emit_alu(u32 opcode, u32 src, u32 dst, struct jit_ctx *ctx)
293{
294 emit(opcode | RS1(dst) | RS2(src) | RD(dst), ctx);
295}
296
297static void emit_alu3(u32 opcode, u32 a, u32 b, u32 c, struct jit_ctx *ctx)
298{
299 emit(opcode | RS1(a) | RS2(b) | RD(c), ctx);
300}
301
302static void emit_alu_K(unsigned int opcode, unsigned int dst, unsigned int imm,
303 struct jit_ctx *ctx)
304{
305 bool small_immed = is_simm13(imm);
306 unsigned int insn = opcode;
307
308 insn |= RS1(dst) | RD(dst);
309 if (small_immed) {
310 emit(insn | IMMED | S13(imm), ctx);
311 } else {
312 unsigned int tmp = bpf2sparc[TMP_REG_1];
313
314 ctx->tmp_1_used = true;
315
316 emit_set_const_sext(imm, tmp, ctx);
317 emit(insn | RS2(tmp), ctx);
318 }
319}
320
321static void emit_alu3_K(unsigned int opcode, unsigned int src, unsigned int imm,
322 unsigned int dst, struct jit_ctx *ctx)
323{
324 bool small_immed = is_simm13(imm);
325 unsigned int insn = opcode;
326
327 insn |= RS1(src) | RD(dst);
328 if (small_immed) {
329 emit(insn | IMMED | S13(imm), ctx);
330 } else {
331 unsigned int tmp = bpf2sparc[TMP_REG_1];
332
333 ctx->tmp_1_used = true;
334
335 emit_set_const_sext(imm, tmp, ctx);
336 emit(insn | RS2(tmp), ctx);
337 }
338}
339
340static void emit_loadimm32(s32 K, unsigned int dest, struct jit_ctx *ctx)
341{
342 if (K >= 0 && is_simm13(K)) {
343 /* or %g0, K, DEST */
344 emit(OR | IMMED | RS1(G0) | S13(K) | RD(dest), ctx);
345 } else {
346 emit_set_const(K, dest, ctx);
347 }
348}
349
350static void emit_loadimm(s32 K, unsigned int dest, struct jit_ctx *ctx)
351{
352 if (is_simm13(K)) {
353 /* or %g0, K, DEST */
354 emit(OR | IMMED | RS1(G0) | S13(K) | RD(dest), ctx);
355 } else {
356 emit_set_const(K, dest, ctx);
357 }
358}
359
360static void emit_loadimm_sext(s32 K, unsigned int dest, struct jit_ctx *ctx)
361{
362 if (is_simm13(K)) {
363 /* or %g0, K, DEST */
364 emit(OR | IMMED | RS1(G0) | S13(K) | RD(dest), ctx);
365 } else {
366 emit_set_const_sext(K, dest, ctx);
367 }
368}
369
370static void emit_loadimm64(u64 K, unsigned int dest, struct jit_ctx *ctx)
371{
372 unsigned int tmp = bpf2sparc[TMP_REG_1];
373 u32 high_part = (K >> 32);
374 u32 low_part = (K & 0xffffffff);
375
376 ctx->tmp_1_used = true;
377
378 emit_set_const(high_part, tmp, ctx);
379 emit_set_const(low_part, dest, ctx);
380 emit_alu_K(SLLX, tmp, 32, ctx);
381 emit(OR | RS1(dest) | RS2(tmp) | RD(dest), ctx);
382}
383
384static void emit_branch(unsigned int br_opc, unsigned int from_idx, unsigned int to_idx,
385 struct jit_ctx *ctx)
386{
387 unsigned int off = to_idx - from_idx;
388
389 if (br_opc & XCC)
390 emit(br_opc | WDISP19(off << 2), ctx);
391 else
392 emit(br_opc | WDISP22(off << 2), ctx);
393}
394
David S. Millere3a724e2017-04-24 15:56:21 -0700395static void emit_cbcond(unsigned int cb_opc, unsigned int from_idx, unsigned int to_idx,
396 const u8 dst, const u8 src, struct jit_ctx *ctx)
397{
398 unsigned int off = to_idx - from_idx;
399
400 emit(cb_opc | WDISP10(off << 2) | RS1(dst) | RS2(src), ctx);
401}
402
403static void emit_cbcondi(unsigned int cb_opc, unsigned int from_idx, unsigned int to_idx,
404 const u8 dst, s32 imm, struct jit_ctx *ctx)
405{
406 unsigned int off = to_idx - from_idx;
407
408 emit(cb_opc | IMMED | WDISP10(off << 2) | RS1(dst) | S5(imm), ctx);
409}
410
David S. Miller7a12b502017-04-17 18:44:36 -0700411#define emit_read_y(REG, CTX) emit(RD_Y | RD(REG), CTX)
412#define emit_write_y(REG, CTX) emit(WR_Y | IMMED | RS1(REG) | S13(0), CTX)
413
414#define emit_cmp(R1, R2, CTX) \
415 emit(SUBCC | RS1(R1) | RS2(R2) | RD(G0), CTX)
416
417#define emit_cmpi(R1, IMM, CTX) \
David S. Millere3a724e2017-04-24 15:56:21 -0700418 emit(SUBCC | IMMED | RS1(R1) | S13(IMM) | RD(G0), CTX)
David S. Miller7a12b502017-04-17 18:44:36 -0700419
420#define emit_btst(R1, R2, CTX) \
421 emit(ANDCC | RS1(R1) | RS2(R2) | RD(G0), CTX)
422
423#define emit_btsti(R1, IMM, CTX) \
424 emit(ANDCC | IMMED | RS1(R1) | S13(IMM) | RD(G0), CTX)
425
David S. Millere3a724e2017-04-24 15:56:21 -0700426static int emit_compare_and_branch(const u8 code, const u8 dst, u8 src,
427 const s32 imm, bool is_imm, int branch_dst,
428 struct jit_ctx *ctx)
429{
430 bool use_cbcond = (sparc64_elf_hwcap & AV_SPARC_CBCOND) != 0;
431 const u8 tmp = bpf2sparc[TMP_REG_1];
432
433 branch_dst = ctx->offset[branch_dst];
434
435 if (!is_simm10(branch_dst - ctx->idx) ||
436 BPF_OP(code) == BPF_JSET)
437 use_cbcond = false;
438
439 if (is_imm) {
440 bool fits = true;
441
442 if (use_cbcond) {
443 if (!is_simm5(imm))
444 fits = false;
445 } else if (!is_simm13(imm)) {
446 fits = false;
447 }
448 if (!fits) {
449 ctx->tmp_1_used = true;
450 emit_loadimm_sext(imm, tmp, ctx);
451 src = tmp;
452 is_imm = false;
453 }
454 }
455
456 if (!use_cbcond) {
457 u32 br_opcode;
458
459 if (BPF_OP(code) == BPF_JSET) {
460 if (is_imm)
461 emit_btsti(dst, imm, ctx);
462 else
463 emit_btst(dst, src, ctx);
464 } else {
465 if (is_imm)
466 emit_cmpi(dst, imm, ctx);
467 else
468 emit_cmp(dst, src, ctx);
469 }
470 switch (BPF_OP(code)) {
471 case BPF_JEQ:
472 br_opcode = BE;
473 break;
474 case BPF_JGT:
475 br_opcode = BGU;
476 break;
477 case BPF_JGE:
478 br_opcode = BGEU;
479 break;
480 case BPF_JSET:
481 case BPF_JNE:
482 br_opcode = BNE;
483 break;
484 case BPF_JSGT:
485 br_opcode = BG;
486 break;
487 case BPF_JSGE:
488 br_opcode = BGE;
489 break;
490 default:
491 /* Make sure we dont leak kernel information to the
492 * user.
493 */
494 return -EFAULT;
495 }
496 emit_branch(br_opcode, ctx->idx, branch_dst, ctx);
497 emit_nop(ctx);
498 } else {
499 u32 cbcond_opcode;
500
501 switch (BPF_OP(code)) {
502 case BPF_JEQ:
503 cbcond_opcode = CBCONDE;
504 break;
505 case BPF_JGT:
506 cbcond_opcode = CBCONDGU;
507 break;
508 case BPF_JGE:
509 cbcond_opcode = CBCONDGEU;
510 break;
511 case BPF_JNE:
512 cbcond_opcode = CBCONDNE;
513 break;
514 case BPF_JSGT:
515 cbcond_opcode = CBCONDG;
516 break;
517 case BPF_JSGE:
518 cbcond_opcode = CBCONDGE;
519 break;
520 default:
521 /* Make sure we dont leak kernel information to the
522 * user.
523 */
524 return -EFAULT;
525 }
526 cbcond_opcode |= CBCOND_OP;
527 if (is_imm)
528 emit_cbcondi(cbcond_opcode, ctx->idx, branch_dst,
529 dst, imm, ctx);
530 else
531 emit_cbcond(cbcond_opcode, ctx->idx, branch_dst,
532 dst, src, ctx);
533 }
534 return 0;
535}
536
David S. Miller7a12b502017-04-17 18:44:36 -0700537static void load_skb_regs(struct jit_ctx *ctx, u8 r_skb)
538{
539 const u8 r_headlen = bpf2sparc[SKB_HLEN_REG];
540 const u8 r_data = bpf2sparc[SKB_DATA_REG];
541 const u8 r_tmp = bpf2sparc[TMP_REG_1];
542 unsigned int off;
543
544 off = offsetof(struct sk_buff, len);
545 emit(LD32I | RS1(r_skb) | S13(off) | RD(r_headlen), ctx);
546
547 off = offsetof(struct sk_buff, data_len);
548 emit(LD32I | RS1(r_skb) | S13(off) | RD(r_tmp), ctx);
549
550 emit(SUB | RS1(r_headlen) | RS2(r_tmp) | RD(r_headlen), ctx);
551
552 off = offsetof(struct sk_buff, data);
553 emit(LDPTRI | RS1(r_skb) | S13(off) | RD(r_data), ctx);
554}
555
556/* Just skip the save instruction and the ctx register move. */
557#define BPF_TAILCALL_PROLOGUE_SKIP 16
558#define BPF_TAILCALL_CNT_SP_OFF (STACK_BIAS + 128)
559
560static void build_prologue(struct jit_ctx *ctx)
561{
562 s32 stack_needed = BASE_STACKFRAME;
563
564 if (ctx->saw_frame_pointer || ctx->saw_tail_call)
565 stack_needed += MAX_BPF_STACK;
566
567 if (ctx->saw_tail_call)
568 stack_needed += 8;
569
570 /* save %sp, -176, %sp */
571 emit(SAVE | IMMED | RS1(SP) | S13(-stack_needed) | RD(SP), ctx);
572
573 /* tail_call_cnt = 0 */
574 if (ctx->saw_tail_call) {
575 u32 off = BPF_TAILCALL_CNT_SP_OFF;
576
577 emit(ST32 | IMMED | RS1(SP) | S13(off) | RD(G0), ctx);
578 } else {
579 emit_nop(ctx);
580 }
581 if (ctx->saw_frame_pointer) {
582 const u8 vfp = bpf2sparc[BPF_REG_FP];
583
584 emit(ADD | IMMED | RS1(FP) | S13(STACK_BIAS) | RD(vfp), ctx);
585 }
586
587 emit_reg_move(I0, O0, ctx);
588 /* If you add anything here, adjust BPF_TAILCALL_PROLOGUE_SKIP above. */
589
590 if (ctx->saw_ld_abs_ind)
591 load_skb_regs(ctx, bpf2sparc[BPF_REG_1]);
592}
593
594static void build_epilogue(struct jit_ctx *ctx)
595{
596 ctx->epilogue_offset = ctx->idx;
597
598 /* ret (jmpl %i7 + 8, %g0) */
599 emit(JMPL | IMMED | RS1(I7) | S13(8) | RD(G0), ctx);
600
601 /* restore %i5, %g0, %o0 */
602 emit(RESTORE | RS1(bpf2sparc[BPF_REG_0]) | RS2(G0) | RD(O0), ctx);
603}
604
605static void emit_tail_call(struct jit_ctx *ctx)
606{
607 const u8 bpf_array = bpf2sparc[BPF_REG_2];
608 const u8 bpf_index = bpf2sparc[BPF_REG_3];
609 const u8 tmp = bpf2sparc[TMP_REG_1];
610 u32 off;
611
612 ctx->saw_tail_call = true;
613
614 off = offsetof(struct bpf_array, map.max_entries);
615 emit(LD32 | IMMED | RS1(bpf_array) | S13(off) | RD(tmp), ctx);
616 emit_cmp(bpf_index, tmp, ctx);
617#define OFFSET1 17
618 emit_branch(BGEU, ctx->idx, ctx->idx + OFFSET1, ctx);
619 emit_nop(ctx);
620
621 off = BPF_TAILCALL_CNT_SP_OFF;
622 emit(LD32 | IMMED | RS1(SP) | S13(off) | RD(tmp), ctx);
623 emit_cmpi(tmp, MAX_TAIL_CALL_CNT, ctx);
624#define OFFSET2 13
625 emit_branch(BGU, ctx->idx, ctx->idx + OFFSET2, ctx);
626 emit_nop(ctx);
627
628 emit_alu_K(ADD, tmp, 1, ctx);
629 off = BPF_TAILCALL_CNT_SP_OFF;
630 emit(ST32 | IMMED | RS1(SP) | S13(off) | RD(tmp), ctx);
631
632 emit_alu3_K(SLL, bpf_index, 3, tmp, ctx);
633 emit_alu(ADD, bpf_array, tmp, ctx);
634 off = offsetof(struct bpf_array, ptrs);
635 emit(LD64 | IMMED | RS1(tmp) | S13(off) | RD(tmp), ctx);
636
637 emit_cmpi(tmp, 0, ctx);
638#define OFFSET3 5
639 emit_branch(BE, ctx->idx, ctx->idx + OFFSET3, ctx);
640 emit_nop(ctx);
641
642 off = offsetof(struct bpf_prog, bpf_func);
643 emit(LD64 | IMMED | RS1(tmp) | S13(off) | RD(tmp), ctx);
644
645 off = BPF_TAILCALL_PROLOGUE_SKIP;
646 emit(JMPL | IMMED | RS1(tmp) | S13(off) | RD(G0), ctx);
647 emit_nop(ctx);
648}
649
650static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
651{
652 const u8 code = insn->code;
653 const u8 dst = bpf2sparc[insn->dst_reg];
654 const u8 src = bpf2sparc[insn->src_reg];
655 const int i = insn - ctx->prog->insnsi;
656 const s16 off = insn->off;
657 const s32 imm = insn->imm;
658 u32 *func;
659
660 if (insn->src_reg == BPF_REG_FP)
661 ctx->saw_frame_pointer = true;
662
663 switch (code) {
664 /* dst = src */
665 case BPF_ALU | BPF_MOV | BPF_X:
666 emit_alu3_K(SRL, src, 0, dst, ctx);
667 break;
668 case BPF_ALU64 | BPF_MOV | BPF_X:
669 emit_reg_move(src, dst, ctx);
670 break;
671 /* dst = dst OP src */
672 case BPF_ALU | BPF_ADD | BPF_X:
673 case BPF_ALU64 | BPF_ADD | BPF_X:
674 emit_alu(ADD, src, dst, ctx);
675 goto do_alu32_trunc;
676 case BPF_ALU | BPF_SUB | BPF_X:
677 case BPF_ALU64 | BPF_SUB | BPF_X:
678 emit_alu(SUB, src, dst, ctx);
679 goto do_alu32_trunc;
680 case BPF_ALU | BPF_AND | BPF_X:
681 case BPF_ALU64 | BPF_AND | BPF_X:
682 emit_alu(AND, src, dst, ctx);
683 goto do_alu32_trunc;
684 case BPF_ALU | BPF_OR | BPF_X:
685 case BPF_ALU64 | BPF_OR | BPF_X:
686 emit_alu(OR, src, dst, ctx);
687 goto do_alu32_trunc;
688 case BPF_ALU | BPF_XOR | BPF_X:
689 case BPF_ALU64 | BPF_XOR | BPF_X:
690 emit_alu(XOR, src, dst, ctx);
691 goto do_alu32_trunc;
692 case BPF_ALU | BPF_MUL | BPF_X:
693 emit_alu(MUL, src, dst, ctx);
694 goto do_alu32_trunc;
695 case BPF_ALU64 | BPF_MUL | BPF_X:
696 emit_alu(MULX, src, dst, ctx);
697 break;
698 case BPF_ALU | BPF_DIV | BPF_X:
699 emit_cmp(src, G0, ctx);
700 emit_branch(BE|ANNUL, ctx->idx, ctx->epilogue_offset, ctx);
701 emit_loadimm(0, bpf2sparc[BPF_REG_0], ctx);
702
703 emit_write_y(G0, ctx);
704 emit_alu(DIV, src, dst, ctx);
705 break;
706
707 case BPF_ALU64 | BPF_DIV | BPF_X:
708 emit_cmp(src, G0, ctx);
709 emit_branch(BE|ANNUL, ctx->idx, ctx->epilogue_offset, ctx);
710 emit_loadimm(0, bpf2sparc[BPF_REG_0], ctx);
711
712 emit_alu(UDIVX, src, dst, ctx);
713 break;
714
715 case BPF_ALU | BPF_MOD | BPF_X: {
716 const u8 tmp = bpf2sparc[TMP_REG_1];
717
718 ctx->tmp_1_used = true;
719
720 emit_cmp(src, G0, ctx);
721 emit_branch(BE|ANNUL, ctx->idx, ctx->epilogue_offset, ctx);
722 emit_loadimm(0, bpf2sparc[BPF_REG_0], ctx);
723
724 emit_write_y(G0, ctx);
725 emit_alu3(DIV, dst, src, tmp, ctx);
726 emit_alu3(MULX, tmp, src, tmp, ctx);
727 emit_alu3(SUB, dst, tmp, dst, ctx);
728 goto do_alu32_trunc;
729 }
730 case BPF_ALU64 | BPF_MOD | BPF_X: {
731 const u8 tmp = bpf2sparc[TMP_REG_1];
732
733 ctx->tmp_1_used = true;
734
735 emit_cmp(src, G0, ctx);
736 emit_branch(BE|ANNUL, ctx->idx, ctx->epilogue_offset, ctx);
737 emit_loadimm(0, bpf2sparc[BPF_REG_0], ctx);
738
739 emit_alu3(UDIVX, dst, src, tmp, ctx);
740 emit_alu3(MULX, tmp, src, tmp, ctx);
741 emit_alu3(SUB, dst, tmp, dst, ctx);
742 break;
743 }
744 case BPF_ALU | BPF_LSH | BPF_X:
745 emit_alu(SLL, src, dst, ctx);
746 goto do_alu32_trunc;
747 case BPF_ALU64 | BPF_LSH | BPF_X:
748 emit_alu(SLLX, src, dst, ctx);
749 break;
750 case BPF_ALU | BPF_RSH | BPF_X:
751 emit_alu(SRL, src, dst, ctx);
752 break;
753 case BPF_ALU64 | BPF_RSH | BPF_X:
754 emit_alu(SRLX, src, dst, ctx);
755 break;
756 case BPF_ALU | BPF_ARSH | BPF_X:
757 emit_alu(SRA, src, dst, ctx);
758 goto do_alu32_trunc;
759 case BPF_ALU64 | BPF_ARSH | BPF_X:
760 emit_alu(SRAX, src, dst, ctx);
761 break;
762
763 /* dst = -dst */
764 case BPF_ALU | BPF_NEG:
765 case BPF_ALU64 | BPF_NEG:
766 emit(SUB | RS1(0) | RS2(dst) | RD(dst), ctx);
767 goto do_alu32_trunc;
768
769 case BPF_ALU | BPF_END | BPF_FROM_BE:
770 switch (imm) {
771 case 16:
772 emit_alu_K(SLL, dst, 16, ctx);
773 emit_alu_K(SRL, dst, 16, ctx);
774 break;
775 case 32:
776 emit_alu_K(SRL, dst, 0, ctx);
777 break;
778 case 64:
779 /* nop */
780 break;
781
782 }
783 break;
784
785 /* dst = BSWAP##imm(dst) */
786 case BPF_ALU | BPF_END | BPF_FROM_LE: {
787 const u8 tmp = bpf2sparc[TMP_REG_1];
788 const u8 tmp2 = bpf2sparc[TMP_REG_2];
789
790 ctx->tmp_1_used = true;
791 switch (imm) {
792 case 16:
793 emit_alu3_K(AND, dst, 0xff, tmp, ctx);
794 emit_alu3_K(SRL, dst, 8, dst, ctx);
795 emit_alu3_K(AND, dst, 0xff, dst, ctx);
796 emit_alu3_K(SLL, tmp, 8, tmp, ctx);
797 emit_alu(OR, tmp, dst, ctx);
798 break;
799
800 case 32:
801 ctx->tmp_2_used = true;
802 emit_alu3_K(SRL, dst, 24, tmp, ctx); /* tmp = dst >> 24 */
803 emit_alu3_K(SRL, dst, 16, tmp2, ctx); /* tmp2 = dst >> 16 */
804 emit_alu3_K(AND, tmp2, 0xff, tmp2, ctx);/* tmp2 = tmp2 & 0xff */
805 emit_alu3_K(SLL, tmp2, 8, tmp2, ctx); /* tmp2 = tmp2 << 8 */
806 emit_alu(OR, tmp2, tmp, ctx); /* tmp = tmp | tmp2 */
807 emit_alu3_K(SRL, dst, 8, tmp2, ctx); /* tmp2 = dst >> 8 */
808 emit_alu3_K(AND, tmp2, 0xff, tmp2, ctx);/* tmp2 = tmp2 & 0xff */
809 emit_alu3_K(SLL, tmp2, 16, tmp2, ctx); /* tmp2 = tmp2 << 16 */
810 emit_alu(OR, tmp2, tmp, ctx); /* tmp = tmp | tmp2 */
811 emit_alu3_K(AND, dst, 0xff, dst, ctx); /* dst = dst & 0xff */
812 emit_alu3_K(SLL, dst, 24, dst, ctx); /* dst = dst << 24 */
813 emit_alu(OR, tmp, dst, ctx); /* dst = dst | tmp */
814 break;
815
816 case 64:
817 emit_alu3_K(ADD, SP, STACK_BIAS + 128, tmp, ctx);
818 emit(ST64 | RS1(tmp) | RS2(G0) | RD(dst), ctx);
819 emit(LD64A | ASI(ASI_PL) | RS1(tmp) | RS2(G0) | RD(dst), ctx);
820 break;
821 }
822 break;
823 }
824 /* dst = imm */
825 case BPF_ALU | BPF_MOV | BPF_K:
826 emit_loadimm32(imm, dst, ctx);
827 break;
828 case BPF_ALU64 | BPF_MOV | BPF_K:
829 emit_loadimm_sext(imm, dst, ctx);
830 break;
831 /* dst = dst OP imm */
832 case BPF_ALU | BPF_ADD | BPF_K:
833 case BPF_ALU64 | BPF_ADD | BPF_K:
834 emit_alu_K(ADD, dst, imm, ctx);
835 goto do_alu32_trunc;
836 case BPF_ALU | BPF_SUB | BPF_K:
837 case BPF_ALU64 | BPF_SUB | BPF_K:
838 emit_alu_K(SUB, dst, imm, ctx);
839 goto do_alu32_trunc;
840 case BPF_ALU | BPF_AND | BPF_K:
841 case BPF_ALU64 | BPF_AND | BPF_K:
842 emit_alu_K(AND, dst, imm, ctx);
843 goto do_alu32_trunc;
844 case BPF_ALU | BPF_OR | BPF_K:
845 case BPF_ALU64 | BPF_OR | BPF_K:
846 emit_alu_K(OR, dst, imm, ctx);
847 goto do_alu32_trunc;
848 case BPF_ALU | BPF_XOR | BPF_K:
849 case BPF_ALU64 | BPF_XOR | BPF_K:
850 emit_alu_K(XOR, dst, imm, ctx);
851 goto do_alu32_trunc;
852 case BPF_ALU | BPF_MUL | BPF_K:
853 emit_alu_K(MUL, dst, imm, ctx);
854 goto do_alu32_trunc;
855 case BPF_ALU64 | BPF_MUL | BPF_K:
856 emit_alu_K(MULX, dst, imm, ctx);
857 break;
858 case BPF_ALU | BPF_DIV | BPF_K:
859 if (imm == 0)
860 return -EINVAL;
861
862 emit_write_y(G0, ctx);
863 emit_alu_K(DIV, dst, imm, ctx);
864 goto do_alu32_trunc;
865 case BPF_ALU64 | BPF_DIV | BPF_K:
866 if (imm == 0)
867 return -EINVAL;
868
869 emit_alu_K(UDIVX, dst, imm, ctx);
870 break;
871 case BPF_ALU64 | BPF_MOD | BPF_K:
872 case BPF_ALU | BPF_MOD | BPF_K: {
873 const u8 tmp = bpf2sparc[TMP_REG_2];
874 unsigned int div;
875
876 if (imm == 0)
877 return -EINVAL;
878
879 div = (BPF_CLASS(code) == BPF_ALU64) ? UDIVX : DIV;
880
881 ctx->tmp_2_used = true;
882
883 if (BPF_CLASS(code) != BPF_ALU64)
884 emit_write_y(G0, ctx);
885 if (is_simm13(imm)) {
886 emit(div | IMMED | RS1(dst) | S13(imm) | RD(tmp), ctx);
887 emit(MULX | IMMED | RS1(tmp) | S13(imm) | RD(tmp), ctx);
888 emit(SUB | RS1(dst) | RS2(tmp) | RD(dst), ctx);
889 } else {
890 const u8 tmp1 = bpf2sparc[TMP_REG_1];
891
892 ctx->tmp_1_used = true;
893
894 emit_set_const_sext(imm, tmp1, ctx);
895 emit(div | RS1(dst) | RS2(tmp1) | RD(tmp), ctx);
896 emit(MULX | RS1(tmp) | RS2(tmp1) | RD(tmp), ctx);
897 emit(SUB | RS1(dst) | RS2(tmp) | RD(dst), ctx);
898 }
899 goto do_alu32_trunc;
900 }
901 case BPF_ALU | BPF_LSH | BPF_K:
902 emit_alu_K(SLL, dst, imm, ctx);
903 goto do_alu32_trunc;
904 case BPF_ALU64 | BPF_LSH | BPF_K:
905 emit_alu_K(SLLX, dst, imm, ctx);
906 break;
907 case BPF_ALU | BPF_RSH | BPF_K:
908 emit_alu_K(SRL, dst, imm, ctx);
909 break;
910 case BPF_ALU64 | BPF_RSH | BPF_K:
911 emit_alu_K(SRLX, dst, imm, ctx);
912 break;
913 case BPF_ALU | BPF_ARSH | BPF_K:
914 emit_alu_K(SRA, dst, imm, ctx);
915 goto do_alu32_trunc;
916 case BPF_ALU64 | BPF_ARSH | BPF_K:
917 emit_alu_K(SRAX, dst, imm, ctx);
918 break;
919
920 do_alu32_trunc:
921 if (BPF_CLASS(code) == BPF_ALU)
922 emit_alu_K(SRL, dst, 0, ctx);
923 break;
924
925 /* JUMP off */
926 case BPF_JMP | BPF_JA:
927 emit_branch(BA, ctx->idx, ctx->offset[i + off], ctx);
928 emit_nop(ctx);
929 break;
930 /* IF (dst COND src) JUMP off */
931 case BPF_JMP | BPF_JEQ | BPF_X:
932 case BPF_JMP | BPF_JGT | BPF_X:
933 case BPF_JMP | BPF_JGE | BPF_X:
934 case BPF_JMP | BPF_JNE | BPF_X:
935 case BPF_JMP | BPF_JSGT | BPF_X:
David S. Millere3a724e2017-04-24 15:56:21 -0700936 case BPF_JMP | BPF_JSGE | BPF_X:
937 case BPF_JMP | BPF_JSET | BPF_X: {
938 int err;
David S. Miller7a12b502017-04-17 18:44:36 -0700939
David S. Millere3a724e2017-04-24 15:56:21 -0700940 err = emit_compare_and_branch(code, dst, src, 0, false, i + off, ctx);
941 if (err)
942 return err;
David S. Miller7a12b502017-04-17 18:44:36 -0700943 break;
944 }
David S. Miller7a12b502017-04-17 18:44:36 -0700945 /* IF (dst COND imm) JUMP off */
946 case BPF_JMP | BPF_JEQ | BPF_K:
947 case BPF_JMP | BPF_JGT | BPF_K:
948 case BPF_JMP | BPF_JGE | BPF_K:
949 case BPF_JMP | BPF_JNE | BPF_K:
950 case BPF_JMP | BPF_JSGT | BPF_K:
951 case BPF_JMP | BPF_JSGE | BPF_K:
David S. Millere3a724e2017-04-24 15:56:21 -0700952 case BPF_JMP | BPF_JSET | BPF_K: {
953 int err;
954
955 err = emit_compare_and_branch(code, dst, 0, imm, true, i + off, ctx);
956 if (err)
957 return err;
958 break;
959 }
David S. Miller7a12b502017-04-17 18:44:36 -0700960
961 /* function call */
962 case BPF_JMP | BPF_CALL:
963 {
964 u8 *func = ((u8 *)__bpf_call_base) + imm;
965
966 ctx->saw_call = true;
967
968 emit_call((u32 *)func, ctx);
969 emit_nop(ctx);
970
971 emit_reg_move(O0, bpf2sparc[BPF_REG_0], ctx);
972
973 if (bpf_helper_changes_pkt_data(func) && ctx->saw_ld_abs_ind)
974 load_skb_regs(ctx, bpf2sparc[BPF_REG_6]);
975 break;
976 }
977
978 /* tail call */
979 case BPF_JMP | BPF_CALL |BPF_X:
980 emit_tail_call(ctx);
981 break;
982
983 /* function return */
984 case BPF_JMP | BPF_EXIT:
985 /* Optimization: when last instruction is EXIT,
986 simply fallthrough to epilogue. */
987 if (i == ctx->prog->len - 1)
988 break;
989 emit_branch(BA, ctx->idx, ctx->epilogue_offset, ctx);
990 emit_nop(ctx);
991 break;
992
993 /* dst = imm64 */
994 case BPF_LD | BPF_IMM | BPF_DW:
995 {
996 const struct bpf_insn insn1 = insn[1];
997 u64 imm64;
998
999 imm64 = (u64)insn1.imm << 32 | (u32)imm;
1000 emit_loadimm64(imm64, dst, ctx);
1001
1002 return 1;
1003 }
1004
1005 /* LDX: dst = *(size *)(src + off) */
1006 case BPF_LDX | BPF_MEM | BPF_W:
1007 case BPF_LDX | BPF_MEM | BPF_H:
1008 case BPF_LDX | BPF_MEM | BPF_B:
1009 case BPF_LDX | BPF_MEM | BPF_DW: {
1010 const u8 tmp = bpf2sparc[TMP_REG_1];
1011 u32 opcode = 0, rs2;
1012
1013 ctx->tmp_1_used = true;
1014 switch (BPF_SIZE(code)) {
1015 case BPF_W:
1016 opcode = LD32;
1017 break;
1018 case BPF_H:
1019 opcode = LD16;
1020 break;
1021 case BPF_B:
1022 opcode = LD8;
1023 break;
1024 case BPF_DW:
1025 opcode = LD64;
1026 break;
1027 }
1028
1029 if (is_simm13(off)) {
1030 opcode |= IMMED;
1031 rs2 = S13(off);
1032 } else {
1033 emit_loadimm(off, tmp, ctx);
1034 rs2 = RS2(tmp);
1035 }
1036 emit(opcode | RS1(src) | rs2 | RD(dst), ctx);
1037 break;
1038 }
1039 /* ST: *(size *)(dst + off) = imm */
1040 case BPF_ST | BPF_MEM | BPF_W:
1041 case BPF_ST | BPF_MEM | BPF_H:
1042 case BPF_ST | BPF_MEM | BPF_B:
1043 case BPF_ST | BPF_MEM | BPF_DW: {
1044 const u8 tmp = bpf2sparc[TMP_REG_1];
1045 const u8 tmp2 = bpf2sparc[TMP_REG_2];
1046 u32 opcode = 0, rs2;
1047
1048 ctx->tmp_2_used = true;
1049 emit_loadimm(imm, tmp2, ctx);
1050
1051 switch (BPF_SIZE(code)) {
1052 case BPF_W:
1053 opcode = ST32;
1054 break;
1055 case BPF_H:
1056 opcode = ST16;
1057 break;
1058 case BPF_B:
1059 opcode = ST8;
1060 break;
1061 case BPF_DW:
1062 opcode = ST64;
1063 break;
1064 }
1065
1066 if (is_simm13(off)) {
1067 opcode |= IMMED;
1068 rs2 = S13(off);
1069 } else {
1070 ctx->tmp_1_used = true;
1071 emit_loadimm(off, tmp, ctx);
1072 rs2 = RS2(tmp);
1073 }
1074 emit(opcode | RS1(dst) | rs2 | RD(tmp2), ctx);
1075 break;
1076 }
1077
1078 /* STX: *(size *)(dst + off) = src */
1079 case BPF_STX | BPF_MEM | BPF_W:
1080 case BPF_STX | BPF_MEM | BPF_H:
1081 case BPF_STX | BPF_MEM | BPF_B:
1082 case BPF_STX | BPF_MEM | BPF_DW: {
1083 const u8 tmp = bpf2sparc[TMP_REG_1];
1084 u32 opcode = 0, rs2;
1085
1086 switch (BPF_SIZE(code)) {
1087 case BPF_W:
1088 opcode = ST32;
1089 break;
1090 case BPF_H:
1091 opcode = ST16;
1092 break;
1093 case BPF_B:
1094 opcode = ST8;
1095 break;
1096 case BPF_DW:
1097 opcode = ST64;
1098 break;
1099 }
1100 if (is_simm13(off)) {
1101 opcode |= IMMED;
1102 rs2 = S13(off);
1103 } else {
1104 ctx->tmp_1_used = true;
1105 emit_loadimm(off, tmp, ctx);
1106 rs2 = RS2(tmp);
1107 }
1108 emit(opcode | RS1(dst) | rs2 | RD(src), ctx);
1109 break;
1110 }
1111
1112 /* STX XADD: lock *(u32 *)(dst + off) += src */
1113 case BPF_STX | BPF_XADD | BPF_W: {
1114 const u8 tmp = bpf2sparc[TMP_REG_1];
1115 const u8 tmp2 = bpf2sparc[TMP_REG_2];
1116 const u8 tmp3 = bpf2sparc[TMP_REG_3];
1117
1118 ctx->tmp_1_used = true;
1119 ctx->tmp_2_used = true;
1120 ctx->tmp_3_used = true;
1121 emit_loadimm(off, tmp, ctx);
1122 emit_alu3(ADD, dst, tmp, tmp, ctx);
1123
1124 emit(LD32 | RS1(tmp) | RS2(G0) | RD(tmp2), ctx);
1125 emit_alu3(ADD, tmp2, src, tmp3, ctx);
1126 emit(CAS | ASI(ASI_P) | RS1(tmp) | RS2(tmp2) | RD(tmp3), ctx);
1127 emit_cmp(tmp2, tmp3, ctx);
1128 emit_branch(BNE, 4, 0, ctx);
1129 emit_nop(ctx);
1130 break;
1131 }
1132 /* STX XADD: lock *(u64 *)(dst + off) += src */
1133 case BPF_STX | BPF_XADD | BPF_DW: {
1134 const u8 tmp = bpf2sparc[TMP_REG_1];
1135 const u8 tmp2 = bpf2sparc[TMP_REG_2];
1136 const u8 tmp3 = bpf2sparc[TMP_REG_3];
1137
1138 ctx->tmp_1_used = true;
1139 ctx->tmp_2_used = true;
1140 ctx->tmp_3_used = true;
1141 emit_loadimm(off, tmp, ctx);
1142 emit_alu3(ADD, dst, tmp, tmp, ctx);
1143
1144 emit(LD64 | RS1(tmp) | RS2(G0) | RD(tmp2), ctx);
1145 emit_alu3(ADD, tmp2, src, tmp3, ctx);
1146 emit(CASX | ASI(ASI_P) | RS1(tmp) | RS2(tmp2) | RD(tmp3), ctx);
1147 emit_cmp(tmp2, tmp3, ctx);
1148 emit_branch(BNE, 4, 0, ctx);
1149 emit_nop(ctx);
1150 break;
1151 }
1152#define CHOOSE_LOAD_FUNC(K, func) \
1153 ((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative_offset : func) : func##_positive_offset)
1154
1155 /* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + imm)) */
1156 case BPF_LD | BPF_ABS | BPF_W:
1157 func = CHOOSE_LOAD_FUNC(imm, bpf_jit_load_word);
1158 goto common_load;
1159 case BPF_LD | BPF_ABS | BPF_H:
1160 func = CHOOSE_LOAD_FUNC(imm, bpf_jit_load_half);
1161 goto common_load;
1162 case BPF_LD | BPF_ABS | BPF_B:
1163 func = CHOOSE_LOAD_FUNC(imm, bpf_jit_load_byte);
1164 goto common_load;
1165 /* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + src + imm)) */
1166 case BPF_LD | BPF_IND | BPF_W:
1167 func = bpf_jit_load_word;
1168 goto common_load;
1169 case BPF_LD | BPF_IND | BPF_H:
1170 func = bpf_jit_load_half;
1171 goto common_load;
1172
1173 case BPF_LD | BPF_IND | BPF_B:
1174 func = bpf_jit_load_byte;
1175 common_load:
1176 ctx->saw_ld_abs_ind = true;
1177
1178 emit_reg_move(bpf2sparc[BPF_REG_6], O0, ctx);
1179 emit_loadimm(imm, O1, ctx);
1180
1181 if (BPF_MODE(code) == BPF_IND)
1182 emit_alu(ADD, src, O1, ctx);
1183
1184 emit_call(func, ctx);
1185 emit_alu_K(SRA, O1, 0, ctx);
1186
1187 emit_reg_move(O0, bpf2sparc[BPF_REG_0], ctx);
1188 break;
1189
1190 default:
1191 pr_err_once("unknown opcode %02x\n", code);
1192 return -EINVAL;
1193 }
1194
1195 return 0;
1196}
1197
1198static int build_body(struct jit_ctx *ctx)
1199{
1200 const struct bpf_prog *prog = ctx->prog;
1201 int i;
1202
1203 for (i = 0; i < prog->len; i++) {
1204 const struct bpf_insn *insn = &prog->insnsi[i];
1205 int ret;
1206
1207 ret = build_insn(insn, ctx);
1208 ctx->offset[i] = ctx->idx;
1209
1210 if (ret > 0) {
1211 i++;
1212 continue;
1213 }
1214 if (ret)
1215 return ret;
1216 }
1217 return 0;
1218}
1219
1220static void jit_fill_hole(void *area, unsigned int size)
1221{
1222 u32 *ptr;
1223 /* We are guaranteed to have aligned memory. */
1224 for (ptr = area; size >= sizeof(u32); size -= sizeof(u32))
1225 *ptr++ = 0x91d02005; /* ta 5 */
1226}
1227
1228struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
1229{
1230 struct bpf_prog *tmp, *orig_prog = prog;
1231 struct bpf_binary_header *header;
1232 bool tmp_blinded = false;
1233 struct jit_ctx ctx;
1234 u32 image_size;
1235 u8 *image_ptr;
1236 int pass;
1237
1238 if (!bpf_jit_enable)
1239 return orig_prog;
1240
1241 tmp = bpf_jit_blind_constants(prog);
1242 /* If blinding was requested and we failed during blinding,
1243 * we must fall back to the interpreter.
1244 */
1245 if (IS_ERR(tmp))
1246 return orig_prog;
1247 if (tmp != prog) {
1248 tmp_blinded = true;
1249 prog = tmp;
1250 }
1251
1252 memset(&ctx, 0, sizeof(ctx));
1253 ctx.prog = prog;
1254
1255 ctx.offset = kcalloc(prog->len, sizeof(unsigned int), GFP_KERNEL);
1256 if (ctx.offset == NULL) {
1257 prog = orig_prog;
1258 goto out;
1259 }
1260
1261 /* Fake pass to detect features used, and get an accurate assessment
1262 * of what the final image size will be.
1263 */
1264 if (build_body(&ctx)) {
1265 prog = orig_prog;
1266 goto out_off;
1267 }
1268 build_prologue(&ctx);
1269 build_epilogue(&ctx);
1270
1271 /* Now we know the actual image size. */
1272 image_size = sizeof(u32) * ctx.idx;
1273 header = bpf_jit_binary_alloc(image_size, &image_ptr,
1274 sizeof(u32), jit_fill_hole);
1275 if (header == NULL) {
1276 prog = orig_prog;
1277 goto out_off;
1278 }
1279
1280 ctx.image = (u32 *)image_ptr;
1281
1282 for (pass = 1; pass < 3; pass++) {
1283 ctx.idx = 0;
1284
1285 build_prologue(&ctx);
1286
1287 if (build_body(&ctx)) {
1288 bpf_jit_binary_free(header);
1289 prog = orig_prog;
1290 goto out_off;
1291 }
1292
1293 build_epilogue(&ctx);
1294
1295 if (bpf_jit_enable > 1)
1296 pr_info("Pass %d: shrink = %d, seen = [%c%c%c%c%c%c%c]\n", pass,
1297 image_size - (ctx.idx * 4),
1298 ctx.tmp_1_used ? '1' : ' ',
1299 ctx.tmp_2_used ? '2' : ' ',
1300 ctx.tmp_3_used ? '3' : ' ',
1301 ctx.saw_ld_abs_ind ? 'L' : ' ',
1302 ctx.saw_frame_pointer ? 'F' : ' ',
1303 ctx.saw_call ? 'C' : ' ',
1304 ctx.saw_tail_call ? 'T' : ' ');
1305 }
1306
1307 if (bpf_jit_enable > 1)
1308 bpf_jit_dump(prog->len, image_size, pass, ctx.image);
1309
1310 bpf_flush_icache(header, (u8 *)header + (header->pages * PAGE_SIZE));
1311
1312 bpf_jit_binary_lock_ro(header);
1313
1314 prog->bpf_func = (void *)ctx.image;
1315 prog->jited = 1;
1316
1317out_off:
1318 kfree(ctx.offset);
1319out:
1320 if (tmp_blinded)
1321 bpf_jit_prog_release_other(prog, prog == orig_prog ?
1322 tmp : orig_prog);
1323 return prog;
1324}