Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * BPF JIT compiler for ARM64
4 *
5 * Copyright (C) 2014-2016 Zi Shen Lim <zlim.lnx@gmail.com>
6 */
7
8#define pr_fmt(fmt) "bpf_jit: " fmt
9
10#include <linux/bitfield.h>
11#include <linux/bpf.h>
12#include <linux/filter.h>
13#include <linux/printk.h>
14#include <linux/slab.h>
15
16#include <asm/asm-extable.h>
17#include <asm/byteorder.h>
18#include <asm/cacheflush.h>
19#include <asm/debug-monitors.h>
20#include <asm/insn.h>
21#include <asm/set_memory.h>
22
23#include "bpf_jit.h"
24
25#define TMP_REG_1 (MAX_BPF_JIT_REG + 0)
26#define TMP_REG_2 (MAX_BPF_JIT_REG + 1)
27#define TCALL_CNT (MAX_BPF_JIT_REG + 2)
28#define TMP_REG_3 (MAX_BPF_JIT_REG + 3)
29#define FP_BOTTOM (MAX_BPF_JIT_REG + 4)
30
31#define check_imm(bits, imm) do { \
32 if ((((imm) > 0) && ((imm) >> (bits))) || \
33 (((imm) < 0) && (~(imm) >> (bits)))) { \
34 pr_info("[%2d] imm=%d(0x%x) out of range\n", \
35 i, imm, imm); \
36 return -EINVAL; \
37 } \
38} while (0)
39#define check_imm19(imm) check_imm(19, imm)
40#define check_imm26(imm) check_imm(26, imm)
41
42/* Map BPF registers to A64 registers */
43static const int bpf2a64[] = {
44 /* return value from in-kernel function, and exit value from eBPF */
45 [BPF_REG_0] = A64_R(7),
46 /* arguments from eBPF program to in-kernel function */
47 [BPF_REG_1] = A64_R(0),
48 [BPF_REG_2] = A64_R(1),
49 [BPF_REG_3] = A64_R(2),
50 [BPF_REG_4] = A64_R(3),
51 [BPF_REG_5] = A64_R(4),
52 /* callee saved registers that in-kernel function will preserve */
53 [BPF_REG_6] = A64_R(19),
54 [BPF_REG_7] = A64_R(20),
55 [BPF_REG_8] = A64_R(21),
56 [BPF_REG_9] = A64_R(22),
57 /* read-only frame pointer to access stack */
58 [BPF_REG_FP] = A64_R(25),
59 /* temporary registers for BPF JIT */
60 [TMP_REG_1] = A64_R(10),
61 [TMP_REG_2] = A64_R(11),
62 [TMP_REG_3] = A64_R(12),
63 /* tail_call_cnt */
64 [TCALL_CNT] = A64_R(26),
65 /* temporary register for blinding constants */
66 [BPF_REG_AX] = A64_R(9),
67 [FP_BOTTOM] = A64_R(27),
68};
69
70struct jit_ctx {
71 const struct bpf_prog *prog;
72 int idx;
73 int epilogue_offset;
74 int *offset;
75 int exentry_idx;
76 __le32 *image;
77 u32 stack_size;
78 int fpb_offset;
79};
80
81static inline void emit(const u32 insn, struct jit_ctx *ctx)
82{
83 if (ctx->image != NULL)
84 ctx->image[ctx->idx] = cpu_to_le32(insn);
85
86 ctx->idx++;
87}
88
89static inline void emit_a64_mov_i(const int is64, const int reg,
90 const s32 val, struct jit_ctx *ctx)
91{
92 u16 hi = val >> 16;
93 u16 lo = val & 0xffff;
94
95 if (hi & 0x8000) {
96 if (hi == 0xffff) {
97 emit(A64_MOVN(is64, reg, (u16)~lo, 0), ctx);
98 } else {
99 emit(A64_MOVN(is64, reg, (u16)~hi, 16), ctx);
100 if (lo != 0xffff)
101 emit(A64_MOVK(is64, reg, lo, 0), ctx);
102 }
103 } else {
104 emit(A64_MOVZ(is64, reg, lo, 0), ctx);
105 if (hi)
106 emit(A64_MOVK(is64, reg, hi, 16), ctx);
107 }
108}
109
110static int i64_i16_blocks(const u64 val, bool inverse)
111{
112 return (((val >> 0) & 0xffff) != (inverse ? 0xffff : 0x0000)) +
113 (((val >> 16) & 0xffff) != (inverse ? 0xffff : 0x0000)) +
114 (((val >> 32) & 0xffff) != (inverse ? 0xffff : 0x0000)) +
115 (((val >> 48) & 0xffff) != (inverse ? 0xffff : 0x0000));
116}
117
118static inline void emit_a64_mov_i64(const int reg, const u64 val,
119 struct jit_ctx *ctx)
120{
121 u64 nrm_tmp = val, rev_tmp = ~val;
122 bool inverse;
123 int shift;
124
125 if (!(nrm_tmp >> 32))
126 return emit_a64_mov_i(0, reg, (u32)val, ctx);
127
128 inverse = i64_i16_blocks(nrm_tmp, true) < i64_i16_blocks(nrm_tmp, false);
129 shift = max(round_down((inverse ? (fls64(rev_tmp) - 1) :
130 (fls64(nrm_tmp) - 1)), 16), 0);
131 if (inverse)
132 emit(A64_MOVN(1, reg, (rev_tmp >> shift) & 0xffff, shift), ctx);
133 else
134 emit(A64_MOVZ(1, reg, (nrm_tmp >> shift) & 0xffff, shift), ctx);
135 shift -= 16;
136 while (shift >= 0) {
137 if (((nrm_tmp >> shift) & 0xffff) != (inverse ? 0xffff : 0x0000))
138 emit(A64_MOVK(1, reg, (nrm_tmp >> shift) & 0xffff, shift), ctx);
139 shift -= 16;
140 }
141}
142
143/*
144 * Kernel addresses in the vmalloc space use at most 48 bits, and the
145 * remaining bits are guaranteed to be 0x1. So we can compose the address
146 * with a fixed length movn/movk/movk sequence.
147 */
148static inline void emit_addr_mov_i64(const int reg, const u64 val,
149 struct jit_ctx *ctx)
150{
151 u64 tmp = val;
152 int shift = 0;
153
154 emit(A64_MOVN(1, reg, ~tmp & 0xffff, shift), ctx);
155 while (shift < 32) {
156 tmp >>= 16;
157 shift += 16;
158 emit(A64_MOVK(1, reg, tmp & 0xffff, shift), ctx);
159 }
160}
161
162static inline int bpf2a64_offset(int bpf_insn, int off,
163 const struct jit_ctx *ctx)
164{
165 /* BPF JMP offset is relative to the next instruction */
166 bpf_insn++;
167 /*
168 * Whereas arm64 branch instructions encode the offset
169 * from the branch itself, so we must subtract 1 from the
170 * instruction offset.
171 */
172 return ctx->offset[bpf_insn + off] - (ctx->offset[bpf_insn] - 1);
173}
174
175static void jit_fill_hole(void *area, unsigned int size)
176{
177 __le32 *ptr;
178 /* We are guaranteed to have aligned memory. */
179 for (ptr = area; size >= sizeof(u32); size -= sizeof(u32))
180 *ptr++ = cpu_to_le32(AARCH64_BREAK_FAULT);
181}
182
183static inline int epilogue_offset(const struct jit_ctx *ctx)
184{
185 int to = ctx->epilogue_offset;
186 int from = ctx->idx;
187
188 return to - from;
189}
190
191static bool is_addsub_imm(u32 imm)
192{
193 /* Either imm12 or shifted imm12. */
194 return !(imm & ~0xfff) || !(imm & ~0xfff000);
195}
196
197/*
198 * There are 3 types of AArch64 LDR/STR (immediate) instruction:
199 * Post-index, Pre-index, Unsigned offset.
200 *
201 * For BPF ldr/str, the "unsigned offset" type is sufficient.
202 *
203 * "Unsigned offset" type LDR(immediate) format:
204 *
205 * 3 2 1 0
206 * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
207 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
208 * |x x|1 1 1 0 0 1 0 1| imm12 | Rn | Rt |
209 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
210 * scale
211 *
212 * "Unsigned offset" type STR(immediate) format:
213 * 3 2 1 0
214 * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
215 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
216 * |x x|1 1 1 0 0 1 0 0| imm12 | Rn | Rt |
217 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
218 * scale
219 *
220 * The offset is calculated from imm12 and scale in the following way:
221 *
222 * offset = (u64)imm12 << scale
223 */
224static bool is_lsi_offset(int offset, int scale)
225{
226 if (offset < 0)
227 return false;
228
229 if (offset > (0xFFF << scale))
230 return false;
231
232 if (offset & ((1 << scale) - 1))
233 return false;
234
235 return true;
236}
237
238/* Tail call offset to jump into */
239#if IS_ENABLED(CONFIG_ARM64_BTI_KERNEL) || \
240 IS_ENABLED(CONFIG_ARM64_PTR_AUTH_KERNEL)
241#define PROLOGUE_OFFSET 9
242#else
243#define PROLOGUE_OFFSET 8
244#endif
245
246static int build_prologue(struct jit_ctx *ctx, bool ebpf_from_cbpf)
247{
248 const struct bpf_prog *prog = ctx->prog;
249 const u8 r6 = bpf2a64[BPF_REG_6];
250 const u8 r7 = bpf2a64[BPF_REG_7];
251 const u8 r8 = bpf2a64[BPF_REG_8];
252 const u8 r9 = bpf2a64[BPF_REG_9];
253 const u8 fp = bpf2a64[BPF_REG_FP];
254 const u8 tcc = bpf2a64[TCALL_CNT];
255 const u8 fpb = bpf2a64[FP_BOTTOM];
256 const int idx0 = ctx->idx;
257 int cur_offset;
258
259 /*
260 * BPF prog stack layout
261 *
262 * high
263 * original A64_SP => 0:+-----+ BPF prologue
264 * |FP/LR|
265 * current A64_FP => -16:+-----+
266 * | ... | callee saved registers
267 * BPF fp register => -64:+-----+ <= (BPF_FP)
268 * | |
269 * | ... | BPF prog stack
270 * | |
271 * +-----+ <= (BPF_FP - prog->aux->stack_depth)
272 * |RSVD | padding
273 * current A64_SP => +-----+ <= (BPF_FP - ctx->stack_size)
274 * | |
275 * | ... | Function call stack
276 * | |
277 * +-----+
278 * low
279 *
280 */
281
282 /* Sign lr */
283 if (IS_ENABLED(CONFIG_ARM64_PTR_AUTH_KERNEL))
284 emit(A64_PACIASP, ctx);
285 /* BTI landing pad */
286 else if (IS_ENABLED(CONFIG_ARM64_BTI_KERNEL))
287 emit(A64_BTI_C, ctx);
288
289 /* Save FP and LR registers to stay align with ARM64 AAPCS */
290 emit(A64_PUSH(A64_FP, A64_LR, A64_SP), ctx);
291 emit(A64_MOV(1, A64_FP, A64_SP), ctx);
292
293 /* Save callee-saved registers */
294 emit(A64_PUSH(r6, r7, A64_SP), ctx);
295 emit(A64_PUSH(r8, r9, A64_SP), ctx);
296 emit(A64_PUSH(fp, tcc, A64_SP), ctx);
297 emit(A64_PUSH(fpb, A64_R(28), A64_SP), ctx);
298
299 /* Set up BPF prog stack base register */
300 emit(A64_MOV(1, fp, A64_SP), ctx);
301
302 if (!ebpf_from_cbpf) {
303 /* Initialize tail_call_cnt */
304 emit(A64_MOVZ(1, tcc, 0, 0), ctx);
305
306 cur_offset = ctx->idx - idx0;
307 if (cur_offset != PROLOGUE_OFFSET) {
308 pr_err_once("PROLOGUE_OFFSET = %d, expected %d!\n",
309 cur_offset, PROLOGUE_OFFSET);
310 return -1;
311 }
312
313 /* BTI landing pad for the tail call, done with a BR */
314 if (IS_ENABLED(CONFIG_ARM64_BTI_KERNEL))
315 emit(A64_BTI_J, ctx);
316 }
317
318 emit(A64_SUB_I(1, fpb, fp, ctx->fpb_offset), ctx);
319
320 /* Stack must be multiples of 16B */
321 ctx->stack_size = round_up(prog->aux->stack_depth, 16);
322
323 /* Set up function call stack */
324 emit(A64_SUB_I(1, A64_SP, A64_SP, ctx->stack_size), ctx);
325 return 0;
326}
327
328static int out_offset = -1; /* initialized on the first pass of build_body() */
329static int emit_bpf_tail_call(struct jit_ctx *ctx)
330{
331 /* bpf_tail_call(void *prog_ctx, struct bpf_array *array, u64 index) */
332 const u8 r2 = bpf2a64[BPF_REG_2];
333 const u8 r3 = bpf2a64[BPF_REG_3];
334
335 const u8 tmp = bpf2a64[TMP_REG_1];
336 const u8 prg = bpf2a64[TMP_REG_2];
337 const u8 tcc = bpf2a64[TCALL_CNT];
338 const int idx0 = ctx->idx;
339#define cur_offset (ctx->idx - idx0)
340#define jmp_offset (out_offset - (cur_offset))
341 size_t off;
342
343 /* if (index >= array->map.max_entries)
344 * goto out;
345 */
346 off = offsetof(struct bpf_array, map.max_entries);
347 emit_a64_mov_i64(tmp, off, ctx);
348 emit(A64_LDR32(tmp, r2, tmp), ctx);
349 emit(A64_MOV(0, r3, r3), ctx);
350 emit(A64_CMP(0, r3, tmp), ctx);
351 emit(A64_B_(A64_COND_CS, jmp_offset), ctx);
352
353 /*
354 * if (tail_call_cnt >= MAX_TAIL_CALL_CNT)
355 * goto out;
356 * tail_call_cnt++;
357 */
358 emit_a64_mov_i64(tmp, MAX_TAIL_CALL_CNT, ctx);
359 emit(A64_CMP(1, tcc, tmp), ctx);
360 emit(A64_B_(A64_COND_CS, jmp_offset), ctx);
361 emit(A64_ADD_I(1, tcc, tcc, 1), ctx);
362
363 /* prog = array->ptrs[index];
364 * if (prog == NULL)
365 * goto out;
366 */
367 off = offsetof(struct bpf_array, ptrs);
368 emit_a64_mov_i64(tmp, off, ctx);
369 emit(A64_ADD(1, tmp, r2, tmp), ctx);
370 emit(A64_LSL(1, prg, r3, 3), ctx);
371 emit(A64_LDR64(prg, tmp, prg), ctx);
372 emit(A64_CBZ(1, prg, jmp_offset), ctx);
373
374 /* goto *(prog->bpf_func + prologue_offset); */
375 off = offsetof(struct bpf_prog, bpf_func);
376 emit_a64_mov_i64(tmp, off, ctx);
377 emit(A64_LDR64(tmp, prg, tmp), ctx);
378 emit(A64_ADD_I(1, tmp, tmp, sizeof(u32) * PROLOGUE_OFFSET), ctx);
379 emit(A64_ADD_I(1, A64_SP, A64_SP, ctx->stack_size), ctx);
380 emit(A64_BR(tmp), ctx);
381
382 /* out: */
383 if (out_offset == -1)
384 out_offset = cur_offset;
385 if (cur_offset != out_offset) {
386 pr_err_once("tail_call out_offset = %d, expected %d!\n",
387 cur_offset, out_offset);
388 return -1;
389 }
390 return 0;
391#undef cur_offset
392#undef jmp_offset
393}
394
395#ifdef CONFIG_ARM64_LSE_ATOMICS
396static int emit_lse_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx)
397{
398 const u8 code = insn->code;
399 const u8 dst = bpf2a64[insn->dst_reg];
400 const u8 src = bpf2a64[insn->src_reg];
401 const u8 tmp = bpf2a64[TMP_REG_1];
402 const u8 tmp2 = bpf2a64[TMP_REG_2];
403 const bool isdw = BPF_SIZE(code) == BPF_DW;
404 const s16 off = insn->off;
405 u8 reg;
406
407 if (!off) {
408 reg = dst;
409 } else {
410 emit_a64_mov_i(1, tmp, off, ctx);
411 emit(A64_ADD(1, tmp, tmp, dst), ctx);
412 reg = tmp;
413 }
414
415 switch (insn->imm) {
416 /* lock *(u32/u64 *)(dst_reg + off) <op>= src_reg */
417 case BPF_ADD:
418 emit(A64_STADD(isdw, reg, src), ctx);
419 break;
420 case BPF_AND:
421 emit(A64_MVN(isdw, tmp2, src), ctx);
422 emit(A64_STCLR(isdw, reg, tmp2), ctx);
423 break;
424 case BPF_OR:
425 emit(A64_STSET(isdw, reg, src), ctx);
426 break;
427 case BPF_XOR:
428 emit(A64_STEOR(isdw, reg, src), ctx);
429 break;
430 /* src_reg = atomic_fetch_<op>(dst_reg + off, src_reg) */
431 case BPF_ADD | BPF_FETCH:
432 emit(A64_LDADDAL(isdw, src, reg, src), ctx);
433 break;
434 case BPF_AND | BPF_FETCH:
435 emit(A64_MVN(isdw, tmp2, src), ctx);
436 emit(A64_LDCLRAL(isdw, src, reg, tmp2), ctx);
437 break;
438 case BPF_OR | BPF_FETCH:
439 emit(A64_LDSETAL(isdw, src, reg, src), ctx);
440 break;
441 case BPF_XOR | BPF_FETCH:
442 emit(A64_LDEORAL(isdw, src, reg, src), ctx);
443 break;
444 /* src_reg = atomic_xchg(dst_reg + off, src_reg); */
445 case BPF_XCHG:
446 emit(A64_SWPAL(isdw, src, reg, src), ctx);
447 break;
448 /* r0 = atomic_cmpxchg(dst_reg + off, r0, src_reg); */
449 case BPF_CMPXCHG:
450 emit(A64_CASAL(isdw, src, reg, bpf2a64[BPF_REG_0]), ctx);
451 break;
452 default:
453 pr_err_once("unknown atomic op code %02x\n", insn->imm);
454 return -EINVAL;
455 }
456
457 return 0;
458}
459#else
460static inline int emit_lse_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx)
461{
462 return -EINVAL;
463}
464#endif
465
466static int emit_ll_sc_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx)
467{
468 const u8 code = insn->code;
469 const u8 dst = bpf2a64[insn->dst_reg];
470 const u8 src = bpf2a64[insn->src_reg];
471 const u8 tmp = bpf2a64[TMP_REG_1];
472 const u8 tmp2 = bpf2a64[TMP_REG_2];
473 const u8 tmp3 = bpf2a64[TMP_REG_3];
474 const int i = insn - ctx->prog->insnsi;
475 const s32 imm = insn->imm;
476 const s16 off = insn->off;
477 const bool isdw = BPF_SIZE(code) == BPF_DW;
478 u8 reg;
479 s32 jmp_offset;
480
481 if (!off) {
482 reg = dst;
483 } else {
484 emit_a64_mov_i(1, tmp, off, ctx);
485 emit(A64_ADD(1, tmp, tmp, dst), ctx);
486 reg = tmp;
487 }
488
489 if (imm == BPF_ADD || imm == BPF_AND ||
490 imm == BPF_OR || imm == BPF_XOR) {
491 /* lock *(u32/u64 *)(dst_reg + off) <op>= src_reg */
492 emit(A64_LDXR(isdw, tmp2, reg), ctx);
493 if (imm == BPF_ADD)
494 emit(A64_ADD(isdw, tmp2, tmp2, src), ctx);
495 else if (imm == BPF_AND)
496 emit(A64_AND(isdw, tmp2, tmp2, src), ctx);
497 else if (imm == BPF_OR)
498 emit(A64_ORR(isdw, tmp2, tmp2, src), ctx);
499 else
500 emit(A64_EOR(isdw, tmp2, tmp2, src), ctx);
501 emit(A64_STXR(isdw, tmp2, reg, tmp3), ctx);
502 jmp_offset = -3;
503 check_imm19(jmp_offset);
504 emit(A64_CBNZ(0, tmp3, jmp_offset), ctx);
505 } else if (imm == (BPF_ADD | BPF_FETCH) ||
506 imm == (BPF_AND | BPF_FETCH) ||
507 imm == (BPF_OR | BPF_FETCH) ||
508 imm == (BPF_XOR | BPF_FETCH)) {
509 /* src_reg = atomic_fetch_<op>(dst_reg + off, src_reg) */
510 const u8 ax = bpf2a64[BPF_REG_AX];
511
512 emit(A64_MOV(isdw, ax, src), ctx);
513 emit(A64_LDXR(isdw, src, reg), ctx);
514 if (imm == (BPF_ADD | BPF_FETCH))
515 emit(A64_ADD(isdw, tmp2, src, ax), ctx);
516 else if (imm == (BPF_AND | BPF_FETCH))
517 emit(A64_AND(isdw, tmp2, src, ax), ctx);
518 else if (imm == (BPF_OR | BPF_FETCH))
519 emit(A64_ORR(isdw, tmp2, src, ax), ctx);
520 else
521 emit(A64_EOR(isdw, tmp2, src, ax), ctx);
522 emit(A64_STLXR(isdw, tmp2, reg, tmp3), ctx);
523 jmp_offset = -3;
524 check_imm19(jmp_offset);
525 emit(A64_CBNZ(0, tmp3, jmp_offset), ctx);
526 emit(A64_DMB_ISH, ctx);
527 } else if (imm == BPF_XCHG) {
528 /* src_reg = atomic_xchg(dst_reg + off, src_reg); */
529 emit(A64_MOV(isdw, tmp2, src), ctx);
530 emit(A64_LDXR(isdw, src, reg), ctx);
531 emit(A64_STLXR(isdw, tmp2, reg, tmp3), ctx);
532 jmp_offset = -2;
533 check_imm19(jmp_offset);
534 emit(A64_CBNZ(0, tmp3, jmp_offset), ctx);
535 emit(A64_DMB_ISH, ctx);
536 } else if (imm == BPF_CMPXCHG) {
537 /* r0 = atomic_cmpxchg(dst_reg + off, r0, src_reg); */
538 const u8 r0 = bpf2a64[BPF_REG_0];
539
540 emit(A64_MOV(isdw, tmp2, r0), ctx);
541 emit(A64_LDXR(isdw, r0, reg), ctx);
542 emit(A64_EOR(isdw, tmp3, r0, tmp2), ctx);
543 jmp_offset = 4;
544 check_imm19(jmp_offset);
545 emit(A64_CBNZ(isdw, tmp3, jmp_offset), ctx);
546 emit(A64_STLXR(isdw, src, reg, tmp3), ctx);
547 jmp_offset = -4;
548 check_imm19(jmp_offset);
549 emit(A64_CBNZ(0, tmp3, jmp_offset), ctx);
550 emit(A64_DMB_ISH, ctx);
551 } else {
552 pr_err_once("unknown atomic op code %02x\n", imm);
553 return -EINVAL;
554 }
555
556 return 0;
557}
558
559static void build_epilogue(struct jit_ctx *ctx)
560{
561 const u8 r0 = bpf2a64[BPF_REG_0];
562 const u8 r6 = bpf2a64[BPF_REG_6];
563 const u8 r7 = bpf2a64[BPF_REG_7];
564 const u8 r8 = bpf2a64[BPF_REG_8];
565 const u8 r9 = bpf2a64[BPF_REG_9];
566 const u8 fp = bpf2a64[BPF_REG_FP];
567 const u8 fpb = bpf2a64[FP_BOTTOM];
568
569 /* We're done with BPF stack */
570 emit(A64_ADD_I(1, A64_SP, A64_SP, ctx->stack_size), ctx);
571
572 /* Restore x27 and x28 */
573 emit(A64_POP(fpb, A64_R(28), A64_SP), ctx);
574 /* Restore fs (x25) and x26 */
575 emit(A64_POP(fp, A64_R(26), A64_SP), ctx);
576
577 /* Restore callee-saved register */
578 emit(A64_POP(r8, r9, A64_SP), ctx);
579 emit(A64_POP(r6, r7, A64_SP), ctx);
580
581 /* Restore FP/LR registers */
582 emit(A64_POP(A64_FP, A64_LR, A64_SP), ctx);
583
584 /* Set return value */
585 emit(A64_MOV(1, A64_R(0), r0), ctx);
586
587 /* Authenticate lr */
588 if (IS_ENABLED(CONFIG_ARM64_PTR_AUTH_KERNEL))
589 emit(A64_AUTIASP, ctx);
590
591 emit(A64_RET(A64_LR), ctx);
592}
593
594#define BPF_FIXUP_OFFSET_MASK GENMASK(26, 0)
595#define BPF_FIXUP_REG_MASK GENMASK(31, 27)
596
597bool ex_handler_bpf(const struct exception_table_entry *ex,
598 struct pt_regs *regs)
599{
600 off_t offset = FIELD_GET(BPF_FIXUP_OFFSET_MASK, ex->fixup);
601 int dst_reg = FIELD_GET(BPF_FIXUP_REG_MASK, ex->fixup);
602
603 regs->regs[dst_reg] = 0;
604 regs->pc = (unsigned long)&ex->fixup - offset;
605 return true;
606}
607
608/* For accesses to BTF pointers, add an entry to the exception table */
609static int add_exception_handler(const struct bpf_insn *insn,
610 struct jit_ctx *ctx,
611 int dst_reg)
612{
613 off_t offset;
614 unsigned long pc;
615 struct exception_table_entry *ex;
616
617 if (!ctx->image)
618 /* First pass */
619 return 0;
620
621 if (BPF_MODE(insn->code) != BPF_PROBE_MEM)
622 return 0;
623
624 if (!ctx->prog->aux->extable ||
625 WARN_ON_ONCE(ctx->exentry_idx >= ctx->prog->aux->num_exentries))
626 return -EINVAL;
627
628 ex = &ctx->prog->aux->extable[ctx->exentry_idx];
629 pc = (unsigned long)&ctx->image[ctx->idx - 1];
630
631 offset = pc - (long)&ex->insn;
632 if (WARN_ON_ONCE(offset >= 0 || offset < INT_MIN))
633 return -ERANGE;
634 ex->insn = offset;
635
636 /*
637 * Since the extable follows the program, the fixup offset is always
638 * negative and limited to BPF_JIT_REGION_SIZE. Store a positive value
639 * to keep things simple, and put the destination register in the upper
640 * bits. We don't need to worry about buildtime or runtime sort
641 * modifying the upper bits because the table is already sorted, and
642 * isn't part of the main exception table.
643 */
644 offset = (long)&ex->fixup - (pc + AARCH64_INSN_SIZE);
645 if (!FIELD_FIT(BPF_FIXUP_OFFSET_MASK, offset))
646 return -ERANGE;
647
648 ex->fixup = FIELD_PREP(BPF_FIXUP_OFFSET_MASK, offset) |
649 FIELD_PREP(BPF_FIXUP_REG_MASK, dst_reg);
650
651 ex->type = EX_TYPE_BPF;
652
653 ctx->exentry_idx++;
654 return 0;
655}
656
657/* JITs an eBPF instruction.
658 * Returns:
659 * 0 - successfully JITed an 8-byte eBPF instruction.
660 * >0 - successfully JITed a 16-byte eBPF instruction.
661 * <0 - failed to JIT.
662 */
663static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
664 bool extra_pass)
665{
666 const u8 code = insn->code;
667 const u8 dst = bpf2a64[insn->dst_reg];
668 const u8 src = bpf2a64[insn->src_reg];
669 const u8 tmp = bpf2a64[TMP_REG_1];
670 const u8 tmp2 = bpf2a64[TMP_REG_2];
671 const u8 fp = bpf2a64[BPF_REG_FP];
672 const u8 fpb = bpf2a64[FP_BOTTOM];
673 const s16 off = insn->off;
674 const s32 imm = insn->imm;
675 const int i = insn - ctx->prog->insnsi;
676 const bool is64 = BPF_CLASS(code) == BPF_ALU64 ||
677 BPF_CLASS(code) == BPF_JMP;
678 u8 jmp_cond;
679 s32 jmp_offset;
680 u32 a64_insn;
681 u8 src_adj;
682 u8 dst_adj;
683 int off_adj;
684 int ret;
685
686 switch (code) {
687 /* dst = src */
688 case BPF_ALU | BPF_MOV | BPF_X:
689 case BPF_ALU64 | BPF_MOV | BPF_X:
690 emit(A64_MOV(is64, dst, src), ctx);
691 break;
692 /* dst = dst OP src */
693 case BPF_ALU | BPF_ADD | BPF_X:
694 case BPF_ALU64 | BPF_ADD | BPF_X:
695 emit(A64_ADD(is64, dst, dst, src), ctx);
696 break;
697 case BPF_ALU | BPF_SUB | BPF_X:
698 case BPF_ALU64 | BPF_SUB | BPF_X:
699 emit(A64_SUB(is64, dst, dst, src), ctx);
700 break;
701 case BPF_ALU | BPF_AND | BPF_X:
702 case BPF_ALU64 | BPF_AND | BPF_X:
703 emit(A64_AND(is64, dst, dst, src), ctx);
704 break;
705 case BPF_ALU | BPF_OR | BPF_X:
706 case BPF_ALU64 | BPF_OR | BPF_X:
707 emit(A64_ORR(is64, dst, dst, src), ctx);
708 break;
709 case BPF_ALU | BPF_XOR | BPF_X:
710 case BPF_ALU64 | BPF_XOR | BPF_X:
711 emit(A64_EOR(is64, dst, dst, src), ctx);
712 break;
713 case BPF_ALU | BPF_MUL | BPF_X:
714 case BPF_ALU64 | BPF_MUL | BPF_X:
715 emit(A64_MUL(is64, dst, dst, src), ctx);
716 break;
717 case BPF_ALU | BPF_DIV | BPF_X:
718 case BPF_ALU64 | BPF_DIV | BPF_X:
719 emit(A64_UDIV(is64, dst, dst, src), ctx);
720 break;
721 case BPF_ALU | BPF_MOD | BPF_X:
722 case BPF_ALU64 | BPF_MOD | BPF_X:
723 emit(A64_UDIV(is64, tmp, dst, src), ctx);
724 emit(A64_MSUB(is64, dst, dst, tmp, src), ctx);
725 break;
726 case BPF_ALU | BPF_LSH | BPF_X:
727 case BPF_ALU64 | BPF_LSH | BPF_X:
728 emit(A64_LSLV(is64, dst, dst, src), ctx);
729 break;
730 case BPF_ALU | BPF_RSH | BPF_X:
731 case BPF_ALU64 | BPF_RSH | BPF_X:
732 emit(A64_LSRV(is64, dst, dst, src), ctx);
733 break;
734 case BPF_ALU | BPF_ARSH | BPF_X:
735 case BPF_ALU64 | BPF_ARSH | BPF_X:
736 emit(A64_ASRV(is64, dst, dst, src), ctx);
737 break;
738 /* dst = -dst */
739 case BPF_ALU | BPF_NEG:
740 case BPF_ALU64 | BPF_NEG:
741 emit(A64_NEG(is64, dst, dst), ctx);
742 break;
743 /* dst = BSWAP##imm(dst) */
744 case BPF_ALU | BPF_END | BPF_FROM_LE:
745 case BPF_ALU | BPF_END | BPF_FROM_BE:
746#ifdef CONFIG_CPU_BIG_ENDIAN
747 if (BPF_SRC(code) == BPF_FROM_BE)
748 goto emit_bswap_uxt;
749#else /* !CONFIG_CPU_BIG_ENDIAN */
750 if (BPF_SRC(code) == BPF_FROM_LE)
751 goto emit_bswap_uxt;
752#endif
753 switch (imm) {
754 case 16:
755 emit(A64_REV16(is64, dst, dst), ctx);
756 /* zero-extend 16 bits into 64 bits */
757 emit(A64_UXTH(is64, dst, dst), ctx);
758 break;
759 case 32:
760 emit(A64_REV32(is64, dst, dst), ctx);
761 /* upper 32 bits already cleared */
762 break;
763 case 64:
764 emit(A64_REV64(dst, dst), ctx);
765 break;
766 }
767 break;
768emit_bswap_uxt:
769 switch (imm) {
770 case 16:
771 /* zero-extend 16 bits into 64 bits */
772 emit(A64_UXTH(is64, dst, dst), ctx);
773 break;
774 case 32:
775 /* zero-extend 32 bits into 64 bits */
776 emit(A64_UXTW(is64, dst, dst), ctx);
777 break;
778 case 64:
779 /* nop */
780 break;
781 }
782 break;
783 /* dst = imm */
784 case BPF_ALU | BPF_MOV | BPF_K:
785 case BPF_ALU64 | BPF_MOV | BPF_K:
786 emit_a64_mov_i(is64, dst, imm, ctx);
787 break;
788 /* dst = dst OP imm */
789 case BPF_ALU | BPF_ADD | BPF_K:
790 case BPF_ALU64 | BPF_ADD | BPF_K:
791 if (is_addsub_imm(imm)) {
792 emit(A64_ADD_I(is64, dst, dst, imm), ctx);
793 } else if (is_addsub_imm(-imm)) {
794 emit(A64_SUB_I(is64, dst, dst, -imm), ctx);
795 } else {
796 emit_a64_mov_i(is64, tmp, imm, ctx);
797 emit(A64_ADD(is64, dst, dst, tmp), ctx);
798 }
799 break;
800 case BPF_ALU | BPF_SUB | BPF_K:
801 case BPF_ALU64 | BPF_SUB | BPF_K:
802 if (is_addsub_imm(imm)) {
803 emit(A64_SUB_I(is64, dst, dst, imm), ctx);
804 } else if (is_addsub_imm(-imm)) {
805 emit(A64_ADD_I(is64, dst, dst, -imm), ctx);
806 } else {
807 emit_a64_mov_i(is64, tmp, imm, ctx);
808 emit(A64_SUB(is64, dst, dst, tmp), ctx);
809 }
810 break;
811 case BPF_ALU | BPF_AND | BPF_K:
812 case BPF_ALU64 | BPF_AND | BPF_K:
813 a64_insn = A64_AND_I(is64, dst, dst, imm);
814 if (a64_insn != AARCH64_BREAK_FAULT) {
815 emit(a64_insn, ctx);
816 } else {
817 emit_a64_mov_i(is64, tmp, imm, ctx);
818 emit(A64_AND(is64, dst, dst, tmp), ctx);
819 }
820 break;
821 case BPF_ALU | BPF_OR | BPF_K:
822 case BPF_ALU64 | BPF_OR | BPF_K:
823 a64_insn = A64_ORR_I(is64, dst, dst, imm);
824 if (a64_insn != AARCH64_BREAK_FAULT) {
825 emit(a64_insn, ctx);
826 } else {
827 emit_a64_mov_i(is64, tmp, imm, ctx);
828 emit(A64_ORR(is64, dst, dst, tmp), ctx);
829 }
830 break;
831 case BPF_ALU | BPF_XOR | BPF_K:
832 case BPF_ALU64 | BPF_XOR | BPF_K:
833 a64_insn = A64_EOR_I(is64, dst, dst, imm);
834 if (a64_insn != AARCH64_BREAK_FAULT) {
835 emit(a64_insn, ctx);
836 } else {
837 emit_a64_mov_i(is64, tmp, imm, ctx);
838 emit(A64_EOR(is64, dst, dst, tmp), ctx);
839 }
840 break;
841 case BPF_ALU | BPF_MUL | BPF_K:
842 case BPF_ALU64 | BPF_MUL | BPF_K:
843 emit_a64_mov_i(is64, tmp, imm, ctx);
844 emit(A64_MUL(is64, dst, dst, tmp), ctx);
845 break;
846 case BPF_ALU | BPF_DIV | BPF_K:
847 case BPF_ALU64 | BPF_DIV | BPF_K:
848 emit_a64_mov_i(is64, tmp, imm, ctx);
849 emit(A64_UDIV(is64, dst, dst, tmp), ctx);
850 break;
851 case BPF_ALU | BPF_MOD | BPF_K:
852 case BPF_ALU64 | BPF_MOD | BPF_K:
853 emit_a64_mov_i(is64, tmp2, imm, ctx);
854 emit(A64_UDIV(is64, tmp, dst, tmp2), ctx);
855 emit(A64_MSUB(is64, dst, dst, tmp, tmp2), ctx);
856 break;
857 case BPF_ALU | BPF_LSH | BPF_K:
858 case BPF_ALU64 | BPF_LSH | BPF_K:
859 emit(A64_LSL(is64, dst, dst, imm), ctx);
860 break;
861 case BPF_ALU | BPF_RSH | BPF_K:
862 case BPF_ALU64 | BPF_RSH | BPF_K:
863 emit(A64_LSR(is64, dst, dst, imm), ctx);
864 break;
865 case BPF_ALU | BPF_ARSH | BPF_K:
866 case BPF_ALU64 | BPF_ARSH | BPF_K:
867 emit(A64_ASR(is64, dst, dst, imm), ctx);
868 break;
869
870 /* JUMP off */
871 case BPF_JMP | BPF_JA:
872 jmp_offset = bpf2a64_offset(i, off, ctx);
873 check_imm26(jmp_offset);
874 emit(A64_B(jmp_offset), ctx);
875 break;
876 /* IF (dst COND src) JUMP off */
877 case BPF_JMP | BPF_JEQ | BPF_X:
878 case BPF_JMP | BPF_JGT | BPF_X:
879 case BPF_JMP | BPF_JLT | BPF_X:
880 case BPF_JMP | BPF_JGE | BPF_X:
881 case BPF_JMP | BPF_JLE | BPF_X:
882 case BPF_JMP | BPF_JNE | BPF_X:
883 case BPF_JMP | BPF_JSGT | BPF_X:
884 case BPF_JMP | BPF_JSLT | BPF_X:
885 case BPF_JMP | BPF_JSGE | BPF_X:
886 case BPF_JMP | BPF_JSLE | BPF_X:
887 case BPF_JMP32 | BPF_JEQ | BPF_X:
888 case BPF_JMP32 | BPF_JGT | BPF_X:
889 case BPF_JMP32 | BPF_JLT | BPF_X:
890 case BPF_JMP32 | BPF_JGE | BPF_X:
891 case BPF_JMP32 | BPF_JLE | BPF_X:
892 case BPF_JMP32 | BPF_JNE | BPF_X:
893 case BPF_JMP32 | BPF_JSGT | BPF_X:
894 case BPF_JMP32 | BPF_JSLT | BPF_X:
895 case BPF_JMP32 | BPF_JSGE | BPF_X:
896 case BPF_JMP32 | BPF_JSLE | BPF_X:
897 emit(A64_CMP(is64, dst, src), ctx);
898emit_cond_jmp:
899 jmp_offset = bpf2a64_offset(i, off, ctx);
900 check_imm19(jmp_offset);
901 switch (BPF_OP(code)) {
902 case BPF_JEQ:
903 jmp_cond = A64_COND_EQ;
904 break;
905 case BPF_JGT:
906 jmp_cond = A64_COND_HI;
907 break;
908 case BPF_JLT:
909 jmp_cond = A64_COND_CC;
910 break;
911 case BPF_JGE:
912 jmp_cond = A64_COND_CS;
913 break;
914 case BPF_JLE:
915 jmp_cond = A64_COND_LS;
916 break;
917 case BPF_JSET:
918 case BPF_JNE:
919 jmp_cond = A64_COND_NE;
920 break;
921 case BPF_JSGT:
922 jmp_cond = A64_COND_GT;
923 break;
924 case BPF_JSLT:
925 jmp_cond = A64_COND_LT;
926 break;
927 case BPF_JSGE:
928 jmp_cond = A64_COND_GE;
929 break;
930 case BPF_JSLE:
931 jmp_cond = A64_COND_LE;
932 break;
933 default:
934 return -EFAULT;
935 }
936 emit(A64_B_(jmp_cond, jmp_offset), ctx);
937 break;
938 case BPF_JMP | BPF_JSET | BPF_X:
939 case BPF_JMP32 | BPF_JSET | BPF_X:
940 emit(A64_TST(is64, dst, src), ctx);
941 goto emit_cond_jmp;
942 /* IF (dst COND imm) JUMP off */
943 case BPF_JMP | BPF_JEQ | BPF_K:
944 case BPF_JMP | BPF_JGT | BPF_K:
945 case BPF_JMP | BPF_JLT | BPF_K:
946 case BPF_JMP | BPF_JGE | BPF_K:
947 case BPF_JMP | BPF_JLE | BPF_K:
948 case BPF_JMP | BPF_JNE | BPF_K:
949 case BPF_JMP | BPF_JSGT | BPF_K:
950 case BPF_JMP | BPF_JSLT | BPF_K:
951 case BPF_JMP | BPF_JSGE | BPF_K:
952 case BPF_JMP | BPF_JSLE | BPF_K:
953 case BPF_JMP32 | BPF_JEQ | BPF_K:
954 case BPF_JMP32 | BPF_JGT | BPF_K:
955 case BPF_JMP32 | BPF_JLT | BPF_K:
956 case BPF_JMP32 | BPF_JGE | BPF_K:
957 case BPF_JMP32 | BPF_JLE | BPF_K:
958 case BPF_JMP32 | BPF_JNE | BPF_K:
959 case BPF_JMP32 | BPF_JSGT | BPF_K:
960 case BPF_JMP32 | BPF_JSLT | BPF_K:
961 case BPF_JMP32 | BPF_JSGE | BPF_K:
962 case BPF_JMP32 | BPF_JSLE | BPF_K:
963 if (is_addsub_imm(imm)) {
964 emit(A64_CMP_I(is64, dst, imm), ctx);
965 } else if (is_addsub_imm(-imm)) {
966 emit(A64_CMN_I(is64, dst, -imm), ctx);
967 } else {
968 emit_a64_mov_i(is64, tmp, imm, ctx);
969 emit(A64_CMP(is64, dst, tmp), ctx);
970 }
971 goto emit_cond_jmp;
972 case BPF_JMP | BPF_JSET | BPF_K:
973 case BPF_JMP32 | BPF_JSET | BPF_K:
974 a64_insn = A64_TST_I(is64, dst, imm);
975 if (a64_insn != AARCH64_BREAK_FAULT) {
976 emit(a64_insn, ctx);
977 } else {
978 emit_a64_mov_i(is64, tmp, imm, ctx);
979 emit(A64_TST(is64, dst, tmp), ctx);
980 }
981 goto emit_cond_jmp;
982 /* function call */
983 case BPF_JMP | BPF_CALL:
984 {
985 const u8 r0 = bpf2a64[BPF_REG_0];
986 bool func_addr_fixed;
987 u64 func_addr;
988
989 ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass,
990 &func_addr, &func_addr_fixed);
991 if (ret < 0)
992 return ret;
993 emit_addr_mov_i64(tmp, func_addr, ctx);
994 emit(A64_BLR(tmp), ctx);
995 emit(A64_MOV(1, r0, A64_R(0)), ctx);
996 break;
997 }
998 /* tail call */
999 case BPF_JMP | BPF_TAIL_CALL:
1000 if (emit_bpf_tail_call(ctx))
1001 return -EFAULT;
1002 break;
1003 /* function return */
1004 case BPF_JMP | BPF_EXIT:
1005 /* Optimization: when last instruction is EXIT,
1006 simply fallthrough to epilogue. */
1007 if (i == ctx->prog->len - 1)
1008 break;
1009 jmp_offset = epilogue_offset(ctx);
1010 check_imm26(jmp_offset);
1011 emit(A64_B(jmp_offset), ctx);
1012 break;
1013
1014 /* dst = imm64 */
1015 case BPF_LD | BPF_IMM | BPF_DW:
1016 {
1017 const struct bpf_insn insn1 = insn[1];
1018 u64 imm64;
1019
1020 imm64 = (u64)insn1.imm << 32 | (u32)imm;
1021 if (bpf_pseudo_func(insn))
1022 emit_addr_mov_i64(dst, imm64, ctx);
1023 else
1024 emit_a64_mov_i64(dst, imm64, ctx);
1025
1026 return 1;
1027 }
1028
1029 /* LDX: dst = *(size *)(src + off) */
1030 case BPF_LDX | BPF_MEM | BPF_W:
1031 case BPF_LDX | BPF_MEM | BPF_H:
1032 case BPF_LDX | BPF_MEM | BPF_B:
1033 case BPF_LDX | BPF_MEM | BPF_DW:
1034 case BPF_LDX | BPF_PROBE_MEM | BPF_DW:
1035 case BPF_LDX | BPF_PROBE_MEM | BPF_W:
1036 case BPF_LDX | BPF_PROBE_MEM | BPF_H:
1037 case BPF_LDX | BPF_PROBE_MEM | BPF_B:
1038 if (ctx->fpb_offset > 0 && src == fp) {
1039 src_adj = fpb;
1040 off_adj = off + ctx->fpb_offset;
1041 } else {
1042 src_adj = src;
1043 off_adj = off;
1044 }
1045 switch (BPF_SIZE(code)) {
1046 case BPF_W:
1047 if (is_lsi_offset(off_adj, 2)) {
1048 emit(A64_LDR32I(dst, src_adj, off_adj), ctx);
1049 } else {
1050 emit_a64_mov_i(1, tmp, off, ctx);
1051 emit(A64_LDR32(dst, src, tmp), ctx);
1052 }
1053 break;
1054 case BPF_H:
1055 if (is_lsi_offset(off_adj, 1)) {
1056 emit(A64_LDRHI(dst, src_adj, off_adj), ctx);
1057 } else {
1058 emit_a64_mov_i(1, tmp, off, ctx);
1059 emit(A64_LDRH(dst, src, tmp), ctx);
1060 }
1061 break;
1062 case BPF_B:
1063 if (is_lsi_offset(off_adj, 0)) {
1064 emit(A64_LDRBI(dst, src_adj, off_adj), ctx);
1065 } else {
1066 emit_a64_mov_i(1, tmp, off, ctx);
1067 emit(A64_LDRB(dst, src, tmp), ctx);
1068 }
1069 break;
1070 case BPF_DW:
1071 if (is_lsi_offset(off_adj, 3)) {
1072 emit(A64_LDR64I(dst, src_adj, off_adj), ctx);
1073 } else {
1074 emit_a64_mov_i(1, tmp, off, ctx);
1075 emit(A64_LDR64(dst, src, tmp), ctx);
1076 }
1077 break;
1078 }
1079
1080 ret = add_exception_handler(insn, ctx, dst);
1081 if (ret)
1082 return ret;
1083 break;
1084
1085 /* speculation barrier */
1086 case BPF_ST | BPF_NOSPEC:
1087 /*
1088 * Nothing required here.
1089 *
1090 * In case of arm64, we rely on the firmware mitigation of
1091 * Speculative Store Bypass as controlled via the ssbd kernel
1092 * parameter. Whenever the mitigation is enabled, it works
1093 * for all of the kernel code with no need to provide any
1094 * additional instructions.
1095 */
1096 break;
1097
1098 /* ST: *(size *)(dst + off) = imm */
1099 case BPF_ST | BPF_MEM | BPF_W:
1100 case BPF_ST | BPF_MEM | BPF_H:
1101 case BPF_ST | BPF_MEM | BPF_B:
1102 case BPF_ST | BPF_MEM | BPF_DW:
1103 if (ctx->fpb_offset > 0 && dst == fp) {
1104 dst_adj = fpb;
1105 off_adj = off + ctx->fpb_offset;
1106 } else {
1107 dst_adj = dst;
1108 off_adj = off;
1109 }
1110 /* Load imm to a register then store it */
1111 emit_a64_mov_i(1, tmp, imm, ctx);
1112 switch (BPF_SIZE(code)) {
1113 case BPF_W:
1114 if (is_lsi_offset(off_adj, 2)) {
1115 emit(A64_STR32I(tmp, dst_adj, off_adj), ctx);
1116 } else {
1117 emit_a64_mov_i(1, tmp2, off, ctx);
1118 emit(A64_STR32(tmp, dst, tmp2), ctx);
1119 }
1120 break;
1121 case BPF_H:
1122 if (is_lsi_offset(off_adj, 1)) {
1123 emit(A64_STRHI(tmp, dst_adj, off_adj), ctx);
1124 } else {
1125 emit_a64_mov_i(1, tmp2, off, ctx);
1126 emit(A64_STRH(tmp, dst, tmp2), ctx);
1127 }
1128 break;
1129 case BPF_B:
1130 if (is_lsi_offset(off_adj, 0)) {
1131 emit(A64_STRBI(tmp, dst_adj, off_adj), ctx);
1132 } else {
1133 emit_a64_mov_i(1, tmp2, off, ctx);
1134 emit(A64_STRB(tmp, dst, tmp2), ctx);
1135 }
1136 break;
1137 case BPF_DW:
1138 if (is_lsi_offset(off_adj, 3)) {
1139 emit(A64_STR64I(tmp, dst_adj, off_adj), ctx);
1140 } else {
1141 emit_a64_mov_i(1, tmp2, off, ctx);
1142 emit(A64_STR64(tmp, dst, tmp2), ctx);
1143 }
1144 break;
1145 }
1146 break;
1147
1148 /* STX: *(size *)(dst + off) = src */
1149 case BPF_STX | BPF_MEM | BPF_W:
1150 case BPF_STX | BPF_MEM | BPF_H:
1151 case BPF_STX | BPF_MEM | BPF_B:
1152 case BPF_STX | BPF_MEM | BPF_DW:
1153 if (ctx->fpb_offset > 0 && dst == fp) {
1154 dst_adj = fpb;
1155 off_adj = off + ctx->fpb_offset;
1156 } else {
1157 dst_adj = dst;
1158 off_adj = off;
1159 }
1160 switch (BPF_SIZE(code)) {
1161 case BPF_W:
1162 if (is_lsi_offset(off_adj, 2)) {
1163 emit(A64_STR32I(src, dst_adj, off_adj), ctx);
1164 } else {
1165 emit_a64_mov_i(1, tmp, off, ctx);
1166 emit(A64_STR32(src, dst, tmp), ctx);
1167 }
1168 break;
1169 case BPF_H:
1170 if (is_lsi_offset(off_adj, 1)) {
1171 emit(A64_STRHI(src, dst_adj, off_adj), ctx);
1172 } else {
1173 emit_a64_mov_i(1, tmp, off, ctx);
1174 emit(A64_STRH(src, dst, tmp), ctx);
1175 }
1176 break;
1177 case BPF_B:
1178 if (is_lsi_offset(off_adj, 0)) {
1179 emit(A64_STRBI(src, dst_adj, off_adj), ctx);
1180 } else {
1181 emit_a64_mov_i(1, tmp, off, ctx);
1182 emit(A64_STRB(src, dst, tmp), ctx);
1183 }
1184 break;
1185 case BPF_DW:
1186 if (is_lsi_offset(off_adj, 3)) {
1187 emit(A64_STR64I(src, dst_adj, off_adj), ctx);
1188 } else {
1189 emit_a64_mov_i(1, tmp, off, ctx);
1190 emit(A64_STR64(src, dst, tmp), ctx);
1191 }
1192 break;
1193 }
1194 break;
1195
1196 case BPF_STX | BPF_ATOMIC | BPF_W:
1197 case BPF_STX | BPF_ATOMIC | BPF_DW:
1198 if (cpus_have_cap(ARM64_HAS_LSE_ATOMICS))
1199 ret = emit_lse_atomic(insn, ctx);
1200 else
1201 ret = emit_ll_sc_atomic(insn, ctx);
1202 if (ret)
1203 return ret;
1204 break;
1205
1206 default:
1207 pr_err_once("unknown opcode %02x\n", code);
1208 return -EINVAL;
1209 }
1210
1211 return 0;
1212}
1213
1214/*
1215 * Return 0 if FP may change at runtime, otherwise find the minimum negative
1216 * offset to FP, converts it to positive number, and align down to 8 bytes.
1217 */
1218static int find_fpb_offset(struct bpf_prog *prog)
1219{
1220 int i;
1221 int offset = 0;
1222
1223 for (i = 0; i < prog->len; i++) {
1224 const struct bpf_insn *insn = &prog->insnsi[i];
1225 const u8 class = BPF_CLASS(insn->code);
1226 const u8 mode = BPF_MODE(insn->code);
1227 const u8 src = insn->src_reg;
1228 const u8 dst = insn->dst_reg;
1229 const s32 imm = insn->imm;
1230 const s16 off = insn->off;
1231
1232 switch (class) {
1233 case BPF_STX:
1234 case BPF_ST:
1235 /* fp holds atomic operation result */
1236 if (class == BPF_STX && mode == BPF_ATOMIC &&
1237 ((imm == BPF_XCHG ||
1238 imm == (BPF_FETCH | BPF_ADD) ||
1239 imm == (BPF_FETCH | BPF_AND) ||
1240 imm == (BPF_FETCH | BPF_XOR) ||
1241 imm == (BPF_FETCH | BPF_OR)) &&
1242 src == BPF_REG_FP))
1243 return 0;
1244
1245 if (mode == BPF_MEM && dst == BPF_REG_FP &&
1246 off < offset)
1247 offset = insn->off;
1248 break;
1249
1250 case BPF_JMP32:
1251 case BPF_JMP:
1252 break;
1253
1254 case BPF_LDX:
1255 case BPF_LD:
1256 /* fp holds load result */
1257 if (dst == BPF_REG_FP)
1258 return 0;
1259
1260 if (class == BPF_LDX && mode == BPF_MEM &&
1261 src == BPF_REG_FP && off < offset)
1262 offset = off;
1263 break;
1264
1265 case BPF_ALU:
1266 case BPF_ALU64:
1267 default:
1268 /* fp holds ALU result */
1269 if (dst == BPF_REG_FP)
1270 return 0;
1271 }
1272 }
1273
1274 if (offset < 0) {
1275 /*
1276 * safely be converted to a positive 'int', since insn->off
1277 * is 's16'
1278 */
1279 offset = -offset;
1280 /* align down to 8 bytes */
1281 offset = ALIGN_DOWN(offset, 8);
1282 }
1283
1284 return offset;
1285}
1286
1287static int build_body(struct jit_ctx *ctx, bool extra_pass)
1288{
1289 const struct bpf_prog *prog = ctx->prog;
1290 int i;
1291
1292 /*
1293 * - offset[0] offset of the end of prologue,
1294 * start of the 1st instruction.
1295 * - offset[1] - offset of the end of 1st instruction,
1296 * start of the 2nd instruction
1297 * [....]
1298 * - offset[3] - offset of the end of 3rd instruction,
1299 * start of 4th instruction
1300 */
1301 for (i = 0; i < prog->len; i++) {
1302 const struct bpf_insn *insn = &prog->insnsi[i];
1303 int ret;
1304
1305 if (ctx->image == NULL)
1306 ctx->offset[i] = ctx->idx;
1307 ret = build_insn(insn, ctx, extra_pass);
1308 if (ret > 0) {
1309 i++;
1310 if (ctx->image == NULL)
1311 ctx->offset[i] = ctx->idx;
1312 continue;
1313 }
1314 if (ret)
1315 return ret;
1316 }
1317 /*
1318 * offset is allocated with prog->len + 1 so fill in
1319 * the last element with the offset after the last
1320 * instruction (end of program)
1321 */
1322 if (ctx->image == NULL)
1323 ctx->offset[i] = ctx->idx;
1324
1325 return 0;
1326}
1327
1328static int validate_code(struct jit_ctx *ctx)
1329{
1330 int i;
1331
1332 for (i = 0; i < ctx->idx; i++) {
1333 u32 a64_insn = le32_to_cpu(ctx->image[i]);
1334
1335 if (a64_insn == AARCH64_BREAK_FAULT)
1336 return -1;
1337 }
1338
1339 if (WARN_ON_ONCE(ctx->exentry_idx != ctx->prog->aux->num_exentries))
1340 return -1;
1341
1342 return 0;
1343}
1344
1345static inline void bpf_flush_icache(void *start, void *end)
1346{
1347 flush_icache_range((unsigned long)start, (unsigned long)end);
1348}
1349
1350struct arm64_jit_data {
1351 struct bpf_binary_header *header;
1352 u8 *image;
1353 struct jit_ctx ctx;
1354};
1355
1356struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
1357{
1358 int image_size, prog_size, extable_size;
1359 struct bpf_prog *tmp, *orig_prog = prog;
1360 struct bpf_binary_header *header;
1361 struct arm64_jit_data *jit_data;
1362 bool was_classic = bpf_prog_was_classic(prog);
1363 bool tmp_blinded = false;
1364 bool extra_pass = false;
1365 struct jit_ctx ctx;
1366 u8 *image_ptr;
1367
1368 if (!prog->jit_requested)
1369 return orig_prog;
1370
1371 tmp = bpf_jit_blind_constants(prog);
1372 /* If blinding was requested and we failed during blinding,
1373 * we must fall back to the interpreter.
1374 */
1375 if (IS_ERR(tmp))
1376 return orig_prog;
1377 if (tmp != prog) {
1378 tmp_blinded = true;
1379 prog = tmp;
1380 }
1381
1382 jit_data = prog->aux->jit_data;
1383 if (!jit_data) {
1384 jit_data = kzalloc(sizeof(*jit_data), GFP_KERNEL);
1385 if (!jit_data) {
1386 prog = orig_prog;
1387 goto out;
1388 }
1389 prog->aux->jit_data = jit_data;
1390 }
1391 if (jit_data->ctx.offset) {
1392 ctx = jit_data->ctx;
1393 image_ptr = jit_data->image;
1394 header = jit_data->header;
1395 extra_pass = true;
1396 prog_size = sizeof(u32) * ctx.idx;
1397 goto skip_init_ctx;
1398 }
1399 memset(&ctx, 0, sizeof(ctx));
1400 ctx.prog = prog;
1401
1402 ctx.offset = kcalloc(prog->len + 1, sizeof(int), GFP_KERNEL);
1403 if (ctx.offset == NULL) {
1404 prog = orig_prog;
1405 goto out_off;
1406 }
1407
1408 ctx.fpb_offset = find_fpb_offset(prog);
1409
1410 /*
1411 * 1. Initial fake pass to compute ctx->idx and ctx->offset.
1412 *
1413 * BPF line info needs ctx->offset[i] to be the offset of
1414 * instruction[i] in jited image, so build prologue first.
1415 */
1416 if (build_prologue(&ctx, was_classic)) {
1417 prog = orig_prog;
1418 goto out_off;
1419 }
1420
1421 if (build_body(&ctx, extra_pass)) {
1422 prog = orig_prog;
1423 goto out_off;
1424 }
1425
1426 ctx.epilogue_offset = ctx.idx;
1427 build_epilogue(&ctx);
1428
1429 extable_size = prog->aux->num_exentries *
1430 sizeof(struct exception_table_entry);
1431
1432 /* Now we know the actual image size. */
1433 prog_size = sizeof(u32) * ctx.idx;
1434 image_size = prog_size + extable_size;
1435 header = bpf_jit_binary_alloc(image_size, &image_ptr,
1436 sizeof(u32), jit_fill_hole);
1437 if (header == NULL) {
1438 prog = orig_prog;
1439 goto out_off;
1440 }
1441
1442 /* 2. Now, the actual pass. */
1443
1444 ctx.image = (__le32 *)image_ptr;
1445 if (extable_size)
1446 prog->aux->extable = (void *)image_ptr + prog_size;
1447skip_init_ctx:
1448 ctx.idx = 0;
1449 ctx.exentry_idx = 0;
1450
1451 build_prologue(&ctx, was_classic);
1452
1453 if (build_body(&ctx, extra_pass)) {
1454 bpf_jit_binary_free(header);
1455 prog = orig_prog;
1456 goto out_off;
1457 }
1458
1459 build_epilogue(&ctx);
1460
1461 /* 3. Extra pass to validate JITed code. */
1462 if (validate_code(&ctx)) {
1463 bpf_jit_binary_free(header);
1464 prog = orig_prog;
1465 goto out_off;
1466 }
1467
1468 /* And we're done. */
1469 if (bpf_jit_enable > 1)
1470 bpf_jit_dump(prog->len, prog_size, 2, ctx.image);
1471
1472 bpf_flush_icache(header, ctx.image + ctx.idx);
1473
1474 if (!prog->is_func || extra_pass) {
1475 if (extra_pass && ctx.idx != jit_data->ctx.idx) {
1476 pr_err_once("multi-func JIT bug %d != %d\n",
1477 ctx.idx, jit_data->ctx.idx);
1478 bpf_jit_binary_free(header);
1479 prog->bpf_func = NULL;
1480 prog->jited = 0;
1481 prog->jited_len = 0;
1482 goto out_off;
1483 }
1484 bpf_jit_binary_lock_ro(header);
1485 } else {
1486 jit_data->ctx = ctx;
1487 jit_data->image = image_ptr;
1488 jit_data->header = header;
1489 }
1490 prog->bpf_func = (void *)ctx.image;
1491 prog->jited = 1;
1492 prog->jited_len = prog_size;
1493
1494 if (!prog->is_func || extra_pass) {
1495 int i;
1496
1497 /* offset[prog->len] is the size of program */
1498 for (i = 0; i <= prog->len; i++)
1499 ctx.offset[i] *= AARCH64_INSN_SIZE;
1500 bpf_prog_fill_jited_linfo(prog, ctx.offset + 1);
1501out_off:
1502 kfree(ctx.offset);
1503 kfree(jit_data);
1504 prog->aux->jit_data = NULL;
1505 }
1506out:
1507 if (tmp_blinded)
1508 bpf_jit_prog_release_other(prog, prog == orig_prog ?
1509 tmp : orig_prog);
1510 return prog;
1511}
1512
1513bool bpf_jit_supports_kfunc_call(void)
1514{
1515 return true;
1516}
1517
1518u64 bpf_jit_alloc_exec_limit(void)
1519{
1520 return VMALLOC_END - VMALLOC_START;
1521}
1522
1523void *bpf_jit_alloc_exec(unsigned long size)
1524{
1525 /* Memory is intended to be executable, reset the pointer tag. */
1526 return kasan_reset_tag(vmalloc(size));
1527}
1528
1529void bpf_jit_free_exec(void *addr)
1530{
1531 return vfree(addr);
1532}