~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/parisc/net/bpf_jit_comp64.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * BPF JIT compiler for PA-RISC (64-bit)
  4  *
  5  * Copyright(c) 2023 Helge Deller <deller@gmx.de>
  6  *
  7  * The code is based on the BPF JIT compiler for RV64 by Björn Töpel.
  8  *
  9  * TODO:
 10  * - check if bpf_jit_needs_zext() is needed (currently enabled)
 11  * - implement arch_prepare_bpf_trampoline(), poke(), ...
 12  */
 13 
 14 #include <linux/bitfield.h>
 15 #include <linux/bpf.h>
 16 #include <linux/filter.h>
 17 #include <linux/libgcc.h>
 18 #include "bpf_jit.h"
 19 
 20 static const int regmap[] = {
 21         [BPF_REG_0] =   HPPA_REG_RET0,
 22         [BPF_REG_1] =   HPPA_R(5),
 23         [BPF_REG_2] =   HPPA_R(6),
 24         [BPF_REG_3] =   HPPA_R(7),
 25         [BPF_REG_4] =   HPPA_R(8),
 26         [BPF_REG_5] =   HPPA_R(9),
 27         [BPF_REG_6] =   HPPA_R(10),
 28         [BPF_REG_7] =   HPPA_R(11),
 29         [BPF_REG_8] =   HPPA_R(12),
 30         [BPF_REG_9] =   HPPA_R(13),
 31         [BPF_REG_FP] =  HPPA_R(14),
 32         [BPF_REG_AX] =  HPPA_R(15),
 33 };
 34 
 35 /*
 36  * Stack layout during BPF program execution (note: stack grows up):
 37  *
 38  *                     high
 39  *   HPPA64 sp =>  +----------+ <= HPPA64 fp
 40  *                 | saved sp |
 41  *                 | saved rp |
 42  *                 |   ...    | HPPA64 callee-saved registers
 43  *                 | curr args|
 44  *                 | local var|
 45  *                 +----------+ <= (BPF FP)
 46  *                 |          |
 47  *                 |   ...    | BPF program stack
 48  *                 |          |
 49  *                 |   ...    | Function call stack
 50  *                 |          |
 51  *                 +----------+
 52  *                     low
 53  */
 54 
 55 /* Offset from fp for BPF registers stored on stack. */
 56 #define STACK_ALIGN     FRAME_SIZE
 57 
 58 #define EXIT_PTR_LOAD(reg)      hppa64_ldd_im16(-FRAME_SIZE, HPPA_REG_SP, reg)
 59 #define EXIT_PTR_STORE(reg)     hppa64_std_im16(reg, -FRAME_SIZE, HPPA_REG_SP)
 60 #define EXIT_PTR_JUMP(reg, nop) hppa_bv(HPPA_REG_ZERO, reg, nop)
 61 
 62 static u8 bpf_to_hppa_reg(int bpf_reg, struct hppa_jit_context *ctx)
 63 {
 64         u8 reg = regmap[bpf_reg];
 65 
 66         REG_SET_SEEN(ctx, reg);
 67         return reg;
 68 };
 69 
 70 static void emit_hppa_copy(const s8 rs, const s8 rd, struct hppa_jit_context *ctx)
 71 {
 72         REG_SET_SEEN(ctx, rd);
 73         if (OPTIMIZE_HPPA && (rs == rd))
 74                 return;
 75         REG_SET_SEEN(ctx, rs);
 76         emit(hppa_copy(rs, rd), ctx);
 77 }
 78 
 79 static void emit_hppa64_depd(u8 src, u8 pos, u8 len, u8 target, bool no_zero, struct hppa_jit_context *ctx)
 80 {
 81         int c;
 82 
 83         pos &= (BITS_PER_LONG - 1);
 84         pos = 63 - pos;
 85         len = 64 - len;
 86         c =  (len < 32)  ? 0x4 : 0;
 87         c |= (pos >= 32) ? 0x2 : 0;
 88         c |= (no_zero)   ? 0x1 : 0;
 89         emit(hppa_t10_insn(0x3c, target, src, 0, c, pos & 0x1f, len & 0x1f), ctx);
 90 }
 91 
 92 static void emit_hppa64_shld(u8 src, int num, u8 target, struct hppa_jit_context *ctx)
 93 {
 94         emit_hppa64_depd(src, 63-num, 64-num, target, 0, ctx);
 95 }
 96 
 97 static void emit_hppa64_extrd(u8 src, u8 pos, u8 len, u8 target, bool signed_op, struct hppa_jit_context *ctx)
 98 {
 99         int c;
100 
101         pos &= (BITS_PER_LONG - 1);
102         len = 64 - len;
103         c =  (len <  32) ? 0x4 : 0;
104         c |= (pos >= 32) ? 0x2 : 0;
105         c |= signed_op   ? 0x1 : 0;
106         emit(hppa_t10_insn(0x36, src, target, 0, c, pos & 0x1f, len & 0x1f), ctx);
107 }
108 
109 static void emit_hppa64_extrw(u8 src, u8 pos, u8 len, u8 target, bool signed_op, struct hppa_jit_context *ctx)
110 {
111         int c;
112 
113         pos &= (32 - 1);
114         len = 32 - len;
115         c = 0x06 | (signed_op ? 1 : 0);
116         emit(hppa_t10_insn(0x34, src, target, 0, c, pos, len), ctx);
117 }
118 
119 #define emit_hppa64_zext32(r, target, ctx) \
120         emit_hppa64_extrd(r, 63, 32, target, false, ctx)
121 #define emit_hppa64_sext32(r, target, ctx) \
122         emit_hppa64_extrd(r, 63, 32, target, true, ctx)
123 
124 static void emit_hppa64_shrd(u8 src, int num, u8 target, bool signed_op, struct hppa_jit_context *ctx)
125 {
126         emit_hppa64_extrd(src, 63-num, 64-num, target, signed_op, ctx);
127 }
128 
129 static void emit_hppa64_shrw(u8 src, int num, u8 target, bool signed_op, struct hppa_jit_context *ctx)
130 {
131         emit_hppa64_extrw(src, 31-num, 32-num, target, signed_op, ctx);
132 }
133 
134 /* Emit variable-length instructions for 32-bit imm */
135 static void emit_imm32(u8 rd, s32 imm, struct hppa_jit_context *ctx)
136 {
137         u32 lower = im11(imm);
138 
139         REG_SET_SEEN(ctx, rd);
140         if (OPTIMIZE_HPPA && relative_bits_ok(imm, 14)) {
141                 emit(hppa_ldi(imm, rd), ctx);
142                 return;
143         }
144         if (OPTIMIZE_HPPA && lower == imm) {
145                 emit(hppa_ldo(lower, HPPA_REG_ZERO, rd), ctx);
146                 return;
147         }
148         emit(hppa_ldil(imm, rd), ctx);
149         if (OPTIMIZE_HPPA && (lower == 0))
150                 return;
151         emit(hppa_ldo(lower, rd, rd), ctx);
152 }
153 
154 static bool is_32b_int(s64 val)
155 {
156         return val == (s32) val;
157 }
158 
159 /* Emit variable-length instructions for 64-bit imm */
160 static void emit_imm(u8 rd, s64 imm, u8 tmpreg, struct hppa_jit_context *ctx)
161 {
162         u32 upper32;
163 
164         /* get lower 32-bits into rd, sign extended */
165         emit_imm32(rd, imm, ctx);
166 
167         /* do we have upper 32-bits too ? */
168         if (OPTIMIZE_HPPA && is_32b_int(imm))
169                 return;
170 
171         /* load upper 32-bits into lower tmpreg and deposit into rd */
172         upper32 = imm >> 32;
173         if (upper32 || !OPTIMIZE_HPPA) {
174                 emit_imm32(tmpreg, upper32, ctx);
175                 emit_hppa64_depd(tmpreg, 31, 32, rd, 1, ctx);
176         } else
177                 emit_hppa64_depd(HPPA_REG_ZERO, 31, 32, rd, 1, ctx);
178 
179 }
180 
181 static int emit_jump(signed long paoff, bool force_far,
182                                struct hppa_jit_context *ctx)
183 {
184         unsigned long pc, addr;
185 
186         /* Note: Use 2 instructions for jumps if force_far is set. */
187         if (relative_bits_ok(paoff - HPPA_BRANCH_DISPLACEMENT, 22)) {
188                 /* use BL,long branch followed by nop() */
189                 emit(hppa64_bl_long(paoff - HPPA_BRANCH_DISPLACEMENT), ctx);
190                 if (force_far)
191                         emit(hppa_nop(), ctx);
192                 return 0;
193         }
194 
195         pc = (uintptr_t) &ctx->insns[ctx->ninsns];
196         addr = pc + (paoff * HPPA_INSN_SIZE);
197         /* even the 64-bit kernel runs in memory below 4GB */
198         if (WARN_ON_ONCE(addr >> 32))
199                 return -E2BIG;
200         emit(hppa_ldil(addr, HPPA_REG_R31), ctx);
201         emit(hppa_be_l(im11(addr) >> 2, HPPA_REG_R31, NOP_NEXT_INSTR), ctx);
202         return 0;
203 }
204 
205 static void __build_epilogue(bool is_tail_call, struct hppa_jit_context *ctx)
206 {
207         int i;
208 
209         if (is_tail_call) {
210                 /*
211                  * goto *(t0 + 4);
212                  * Skips first instruction of prologue which initializes tail
213                  * call counter. Assumes t0 contains address of target program,
214                  * see emit_bpf_tail_call.
215                  */
216                 emit(hppa_ldo(1 * HPPA_INSN_SIZE, HPPA_REG_T0, HPPA_REG_T0), ctx);
217                 emit(hppa_bv(HPPA_REG_ZERO, HPPA_REG_T0, EXEC_NEXT_INSTR), ctx);
218                 /* in delay slot: */
219                 emit(hppa_copy(HPPA_REG_TCC, HPPA_REG_TCC_IN_INIT), ctx);
220 
221                 return;
222         }
223 
224         /* load epilogue function pointer and jump to it. */
225         /* exit point is either at next instruction, or the outest TCC exit function */
226         emit(EXIT_PTR_LOAD(HPPA_REG_RP), ctx);
227         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
228 
229         /* NOTE: we are 64-bit and big-endian, so return lower sign-extended 32-bit value */
230         emit_hppa64_sext32(regmap[BPF_REG_0], HPPA_REG_RET0, ctx);
231 
232         /* Restore callee-saved registers. */
233         for (i = 3; i <= 15; i++) {
234                 if (OPTIMIZE_HPPA && !REG_WAS_SEEN(ctx, HPPA_R(i)))
235                         continue;
236                 emit(hppa64_ldd_im16(-REG_SIZE * i, HPPA_REG_SP, HPPA_R(i)), ctx);
237         }
238 
239         /* load original return pointer (stored by outest TCC function) */
240         emit(hppa64_ldd_im16(-2*REG_SIZE, HPPA_REG_SP, HPPA_REG_RP), ctx);
241         emit(hppa_bv(HPPA_REG_ZERO, HPPA_REG_RP, EXEC_NEXT_INSTR), ctx);
242         /* in delay slot: */
243         emit(hppa64_ldd_im5(-REG_SIZE, HPPA_REG_SP, HPPA_REG_SP), ctx);
244 
245         emit(hppa_nop(), ctx); // XXX WARUM einer zu wenig ??
246 }
247 
248 static int emit_branch(u8 op, u8 rd, u8 rs, signed long paoff,
249                         struct hppa_jit_context *ctx)
250 {
251         int e, s;
252         bool far = false;
253         int off;
254 
255         if (op == BPF_JSET) {
256                 /*
257                  * BPF_JSET is a special case: it has no inverse so translate
258                  * to and() function and compare against zero
259                  */
260                 emit(hppa_and(rd, rs, HPPA_REG_T0), ctx);
261                 paoff -= 1; /* reduce offset due to hppa_and() above */
262                 rd = HPPA_REG_T0;
263                 rs = HPPA_REG_ZERO;
264                 op = BPF_JNE;
265         }
266 
267         /* set start after BPF_JSET */
268         s = ctx->ninsns;
269 
270         if (!relative_branch_ok(paoff - HPPA_BRANCH_DISPLACEMENT + 1, 12)) {
271                 op = invert_bpf_cond(op);
272                 far = true;
273         }
274 
275         /*
276          * For a far branch, the condition is negated and we jump over the
277          * branch itself, and the two instructions from emit_jump.
278          * For a near branch, just use paoff.
279          */
280         off = far ? (2 - HPPA_BRANCH_DISPLACEMENT) : paoff - HPPA_BRANCH_DISPLACEMENT;
281 
282         switch (op) {
283         /* IF (dst COND src) JUMP off */
284         case BPF_JEQ:
285                 emit(hppa_beq(rd, rs, off), ctx);
286                 break;
287         case BPF_JGT:
288                 emit(hppa_bgtu(rd, rs, off), ctx);
289                 break;
290         case BPF_JLT:
291                 emit(hppa_bltu(rd, rs, off), ctx);
292                 break;
293         case BPF_JGE:
294                 emit(hppa_bgeu(rd, rs, off), ctx);
295                 break;
296         case BPF_JLE:
297                 emit(hppa_bleu(rd, rs, off), ctx);
298                 break;
299         case BPF_JNE:
300                 emit(hppa_bne(rd, rs, off), ctx);
301                 break;
302         case BPF_JSGT:
303                 emit(hppa_bgt(rd, rs, off), ctx);
304                 break;
305         case BPF_JSLT:
306                 emit(hppa_blt(rd, rs, off), ctx);
307                 break;
308         case BPF_JSGE:
309                 emit(hppa_bge(rd, rs, off), ctx);
310                 break;
311         case BPF_JSLE:
312                 emit(hppa_ble(rd, rs, off), ctx);
313                 break;
314         default:
315                 WARN_ON(1);
316         }
317 
318         if (far) {
319                 int ret;
320                 e = ctx->ninsns;
321                 /* Adjust for extra insns. */
322                 paoff -= (e - s);
323                 ret = emit_jump(paoff, true, ctx);
324                 if (ret)
325                         return ret;
326         } else {
327                 /*
328                  * always allocate 2 nops instead of the far branch to
329                  * reduce translation loops
330                  */
331                 emit(hppa_nop(), ctx);
332                 emit(hppa_nop(), ctx);
333         }
334         return 0;
335 }
336 
337 static void emit_zext_32(u8 reg, struct hppa_jit_context *ctx)
338 {
339         emit_hppa64_zext32(reg, reg, ctx);
340 }
341 
342 static void emit_bpf_tail_call(int insn, struct hppa_jit_context *ctx)
343 {
344         /*
345          * R1 -> &ctx
346          * R2 -> &array
347          * R3 -> index
348          */
349         int off;
350         const s8 arr_reg = regmap[BPF_REG_2];
351         const s8 idx_reg = regmap[BPF_REG_3];
352         struct bpf_array bpfa;
353         struct bpf_prog bpfp;
354 
355         /* if there is any tail call, we need to save & restore all registers */
356         REG_SET_SEEN_ALL(ctx);
357 
358         /* get address of TCC main exit function for error case into rp */
359         emit(EXIT_PTR_LOAD(HPPA_REG_RP), ctx);
360 
361         /* max_entries = array->map.max_entries; */
362         off = offsetof(struct bpf_array, map.max_entries);
363         BUILD_BUG_ON(sizeof(bpfa.map.max_entries) != 4);
364         emit(hppa_ldw(off, arr_reg, HPPA_REG_T1), ctx);
365 
366         /*
367          * if (index >= max_entries)
368          *   goto out;
369          */
370         emit(hppa_bltu(idx_reg, HPPA_REG_T1, 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
371         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
372 
373         /*
374          * if (--tcc < 0)
375          *   goto out;
376          */
377         REG_FORCE_SEEN(ctx, HPPA_REG_TCC);
378         emit(hppa_ldo(-1, HPPA_REG_TCC, HPPA_REG_TCC), ctx);
379         emit(hppa_bge(HPPA_REG_TCC, HPPA_REG_ZERO, 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
380         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
381 
382         /*
383          * prog = array->ptrs[index];
384          * if (!prog)
385          *   goto out;
386          */
387         BUILD_BUG_ON(sizeof(bpfa.ptrs[0]) != 8);
388         emit(hppa64_shladd(idx_reg, 3, arr_reg, HPPA_REG_T0), ctx);
389         off = offsetof(struct bpf_array, ptrs);
390         BUILD_BUG_ON(off < 16);
391         emit(hppa64_ldd_im16(off, HPPA_REG_T0, HPPA_REG_T0), ctx);
392         emit(hppa_bne(HPPA_REG_T0, HPPA_REG_ZERO, 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
393         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
394 
395         /*
396          * tcc = temp_tcc;
397          * goto *(prog->bpf_func + 4);
398          */
399         off = offsetof(struct bpf_prog, bpf_func);
400         BUILD_BUG_ON(off < 16);
401         BUILD_BUG_ON(sizeof(bpfp.bpf_func) != 8);
402         emit(hppa64_ldd_im16(off, HPPA_REG_T0, HPPA_REG_T0), ctx);
403         /* Epilogue jumps to *(t0 + 4). */
404         __build_epilogue(true, ctx);
405 }
406 
407 static void init_regs(u8 *rd, u8 *rs, const struct bpf_insn *insn,
408                       struct hppa_jit_context *ctx)
409 {
410         u8 code = insn->code;
411 
412         switch (code) {
413         case BPF_JMP | BPF_JA:
414         case BPF_JMP | BPF_CALL:
415         case BPF_JMP | BPF_EXIT:
416         case BPF_JMP | BPF_TAIL_CALL:
417                 break;
418         default:
419                 *rd = bpf_to_hppa_reg(insn->dst_reg, ctx);
420         }
421 
422         if (code & (BPF_ALU | BPF_X) || code & (BPF_ALU64 | BPF_X) ||
423             code & (BPF_JMP | BPF_X) || code & (BPF_JMP32 | BPF_X) ||
424             code & BPF_LDX || code & BPF_STX)
425                 *rs = bpf_to_hppa_reg(insn->src_reg, ctx);
426 }
427 
428 static void emit_zext_32_rd_rs(u8 *rd, u8 *rs, struct hppa_jit_context *ctx)
429 {
430         emit_hppa64_zext32(*rd, HPPA_REG_T2, ctx);
431         *rd = HPPA_REG_T2;
432         emit_hppa64_zext32(*rs, HPPA_REG_T1, ctx);
433         *rs = HPPA_REG_T1;
434 }
435 
436 static void emit_sext_32_rd_rs(u8 *rd, u8 *rs, struct hppa_jit_context *ctx)
437 {
438         emit_hppa64_sext32(*rd, HPPA_REG_T2, ctx);
439         *rd = HPPA_REG_T2;
440         emit_hppa64_sext32(*rs, HPPA_REG_T1, ctx);
441         *rs = HPPA_REG_T1;
442 }
443 
444 static void emit_zext_32_rd_t1(u8 *rd, struct hppa_jit_context *ctx)
445 {
446         emit_hppa64_zext32(*rd, HPPA_REG_T2, ctx);
447         *rd = HPPA_REG_T2;
448         emit_zext_32(HPPA_REG_T1, ctx);
449 }
450 
451 static void emit_sext_32_rd(u8 *rd, struct hppa_jit_context *ctx)
452 {
453         emit_hppa64_sext32(*rd, HPPA_REG_T2, ctx);
454         *rd = HPPA_REG_T2;
455 }
456 
457 static bool is_signed_bpf_cond(u8 cond)
458 {
459         return cond == BPF_JSGT || cond == BPF_JSLT ||
460                 cond == BPF_JSGE || cond == BPF_JSLE;
461 }
462 
463 static void emit_call(u64 addr, bool fixed, struct hppa_jit_context *ctx)
464 {
465         const int offset_sp = 2*FRAME_SIZE;
466 
467         emit(hppa_ldo(offset_sp, HPPA_REG_SP, HPPA_REG_SP), ctx);
468 
469         emit_hppa_copy(regmap[BPF_REG_1], HPPA_REG_ARG0, ctx);
470         emit_hppa_copy(regmap[BPF_REG_2], HPPA_REG_ARG1, ctx);
471         emit_hppa_copy(regmap[BPF_REG_3], HPPA_REG_ARG2, ctx);
472         emit_hppa_copy(regmap[BPF_REG_4], HPPA_REG_ARG3, ctx);
473         emit_hppa_copy(regmap[BPF_REG_5], HPPA_REG_ARG4, ctx);
474 
475         /* Backup TCC. */
476         REG_FORCE_SEEN(ctx, HPPA_REG_TCC_SAVED);
477         if (REG_WAS_SEEN(ctx, HPPA_REG_TCC))
478                 emit(hppa_copy(HPPA_REG_TCC, HPPA_REG_TCC_SAVED), ctx);
479 
480         /*
481          * Use ldil() to load absolute address. Don't use emit_imm as the
482          * number of emitted instructions should not depend on the value of
483          * addr.
484          */
485         WARN_ON(addr >> 32);
486         /* load function address and gp from Elf64_Fdesc descriptor */
487         emit(hppa_ldil(addr, HPPA_REG_R31), ctx);
488         emit(hppa_ldo(im11(addr), HPPA_REG_R31, HPPA_REG_R31), ctx);
489         emit(hppa64_ldd_im16(offsetof(struct elf64_fdesc, addr),
490                              HPPA_REG_R31, HPPA_REG_RP), ctx);
491         emit(hppa64_bve_l_rp(HPPA_REG_RP), ctx);
492         emit(hppa64_ldd_im16(offsetof(struct elf64_fdesc, gp),
493                              HPPA_REG_R31, HPPA_REG_GP), ctx);
494 
495         /* Restore TCC. */
496         if (REG_WAS_SEEN(ctx, HPPA_REG_TCC))
497                 emit(hppa_copy(HPPA_REG_TCC_SAVED, HPPA_REG_TCC), ctx);
498 
499         emit(hppa_ldo(-offset_sp, HPPA_REG_SP, HPPA_REG_SP), ctx);
500 
501         /* Set return value. */
502         emit_hppa_copy(HPPA_REG_RET0, regmap[BPF_REG_0], ctx);
503 }
504 
505 static void emit_call_libgcc_ll(void *func, const s8 arg0,
506                 const s8 arg1, u8 opcode, struct hppa_jit_context *ctx)
507 {
508         u64 func_addr;
509 
510         if (BPF_CLASS(opcode) == BPF_ALU) {
511                 emit_hppa64_zext32(arg0, HPPA_REG_ARG0, ctx);
512                 emit_hppa64_zext32(arg1, HPPA_REG_ARG1, ctx);
513         } else {
514                 emit_hppa_copy(arg0, HPPA_REG_ARG0, ctx);
515                 emit_hppa_copy(arg1, HPPA_REG_ARG1, ctx);
516         }
517 
518         /* libcgcc overwrites HPPA_REG_RET0, so keep copy in HPPA_REG_TCC_SAVED */
519         if (arg0 != HPPA_REG_RET0) {
520                 REG_SET_SEEN(ctx, HPPA_REG_TCC_SAVED);
521                 emit(hppa_copy(HPPA_REG_RET0, HPPA_REG_TCC_SAVED), ctx);
522         }
523 
524         /* set up stack */
525         emit(hppa_ldo(FRAME_SIZE, HPPA_REG_SP, HPPA_REG_SP), ctx);
526 
527         func_addr = (uintptr_t) func;
528         /* load function func_address and gp from Elf64_Fdesc descriptor */
529         emit_imm(HPPA_REG_R31, func_addr, arg0, ctx);
530         emit(hppa64_ldd_im16(offsetof(struct elf64_fdesc, addr),
531                              HPPA_REG_R31, HPPA_REG_RP), ctx);
532         /* skip the following bve_l instruction if divisor is 0. */
533         if (BPF_OP(opcode) == BPF_DIV || BPF_OP(opcode) == BPF_MOD) {
534                 if (BPF_OP(opcode) == BPF_DIV)
535                         emit_hppa_copy(HPPA_REG_ZERO, HPPA_REG_RET0, ctx);
536                 else {
537                         emit_hppa_copy(HPPA_REG_ARG0, HPPA_REG_RET0, ctx);
538                 }
539                 emit(hppa_beq(HPPA_REG_ARG1, HPPA_REG_ZERO, 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
540         }
541         emit(hppa64_bve_l_rp(HPPA_REG_RP), ctx);
542         emit(hppa64_ldd_im16(offsetof(struct elf64_fdesc, gp),
543                              HPPA_REG_R31, HPPA_REG_GP), ctx);
544 
545         emit(hppa_ldo(-FRAME_SIZE, HPPA_REG_SP, HPPA_REG_SP), ctx);
546 
547         emit_hppa_copy(HPPA_REG_RET0, arg0, ctx);
548 
549         /* restore HPPA_REG_RET0 */
550         if (arg0 != HPPA_REG_RET0)
551                 emit(hppa_copy(HPPA_REG_TCC_SAVED, HPPA_REG_RET0), ctx);
552 }
553 
554 static void emit_store(const s8 rd, const s8 rs, s16 off,
555                           struct hppa_jit_context *ctx, const u8 size,
556                           const u8 mode)
557 {
558         s8 dstreg;
559 
560         /* need to calculate address since offset does not fit in 14 bits? */
561         if (relative_bits_ok(off, 14))
562                 dstreg = rd;
563         else {
564                 /* need to use R1 here, since addil puts result into R1 */
565                 dstreg = HPPA_REG_R1;
566                 emit(hppa_addil(off, rd), ctx);
567                 off = im11(off);
568         }
569 
570         switch (size) {
571         case BPF_B:
572                 emit(hppa_stb(rs, off, dstreg), ctx);
573                 break;
574         case BPF_H:
575                 emit(hppa_sth(rs, off, dstreg), ctx);
576                 break;
577         case BPF_W:
578                 emit(hppa_stw(rs, off, dstreg), ctx);
579                 break;
580         case BPF_DW:
581                 if (off & 7) {
582                         emit(hppa_ldo(off, dstreg, HPPA_REG_R1), ctx);
583                         emit(hppa64_std_im5(rs, 0, HPPA_REG_R1), ctx);
584                 } else if (off >= -16 && off <= 15)
585                         emit(hppa64_std_im5(rs, off, dstreg), ctx);
586                 else
587                         emit(hppa64_std_im16(rs, off, dstreg), ctx);
588                 break;
589         }
590 }
591 
592 int bpf_jit_emit_insn(const struct bpf_insn *insn, struct hppa_jit_context *ctx,
593                       bool extra_pass)
594 {
595         bool is64 = BPF_CLASS(insn->code) == BPF_ALU64 ||
596                     BPF_CLASS(insn->code) == BPF_JMP;
597         int s, e, ret, i = insn - ctx->prog->insnsi;
598         s64 paoff;
599         struct bpf_prog_aux *aux = ctx->prog->aux;
600         u8 rd = -1, rs = -1, code = insn->code;
601         s16 off = insn->off;
602         s32 imm = insn->imm;
603 
604         init_regs(&rd, &rs, insn, ctx);
605 
606         switch (code) {
607         /* dst = src */
608         case BPF_ALU | BPF_MOV | BPF_X:
609         case BPF_ALU64 | BPF_MOV | BPF_X:
610                 if (imm == 1) {
611                         /* Special mov32 for zext */
612                         emit_zext_32(rd, ctx);
613                         break;
614                 }
615                 if (!is64 && !aux->verifier_zext)
616                         emit_hppa64_zext32(rs, rd, ctx);
617                 else
618                         emit_hppa_copy(rs, rd, ctx);
619                 break;
620 
621         /* dst = dst OP src */
622         case BPF_ALU | BPF_ADD | BPF_X:
623         case BPF_ALU64 | BPF_ADD | BPF_X:
624                 emit(hppa_add(rd, rs, rd), ctx);
625                 if (!is64 && !aux->verifier_zext)
626                         emit_zext_32(rd, ctx);
627                 break;
628         case BPF_ALU | BPF_SUB | BPF_X:
629         case BPF_ALU64 | BPF_SUB | BPF_X:
630                 emit(hppa_sub(rd, rs, rd), ctx);
631                 if (!is64 && !aux->verifier_zext)
632                         emit_zext_32(rd, ctx);
633                 break;
634         case BPF_ALU | BPF_AND | BPF_X:
635         case BPF_ALU64 | BPF_AND | BPF_X:
636                 emit(hppa_and(rd, rs, rd), ctx);
637                 if (!is64 && !aux->verifier_zext)
638                         emit_zext_32(rd, ctx);
639                 break;
640         case BPF_ALU | BPF_OR | BPF_X:
641         case BPF_ALU64 | BPF_OR | BPF_X:
642                 emit(hppa_or(rd, rs, rd), ctx);
643                 if (!is64 && !aux->verifier_zext)
644                         emit_zext_32(rd, ctx);
645                 break;
646         case BPF_ALU | BPF_XOR | BPF_X:
647         case BPF_ALU64 | BPF_XOR | BPF_X:
648                 emit(hppa_xor(rd, rs, rd), ctx);
649                 if (!is64 && !aux->verifier_zext && rs != rd)
650                         emit_zext_32(rd, ctx);
651                 break;
652         case BPF_ALU | BPF_MUL | BPF_K:
653         case BPF_ALU64 | BPF_MUL | BPF_K:
654                 emit_imm(HPPA_REG_T1, is64 ? (s64)(s32)imm : (u32)imm, HPPA_REG_T2, ctx);
655                 rs = HPPA_REG_T1;
656                 fallthrough;
657         case BPF_ALU | BPF_MUL | BPF_X:
658         case BPF_ALU64 | BPF_MUL | BPF_X:
659                 emit_call_libgcc_ll(__muldi3, rd, rs, code, ctx);
660                 if (!is64 && !aux->verifier_zext)
661                         emit_zext_32(rd, ctx);
662                 break;
663         case BPF_ALU | BPF_DIV | BPF_K:
664         case BPF_ALU64 | BPF_DIV | BPF_K:
665                 emit_imm(HPPA_REG_T1, is64 ? (s64)(s32)imm : (u32)imm, HPPA_REG_T2, ctx);
666                 rs = HPPA_REG_T1;
667                 fallthrough;
668         case BPF_ALU | BPF_DIV | BPF_X:
669         case BPF_ALU64 | BPF_DIV | BPF_X:
670                 emit_call_libgcc_ll(&hppa_div64, rd, rs, code, ctx);
671                 if (!is64 && !aux->verifier_zext)
672                         emit_zext_32(rd, ctx);
673                 break;
674         case BPF_ALU | BPF_MOD | BPF_K:
675         case BPF_ALU64 | BPF_MOD | BPF_K:
676                 emit_imm(HPPA_REG_T1, is64 ? (s64)(s32)imm : (u32)imm, HPPA_REG_T2, ctx);
677                 rs = HPPA_REG_T1;
678                 fallthrough;
679         case BPF_ALU | BPF_MOD | BPF_X:
680         case BPF_ALU64 | BPF_MOD | BPF_X:
681                 emit_call_libgcc_ll(&hppa_div64_rem, rd, rs, code, ctx);
682                 if (!is64 && !aux->verifier_zext)
683                         emit_zext_32(rd, ctx);
684                 break;
685 
686         case BPF_ALU | BPF_LSH | BPF_X:
687         case BPF_ALU64 | BPF_LSH | BPF_X:
688                 emit_hppa64_sext32(rs, HPPA_REG_T0, ctx);
689                 emit(hppa64_mtsarcm(HPPA_REG_T0), ctx);
690                 if (is64)
691                         emit(hppa64_depdz_sar(rd, rd), ctx);
692                 else
693                         emit(hppa_depwz_sar(rd, rd), ctx);
694                 if (!is64 && !aux->verifier_zext)
695                         emit_zext_32(rd, ctx);
696                 break;
697         case BPF_ALU | BPF_RSH | BPF_X:
698         case BPF_ALU64 | BPF_RSH | BPF_X:
699                 emit(hppa_mtsar(rs), ctx);
700                 if (is64)
701                         emit(hppa64_shrpd_sar(rd, rd), ctx);
702                 else
703                         emit(hppa_shrpw_sar(rd, rd), ctx);
704                 if (!is64 && !aux->verifier_zext)
705                         emit_zext_32(rd, ctx);
706                 break;
707         case BPF_ALU | BPF_ARSH | BPF_X:
708         case BPF_ALU64 | BPF_ARSH | BPF_X:
709                 emit_hppa64_sext32(rs, HPPA_REG_T0, ctx);
710                 emit(hppa64_mtsarcm(HPPA_REG_T0), ctx);
711                 if (is64)
712                         emit(hppa_extrd_sar(rd, rd, 1), ctx);
713                 else
714                         emit(hppa_extrws_sar(rd, rd), ctx);
715                 if (!is64 && !aux->verifier_zext)
716                         emit_zext_32(rd, ctx);
717                 break;
718 
719         /* dst = -dst */
720         case BPF_ALU | BPF_NEG:
721         case BPF_ALU64 | BPF_NEG:
722                 emit(hppa_sub(HPPA_REG_ZERO, rd, rd), ctx);
723                 if (!is64 && !aux->verifier_zext)
724                         emit_zext_32(rd, ctx);
725                 break;
726 
727         /* dst = BSWAP##imm(dst) */
728         case BPF_ALU | BPF_END | BPF_FROM_BE:
729                 switch (imm) {
730                 case 16:
731                         /* zero-extend 16 bits into 64 bits */
732                         emit_hppa64_depd(HPPA_REG_ZERO, 63-16, 64-16, rd, 1, ctx);
733                         break;
734                 case 32:
735                         if (!aux->verifier_zext)
736                                 emit_zext_32(rd, ctx);
737                         break;
738                 case 64:
739                         /* Do nothing */
740                         break;
741                 }
742                 break;
743 
744         case BPF_ALU | BPF_END | BPF_FROM_LE:
745                 switch (imm) {
746                 case 16:
747                         emit(hppa_extru(rd, 31 - 8, 8, HPPA_REG_T1), ctx);
748                         emit(hppa_depwz(rd, 23, 8, HPPA_REG_T1), ctx);
749                         emit(hppa_extru(HPPA_REG_T1, 31, 16, rd), ctx);
750                         emit_hppa64_extrd(HPPA_REG_T1, 63, 16, rd, 0, ctx);
751                         break;
752                 case 32:
753                         emit(hppa_shrpw(rd, rd, 16, HPPA_REG_T1), ctx);
754                         emit_hppa64_depd(HPPA_REG_T1, 63-16, 8, HPPA_REG_T1, 1, ctx);
755                         emit(hppa_shrpw(rd, HPPA_REG_T1, 8, HPPA_REG_T1), ctx);
756                         emit_hppa64_extrd(HPPA_REG_T1, 63, 32, rd, 0, ctx);
757                         break;
758                 case 64:
759                         emit(hppa64_permh_3210(rd, HPPA_REG_T1), ctx);
760                         emit(hppa64_hshl(HPPA_REG_T1, 8, HPPA_REG_T2), ctx);
761                         emit(hppa64_hshr_u(HPPA_REG_T1, 8, HPPA_REG_T1), ctx);
762                         emit(hppa_or(HPPA_REG_T2, HPPA_REG_T1, rd), ctx);
763                         break;
764                 default:
765                         pr_err("bpf-jit: BPF_END imm %d invalid\n", imm);
766                         return -1;
767                 }
768                 break;
769 
770         /* dst = imm */
771         case BPF_ALU | BPF_MOV | BPF_K:
772         case BPF_ALU64 | BPF_MOV | BPF_K:
773                 emit_imm(rd, imm, HPPA_REG_T2, ctx);
774                 if (!is64 && !aux->verifier_zext)
775                         emit_zext_32(rd, ctx);
776                 break;
777 
778         /* dst = dst OP imm */
779         case BPF_ALU | BPF_ADD | BPF_K:
780         case BPF_ALU64 | BPF_ADD | BPF_K:
781                 if (relative_bits_ok(imm, 14)) {
782                         emit(hppa_ldo(imm, rd, rd), ctx);
783                 } else {
784                         emit_imm(HPPA_REG_T1, imm, HPPA_REG_T2, ctx);
785                         emit(hppa_add(rd, HPPA_REG_T1, rd), ctx);
786                 }
787                 if (!is64 && !aux->verifier_zext)
788                         emit_zext_32(rd, ctx);
789                 break;
790         case BPF_ALU | BPF_SUB | BPF_K:
791         case BPF_ALU64 | BPF_SUB | BPF_K:
792                 if (relative_bits_ok(-imm, 14)) {
793                         emit(hppa_ldo(-imm, rd, rd), ctx);
794                 } else {
795                         emit_imm(HPPA_REG_T1, imm, HPPA_REG_T2, ctx);
796                         emit(hppa_sub(rd, HPPA_REG_T1, rd), ctx);
797                 }
798                 if (!is64 && !aux->verifier_zext)
799                         emit_zext_32(rd, ctx);
800                 break;
801         case BPF_ALU | BPF_AND | BPF_K:
802         case BPF_ALU64 | BPF_AND | BPF_K:
803                 emit_imm(HPPA_REG_T1, imm, HPPA_REG_T2, ctx);
804                 emit(hppa_and(rd, HPPA_REG_T1, rd), ctx);
805                 if (!is64 && !aux->verifier_zext)
806                         emit_zext_32(rd, ctx);
807                 break;
808         case BPF_ALU | BPF_OR | BPF_K:
809         case BPF_ALU64 | BPF_OR | BPF_K:
810                 emit_imm(HPPA_REG_T1, imm, HPPA_REG_T2, ctx);
811                 emit(hppa_or(rd, HPPA_REG_T1, rd), ctx);
812                 if (!is64 && !aux->verifier_zext)
813                         emit_zext_32(rd, ctx);
814                 break;
815         case BPF_ALU | BPF_XOR | BPF_K:
816         case BPF_ALU64 | BPF_XOR | BPF_K:
817                 emit_imm(HPPA_REG_T1, imm, HPPA_REG_T2, ctx);
818                 emit(hppa_xor(rd, HPPA_REG_T1, rd), ctx);
819                 if (!is64 && !aux->verifier_zext)
820                         emit_zext_32(rd, ctx);
821                 break;
822         case BPF_ALU | BPF_LSH | BPF_K:
823         case BPF_ALU64 | BPF_LSH | BPF_K:
824                 if (imm != 0) {
825                         emit_hppa64_shld(rd, imm, rd, ctx);
826                 }
827 
828                 if (!is64 && !aux->verifier_zext)
829                         emit_zext_32(rd, ctx);
830                 break;
831         case BPF_ALU | BPF_RSH | BPF_K:
832         case BPF_ALU64 | BPF_RSH | BPF_K:
833                 if (imm != 0) {
834                         if (is64)
835                                 emit_hppa64_shrd(rd, imm, rd, false, ctx);
836                         else
837                                 emit_hppa64_shrw(rd, imm, rd, false, ctx);
838                 }
839 
840                 if (!is64 && !aux->verifier_zext)
841                         emit_zext_32(rd, ctx);
842                 break;
843         case BPF_ALU | BPF_ARSH | BPF_K:
844         case BPF_ALU64 | BPF_ARSH | BPF_K:
845                 if (imm != 0) {
846                         if (is64)
847                                 emit_hppa64_shrd(rd, imm, rd, true, ctx);
848                         else
849                                 emit_hppa64_shrw(rd, imm, rd, true, ctx);
850                 }
851 
852                 if (!is64 && !aux->verifier_zext)
853                         emit_zext_32(rd, ctx);
854                 break;
855 
856         /* JUMP off */
857         case BPF_JMP | BPF_JA:
858                 paoff = hppa_offset(i, off, ctx);
859                 ret = emit_jump(paoff, false, ctx);
860                 if (ret)
861                         return ret;
862                 break;
863 
864         /* IF (dst COND src) JUMP off */
865         case BPF_JMP | BPF_JEQ | BPF_X:
866         case BPF_JMP32 | BPF_JEQ | BPF_X:
867         case BPF_JMP | BPF_JGT | BPF_X:
868         case BPF_JMP32 | BPF_JGT | BPF_X:
869         case BPF_JMP | BPF_JLT | BPF_X:
870         case BPF_JMP32 | BPF_JLT | BPF_X:
871         case BPF_JMP | BPF_JGE | BPF_X:
872         case BPF_JMP32 | BPF_JGE | BPF_X:
873         case BPF_JMP | BPF_JLE | BPF_X:
874         case BPF_JMP32 | BPF_JLE | BPF_X:
875         case BPF_JMP | BPF_JNE | BPF_X:
876         case BPF_JMP32 | BPF_JNE | BPF_X:
877         case BPF_JMP | BPF_JSGT | BPF_X:
878         case BPF_JMP32 | BPF_JSGT | BPF_X:
879         case BPF_JMP | BPF_JSLT | BPF_X:
880         case BPF_JMP32 | BPF_JSLT | BPF_X:
881         case BPF_JMP | BPF_JSGE | BPF_X:
882         case BPF_JMP32 | BPF_JSGE | BPF_X:
883         case BPF_JMP | BPF_JSLE | BPF_X:
884         case BPF_JMP32 | BPF_JSLE | BPF_X:
885         case BPF_JMP | BPF_JSET | BPF_X:
886         case BPF_JMP32 | BPF_JSET | BPF_X:
887                 paoff = hppa_offset(i, off, ctx);
888                 if (!is64) {
889                         s = ctx->ninsns;
890                         if (is_signed_bpf_cond(BPF_OP(code)))
891                                 emit_sext_32_rd_rs(&rd, &rs, ctx);
892                         else
893                                 emit_zext_32_rd_rs(&rd, &rs, ctx);
894                         e = ctx->ninsns;
895 
896                         /* Adjust for extra insns */
897                         paoff -= (e - s);
898                 }
899                 if (BPF_OP(code) == BPF_JSET) {
900                         /* Adjust for and */
901                         paoff -= 1;
902                         emit(hppa_and(rs, rd, HPPA_REG_T1), ctx);
903                         emit_branch(BPF_JNE, HPPA_REG_T1, HPPA_REG_ZERO, paoff,
904                                     ctx);
905                 } else {
906                         emit_branch(BPF_OP(code), rd, rs, paoff, ctx);
907                 }
908                 break;
909 
910         /* IF (dst COND imm) JUMP off */
911         case BPF_JMP | BPF_JEQ | BPF_K:
912         case BPF_JMP32 | BPF_JEQ | BPF_K:
913         case BPF_JMP | BPF_JGT | BPF_K:
914         case BPF_JMP32 | BPF_JGT | BPF_K:
915         case BPF_JMP | BPF_JLT | BPF_K:
916         case BPF_JMP32 | BPF_JLT | BPF_K:
917         case BPF_JMP | BPF_JGE | BPF_K:
918         case BPF_JMP32 | BPF_JGE | BPF_K:
919         case BPF_JMP | BPF_JLE | BPF_K:
920         case BPF_JMP32 | BPF_JLE | BPF_K:
921         case BPF_JMP | BPF_JNE | BPF_K:
922         case BPF_JMP32 | BPF_JNE | BPF_K:
923         case BPF_JMP | BPF_JSGT | BPF_K:
924         case BPF_JMP32 | BPF_JSGT | BPF_K:
925         case BPF_JMP | BPF_JSLT | BPF_K:
926         case BPF_JMP32 | BPF_JSLT | BPF_K:
927         case BPF_JMP | BPF_JSGE | BPF_K:
928         case BPF_JMP32 | BPF_JSGE | BPF_K:
929         case BPF_JMP | BPF_JSLE | BPF_K:
930         case BPF_JMP32 | BPF_JSLE | BPF_K:
931                 paoff = hppa_offset(i, off, ctx);
932                 s = ctx->ninsns;
933                 if (imm) {
934                         emit_imm(HPPA_REG_T1, imm, HPPA_REG_T2, ctx);
935                         rs = HPPA_REG_T1;
936                 } else {
937                         rs = HPPA_REG_ZERO;
938                 }
939                 if (!is64) {
940                         if (is_signed_bpf_cond(BPF_OP(code)))
941                                 emit_sext_32_rd(&rd, ctx);
942                         else
943                                 emit_zext_32_rd_t1(&rd, ctx);
944                 }
945                 e = ctx->ninsns;
946 
947                 /* Adjust for extra insns */
948                 paoff -= (e - s);
949                 emit_branch(BPF_OP(code), rd, rs, paoff, ctx);
950                 break;
951         case BPF_JMP | BPF_JSET | BPF_K:
952         case BPF_JMP32 | BPF_JSET | BPF_K:
953                 paoff = hppa_offset(i, off, ctx);
954                 s = ctx->ninsns;
955                 emit_imm(HPPA_REG_T1, imm, HPPA_REG_T2, ctx);
956                 emit(hppa_and(HPPA_REG_T1, rd, HPPA_REG_T1), ctx);
957                 /* For jset32, we should clear the upper 32 bits of t1, but
958                  * sign-extension is sufficient here and saves one instruction,
959                  * as t1 is used only in comparison against zero.
960                  */
961                 if (!is64 && imm < 0)
962                         emit_hppa64_sext32(HPPA_REG_T1, HPPA_REG_T1, ctx);
963                 e = ctx->ninsns;
964                 paoff -= (e - s);
965                 emit_branch(BPF_JNE, HPPA_REG_T1, HPPA_REG_ZERO, paoff, ctx);
966                 break;
967         /* function call */
968         case BPF_JMP | BPF_CALL:
969         {
970                 bool fixed_addr;
971                 u64 addr;
972 
973                 ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass,
974                                             &addr, &fixed_addr);
975                 if (ret < 0)
976                         return ret;
977 
978                 REG_SET_SEEN_ALL(ctx);
979                 emit_call(addr, fixed_addr, ctx);
980                 break;
981         }
982         /* tail call */
983         case BPF_JMP | BPF_TAIL_CALL:
984                 emit_bpf_tail_call(i, ctx);
985                 break;
986 
987         /* function return */
988         case BPF_JMP | BPF_EXIT:
989                 if (i == ctx->prog->len - 1)
990                         break;
991 
992                 paoff = epilogue_offset(ctx);
993                 ret = emit_jump(paoff, false, ctx);
994                 if (ret)
995                         return ret;
996                 break;
997 
998         /* dst = imm64 */
999         case BPF_LD | BPF_IMM | BPF_DW:
1000         {
1001                 struct bpf_insn insn1 = insn[1];
1002                 u64 imm64 = (u64)insn1.imm << 32 | (u32)imm;
1003                 if (bpf_pseudo_func(insn))
1004                         imm64 = (uintptr_t)dereference_function_descriptor((void*)imm64);
1005                 emit_imm(rd, imm64, HPPA_REG_T2, ctx);
1006 
1007                 return 1;
1008         }
1009 
1010         /* LDX: dst = *(size *)(src + off) */
1011         case BPF_LDX | BPF_MEM | BPF_B:
1012         case BPF_LDX | BPF_MEM | BPF_H:
1013         case BPF_LDX | BPF_MEM | BPF_W:
1014         case BPF_LDX | BPF_MEM | BPF_DW:
1015         case BPF_LDX | BPF_PROBE_MEM | BPF_B:
1016         case BPF_LDX | BPF_PROBE_MEM | BPF_H:
1017         case BPF_LDX | BPF_PROBE_MEM | BPF_W:
1018         case BPF_LDX | BPF_PROBE_MEM | BPF_DW:
1019         {
1020                 u8 srcreg;
1021 
1022                 /* need to calculate address since offset does not fit in 14 bits? */
1023                 if (relative_bits_ok(off, 14))
1024                         srcreg = rs;
1025                 else {
1026                         /* need to use R1 here, since addil puts result into R1 */
1027                         srcreg = HPPA_REG_R1;
1028                         BUG_ON(rs == HPPA_REG_R1);
1029                         BUG_ON(rd == HPPA_REG_R1);
1030                         emit(hppa_addil(off, rs), ctx);
1031                         off = im11(off);
1032                 }
1033 
1034                 switch (BPF_SIZE(code)) {
1035                 case BPF_B:
1036                         emit(hppa_ldb(off, srcreg, rd), ctx);
1037                         if (insn_is_zext(&insn[1]))
1038                                 return 1;
1039                         break;
1040                 case BPF_H:
1041                         emit(hppa_ldh(off, srcreg, rd), ctx);
1042                         if (insn_is_zext(&insn[1]))
1043                                 return 1;
1044                         break;
1045                 case BPF_W:
1046                         emit(hppa_ldw(off, srcreg, rd), ctx);
1047                         if (insn_is_zext(&insn[1]))
1048                                 return 1;
1049                         break;
1050                 case BPF_DW:
1051                         if (off & 7) {
1052                                 emit(hppa_ldo(off, srcreg, HPPA_REG_R1), ctx);
1053                                 emit(hppa64_ldd_reg(HPPA_REG_ZERO, HPPA_REG_R1, rd), ctx);
1054                         } else if (off >= -16 && off <= 15)
1055                                 emit(hppa64_ldd_im5(off, srcreg, rd), ctx);
1056                         else
1057                                 emit(hppa64_ldd_im16(off, srcreg, rd), ctx);
1058                         break;
1059                 }
1060                 break;
1061         }
1062         /* speculation barrier */
1063         case BPF_ST | BPF_NOSPEC:
1064                 break;
1065 
1066         /* ST: *(size *)(dst + off) = imm */
1067         /* STX: *(size *)(dst + off) = src */
1068         case BPF_ST | BPF_MEM | BPF_B:
1069         case BPF_ST | BPF_MEM | BPF_H:
1070         case BPF_ST | BPF_MEM | BPF_W:
1071         case BPF_ST | BPF_MEM | BPF_DW:
1072 
1073         case BPF_STX | BPF_MEM | BPF_B:
1074         case BPF_STX | BPF_MEM | BPF_H:
1075         case BPF_STX | BPF_MEM | BPF_W:
1076         case BPF_STX | BPF_MEM | BPF_DW:
1077                 if (BPF_CLASS(code) == BPF_ST) {
1078                         emit_imm(HPPA_REG_T2, imm, HPPA_REG_T1, ctx);
1079                         rs = HPPA_REG_T2;
1080                 }
1081 
1082                 emit_store(rd, rs, off, ctx, BPF_SIZE(code), BPF_MODE(code));
1083                 break;
1084 
1085         case BPF_STX | BPF_ATOMIC | BPF_W:
1086         case BPF_STX | BPF_ATOMIC | BPF_DW:
1087                 pr_info_once(
1088                         "bpf-jit: not supported: atomic operation %02x ***\n",
1089                         insn->imm);
1090                 return -EFAULT;
1091 
1092         default:
1093                 pr_err("bpf-jit: unknown opcode %02x\n", code);
1094                 return -EINVAL;
1095         }
1096 
1097         return 0;
1098 }
1099 
1100 void bpf_jit_build_prologue(struct hppa_jit_context *ctx)
1101 {
1102         int bpf_stack_adjust, stack_adjust, i;
1103         unsigned long addr;
1104         s8 reg;
1105 
1106         /*
1107          * stack on hppa grows up, so if tail calls are used we need to
1108          * allocate the maximum stack size
1109          */
1110         if (REG_ALL_SEEN(ctx))
1111                 bpf_stack_adjust = MAX_BPF_STACK;
1112         else
1113                 bpf_stack_adjust = ctx->prog->aux->stack_depth;
1114         bpf_stack_adjust = round_up(bpf_stack_adjust, STACK_ALIGN);
1115 
1116         stack_adjust = FRAME_SIZE + bpf_stack_adjust;
1117         stack_adjust = round_up(stack_adjust, STACK_ALIGN);
1118 
1119         /*
1120          * NOTE: We construct an Elf64_Fdesc descriptor here.
1121          * The first 4 words initialize the TCC and compares them.
1122          * Then follows the virtual address of the eBPF function,
1123          * and the gp for this function.
1124          *
1125          * The first instruction sets the tail-call-counter (TCC) register.
1126          * This instruction is skipped by tail calls.
1127          * Use a temporary register instead of a caller-saved register initially.
1128          */
1129         REG_FORCE_SEEN(ctx, HPPA_REG_TCC_IN_INIT);
1130         emit(hppa_ldi(MAX_TAIL_CALL_CNT, HPPA_REG_TCC_IN_INIT), ctx);
1131 
1132         /*
1133          * Skip all initializations when called as BPF TAIL call.
1134          */
1135         emit(hppa_ldi(MAX_TAIL_CALL_CNT, HPPA_REG_R1), ctx);
1136         emit(hppa_beq(HPPA_REG_TCC_IN_INIT, HPPA_REG_R1, 6 - HPPA_BRANCH_DISPLACEMENT), ctx);
1137         emit(hppa64_bl_long(ctx->prologue_len - 3 - HPPA_BRANCH_DISPLACEMENT), ctx);
1138 
1139         /* store entry address of this eBPF function */
1140         addr = (uintptr_t) &ctx->insns[0];
1141         emit(addr >> 32, ctx);
1142         emit(addr & 0xffffffff, ctx);
1143 
1144         /* store gp of this eBPF function */
1145         asm("copy %%r27,%0" : "=r" (addr) );
1146         emit(addr >> 32, ctx);
1147         emit(addr & 0xffffffff, ctx);
1148 
1149         /* Set up hppa stack frame. */
1150         emit_hppa_copy(HPPA_REG_SP, HPPA_REG_R1, ctx);
1151         emit(hppa_ldo(stack_adjust, HPPA_REG_SP, HPPA_REG_SP), ctx);
1152         emit(hppa64_std_im5 (HPPA_REG_R1, -REG_SIZE, HPPA_REG_SP), ctx);
1153         emit(hppa64_std_im16(HPPA_REG_RP, -2*REG_SIZE, HPPA_REG_SP), ctx);
1154 
1155         /* Save callee-save registers. */
1156         for (i = 3; i <= 15; i++) {
1157                 if (OPTIMIZE_HPPA && !REG_WAS_SEEN(ctx, HPPA_R(i)))
1158                         continue;
1159                 emit(hppa64_std_im16(HPPA_R(i), -REG_SIZE * i, HPPA_REG_SP), ctx);
1160         }
1161 
1162         /* load function parameters; load all if we use tail functions */
1163         #define LOAD_PARAM(arg, dst) \
1164                 if (REG_WAS_SEEN(ctx, regmap[dst]) ||   \
1165                     REG_WAS_SEEN(ctx, HPPA_REG_TCC))    \
1166                         emit_hppa_copy(arg, regmap[dst], ctx)
1167         LOAD_PARAM(HPPA_REG_ARG0, BPF_REG_1);
1168         LOAD_PARAM(HPPA_REG_ARG1, BPF_REG_2);
1169         LOAD_PARAM(HPPA_REG_ARG2, BPF_REG_3);
1170         LOAD_PARAM(HPPA_REG_ARG3, BPF_REG_4);
1171         LOAD_PARAM(HPPA_REG_ARG4, BPF_REG_5);
1172         #undef LOAD_PARAM
1173 
1174         REG_FORCE_SEEN(ctx, HPPA_REG_T0);
1175         REG_FORCE_SEEN(ctx, HPPA_REG_T1);
1176         REG_FORCE_SEEN(ctx, HPPA_REG_T2);
1177 
1178         /*
1179          * Now really set the tail call counter (TCC) register.
1180          */
1181         if (REG_WAS_SEEN(ctx, HPPA_REG_TCC))
1182                 emit(hppa_ldi(MAX_TAIL_CALL_CNT, HPPA_REG_TCC), ctx);
1183 
1184         /*
1185          * Save epilogue function pointer for outer TCC call chain.
1186          * The main TCC call stores the final RP on stack.
1187          */
1188         addr = (uintptr_t) &ctx->insns[ctx->epilogue_offset];
1189         /* skip first two instructions which jump to exit */
1190         addr += 2 * HPPA_INSN_SIZE;
1191         emit_imm(HPPA_REG_T2, addr, HPPA_REG_T1, ctx);
1192         emit(EXIT_PTR_STORE(HPPA_REG_T2), ctx);
1193 
1194         /* Set up BPF frame pointer. */
1195         reg = regmap[BPF_REG_FP];       /* -> HPPA_REG_FP */
1196         if (REG_WAS_SEEN(ctx, reg)) {
1197                 emit(hppa_ldo(-FRAME_SIZE, HPPA_REG_SP, reg), ctx);
1198         }
1199 }
1200 
1201 void bpf_jit_build_epilogue(struct hppa_jit_context *ctx)
1202 {
1203         __build_epilogue(false, ctx);
1204 }
1205 
1206 bool bpf_jit_supports_kfunc_call(void)
1207 {
1208         return true;
1209 }
1210 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php