]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/arm/net/bpf_jit_32.c
Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / arch / arm / net / bpf_jit_32.c
1 /*
2  * Just-In-Time compiler for BPF filters on 32bit ARM
3  *
4  * Copyright (c) 2011 Mircea Gherzan <mgherzan@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the
8  * Free Software Foundation; version 2 of the License.
9  */
10
11 #include <linux/bitops.h>
12 #include <linux/compiler.h>
13 #include <linux/errno.h>
14 #include <linux/filter.h>
15 #include <linux/netdevice.h>
16 #include <linux/string.h>
17 #include <linux/slab.h>
18 #include <linux/if_vlan.h>
19
20 #include <asm/cacheflush.h>
21 #include <asm/hwcap.h>
22 #include <asm/opcodes.h>
23
24 #include "bpf_jit_32.h"
25
26 /*
27  * ABI:
28  *
29  * r0   scratch register
30  * r4   BPF register A
31  * r5   BPF register X
32  * r6   pointer to the skb
33  * r7   skb->data
34  * r8   skb_headlen(skb)
35  */
36
37 #define r_scratch       ARM_R0
38 /* r1-r3 are (also) used for the unaligned loads on the non-ARMv7 slowpath */
39 #define r_off           ARM_R1
40 #define r_A             ARM_R4
41 #define r_X             ARM_R5
42 #define r_skb           ARM_R6
43 #define r_skb_data      ARM_R7
44 #define r_skb_hl        ARM_R8
45
46 #define SCRATCH_SP_OFFSET       0
47 #define SCRATCH_OFF(k)          (SCRATCH_SP_OFFSET + 4 * (k))
48
49 #define SEEN_MEM                ((1 << BPF_MEMWORDS) - 1)
50 #define SEEN_MEM_WORD(k)        (1 << (k))
51 #define SEEN_X                  (1 << BPF_MEMWORDS)
52 #define SEEN_CALL               (1 << (BPF_MEMWORDS + 1))
53 #define SEEN_SKB                (1 << (BPF_MEMWORDS + 2))
54 #define SEEN_DATA               (1 << (BPF_MEMWORDS + 3))
55
56 #define FLAG_NEED_X_RESET       (1 << 0)
57 #define FLAG_IMM_OVERFLOW       (1 << 1)
58
59 struct jit_ctx {
60         const struct bpf_prog *skf;
61         unsigned idx;
62         unsigned prologue_bytes;
63         int ret0_fp_idx;
64         u32 seen;
65         u32 flags;
66         u32 *offsets;
67         u32 *target;
68 #if __LINUX_ARM_ARCH__ < 7
69         u16 epilogue_bytes;
70         u16 imm_count;
71         u32 *imms;
72 #endif
73 };
74
75 int bpf_jit_enable __read_mostly;
76
77 static inline int call_neg_helper(struct sk_buff *skb, int offset, void *ret,
78                       unsigned int size)
79 {
80         void *ptr = bpf_internal_load_pointer_neg_helper(skb, offset, size);
81
82         if (!ptr)
83                 return -EFAULT;
84         memcpy(ret, ptr, size);
85         return 0;
86 }
87
88 static u64 jit_get_skb_b(struct sk_buff *skb, int offset)
89 {
90         u8 ret;
91         int err;
92
93         if (offset < 0)
94                 err = call_neg_helper(skb, offset, &ret, 1);
95         else
96                 err = skb_copy_bits(skb, offset, &ret, 1);
97
98         return (u64)err << 32 | ret;
99 }
100
101 static u64 jit_get_skb_h(struct sk_buff *skb, int offset)
102 {
103         u16 ret;
104         int err;
105
106         if (offset < 0)
107                 err = call_neg_helper(skb, offset, &ret, 2);
108         else
109                 err = skb_copy_bits(skb, offset, &ret, 2);
110
111         return (u64)err << 32 | ntohs(ret);
112 }
113
114 static u64 jit_get_skb_w(struct sk_buff *skb, int offset)
115 {
116         u32 ret;
117         int err;
118
119         if (offset < 0)
120                 err = call_neg_helper(skb, offset, &ret, 4);
121         else
122                 err = skb_copy_bits(skb, offset, &ret, 4);
123
124         return (u64)err << 32 | ntohl(ret);
125 }
126
127 /*
128  * Wrapper that handles both OABI and EABI and assures Thumb2 interworking
129  * (where the assembly routines like __aeabi_uidiv could cause problems).
130  */
131 static u32 jit_udiv(u32 dividend, u32 divisor)
132 {
133         return dividend / divisor;
134 }
135
136 static inline void _emit(int cond, u32 inst, struct jit_ctx *ctx)
137 {
138         inst |= (cond << 28);
139         inst = __opcode_to_mem_arm(inst);
140
141         if (ctx->target != NULL)
142                 ctx->target[ctx->idx] = inst;
143
144         ctx->idx++;
145 }
146
147 /*
148  * Emit an instruction that will be executed unconditionally.
149  */
150 static inline void emit(u32 inst, struct jit_ctx *ctx)
151 {
152         _emit(ARM_COND_AL, inst, ctx);
153 }
154
155 static u16 saved_regs(struct jit_ctx *ctx)
156 {
157         u16 ret = 0;
158
159         if ((ctx->skf->len > 1) ||
160             (ctx->skf->insns[0].code == (BPF_RET | BPF_A)))
161                 ret |= 1 << r_A;
162
163 #ifdef CONFIG_FRAME_POINTER
164         ret |= (1 << ARM_FP) | (1 << ARM_IP) | (1 << ARM_LR) | (1 << ARM_PC);
165 #else
166         if (ctx->seen & SEEN_CALL)
167                 ret |= 1 << ARM_LR;
168 #endif
169         if (ctx->seen & (SEEN_DATA | SEEN_SKB))
170                 ret |= 1 << r_skb;
171         if (ctx->seen & SEEN_DATA)
172                 ret |= (1 << r_skb_data) | (1 << r_skb_hl);
173         if (ctx->seen & SEEN_X)
174                 ret |= 1 << r_X;
175
176         return ret;
177 }
178
179 static inline int mem_words_used(struct jit_ctx *ctx)
180 {
181         /* yes, we do waste some stack space IF there are "holes" in the set" */
182         return fls(ctx->seen & SEEN_MEM);
183 }
184
185 static inline bool is_load_to_a(u16 inst)
186 {
187         switch (inst) {
188         case BPF_LD | BPF_W | BPF_LEN:
189         case BPF_LD | BPF_W | BPF_ABS:
190         case BPF_LD | BPF_H | BPF_ABS:
191         case BPF_LD | BPF_B | BPF_ABS:
192                 return true;
193         default:
194                 return false;
195         }
196 }
197
198 static void jit_fill_hole(void *area, unsigned int size)
199 {
200         u32 *ptr;
201         /* We are guaranteed to have aligned memory. */
202         for (ptr = area; size >= sizeof(u32); size -= sizeof(u32))
203                 *ptr++ = __opcode_to_mem_arm(ARM_INST_UDF);
204 }
205
206 static void build_prologue(struct jit_ctx *ctx)
207 {
208         u16 reg_set = saved_regs(ctx);
209         u16 first_inst = ctx->skf->insns[0].code;
210         u16 off;
211
212 #ifdef CONFIG_FRAME_POINTER
213         emit(ARM_MOV_R(ARM_IP, ARM_SP), ctx);
214         emit(ARM_PUSH(reg_set), ctx);
215         emit(ARM_SUB_I(ARM_FP, ARM_IP, 4), ctx);
216 #else
217         if (reg_set)
218                 emit(ARM_PUSH(reg_set), ctx);
219 #endif
220
221         if (ctx->seen & (SEEN_DATA | SEEN_SKB))
222                 emit(ARM_MOV_R(r_skb, ARM_R0), ctx);
223
224         if (ctx->seen & SEEN_DATA) {
225                 off = offsetof(struct sk_buff, data);
226                 emit(ARM_LDR_I(r_skb_data, r_skb, off), ctx);
227                 /* headlen = len - data_len */
228                 off = offsetof(struct sk_buff, len);
229                 emit(ARM_LDR_I(r_skb_hl, r_skb, off), ctx);
230                 off = offsetof(struct sk_buff, data_len);
231                 emit(ARM_LDR_I(r_scratch, r_skb, off), ctx);
232                 emit(ARM_SUB_R(r_skb_hl, r_skb_hl, r_scratch), ctx);
233         }
234
235         if (ctx->flags & FLAG_NEED_X_RESET)
236                 emit(ARM_MOV_I(r_X, 0), ctx);
237
238         /* do not leak kernel data to userspace */
239         if ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))
240                 emit(ARM_MOV_I(r_A, 0), ctx);
241
242         /* stack space for the BPF_MEM words */
243         if (ctx->seen & SEEN_MEM)
244                 emit(ARM_SUB_I(ARM_SP, ARM_SP, mem_words_used(ctx) * 4), ctx);
245 }
246
247 static void build_epilogue(struct jit_ctx *ctx)
248 {
249         u16 reg_set = saved_regs(ctx);
250
251         if (ctx->seen & SEEN_MEM)
252                 emit(ARM_ADD_I(ARM_SP, ARM_SP, mem_words_used(ctx) * 4), ctx);
253
254         reg_set &= ~(1 << ARM_LR);
255
256 #ifdef CONFIG_FRAME_POINTER
257         /* the first instruction of the prologue was: mov ip, sp */
258         reg_set &= ~(1 << ARM_IP);
259         reg_set |= (1 << ARM_SP);
260         emit(ARM_LDM(ARM_SP, reg_set), ctx);
261 #else
262         if (reg_set) {
263                 if (ctx->seen & SEEN_CALL)
264                         reg_set |= 1 << ARM_PC;
265                 emit(ARM_POP(reg_set), ctx);
266         }
267
268         if (!(ctx->seen & SEEN_CALL))
269                 emit(ARM_BX(ARM_LR), ctx);
270 #endif
271 }
272
273 static int16_t imm8m(u32 x)
274 {
275         u32 rot;
276
277         for (rot = 0; rot < 16; rot++)
278                 if ((x & ~ror32(0xff, 2 * rot)) == 0)
279                         return rol32(x, 2 * rot) | (rot << 8);
280
281         return -1;
282 }
283
284 #if __LINUX_ARM_ARCH__ < 7
285
286 static u16 imm_offset(u32 k, struct jit_ctx *ctx)
287 {
288         unsigned i = 0, offset;
289         u16 imm;
290
291         /* on the "fake" run we just count them (duplicates included) */
292         if (ctx->target == NULL) {
293                 ctx->imm_count++;
294                 return 0;
295         }
296
297         while ((i < ctx->imm_count) && ctx->imms[i]) {
298                 if (ctx->imms[i] == k)
299                         break;
300                 i++;
301         }
302
303         if (ctx->imms[i] == 0)
304                 ctx->imms[i] = k;
305
306         /* constants go just after the epilogue */
307         offset =  ctx->offsets[ctx->skf->len];
308         offset += ctx->prologue_bytes;
309         offset += ctx->epilogue_bytes;
310         offset += i * 4;
311
312         ctx->target[offset / 4] = k;
313
314         /* PC in ARM mode == address of the instruction + 8 */
315         imm = offset - (8 + ctx->idx * 4);
316
317         if (imm & ~0xfff) {
318                 /*
319                  * literal pool is too far, signal it into flags. we
320                  * can only detect it on the second pass unfortunately.
321                  */
322                 ctx->flags |= FLAG_IMM_OVERFLOW;
323                 return 0;
324         }
325
326         return imm;
327 }
328
329 #endif /* __LINUX_ARM_ARCH__ */
330
331 /*
332  * Move an immediate that's not an imm8m to a core register.
333  */
334 static inline void emit_mov_i_no8m(int rd, u32 val, struct jit_ctx *ctx)
335 {
336 #if __LINUX_ARM_ARCH__ < 7
337         emit(ARM_LDR_I(rd, ARM_PC, imm_offset(val, ctx)), ctx);
338 #else
339         emit(ARM_MOVW(rd, val & 0xffff), ctx);
340         if (val > 0xffff)
341                 emit(ARM_MOVT(rd, val >> 16), ctx);
342 #endif
343 }
344
345 static inline void emit_mov_i(int rd, u32 val, struct jit_ctx *ctx)
346 {
347         int imm12 = imm8m(val);
348
349         if (imm12 >= 0)
350                 emit(ARM_MOV_I(rd, imm12), ctx);
351         else
352                 emit_mov_i_no8m(rd, val, ctx);
353 }
354
355 #if __LINUX_ARM_ARCH__ < 6
356
357 static void emit_load_be32(u8 cond, u8 r_res, u8 r_addr, struct jit_ctx *ctx)
358 {
359         _emit(cond, ARM_LDRB_I(ARM_R3, r_addr, 1), ctx);
360         _emit(cond, ARM_LDRB_I(ARM_R1, r_addr, 0), ctx);
361         _emit(cond, ARM_LDRB_I(ARM_R2, r_addr, 3), ctx);
362         _emit(cond, ARM_LSL_I(ARM_R3, ARM_R3, 16), ctx);
363         _emit(cond, ARM_LDRB_I(ARM_R0, r_addr, 2), ctx);
364         _emit(cond, ARM_ORR_S(ARM_R3, ARM_R3, ARM_R1, SRTYPE_LSL, 24), ctx);
365         _emit(cond, ARM_ORR_R(ARM_R3, ARM_R3, ARM_R2), ctx);
366         _emit(cond, ARM_ORR_S(r_res, ARM_R3, ARM_R0, SRTYPE_LSL, 8), ctx);
367 }
368
369 static void emit_load_be16(u8 cond, u8 r_res, u8 r_addr, struct jit_ctx *ctx)
370 {
371         _emit(cond, ARM_LDRB_I(ARM_R1, r_addr, 0), ctx);
372         _emit(cond, ARM_LDRB_I(ARM_R2, r_addr, 1), ctx);
373         _emit(cond, ARM_ORR_S(r_res, ARM_R2, ARM_R1, SRTYPE_LSL, 8), ctx);
374 }
375
376 static inline void emit_swap16(u8 r_dst, u8 r_src, struct jit_ctx *ctx)
377 {
378         /* r_dst = (r_src << 8) | (r_src >> 8) */
379         emit(ARM_LSL_I(ARM_R1, r_src, 8), ctx);
380         emit(ARM_ORR_S(r_dst, ARM_R1, r_src, SRTYPE_LSR, 8), ctx);
381
382         /*
383          * we need to mask out the bits set in r_dst[23:16] due to
384          * the first shift instruction.
385          *
386          * note that 0x8ff is the encoded immediate 0x00ff0000.
387          */
388         emit(ARM_BIC_I(r_dst, r_dst, 0x8ff), ctx);
389 }
390
391 #else  /* ARMv6+ */
392
393 static void emit_load_be32(u8 cond, u8 r_res, u8 r_addr, struct jit_ctx *ctx)
394 {
395         _emit(cond, ARM_LDR_I(r_res, r_addr, 0), ctx);
396 #ifdef __LITTLE_ENDIAN
397         _emit(cond, ARM_REV(r_res, r_res), ctx);
398 #endif
399 }
400
401 static void emit_load_be16(u8 cond, u8 r_res, u8 r_addr, struct jit_ctx *ctx)
402 {
403         _emit(cond, ARM_LDRH_I(r_res, r_addr, 0), ctx);
404 #ifdef __LITTLE_ENDIAN
405         _emit(cond, ARM_REV16(r_res, r_res), ctx);
406 #endif
407 }
408
409 static inline void emit_swap16(u8 r_dst __maybe_unused,
410                                u8 r_src __maybe_unused,
411                                struct jit_ctx *ctx __maybe_unused)
412 {
413 #ifdef __LITTLE_ENDIAN
414         emit(ARM_REV16(r_dst, r_src), ctx);
415 #endif
416 }
417
418 #endif /* __LINUX_ARM_ARCH__ < 6 */
419
420
421 /* Compute the immediate value for a PC-relative branch. */
422 static inline u32 b_imm(unsigned tgt, struct jit_ctx *ctx)
423 {
424         u32 imm;
425
426         if (ctx->target == NULL)
427                 return 0;
428         /*
429          * BPF allows only forward jumps and the offset of the target is
430          * still the one computed during the first pass.
431          */
432         imm  = ctx->offsets[tgt] + ctx->prologue_bytes - (ctx->idx * 4 + 8);
433
434         return imm >> 2;
435 }
436
437 #define OP_IMM3(op, r1, r2, imm_val, ctx)                               \
438         do {                                                            \
439                 imm12 = imm8m(imm_val);                                 \
440                 if (imm12 < 0) {                                        \
441                         emit_mov_i_no8m(r_scratch, imm_val, ctx);       \
442                         emit(op ## _R((r1), (r2), r_scratch), ctx);     \
443                 } else {                                                \
444                         emit(op ## _I((r1), (r2), imm12), ctx);         \
445                 }                                                       \
446         } while (0)
447
448 static inline void emit_err_ret(u8 cond, struct jit_ctx *ctx)
449 {
450         if (ctx->ret0_fp_idx >= 0) {
451                 _emit(cond, ARM_B(b_imm(ctx->ret0_fp_idx, ctx)), ctx);
452                 /* NOP to keep the size constant between passes */
453                 emit(ARM_MOV_R(ARM_R0, ARM_R0), ctx);
454         } else {
455                 _emit(cond, ARM_MOV_I(ARM_R0, 0), ctx);
456                 _emit(cond, ARM_B(b_imm(ctx->skf->len, ctx)), ctx);
457         }
458 }
459
460 static inline void emit_blx_r(u8 tgt_reg, struct jit_ctx *ctx)
461 {
462 #if __LINUX_ARM_ARCH__ < 5
463         emit(ARM_MOV_R(ARM_LR, ARM_PC), ctx);
464
465         if (elf_hwcap & HWCAP_THUMB)
466                 emit(ARM_BX(tgt_reg), ctx);
467         else
468                 emit(ARM_MOV_R(ARM_PC, tgt_reg), ctx);
469 #else
470         emit(ARM_BLX_R(tgt_reg), ctx);
471 #endif
472 }
473
474 static inline void emit_udiv(u8 rd, u8 rm, u8 rn, struct jit_ctx *ctx)
475 {
476 #if __LINUX_ARM_ARCH__ == 7
477         if (elf_hwcap & HWCAP_IDIVA) {
478                 emit(ARM_UDIV(rd, rm, rn), ctx);
479                 return;
480         }
481 #endif
482
483         /*
484          * For BPF_ALU | BPF_DIV | BPF_K instructions, rm is ARM_R4
485          * (r_A) and rn is ARM_R0 (r_scratch) so load rn first into
486          * ARM_R1 to avoid accidentally overwriting ARM_R0 with rm
487          * before using it as a source for ARM_R1.
488          *
489          * For BPF_ALU | BPF_DIV | BPF_X rm is ARM_R4 (r_A) and rn is
490          * ARM_R5 (r_X) so there is no particular register overlap
491          * issues.
492          */
493         if (rn != ARM_R1)
494                 emit(ARM_MOV_R(ARM_R1, rn), ctx);
495         if (rm != ARM_R0)
496                 emit(ARM_MOV_R(ARM_R0, rm), ctx);
497
498         ctx->seen |= SEEN_CALL;
499         emit_mov_i(ARM_R3, (u32)jit_udiv, ctx);
500         emit_blx_r(ARM_R3, ctx);
501
502         if (rd != ARM_R0)
503                 emit(ARM_MOV_R(rd, ARM_R0), ctx);
504 }
505
506 static inline void update_on_xread(struct jit_ctx *ctx)
507 {
508         if (!(ctx->seen & SEEN_X))
509                 ctx->flags |= FLAG_NEED_X_RESET;
510
511         ctx->seen |= SEEN_X;
512 }
513
514 static int build_body(struct jit_ctx *ctx)
515 {
516         void *load_func[] = {jit_get_skb_b, jit_get_skb_h, jit_get_skb_w};
517         const struct bpf_prog *prog = ctx->skf;
518         const struct sock_filter *inst;
519         unsigned i, load_order, off, condt;
520         int imm12;
521         u32 k;
522
523         for (i = 0; i < prog->len; i++) {
524                 u16 code;
525
526                 inst = &(prog->insns[i]);
527                 /* K as an immediate value operand */
528                 k = inst->k;
529                 code = bpf_anc_helper(inst);
530
531                 /* compute offsets only in the fake pass */
532                 if (ctx->target == NULL)
533                         ctx->offsets[i] = ctx->idx * 4;
534
535                 switch (code) {
536                 case BPF_LD | BPF_IMM:
537                         emit_mov_i(r_A, k, ctx);
538                         break;
539                 case BPF_LD | BPF_W | BPF_LEN:
540                         ctx->seen |= SEEN_SKB;
541                         BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);
542                         emit(ARM_LDR_I(r_A, r_skb,
543                                        offsetof(struct sk_buff, len)), ctx);
544                         break;
545                 case BPF_LD | BPF_MEM:
546                         /* A = scratch[k] */
547                         ctx->seen |= SEEN_MEM_WORD(k);
548                         emit(ARM_LDR_I(r_A, ARM_SP, SCRATCH_OFF(k)), ctx);
549                         break;
550                 case BPF_LD | BPF_W | BPF_ABS:
551                         load_order = 2;
552                         goto load;
553                 case BPF_LD | BPF_H | BPF_ABS:
554                         load_order = 1;
555                         goto load;
556                 case BPF_LD | BPF_B | BPF_ABS:
557                         load_order = 0;
558 load:
559                         emit_mov_i(r_off, k, ctx);
560 load_common:
561                         ctx->seen |= SEEN_DATA | SEEN_CALL;
562
563                         if (load_order > 0) {
564                                 emit(ARM_SUB_I(r_scratch, r_skb_hl,
565                                                1 << load_order), ctx);
566                                 emit(ARM_CMP_R(r_scratch, r_off), ctx);
567                                 condt = ARM_COND_GE;
568                         } else {
569                                 emit(ARM_CMP_R(r_skb_hl, r_off), ctx);
570                                 condt = ARM_COND_HI;
571                         }
572
573                         /*
574                          * test for negative offset, only if we are
575                          * currently scheduled to take the fast
576                          * path. this will update the flags so that
577                          * the slowpath instruction are ignored if the
578                          * offset is negative.
579                          *
580                          * for loard_order == 0 the HI condition will
581                          * make loads at offset 0 take the slow path too.
582                          */
583                         _emit(condt, ARM_CMP_I(r_off, 0), ctx);
584
585                         _emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data),
586                               ctx);
587
588                         if (load_order == 0)
589                                 _emit(condt, ARM_LDRB_I(r_A, r_scratch, 0),
590                                       ctx);
591                         else if (load_order == 1)
592                                 emit_load_be16(condt, r_A, r_scratch, ctx);
593                         else if (load_order == 2)
594                                 emit_load_be32(condt, r_A, r_scratch, ctx);
595
596                         _emit(condt, ARM_B(b_imm(i + 1, ctx)), ctx);
597
598                         /* the slowpath */
599                         emit_mov_i(ARM_R3, (u32)load_func[load_order], ctx);
600                         emit(ARM_MOV_R(ARM_R0, r_skb), ctx);
601                         /* the offset is already in R1 */
602                         emit_blx_r(ARM_R3, ctx);
603                         /* check the result of skb_copy_bits */
604                         emit(ARM_CMP_I(ARM_R1, 0), ctx);
605                         emit_err_ret(ARM_COND_NE, ctx);
606                         emit(ARM_MOV_R(r_A, ARM_R0), ctx);
607                         break;
608                 case BPF_LD | BPF_W | BPF_IND:
609                         load_order = 2;
610                         goto load_ind;
611                 case BPF_LD | BPF_H | BPF_IND:
612                         load_order = 1;
613                         goto load_ind;
614                 case BPF_LD | BPF_B | BPF_IND:
615                         load_order = 0;
616 load_ind:
617                         update_on_xread(ctx);
618                         OP_IMM3(ARM_ADD, r_off, r_X, k, ctx);
619                         goto load_common;
620                 case BPF_LDX | BPF_IMM:
621                         ctx->seen |= SEEN_X;
622                         emit_mov_i(r_X, k, ctx);
623                         break;
624                 case BPF_LDX | BPF_W | BPF_LEN:
625                         ctx->seen |= SEEN_X | SEEN_SKB;
626                         emit(ARM_LDR_I(r_X, r_skb,
627                                        offsetof(struct sk_buff, len)), ctx);
628                         break;
629                 case BPF_LDX | BPF_MEM:
630                         ctx->seen |= SEEN_X | SEEN_MEM_WORD(k);
631                         emit(ARM_LDR_I(r_X, ARM_SP, SCRATCH_OFF(k)), ctx);
632                         break;
633                 case BPF_LDX | BPF_B | BPF_MSH:
634                         /* x = ((*(frame + k)) & 0xf) << 2; */
635                         ctx->seen |= SEEN_X | SEEN_DATA | SEEN_CALL;
636                         /* the interpreter should deal with the negative K */
637                         if ((int)k < 0)
638                                 return -1;
639                         /* offset in r1: we might have to take the slow path */
640                         emit_mov_i(r_off, k, ctx);
641                         emit(ARM_CMP_R(r_skb_hl, r_off), ctx);
642
643                         /* load in r0: common with the slowpath */
644                         _emit(ARM_COND_HI, ARM_LDRB_R(ARM_R0, r_skb_data,
645                                                       ARM_R1), ctx);
646                         /*
647                          * emit_mov_i() might generate one or two instructions,
648                          * the same holds for emit_blx_r()
649                          */
650                         _emit(ARM_COND_HI, ARM_B(b_imm(i + 1, ctx) - 2), ctx);
651
652                         emit(ARM_MOV_R(ARM_R0, r_skb), ctx);
653                         /* r_off is r1 */
654                         emit_mov_i(ARM_R3, (u32)jit_get_skb_b, ctx);
655                         emit_blx_r(ARM_R3, ctx);
656                         /* check the return value of skb_copy_bits */
657                         emit(ARM_CMP_I(ARM_R1, 0), ctx);
658                         emit_err_ret(ARM_COND_NE, ctx);
659
660                         emit(ARM_AND_I(r_X, ARM_R0, 0x00f), ctx);
661                         emit(ARM_LSL_I(r_X, r_X, 2), ctx);
662                         break;
663                 case BPF_ST:
664                         ctx->seen |= SEEN_MEM_WORD(k);
665                         emit(ARM_STR_I(r_A, ARM_SP, SCRATCH_OFF(k)), ctx);
666                         break;
667                 case BPF_STX:
668                         update_on_xread(ctx);
669                         ctx->seen |= SEEN_MEM_WORD(k);
670                         emit(ARM_STR_I(r_X, ARM_SP, SCRATCH_OFF(k)), ctx);
671                         break;
672                 case BPF_ALU | BPF_ADD | BPF_K:
673                         /* A += K */
674                         OP_IMM3(ARM_ADD, r_A, r_A, k, ctx);
675                         break;
676                 case BPF_ALU | BPF_ADD | BPF_X:
677                         update_on_xread(ctx);
678                         emit(ARM_ADD_R(r_A, r_A, r_X), ctx);
679                         break;
680                 case BPF_ALU | BPF_SUB | BPF_K:
681                         /* A -= K */
682                         OP_IMM3(ARM_SUB, r_A, r_A, k, ctx);
683                         break;
684                 case BPF_ALU | BPF_SUB | BPF_X:
685                         update_on_xread(ctx);
686                         emit(ARM_SUB_R(r_A, r_A, r_X), ctx);
687                         break;
688                 case BPF_ALU | BPF_MUL | BPF_K:
689                         /* A *= K */
690                         emit_mov_i(r_scratch, k, ctx);
691                         emit(ARM_MUL(r_A, r_A, r_scratch), ctx);
692                         break;
693                 case BPF_ALU | BPF_MUL | BPF_X:
694                         update_on_xread(ctx);
695                         emit(ARM_MUL(r_A, r_A, r_X), ctx);
696                         break;
697                 case BPF_ALU | BPF_DIV | BPF_K:
698                         if (k == 1)
699                                 break;
700                         emit_mov_i(r_scratch, k, ctx);
701                         emit_udiv(r_A, r_A, r_scratch, ctx);
702                         break;
703                 case BPF_ALU | BPF_DIV | BPF_X:
704                         update_on_xread(ctx);
705                         emit(ARM_CMP_I(r_X, 0), ctx);
706                         emit_err_ret(ARM_COND_EQ, ctx);
707                         emit_udiv(r_A, r_A, r_X, ctx);
708                         break;
709                 case BPF_ALU | BPF_OR | BPF_K:
710                         /* A |= K */
711                         OP_IMM3(ARM_ORR, r_A, r_A, k, ctx);
712                         break;
713                 case BPF_ALU | BPF_OR | BPF_X:
714                         update_on_xread(ctx);
715                         emit(ARM_ORR_R(r_A, r_A, r_X), ctx);
716                         break;
717                 case BPF_ALU | BPF_XOR | BPF_K:
718                         /* A ^= K; */
719                         OP_IMM3(ARM_EOR, r_A, r_A, k, ctx);
720                         break;
721                 case BPF_ANC | SKF_AD_ALU_XOR_X:
722                 case BPF_ALU | BPF_XOR | BPF_X:
723                         /* A ^= X */
724                         update_on_xread(ctx);
725                         emit(ARM_EOR_R(r_A, r_A, r_X), ctx);
726                         break;
727                 case BPF_ALU | BPF_AND | BPF_K:
728                         /* A &= K */
729                         OP_IMM3(ARM_AND, r_A, r_A, k, ctx);
730                         break;
731                 case BPF_ALU | BPF_AND | BPF_X:
732                         update_on_xread(ctx);
733                         emit(ARM_AND_R(r_A, r_A, r_X), ctx);
734                         break;
735                 case BPF_ALU | BPF_LSH | BPF_K:
736                         if (unlikely(k > 31))
737                                 return -1;
738                         emit(ARM_LSL_I(r_A, r_A, k), ctx);
739                         break;
740                 case BPF_ALU | BPF_LSH | BPF_X:
741                         update_on_xread(ctx);
742                         emit(ARM_LSL_R(r_A, r_A, r_X), ctx);
743                         break;
744                 case BPF_ALU | BPF_RSH | BPF_K:
745                         if (unlikely(k > 31))
746                                 return -1;
747                         emit(ARM_LSR_I(r_A, r_A, k), ctx);
748                         break;
749                 case BPF_ALU | BPF_RSH | BPF_X:
750                         update_on_xread(ctx);
751                         emit(ARM_LSR_R(r_A, r_A, r_X), ctx);
752                         break;
753                 case BPF_ALU | BPF_NEG:
754                         /* A = -A */
755                         emit(ARM_RSB_I(r_A, r_A, 0), ctx);
756                         break;
757                 case BPF_JMP | BPF_JA:
758                         /* pc += K */
759                         emit(ARM_B(b_imm(i + k + 1, ctx)), ctx);
760                         break;
761                 case BPF_JMP | BPF_JEQ | BPF_K:
762                         /* pc += (A == K) ? pc->jt : pc->jf */
763                         condt  = ARM_COND_EQ;
764                         goto cmp_imm;
765                 case BPF_JMP | BPF_JGT | BPF_K:
766                         /* pc += (A > K) ? pc->jt : pc->jf */
767                         condt  = ARM_COND_HI;
768                         goto cmp_imm;
769                 case BPF_JMP | BPF_JGE | BPF_K:
770                         /* pc += (A >= K) ? pc->jt : pc->jf */
771                         condt  = ARM_COND_HS;
772 cmp_imm:
773                         imm12 = imm8m(k);
774                         if (imm12 < 0) {
775                                 emit_mov_i_no8m(r_scratch, k, ctx);
776                                 emit(ARM_CMP_R(r_A, r_scratch), ctx);
777                         } else {
778                                 emit(ARM_CMP_I(r_A, imm12), ctx);
779                         }
780 cond_jump:
781                         if (inst->jt)
782                                 _emit(condt, ARM_B(b_imm(i + inst->jt + 1,
783                                                    ctx)), ctx);
784                         if (inst->jf)
785                                 _emit(condt ^ 1, ARM_B(b_imm(i + inst->jf + 1,
786                                                              ctx)), ctx);
787                         break;
788                 case BPF_JMP | BPF_JEQ | BPF_X:
789                         /* pc += (A == X) ? pc->jt : pc->jf */
790                         condt   = ARM_COND_EQ;
791                         goto cmp_x;
792                 case BPF_JMP | BPF_JGT | BPF_X:
793                         /* pc += (A > X) ? pc->jt : pc->jf */
794                         condt   = ARM_COND_HI;
795                         goto cmp_x;
796                 case BPF_JMP | BPF_JGE | BPF_X:
797                         /* pc += (A >= X) ? pc->jt : pc->jf */
798                         condt   = ARM_COND_CS;
799 cmp_x:
800                         update_on_xread(ctx);
801                         emit(ARM_CMP_R(r_A, r_X), ctx);
802                         goto cond_jump;
803                 case BPF_JMP | BPF_JSET | BPF_K:
804                         /* pc += (A & K) ? pc->jt : pc->jf */
805                         condt  = ARM_COND_NE;
806                         /* not set iff all zeroes iff Z==1 iff EQ */
807
808                         imm12 = imm8m(k);
809                         if (imm12 < 0) {
810                                 emit_mov_i_no8m(r_scratch, k, ctx);
811                                 emit(ARM_TST_R(r_A, r_scratch), ctx);
812                         } else {
813                                 emit(ARM_TST_I(r_A, imm12), ctx);
814                         }
815                         goto cond_jump;
816                 case BPF_JMP | BPF_JSET | BPF_X:
817                         /* pc += (A & X) ? pc->jt : pc->jf */
818                         update_on_xread(ctx);
819                         condt  = ARM_COND_NE;
820                         emit(ARM_TST_R(r_A, r_X), ctx);
821                         goto cond_jump;
822                 case BPF_RET | BPF_A:
823                         emit(ARM_MOV_R(ARM_R0, r_A), ctx);
824                         goto b_epilogue;
825                 case BPF_RET | BPF_K:
826                         if ((k == 0) && (ctx->ret0_fp_idx < 0))
827                                 ctx->ret0_fp_idx = i;
828                         emit_mov_i(ARM_R0, k, ctx);
829 b_epilogue:
830                         if (i != ctx->skf->len - 1)
831                                 emit(ARM_B(b_imm(prog->len, ctx)), ctx);
832                         break;
833                 case BPF_MISC | BPF_TAX:
834                         /* X = A */
835                         ctx->seen |= SEEN_X;
836                         emit(ARM_MOV_R(r_X, r_A), ctx);
837                         break;
838                 case BPF_MISC | BPF_TXA:
839                         /* A = X */
840                         update_on_xread(ctx);
841                         emit(ARM_MOV_R(r_A, r_X), ctx);
842                         break;
843                 case BPF_ANC | SKF_AD_PROTOCOL:
844                         /* A = ntohs(skb->protocol) */
845                         ctx->seen |= SEEN_SKB;
846                         BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
847                                                   protocol) != 2);
848                         off = offsetof(struct sk_buff, protocol);
849                         emit(ARM_LDRH_I(r_scratch, r_skb, off), ctx);
850                         emit_swap16(r_A, r_scratch, ctx);
851                         break;
852                 case BPF_ANC | SKF_AD_CPU:
853                         /* r_scratch = current_thread_info() */
854                         OP_IMM3(ARM_BIC, r_scratch, ARM_SP, THREAD_SIZE - 1, ctx);
855                         /* A = current_thread_info()->cpu */
856                         BUILD_BUG_ON(FIELD_SIZEOF(struct thread_info, cpu) != 4);
857                         off = offsetof(struct thread_info, cpu);
858                         emit(ARM_LDR_I(r_A, r_scratch, off), ctx);
859                         break;
860                 case BPF_ANC | SKF_AD_IFINDEX:
861                 case BPF_ANC | SKF_AD_HATYPE:
862                         /* A = skb->dev->ifindex */
863                         /* A = skb->dev->type */
864                         ctx->seen |= SEEN_SKB;
865                         off = offsetof(struct sk_buff, dev);
866                         emit(ARM_LDR_I(r_scratch, r_skb, off), ctx);
867
868                         emit(ARM_CMP_I(r_scratch, 0), ctx);
869                         emit_err_ret(ARM_COND_EQ, ctx);
870
871                         BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
872                                                   ifindex) != 4);
873                         BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
874                                                   type) != 2);
875
876                         if (code == (BPF_ANC | SKF_AD_IFINDEX)) {
877                                 off = offsetof(struct net_device, ifindex);
878                                 emit(ARM_LDR_I(r_A, r_scratch, off), ctx);
879                         } else {
880                                 /*
881                                  * offset of field "type" in "struct
882                                  * net_device" is above what can be
883                                  * used in the ldrh rd, [rn, #imm]
884                                  * instruction, so load the offset in
885                                  * a register and use ldrh rd, [rn, rm]
886                                  */
887                                 off = offsetof(struct net_device, type);
888                                 emit_mov_i(ARM_R3, off, ctx);
889                                 emit(ARM_LDRH_R(r_A, r_scratch, ARM_R3), ctx);
890                         }
891                         break;
892                 case BPF_ANC | SKF_AD_MARK:
893                         ctx->seen |= SEEN_SKB;
894                         BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
895                         off = offsetof(struct sk_buff, mark);
896                         emit(ARM_LDR_I(r_A, r_skb, off), ctx);
897                         break;
898                 case BPF_ANC | SKF_AD_RXHASH:
899                         ctx->seen |= SEEN_SKB;
900                         BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);
901                         off = offsetof(struct sk_buff, hash);
902                         emit(ARM_LDR_I(r_A, r_skb, off), ctx);
903                         break;
904                 case BPF_ANC | SKF_AD_VLAN_TAG:
905                 case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
906                         ctx->seen |= SEEN_SKB;
907                         BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2);
908                         off = offsetof(struct sk_buff, vlan_tci);
909                         emit(ARM_LDRH_I(r_A, r_skb, off), ctx);
910                         if (code == (BPF_ANC | SKF_AD_VLAN_TAG))
911                                 OP_IMM3(ARM_AND, r_A, r_A, ~VLAN_TAG_PRESENT, ctx);
912                         else {
913                                 OP_IMM3(ARM_LSR, r_A, r_A, 12, ctx);
914                                 OP_IMM3(ARM_AND, r_A, r_A, 0x1, ctx);
915                         }
916                         break;
917                 case BPF_ANC | SKF_AD_PKTTYPE:
918                         ctx->seen |= SEEN_SKB;
919                         BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
920                                                   __pkt_type_offset[0]) != 1);
921                         off = PKT_TYPE_OFFSET();
922                         emit(ARM_LDRB_I(r_A, r_skb, off), ctx);
923                         emit(ARM_AND_I(r_A, r_A, PKT_TYPE_MAX), ctx);
924 #ifdef __BIG_ENDIAN_BITFIELD
925                         emit(ARM_LSR_I(r_A, r_A, 5), ctx);
926 #endif
927                         break;
928                 case BPF_ANC | SKF_AD_QUEUE:
929                         ctx->seen |= SEEN_SKB;
930                         BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
931                                                   queue_mapping) != 2);
932                         BUILD_BUG_ON(offsetof(struct sk_buff,
933                                               queue_mapping) > 0xff);
934                         off = offsetof(struct sk_buff, queue_mapping);
935                         emit(ARM_LDRH_I(r_A, r_skb, off), ctx);
936                         break;
937                 case BPF_ANC | SKF_AD_PAY_OFFSET:
938                         ctx->seen |= SEEN_SKB | SEEN_CALL;
939
940                         emit(ARM_MOV_R(ARM_R0, r_skb), ctx);
941                         emit_mov_i(ARM_R3, (unsigned int)skb_get_poff, ctx);
942                         emit_blx_r(ARM_R3, ctx);
943                         emit(ARM_MOV_R(r_A, ARM_R0), ctx);
944                         break;
945                 case BPF_LDX | BPF_W | BPF_ABS:
946                         /*
947                          * load a 32bit word from struct seccomp_data.
948                          * seccomp_check_filter() will already have checked
949                          * that k is 32bit aligned and lies within the
950                          * struct seccomp_data.
951                          */
952                         ctx->seen |= SEEN_SKB;
953                         emit(ARM_LDR_I(r_A, r_skb, k), ctx);
954                         break;
955                 default:
956                         return -1;
957                 }
958
959                 if (ctx->flags & FLAG_IMM_OVERFLOW)
960                         /*
961                          * this instruction generated an overflow when
962                          * trying to access the literal pool, so
963                          * delegate this filter to the kernel interpreter.
964                          */
965                         return -1;
966         }
967
968         /* compute offsets only during the first pass */
969         if (ctx->target == NULL)
970                 ctx->offsets[i] = ctx->idx * 4;
971
972         return 0;
973 }
974
975
976 void bpf_jit_compile(struct bpf_prog *fp)
977 {
978         struct bpf_binary_header *header;
979         struct jit_ctx ctx;
980         unsigned tmp_idx;
981         unsigned alloc_size;
982         u8 *target_ptr;
983
984         if (!bpf_jit_enable)
985                 return;
986
987         memset(&ctx, 0, sizeof(ctx));
988         ctx.skf         = fp;
989         ctx.ret0_fp_idx = -1;
990
991         ctx.offsets = kzalloc(4 * (ctx.skf->len + 1), GFP_KERNEL);
992         if (ctx.offsets == NULL)
993                 return;
994
995         /* fake pass to fill in the ctx->seen */
996         if (unlikely(build_body(&ctx)))
997                 goto out;
998
999         tmp_idx = ctx.idx;
1000         build_prologue(&ctx);
1001         ctx.prologue_bytes = (ctx.idx - tmp_idx) * 4;
1002
1003 #if __LINUX_ARM_ARCH__ < 7
1004         tmp_idx = ctx.idx;
1005         build_epilogue(&ctx);
1006         ctx.epilogue_bytes = (ctx.idx - tmp_idx) * 4;
1007
1008         ctx.idx += ctx.imm_count;
1009         if (ctx.imm_count) {
1010                 ctx.imms = kzalloc(4 * ctx.imm_count, GFP_KERNEL);
1011                 if (ctx.imms == NULL)
1012                         goto out;
1013         }
1014 #else
1015         /* there's nothing after the epilogue on ARMv7 */
1016         build_epilogue(&ctx);
1017 #endif
1018         alloc_size = 4 * ctx.idx;
1019         header = bpf_jit_binary_alloc(alloc_size, &target_ptr,
1020                                       4, jit_fill_hole);
1021         if (header == NULL)
1022                 goto out;
1023
1024         ctx.target = (u32 *) target_ptr;
1025         ctx.idx = 0;
1026
1027         build_prologue(&ctx);
1028         if (build_body(&ctx) < 0) {
1029 #if __LINUX_ARM_ARCH__ < 7
1030                 if (ctx.imm_count)
1031                         kfree(ctx.imms);
1032 #endif
1033                 bpf_jit_binary_free(header);
1034                 goto out;
1035         }
1036         build_epilogue(&ctx);
1037
1038         flush_icache_range((u32)ctx.target, (u32)(ctx.target + ctx.idx));
1039
1040 #if __LINUX_ARM_ARCH__ < 7
1041         if (ctx.imm_count)
1042                 kfree(ctx.imms);
1043 #endif
1044
1045         if (bpf_jit_enable > 1)
1046                 /* there are 2 passes here */
1047                 bpf_jit_dump(fp->len, alloc_size, 2, ctx.target);
1048
1049         set_memory_ro((unsigned long)header, header->pages);
1050         fp->bpf_func = (void *)ctx.target;
1051         fp->jited = true;
1052 out:
1053         kfree(ctx.offsets);
1054         return;
1055 }
1056
1057 void bpf_jit_free(struct bpf_prog *fp)
1058 {
1059         unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK;
1060         struct bpf_binary_header *header = (void *)addr;
1061
1062         if (!fp->jited)
1063                 goto free_filter;
1064
1065         set_memory_rw(addr, header->pages);
1066         bpf_jit_binary_free(header);
1067
1068 free_filter:
1069         bpf_prog_unlock_free(fp);
1070 }