]> Git Repo - J-linux.git/blob - arch/parisc/net/bpf_jit_comp32.c
Merge tag 'x86-cleanups-2024-01-08' of git://git.kernel.org/pub/scm/linux/kernel...
[J-linux.git] / arch / parisc / net / bpf_jit_comp32.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * BPF JIT compiler for PA-RISC (32-bit)
4  *
5  * Copyright (c) 2023 Helge Deller <[email protected]>
6  *
7  * The code is based on the BPF JIT compiler for RV64 by Björn Töpel and
8  * the BPF JIT compiler for 32-bit ARM by Shubham Bansal and Mircea Gherzan.
9  */
10
11 #include <linux/bpf.h>
12 #include <linux/filter.h>
13 #include <linux/libgcc.h>
14 #include "bpf_jit.h"
15
16 /*
17  * Stack layout during BPF program execution (note: stack grows up):
18  *
19  *                     high
20  *   HPPA32 sp =>  +----------+ <= HPPA32 fp
21  *                 | saved sp |
22  *                 | saved rp |
23  *                 |   ...    | HPPA32 callee-saved registers
24  *                 | curr args|
25  *                 | local var|
26  *                 +----------+ <= (sp - 4 * NR_SAVED_REGISTERS)
27  *                 |  lo(R9)  |
28  *                 |  hi(R9)  |
29  *                 |  lo(FP)  | JIT scratch space for BPF registers
30  *                 |  hi(FP)  |
31  *                 |   ...    |
32  *                 +----------+ <= (sp - 4 * NR_SAVED_REGISTERS
33  *                 |          |        - 4 * BPF_JIT_SCRATCH_REGS)
34  *                 |          |
35  *                 |   ...    | BPF program stack
36  *                 |          |
37  *                 |   ...    | Function call stack
38  *                 |          |
39  *                 +----------+
40  *                     low
41  */
42
43 enum {
44         /* Stack layout - these are offsets from top of JIT scratch space. */
45         BPF_R8_HI,
46         BPF_R8_LO,
47         BPF_R9_HI,
48         BPF_R9_LO,
49         BPF_FP_HI,
50         BPF_FP_LO,
51         BPF_AX_HI,
52         BPF_AX_LO,
53         BPF_R0_TEMP_HI,
54         BPF_R0_TEMP_LO,
55         BPF_JIT_SCRATCH_REGS,
56 };
57
58 /* Number of callee-saved registers stored to stack: rp, r3-r18. */
59 #define NR_SAVED_REGISTERS      (18 - 3 + 1 + 8)
60
61 /* Offset from fp for BPF registers stored on stack. */
62 #define STACK_OFFSET(k) (- (NR_SAVED_REGISTERS + k + 1))
63 #define STACK_ALIGN     FRAME_SIZE
64
65 #define EXIT_PTR_LOAD(reg)      hppa_ldw(-0x08, HPPA_REG_SP, reg)
66 #define EXIT_PTR_STORE(reg)     hppa_stw(reg, -0x08, HPPA_REG_SP)
67 #define EXIT_PTR_JUMP(reg, nop) hppa_bv(HPPA_REG_ZERO, reg, nop)
68
69 #define TMP_REG_1       (MAX_BPF_JIT_REG + 0)
70 #define TMP_REG_2       (MAX_BPF_JIT_REG + 1)
71 #define TMP_REG_R0      (MAX_BPF_JIT_REG + 2)
72
73 static const s8 regmap[][2] = {
74         /* Return value from in-kernel function, and exit value from eBPF. */
75         [BPF_REG_0] = {HPPA_REG_RET0, HPPA_REG_RET1},           /* HI/LOW */
76
77         /* Arguments from eBPF program to in-kernel function. */
78         [BPF_REG_1] = {HPPA_R(3), HPPA_R(4)},
79         [BPF_REG_2] = {HPPA_R(5), HPPA_R(6)},
80         [BPF_REG_3] = {HPPA_R(7), HPPA_R(8)},
81         [BPF_REG_4] = {HPPA_R(9), HPPA_R(10)},
82         [BPF_REG_5] = {HPPA_R(11), HPPA_R(12)},
83
84         [BPF_REG_6] = {HPPA_R(13), HPPA_R(14)},
85         [BPF_REG_7] = {HPPA_R(15), HPPA_R(16)},
86         /*
87          * Callee-saved registers that in-kernel function will preserve.
88          * Stored on the stack.
89          */
90         [BPF_REG_8] = {STACK_OFFSET(BPF_R8_HI), STACK_OFFSET(BPF_R8_LO)},
91         [BPF_REG_9] = {STACK_OFFSET(BPF_R9_HI), STACK_OFFSET(BPF_R9_LO)},
92
93         /* Read-only frame pointer to access BPF stack. Not needed. */
94         [BPF_REG_FP] = {STACK_OFFSET(BPF_FP_HI), STACK_OFFSET(BPF_FP_LO)},
95
96         /* Temporary register for blinding constants. Stored on the stack. */
97         [BPF_REG_AX] = {STACK_OFFSET(BPF_AX_HI), STACK_OFFSET(BPF_AX_LO)},
98         /*
99          * Temporary registers used by the JIT to operate on registers stored
100          * on the stack. Save t0 and t1 to be used as temporaries in generated
101          * code.
102          */
103         [TMP_REG_1] = {HPPA_REG_T3, HPPA_REG_T2},
104         [TMP_REG_2] = {HPPA_REG_T5, HPPA_REG_T4},
105
106         /* temporary space for BPF_R0 during libgcc and millicode calls */
107         [TMP_REG_R0] = {STACK_OFFSET(BPF_R0_TEMP_HI), STACK_OFFSET(BPF_R0_TEMP_LO)},
108 };
109
110 static s8 hi(const s8 *r)
111 {
112         return r[0];
113 }
114
115 static s8 lo(const s8 *r)
116 {
117         return r[1];
118 }
119
120 static void emit_hppa_copy(const s8 rs, const s8 rd, struct hppa_jit_context *ctx)
121 {
122         REG_SET_SEEN(ctx, rd);
123         if (OPTIMIZE_HPPA && (rs == rd))
124                 return;
125         REG_SET_SEEN(ctx, rs);
126         emit(hppa_copy(rs, rd), ctx);
127 }
128
129 static void emit_hppa_xor(const s8 r1, const s8 r2, const s8 r3, struct hppa_jit_context *ctx)
130 {
131         REG_SET_SEEN(ctx, r1);
132         REG_SET_SEEN(ctx, r2);
133         REG_SET_SEEN(ctx, r3);
134         if (OPTIMIZE_HPPA && (r1 == r2)) {
135                 emit(hppa_copy(HPPA_REG_ZERO, r3), ctx);
136         } else {
137                 emit(hppa_xor(r1, r2, r3), ctx);
138         }
139 }
140
141 static void emit_imm(const s8 rd, s32 imm, struct hppa_jit_context *ctx)
142 {
143         u32 lower = im11(imm);
144
145         REG_SET_SEEN(ctx, rd);
146         if (OPTIMIZE_HPPA && relative_bits_ok(imm, 14)) {
147                 emit(hppa_ldi(imm, rd), ctx);
148                 return;
149         }
150         emit(hppa_ldil(imm, rd), ctx);
151         if (OPTIMIZE_HPPA && (lower == 0))
152                 return;
153         emit(hppa_ldo(lower, rd, rd), ctx);
154 }
155
156 static void emit_imm32(const s8 *rd, s32 imm, struct hppa_jit_context *ctx)
157 {
158         /* Emit immediate into lower bits. */
159         REG_SET_SEEN(ctx, lo(rd));
160         emit_imm(lo(rd), imm, ctx);
161
162         /* Sign-extend into upper bits. */
163         REG_SET_SEEN(ctx, hi(rd));
164         if (imm >= 0)
165                 emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
166         else
167                 emit(hppa_ldi(-1, hi(rd)), ctx);
168 }
169
170 static void emit_imm64(const s8 *rd, s32 imm_hi, s32 imm_lo,
171                        struct hppa_jit_context *ctx)
172 {
173         emit_imm(hi(rd), imm_hi, ctx);
174         emit_imm(lo(rd), imm_lo, ctx);
175 }
176
177 static void __build_epilogue(bool is_tail_call, struct hppa_jit_context *ctx)
178 {
179         const s8 *r0 = regmap[BPF_REG_0];
180         int i;
181
182         if (is_tail_call) {
183                 /*
184                  * goto *(t0 + 4);
185                  * Skips first instruction of prologue which initializes tail
186                  * call counter. Assumes t0 contains address of target program,
187                  * see emit_bpf_tail_call.
188                  */
189                 emit(hppa_ldo(1 * HPPA_INSN_SIZE, HPPA_REG_T0, HPPA_REG_T0), ctx);
190                 emit(hppa_bv(HPPA_REG_ZERO, HPPA_REG_T0, EXEC_NEXT_INSTR), ctx);
191                 /* in delay slot: */
192                 emit(hppa_copy(HPPA_REG_TCC, HPPA_REG_TCC_IN_INIT), ctx);
193
194                 return;
195         }
196
197         /* load epilogue function pointer and jump to it. */
198         /* exit point is either directly below, or the outest TCC exit function */
199         emit(EXIT_PTR_LOAD(HPPA_REG_RP), ctx);
200         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
201
202         /* NOTE: we are 32-bit and big-endian, so return lower 32-bit value */
203         emit_hppa_copy(lo(r0), HPPA_REG_RET0, ctx);
204
205         /* Restore callee-saved registers. */
206         for (i = 3; i <= 18; i++) {
207                 if (OPTIMIZE_HPPA && !REG_WAS_SEEN(ctx, HPPA_R(i)))
208                         continue;
209                 emit(hppa_ldw(-REG_SIZE * (8 + (i-3)), HPPA_REG_SP, HPPA_R(i)), ctx);
210         }
211
212         /* load original return pointer (stored by outest TCC function) */
213         emit(hppa_ldw(-0x14, HPPA_REG_SP, HPPA_REG_RP), ctx);
214         emit(hppa_bv(HPPA_REG_ZERO, HPPA_REG_RP, EXEC_NEXT_INSTR), ctx);
215         /* in delay slot: */
216         emit(hppa_ldw(-0x04, HPPA_REG_SP, HPPA_REG_SP), ctx);
217 }
218
219 static bool is_stacked(s8 reg)
220 {
221         return reg < 0;
222 }
223
224 static const s8 *bpf_get_reg64_offset(const s8 *reg, const s8 *tmp,
225                 u16 offset_sp, struct hppa_jit_context *ctx)
226 {
227         if (is_stacked(hi(reg))) {
228                 emit(hppa_ldw(REG_SIZE * hi(reg) - offset_sp, HPPA_REG_SP, hi(tmp)), ctx);
229                 emit(hppa_ldw(REG_SIZE * lo(reg) - offset_sp, HPPA_REG_SP, lo(tmp)), ctx);
230                 reg = tmp;
231         }
232         REG_SET_SEEN(ctx, hi(reg));
233         REG_SET_SEEN(ctx, lo(reg));
234         return reg;
235 }
236
237 static const s8 *bpf_get_reg64(const s8 *reg, const s8 *tmp,
238                                struct hppa_jit_context *ctx)
239 {
240         return bpf_get_reg64_offset(reg, tmp, 0, ctx);
241 }
242
243 static const s8 *bpf_get_reg64_ref(const s8 *reg, const s8 *tmp,
244                 bool must_load, struct hppa_jit_context *ctx)
245 {
246         if (!OPTIMIZE_HPPA)
247                 return bpf_get_reg64(reg, tmp, ctx);
248
249         if (is_stacked(hi(reg))) {
250                 if (must_load)
251                         emit(hppa_ldw(REG_SIZE * hi(reg), HPPA_REG_SP, hi(tmp)), ctx);
252                 reg = tmp;
253         }
254         REG_SET_SEEN(ctx, hi(reg));
255         REG_SET_SEEN(ctx, lo(reg));
256         return reg;
257 }
258
259
260 static void bpf_put_reg64(const s8 *reg, const s8 *src,
261                           struct hppa_jit_context *ctx)
262 {
263         if (is_stacked(hi(reg))) {
264                 emit(hppa_stw(hi(src), REG_SIZE * hi(reg), HPPA_REG_SP), ctx);
265                 emit(hppa_stw(lo(src), REG_SIZE * lo(reg), HPPA_REG_SP), ctx);
266         }
267 }
268
269 static void bpf_save_R0(struct hppa_jit_context *ctx)
270 {
271         bpf_put_reg64(regmap[TMP_REG_R0], regmap[BPF_REG_0], ctx);
272 }
273
274 static void bpf_restore_R0(struct hppa_jit_context *ctx)
275 {
276         bpf_get_reg64(regmap[TMP_REG_R0], regmap[BPF_REG_0], ctx);
277 }
278
279
280 static const s8 *bpf_get_reg32(const s8 *reg, const s8 *tmp,
281                                struct hppa_jit_context *ctx)
282 {
283         if (is_stacked(lo(reg))) {
284                 emit(hppa_ldw(REG_SIZE * lo(reg), HPPA_REG_SP, lo(tmp)), ctx);
285                 reg = tmp;
286         }
287         REG_SET_SEEN(ctx, lo(reg));
288         return reg;
289 }
290
291 static const s8 *bpf_get_reg32_ref(const s8 *reg, const s8 *tmp,
292                 struct hppa_jit_context *ctx)
293 {
294         if (!OPTIMIZE_HPPA)
295                 return bpf_get_reg32(reg, tmp, ctx);
296
297         if (is_stacked(hi(reg))) {
298                 reg = tmp;
299         }
300         REG_SET_SEEN(ctx, lo(reg));
301         return reg;
302 }
303
304 static void bpf_put_reg32(const s8 *reg, const s8 *src,
305                           struct hppa_jit_context *ctx)
306 {
307         if (is_stacked(lo(reg))) {
308                 REG_SET_SEEN(ctx, lo(src));
309                 emit(hppa_stw(lo(src), REG_SIZE * lo(reg), HPPA_REG_SP), ctx);
310                 if (1 && !ctx->prog->aux->verifier_zext) {
311                         REG_SET_SEEN(ctx, hi(reg));
312                         emit(hppa_stw(HPPA_REG_ZERO, REG_SIZE * hi(reg), HPPA_REG_SP), ctx);
313                 }
314         } else if (1 && !ctx->prog->aux->verifier_zext) {
315                 REG_SET_SEEN(ctx, hi(reg));
316                 emit_hppa_copy(HPPA_REG_ZERO, hi(reg), ctx);
317         }
318 }
319
320 /* extern hppa millicode functions */
321 extern void $$mulI(void);
322 extern void $$divU(void);
323 extern void $$remU(void);
324
325 static void emit_call_millicode(void *func, const s8 arg0,
326                 const s8 arg1, u8 opcode, struct hppa_jit_context *ctx)
327 {
328         u32 func_addr;
329
330         emit_hppa_copy(arg0, HPPA_REG_ARG0, ctx);
331         emit_hppa_copy(arg1, HPPA_REG_ARG1, ctx);
332
333         /* libcgcc overwrites HPPA_REG_RET0/1, save temp. in dest. */
334         if (arg0 != HPPA_REG_RET1)
335                 bpf_save_R0(ctx);
336
337         func_addr = (uintptr_t) dereference_function_descriptor(func);
338         emit(hppa_ldil(func_addr, HPPA_REG_R31), ctx);
339         /* skip the following be_l instruction if divisor is zero. */
340         if (BPF_OP(opcode) == BPF_DIV || BPF_OP(opcode) == BPF_MOD) {
341                 if (BPF_OP(opcode) == BPF_DIV)
342                         emit_hppa_copy(HPPA_REG_ZERO, HPPA_REG_RET1, ctx);
343                 else
344                         emit_hppa_copy(HPPA_REG_ARG0, HPPA_REG_RET1, ctx);
345                 emit(hppa_or_cond(HPPA_REG_ARG1, HPPA_REG_ZERO, 1, 0, HPPA_REG_ZERO), ctx);
346         }
347         /* Note: millicode functions use r31 as return pointer instead of rp */
348         emit(hppa_be_l(im11(func_addr) >> 2, HPPA_REG_R31, NOP_NEXT_INSTR), ctx);
349         emit(hppa_nop(), ctx); /* this nop is needed here for delay slot */
350
351         /* Note: millicode functions return result in RET1, not RET0 */
352         emit_hppa_copy(HPPA_REG_RET1, arg0, ctx);
353
354         /* restore HPPA_REG_RET0/1, temp. save in dest. */
355         if (arg0 != HPPA_REG_RET1)
356                 bpf_restore_R0(ctx);
357 }
358
359 static void emit_call_libgcc_ll(void *func, const s8 *arg0,
360                 const s8 *arg1, u8 opcode, struct hppa_jit_context *ctx)
361 {
362         u32 func_addr;
363
364         emit_hppa_copy(lo(arg0), HPPA_REG_ARG0, ctx);
365         emit_hppa_copy(hi(arg0), HPPA_REG_ARG1, ctx);
366         emit_hppa_copy(lo(arg1), HPPA_REG_ARG2, ctx);
367         emit_hppa_copy(hi(arg1), HPPA_REG_ARG3, ctx);
368
369         /* libcgcc overwrites HPPA_REG_RET0/_RET1, so keep copy of R0 on stack */
370         if (hi(arg0) != HPPA_REG_RET0)
371                 bpf_save_R0(ctx);
372
373         /* prepare stack */
374         emit(hppa_ldo(2 * FRAME_SIZE, HPPA_REG_SP, HPPA_REG_SP), ctx);
375
376         func_addr = (uintptr_t) dereference_function_descriptor(func);
377         emit(hppa_ldil(func_addr, HPPA_REG_R31), ctx);
378         /* zero out the following be_l instruction if divisor is 0 (and set default values) */
379         if (BPF_OP(opcode) == BPF_DIV || BPF_OP(opcode) == BPF_MOD) {
380                 emit_hppa_copy(HPPA_REG_ZERO, HPPA_REG_RET0, ctx);
381                 if (BPF_OP(opcode) == BPF_DIV)
382                         emit_hppa_copy(HPPA_REG_ZERO, HPPA_REG_RET1, ctx);
383                 else
384                         emit_hppa_copy(HPPA_REG_ARG0, HPPA_REG_RET1, ctx);
385                 emit(hppa_or_cond(HPPA_REG_ARG2, HPPA_REG_ARG3, 1, 0, HPPA_REG_ZERO), ctx);
386         }
387         emit(hppa_be_l(im11(func_addr) >> 2, HPPA_REG_R31, EXEC_NEXT_INSTR), ctx);
388         emit_hppa_copy(HPPA_REG_R31, HPPA_REG_RP, ctx);
389
390         /* restore stack */
391         emit(hppa_ldo(-2 * FRAME_SIZE, HPPA_REG_SP, HPPA_REG_SP), ctx);
392
393         emit_hppa_copy(HPPA_REG_RET0, hi(arg0), ctx);
394         emit_hppa_copy(HPPA_REG_RET1, lo(arg0), ctx);
395
396         /* restore HPPA_REG_RET0/_RET1 */
397         if (hi(arg0) != HPPA_REG_RET0)
398                 bpf_restore_R0(ctx);
399 }
400
401 static void emit_jump(s32 paoff, bool force_far,
402                                struct hppa_jit_context *ctx)
403 {
404         unsigned long pc, addr;
405
406         /* Note: allocate 2 instructions for jumps if force_far is set. */
407         if (relative_bits_ok(paoff - HPPA_BRANCH_DISPLACEMENT, 17)) {
408                 /* use BL,short branch followed by nop() */
409                 emit(hppa_bl(paoff - HPPA_BRANCH_DISPLACEMENT, HPPA_REG_ZERO), ctx);
410                 if (force_far)
411                         emit(hppa_nop(), ctx);
412                 return;
413         }
414
415         pc = (uintptr_t) &ctx->insns[ctx->ninsns];
416         addr = pc + (paoff * HPPA_INSN_SIZE);
417         emit(hppa_ldil(addr, HPPA_REG_R31), ctx);
418         emit(hppa_be_l(im11(addr) >> 2, HPPA_REG_R31, NOP_NEXT_INSTR), ctx); // be,l,n addr(sr4,r31), %sr0, %r31
419 }
420
421 static void emit_alu_i64(const s8 *dst, s32 imm,
422                          struct hppa_jit_context *ctx, const u8 op)
423 {
424         const s8 *tmp1 = regmap[TMP_REG_1];
425         const s8 *rd;
426
427         if (0 && op == BPF_MOV)
428                 rd = bpf_get_reg64_ref(dst, tmp1, false, ctx);
429         else
430                 rd = bpf_get_reg64(dst, tmp1, ctx);
431
432         /* dst = dst OP imm */
433         switch (op) {
434         case BPF_MOV:
435                 emit_imm32(rd, imm, ctx);
436                 break;
437         case BPF_AND:
438                 emit_imm(HPPA_REG_T0, imm, ctx);
439                 emit(hppa_and(lo(rd), HPPA_REG_T0, lo(rd)), ctx);
440                 if (imm >= 0)
441                         emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
442                 break;
443         case BPF_OR:
444                 emit_imm(HPPA_REG_T0, imm, ctx);
445                 emit(hppa_or(lo(rd), HPPA_REG_T0, lo(rd)), ctx);
446                 if (imm < 0)
447                         emit_imm(hi(rd), -1, ctx);
448                 break;
449         case BPF_XOR:
450                 emit_imm(HPPA_REG_T0, imm, ctx);
451                 emit_hppa_xor(lo(rd), HPPA_REG_T0, lo(rd), ctx);
452                 if (imm < 0) {
453                         emit_imm(HPPA_REG_T0, -1, ctx);
454                         emit_hppa_xor(hi(rd), HPPA_REG_T0, hi(rd), ctx);
455                 }
456                 break;
457         case BPF_LSH:
458                 if (imm == 0)
459                         break;
460                 if (imm > 32) {
461                         imm -= 32;
462                         emit(hppa_zdep(lo(rd), imm, imm, hi(rd)), ctx);
463                         emit_hppa_copy(HPPA_REG_ZERO, lo(rd), ctx);
464                 } else if (imm == 32) {
465                         emit_hppa_copy(lo(rd), hi(rd), ctx);
466                         emit_hppa_copy(HPPA_REG_ZERO, lo(rd), ctx);
467                 } else {
468                         emit(hppa_shd(hi(rd), lo(rd), 32 - imm, hi(rd)), ctx);
469                         emit(hppa_zdep(lo(rd), imm, imm, lo(rd)), ctx);
470                 }
471                 break;
472         case BPF_RSH:
473                 if (imm == 0)
474                         break;
475                 if (imm > 32) {
476                         imm -= 32;
477                         emit(hppa_shr(hi(rd), imm, lo(rd)), ctx);
478                         emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
479                 } else if (imm == 32) {
480                         emit_hppa_copy(hi(rd), lo(rd), ctx);
481                         emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
482                 } else {
483                         emit(hppa_shrpw(hi(rd), lo(rd), imm, lo(rd)), ctx);
484                         emit(hppa_shr(hi(rd), imm, hi(rd)), ctx);
485                 }
486                 break;
487         case BPF_ARSH:
488                 if (imm == 0)
489                         break;
490                 if (imm > 32) {
491                         imm -= 32;
492                         emit(hppa_extrws(hi(rd), 31 - imm, imm, lo(rd)), ctx);
493                         emit(hppa_extrws(hi(rd), 0, 31, hi(rd)), ctx);
494                 } else if (imm == 32) {
495                         emit_hppa_copy(hi(rd), lo(rd), ctx);
496                         emit(hppa_extrws(hi(rd), 0, 31, hi(rd)), ctx);
497                 } else {
498                         emit(hppa_shrpw(hi(rd), lo(rd), imm, lo(rd)), ctx);
499                         emit(hppa_extrws(hi(rd), 31 - imm, imm, hi(rd)), ctx);
500                 }
501                 break;
502         default:
503                 WARN_ON(1);
504         }
505
506         bpf_put_reg64(dst, rd, ctx);
507 }
508
509 static void emit_alu_i32(const s8 *dst, s32 imm,
510                          struct hppa_jit_context *ctx, const u8 op)
511 {
512         const s8 *tmp1 = regmap[TMP_REG_1];
513         const s8 *rd = bpf_get_reg32(dst, tmp1, ctx);
514
515         if (op == BPF_MOV)
516                 rd = bpf_get_reg32_ref(dst, tmp1, ctx);
517         else
518                 rd = bpf_get_reg32(dst, tmp1, ctx);
519
520         /* dst = dst OP imm */
521         switch (op) {
522         case BPF_MOV:
523                 emit_imm(lo(rd), imm, ctx);
524                 break;
525         case BPF_ADD:
526                 emit_imm(HPPA_REG_T0, imm, ctx);
527                 emit(hppa_add(lo(rd), HPPA_REG_T0, lo(rd)), ctx);
528                 break;
529         case BPF_SUB:
530                 emit_imm(HPPA_REG_T0, imm, ctx);
531                 emit(hppa_sub(lo(rd), HPPA_REG_T0, lo(rd)), ctx);
532                 break;
533         case BPF_AND:
534                 emit_imm(HPPA_REG_T0, imm, ctx);
535                 emit(hppa_and(lo(rd), HPPA_REG_T0, lo(rd)), ctx);
536                 break;
537         case BPF_OR:
538                 emit_imm(HPPA_REG_T0, imm, ctx);
539                 emit(hppa_or(lo(rd), HPPA_REG_T0, lo(rd)), ctx);
540                 break;
541         case BPF_XOR:
542                 emit_imm(HPPA_REG_T0, imm, ctx);
543                 emit_hppa_xor(lo(rd), HPPA_REG_T0, lo(rd), ctx);
544                 break;
545         case BPF_LSH:
546                 if (imm != 0)
547                         emit(hppa_zdep(lo(rd), imm, imm, lo(rd)), ctx);
548                 break;
549         case BPF_RSH:
550                 if (imm != 0)
551                         emit(hppa_shr(lo(rd), imm, lo(rd)), ctx);
552                 break;
553         case BPF_ARSH:
554                 if (imm != 0)
555                         emit(hppa_extrws(lo(rd), 31 - imm, imm, lo(rd)), ctx);
556                 break;
557         default:
558                 WARN_ON(1);
559         }
560
561         bpf_put_reg32(dst, rd, ctx);
562 }
563
564 static void emit_alu_r64(const s8 *dst, const s8 *src,
565                          struct hppa_jit_context *ctx, const u8 op)
566 {
567         const s8 *tmp1 = regmap[TMP_REG_1];
568         const s8 *tmp2 = regmap[TMP_REG_2];
569         const s8 *rd;
570         const s8 *rs = bpf_get_reg64(src, tmp2, ctx);
571
572         if (op == BPF_MOV)
573                 rd = bpf_get_reg64_ref(dst, tmp1, false, ctx);
574         else
575                 rd = bpf_get_reg64(dst, tmp1, ctx);
576
577         /* dst = dst OP src */
578         switch (op) {
579         case BPF_MOV:
580                 emit_hppa_copy(lo(rs), lo(rd), ctx);
581                 emit_hppa_copy(hi(rs), hi(rd), ctx);
582                 break;
583         case BPF_ADD:
584                 emit(hppa_add(lo(rd), lo(rs), lo(rd)), ctx);
585                 emit(hppa_addc(hi(rd), hi(rs), hi(rd)), ctx);
586                 break;
587         case BPF_SUB:
588                 emit(hppa_sub(lo(rd), lo(rs), lo(rd)), ctx);
589                 emit(hppa_subb(hi(rd), hi(rs), hi(rd)), ctx);
590                 break;
591         case BPF_AND:
592                 emit(hppa_and(lo(rd), lo(rs), lo(rd)), ctx);
593                 emit(hppa_and(hi(rd), hi(rs), hi(rd)), ctx);
594                 break;
595         case BPF_OR:
596                 emit(hppa_or(lo(rd), lo(rs), lo(rd)), ctx);
597                 emit(hppa_or(hi(rd), hi(rs), hi(rd)), ctx);
598                 break;
599         case BPF_XOR:
600                 emit_hppa_xor(lo(rd), lo(rs), lo(rd), ctx);
601                 emit_hppa_xor(hi(rd), hi(rs), hi(rd), ctx);
602                 break;
603         case BPF_MUL:
604                 emit_call_libgcc_ll(__muldi3, rd, rs, op, ctx);
605                 break;
606         case BPF_DIV:
607                 emit_call_libgcc_ll(&hppa_div64, rd, rs, op, ctx);
608                 break;
609         case BPF_MOD:
610                 emit_call_libgcc_ll(&hppa_div64_rem, rd, rs, op, ctx);
611                 break;
612         case BPF_LSH:
613                 emit_call_libgcc_ll(__ashldi3, rd, rs, op, ctx);
614                 break;
615         case BPF_RSH:
616                 emit_call_libgcc_ll(__lshrdi3, rd, rs, op, ctx);
617                 break;
618         case BPF_ARSH:
619                 emit_call_libgcc_ll(__ashrdi3, rd, rs, op, ctx);
620                 break;
621         case BPF_NEG:
622                 emit(hppa_sub(HPPA_REG_ZERO, lo(rd), lo(rd)), ctx);
623                 emit(hppa_subb(HPPA_REG_ZERO, hi(rd), hi(rd)), ctx);
624                 break;
625         default:
626                 WARN_ON(1);
627         }
628
629         bpf_put_reg64(dst, rd, ctx);
630 }
631
632 static void emit_alu_r32(const s8 *dst, const s8 *src,
633                          struct hppa_jit_context *ctx, const u8 op)
634 {
635         const s8 *tmp1 = regmap[TMP_REG_1];
636         const s8 *tmp2 = regmap[TMP_REG_2];
637         const s8 *rd;
638         const s8 *rs = bpf_get_reg32(src, tmp2, ctx);
639
640         if (op == BPF_MOV)
641                 rd = bpf_get_reg32_ref(dst, tmp1, ctx);
642         else
643                 rd = bpf_get_reg32(dst, tmp1, ctx);
644
645         /* dst = dst OP src */
646         switch (op) {
647         case BPF_MOV:
648                 emit_hppa_copy(lo(rs), lo(rd), ctx);
649                 break;
650         case BPF_ADD:
651                 emit(hppa_add(lo(rd), lo(rs), lo(rd)), ctx);
652                 break;
653         case BPF_SUB:
654                 emit(hppa_sub(lo(rd), lo(rs), lo(rd)), ctx);
655                 break;
656         case BPF_AND:
657                 emit(hppa_and(lo(rd), lo(rs), lo(rd)), ctx);
658                 break;
659         case BPF_OR:
660                 emit(hppa_or(lo(rd), lo(rs), lo(rd)), ctx);
661                 break;
662         case BPF_XOR:
663                 emit_hppa_xor(lo(rd), lo(rs), lo(rd), ctx);
664                 break;
665         case BPF_MUL:
666                 emit_call_millicode($$mulI, lo(rd), lo(rs), op, ctx);
667                 break;
668         case BPF_DIV:
669                 emit_call_millicode($$divU, lo(rd), lo(rs), op, ctx);
670                 break;
671         case BPF_MOD:
672                 emit_call_millicode($$remU, lo(rd), lo(rs), op, ctx);
673                 break;
674         case BPF_LSH:
675                 emit(hppa_subi(0x1f, lo(rs), HPPA_REG_T0), ctx);
676                 emit(hppa_mtsar(HPPA_REG_T0), ctx);
677                 emit(hppa_depwz_sar(lo(rd), lo(rd)), ctx);
678                 break;
679         case BPF_RSH:
680                 emit(hppa_mtsar(lo(rs)), ctx);
681                 emit(hppa_shrpw_sar(lo(rd), lo(rd)), ctx);
682                 break;
683         case BPF_ARSH: /* sign extending arithmetic shift right */
684                 // emit(hppa_beq(lo(rs), HPPA_REG_ZERO, 2), ctx);
685                 emit(hppa_subi(0x1f, lo(rs), HPPA_REG_T0), ctx);
686                 emit(hppa_mtsar(HPPA_REG_T0), ctx);
687                 emit(hppa_extrws_sar(lo(rd), lo(rd)), ctx);
688                 break;
689         case BPF_NEG:
690                 emit(hppa_sub(HPPA_REG_ZERO, lo(rd), lo(rd)), ctx);  // sub r0,rd,rd
691                 break;
692         default:
693                 WARN_ON(1);
694         }
695
696         bpf_put_reg32(dst, rd, ctx);
697 }
698
699 static int emit_branch_r64(const s8 *src1, const s8 *src2, s32 paoff,
700                            struct hppa_jit_context *ctx, const u8 op)
701 {
702         int e, s = ctx->ninsns;
703         const s8 *tmp1 = regmap[TMP_REG_1];
704         const s8 *tmp2 = regmap[TMP_REG_2];
705
706         const s8 *rs1 = bpf_get_reg64(src1, tmp1, ctx);
707         const s8 *rs2 = bpf_get_reg64(src2, tmp2, ctx);
708
709         /*
710          * NO_JUMP skips over the rest of the instructions and the
711          * emit_jump, meaning the BPF branch is not taken.
712          * JUMP skips directly to the emit_jump, meaning
713          * the BPF branch is taken.
714          *
715          * The fallthrough case results in the BPF branch being taken.
716          */
717 #define NO_JUMP(idx)    (2 + (idx) - 1)
718 #define JUMP(idx)       (0 + (idx) - 1)
719
720         switch (op) {
721         case BPF_JEQ:
722                 emit(hppa_bne(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
723                 emit(hppa_bne(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
724                 break;
725         case BPF_JGT:
726                 emit(hppa_bgtu(hi(rs1), hi(rs2), JUMP(2)), ctx);
727                 emit(hppa_bltu(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
728                 emit(hppa_bleu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
729                 break;
730         case BPF_JLT:
731                 emit(hppa_bltu(hi(rs1), hi(rs2), JUMP(2)), ctx);
732                 emit(hppa_bgtu(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
733                 emit(hppa_bgeu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
734                 break;
735         case BPF_JGE:
736                 emit(hppa_bgtu(hi(rs1), hi(rs2), JUMP(2)), ctx);
737                 emit(hppa_bltu(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
738                 emit(hppa_bltu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
739                 break;
740         case BPF_JLE:
741                 emit(hppa_bltu(hi(rs1), hi(rs2), JUMP(2)), ctx);
742                 emit(hppa_bgtu(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
743                 emit(hppa_bgtu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
744                 break;
745         case BPF_JNE:
746                 emit(hppa_bne(hi(rs1), hi(rs2), JUMP(1)), ctx);
747                 emit(hppa_beq(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
748                 break;
749         case BPF_JSGT:
750                 emit(hppa_bgt(hi(rs1), hi(rs2), JUMP(2)), ctx);
751                 emit(hppa_blt(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
752                 emit(hppa_bleu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
753                 break;
754         case BPF_JSLT:
755                 emit(hppa_blt(hi(rs1), hi(rs2), JUMP(2)), ctx);
756                 emit(hppa_bgt(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
757                 emit(hppa_bgeu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
758                 break;
759         case BPF_JSGE:
760                 emit(hppa_bgt(hi(rs1), hi(rs2), JUMP(2)), ctx);
761                 emit(hppa_blt(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
762                 emit(hppa_bltu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
763                 break;
764         case BPF_JSLE:
765                 emit(hppa_blt(hi(rs1), hi(rs2), JUMP(2)), ctx);
766                 emit(hppa_bgt(hi(rs1), hi(rs2), NO_JUMP(1)), ctx);
767                 emit(hppa_bgtu(lo(rs1), lo(rs2), NO_JUMP(0)), ctx);
768                 break;
769         case BPF_JSET:
770                 emit(hppa_and(hi(rs1), hi(rs2), HPPA_REG_T0), ctx);
771                 emit(hppa_and(lo(rs1), lo(rs2), HPPA_REG_T1), ctx);
772                 emit(hppa_bne(HPPA_REG_T0, HPPA_REG_ZERO, JUMP(1)), ctx);
773                 emit(hppa_beq(HPPA_REG_T1, HPPA_REG_ZERO, NO_JUMP(0)), ctx);
774                 break;
775         default:
776                 WARN_ON(1);
777         }
778
779 #undef NO_JUMP
780 #undef JUMP
781
782         e = ctx->ninsns;
783         /* Adjust for extra insns. */
784         paoff -= (e - s);
785         emit_jump(paoff, true, ctx);
786         return 0;
787 }
788
789 static int emit_bcc(u8 op, u8 rd, u8 rs, int paoff, struct hppa_jit_context *ctx)
790 {
791         int e, s;
792         bool far = false;
793         int off;
794
795         if (op == BPF_JSET) {
796                 /*
797                  * BPF_JSET is a special case: it has no inverse so we always
798                  * treat it as a far branch.
799                  */
800                 emit(hppa_and(rd, rs, HPPA_REG_T0), ctx);
801                 paoff -= 1; /* reduce offset due to hppa_and() above */
802                 rd = HPPA_REG_T0;
803                 rs = HPPA_REG_ZERO;
804                 op = BPF_JNE;
805         }
806
807         s = ctx->ninsns;
808
809         if (!relative_bits_ok(paoff - HPPA_BRANCH_DISPLACEMENT, 12)) {
810                 op = invert_bpf_cond(op);
811                 far = true;
812         }
813
814         /*
815          * For a far branch, the condition is negated and we jump over the
816          * branch itself, and the three instructions from emit_jump.
817          * For a near branch, just use paoff.
818          */
819         off = far ? (HPPA_BRANCH_DISPLACEMENT - 1) : paoff - HPPA_BRANCH_DISPLACEMENT;
820
821         switch (op) {
822         /* IF (dst COND src) JUMP off */
823         case BPF_JEQ:
824                 emit(hppa_beq(rd, rs, off), ctx);
825                 break;
826         case BPF_JGT:
827                 emit(hppa_bgtu(rd, rs, off), ctx);
828                 break;
829         case BPF_JLT:
830                 emit(hppa_bltu(rd, rs, off), ctx);
831                 break;
832         case BPF_JGE:
833                 emit(hppa_bgeu(rd, rs, off), ctx);
834                 break;
835         case BPF_JLE:
836                 emit(hppa_bleu(rd, rs, off), ctx);
837                 break;
838         case BPF_JNE:
839                 emit(hppa_bne(rd, rs, off), ctx);
840                 break;
841         case BPF_JSGT:
842                 emit(hppa_bgt(rd, rs, off), ctx);
843                 break;
844         case BPF_JSLT:
845                 emit(hppa_blt(rd, rs, off), ctx);
846                 break;
847         case BPF_JSGE:
848                 emit(hppa_bge(rd, rs, off), ctx);
849                 break;
850         case BPF_JSLE:
851                 emit(hppa_ble(rd, rs, off), ctx);
852                 break;
853         default:
854                 WARN_ON(1);
855         }
856
857         if (far) {
858                 e = ctx->ninsns;
859                 /* Adjust for extra insns. */
860                 paoff -= (e - s);
861                 emit_jump(paoff, true, ctx);
862         }
863         return 0;
864 }
865
866 static int emit_branch_r32(const s8 *src1, const s8 *src2, s32 paoff,
867                            struct hppa_jit_context *ctx, const u8 op)
868 {
869         int e, s = ctx->ninsns;
870         const s8 *tmp1 = regmap[TMP_REG_1];
871         const s8 *tmp2 = regmap[TMP_REG_2];
872
873         const s8 *rs1 = bpf_get_reg32(src1, tmp1, ctx);
874         const s8 *rs2 = bpf_get_reg32(src2, tmp2, ctx);
875
876         e = ctx->ninsns;
877         /* Adjust for extra insns. */
878         paoff -= (e - s);
879
880         if (emit_bcc(op, lo(rs1), lo(rs2), paoff, ctx))
881                 return -1;
882
883         return 0;
884 }
885
886 static void emit_call(bool fixed, u64 addr, struct hppa_jit_context *ctx)
887 {
888         const s8 *tmp = regmap[TMP_REG_1];
889         const s8 *r0 = regmap[BPF_REG_0];
890         const s8 *reg;
891         const int offset_sp = 2 * STACK_ALIGN;
892
893         /* prepare stack */
894         emit(hppa_ldo(offset_sp, HPPA_REG_SP, HPPA_REG_SP), ctx);
895
896         /* load R1 & R2 in registers, R3-R5 to stack. */
897         reg = bpf_get_reg64_offset(regmap[BPF_REG_5], tmp, offset_sp, ctx);
898         emit(hppa_stw(hi(reg), -0x48, HPPA_REG_SP), ctx);
899         emit(hppa_stw(lo(reg), -0x44, HPPA_REG_SP), ctx);
900
901         reg = bpf_get_reg64_offset(regmap[BPF_REG_4], tmp, offset_sp, ctx);
902         emit(hppa_stw(hi(reg), -0x40, HPPA_REG_SP), ctx);
903         emit(hppa_stw(lo(reg), -0x3c, HPPA_REG_SP), ctx);
904
905         reg = bpf_get_reg64_offset(regmap[BPF_REG_3], tmp, offset_sp, ctx);
906         emit(hppa_stw(hi(reg), -0x38, HPPA_REG_SP), ctx);
907         emit(hppa_stw(lo(reg), -0x34, HPPA_REG_SP), ctx);
908
909         reg = bpf_get_reg64_offset(regmap[BPF_REG_2], tmp, offset_sp, ctx);
910         emit_hppa_copy(hi(reg), HPPA_REG_ARG3, ctx);
911         emit_hppa_copy(lo(reg), HPPA_REG_ARG2, ctx);
912
913         reg = bpf_get_reg64_offset(regmap[BPF_REG_1], tmp, offset_sp, ctx);
914         emit_hppa_copy(hi(reg), HPPA_REG_ARG1, ctx);
915         emit_hppa_copy(lo(reg), HPPA_REG_ARG0, ctx);
916
917         /* backup TCC */
918         if (REG_WAS_SEEN(ctx, HPPA_REG_TCC))
919                 emit(hppa_copy(HPPA_REG_TCC, HPPA_REG_TCC_SAVED), ctx);
920
921         /*
922          * Use ldil() to load absolute address. Don't use emit_imm as the
923          * number of emitted instructions should not depend on the value of
924          * addr.
925          */
926         emit(hppa_ldil(addr, HPPA_REG_R31), ctx);
927         emit(hppa_be_l(im11(addr) >> 2, HPPA_REG_R31, EXEC_NEXT_INSTR), ctx);
928         /* set return address in delay slot */
929         emit_hppa_copy(HPPA_REG_R31, HPPA_REG_RP, ctx);
930
931         /* restore TCC */
932         if (REG_WAS_SEEN(ctx, HPPA_REG_TCC))
933                 emit(hppa_copy(HPPA_REG_TCC_SAVED, HPPA_REG_TCC), ctx);
934
935         /* restore stack */
936         emit(hppa_ldo(-offset_sp, HPPA_REG_SP, HPPA_REG_SP), ctx);
937
938         /* set return value. */
939         emit_hppa_copy(HPPA_REG_RET0, hi(r0), ctx);
940         emit_hppa_copy(HPPA_REG_RET1, lo(r0), ctx);
941 }
942
943 static int emit_bpf_tail_call(int insn, struct hppa_jit_context *ctx)
944 {
945         /*
946          * R1 -> &ctx
947          * R2 -> &array
948          * R3 -> index
949          */
950         int off;
951         const s8 *arr_reg = regmap[BPF_REG_2];
952         const s8 *idx_reg = regmap[BPF_REG_3];
953         struct bpf_array bpfa;
954         struct bpf_prog bpfp;
955
956         /* get address of TCC main exit function for error case into rp */
957         emit(EXIT_PTR_LOAD(HPPA_REG_RP), ctx);
958
959         /* max_entries = array->map.max_entries; */
960         off = offsetof(struct bpf_array, map.max_entries);
961         BUILD_BUG_ON(sizeof(bpfa.map.max_entries) != 4);
962         emit(hppa_ldw(off, lo(arr_reg), HPPA_REG_T1), ctx);
963
964         /*
965          * if (index >= max_entries)
966          *   goto out;
967          */
968         emit(hppa_bltu(lo(idx_reg), HPPA_REG_T1, 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
969         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
970
971         /*
972          * if (--tcc < 0)
973          *   goto out;
974          */
975         REG_FORCE_SEEN(ctx, HPPA_REG_TCC);
976         emit(hppa_ldo(-1, HPPA_REG_TCC, HPPA_REG_TCC), ctx);
977         emit(hppa_bge(HPPA_REG_TCC, HPPA_REG_ZERO, 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
978         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
979
980         /*
981          * prog = array->ptrs[index];
982          * if (!prog)
983          *   goto out;
984          */
985         BUILD_BUG_ON(sizeof(bpfa.ptrs[0]) != 4);
986         emit(hppa_sh2add(lo(idx_reg), lo(arr_reg), HPPA_REG_T0), ctx);
987         off = offsetof(struct bpf_array, ptrs);
988         BUILD_BUG_ON(!relative_bits_ok(off, 11));
989         emit(hppa_ldw(off, HPPA_REG_T0, HPPA_REG_T0), ctx);
990         emit(hppa_bne(HPPA_REG_T0, HPPA_REG_ZERO, 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
991         emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
992
993         /*
994          * tcc = temp_tcc;
995          * goto *(prog->bpf_func + 4);
996          */
997         off = offsetof(struct bpf_prog, bpf_func);
998         BUILD_BUG_ON(!relative_bits_ok(off, 11));
999         BUILD_BUG_ON(sizeof(bpfp.bpf_func) != 4);
1000         emit(hppa_ldw(off, HPPA_REG_T0, HPPA_REG_T0), ctx);
1001         /* Epilogue jumps to *(t0 + 4). */
1002         __build_epilogue(true, ctx);
1003         return 0;
1004 }
1005
1006 static int emit_load_r64(const s8 *dst, const s8 *src, s16 off,
1007                          struct hppa_jit_context *ctx, const u8 size)
1008 {
1009         const s8 *tmp1 = regmap[TMP_REG_1];
1010         const s8 *tmp2 = regmap[TMP_REG_2];
1011         const s8 *rd = bpf_get_reg64_ref(dst, tmp1, ctx->prog->aux->verifier_zext, ctx);
1012         const s8 *rs = bpf_get_reg64(src, tmp2, ctx);
1013         s8 srcreg;
1014
1015         /* need to calculate address since offset does not fit in 14 bits? */
1016         if (relative_bits_ok(off, 14))
1017                 srcreg = lo(rs);
1018         else {
1019                 /* need to use R1 here, since addil puts result into R1 */
1020                 srcreg = HPPA_REG_R1;
1021                 emit(hppa_addil(off, lo(rs)), ctx);
1022                 off = im11(off);
1023         }
1024
1025         /* LDX: dst = *(size *)(src + off) */
1026         switch (size) {
1027         case BPF_B:
1028                 emit(hppa_ldb(off + 0, srcreg, lo(rd)), ctx);
1029                 if (!ctx->prog->aux->verifier_zext)
1030                         emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
1031                 break;
1032         case BPF_H:
1033                 emit(hppa_ldh(off + 0, srcreg, lo(rd)), ctx);
1034                 if (!ctx->prog->aux->verifier_zext)
1035                         emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
1036                 break;
1037         case BPF_W:
1038                 emit(hppa_ldw(off + 0, srcreg, lo(rd)), ctx);
1039                 if (!ctx->prog->aux->verifier_zext)
1040                         emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
1041                 break;
1042         case BPF_DW:
1043                 emit(hppa_ldw(off + 0, srcreg, hi(rd)), ctx);
1044                 emit(hppa_ldw(off + 4, srcreg, lo(rd)), ctx);
1045                 break;
1046         }
1047
1048         bpf_put_reg64(dst, rd, ctx);
1049         return 0;
1050 }
1051
1052 static int emit_store_r64(const s8 *dst, const s8 *src, s16 off,
1053                           struct hppa_jit_context *ctx, const u8 size,
1054                           const u8 mode)
1055 {
1056         const s8 *tmp1 = regmap[TMP_REG_1];
1057         const s8 *tmp2 = regmap[TMP_REG_2];
1058         const s8 *rd = bpf_get_reg64(dst, tmp1, ctx);
1059         const s8 *rs = bpf_get_reg64(src, tmp2, ctx);
1060         s8 dstreg;
1061
1062         /* need to calculate address since offset does not fit in 14 bits? */
1063         if (relative_bits_ok(off, 14))
1064                 dstreg = lo(rd);
1065         else {
1066                 /* need to use R1 here, since addil puts result into R1 */
1067                 dstreg = HPPA_REG_R1;
1068                 emit(hppa_addil(off, lo(rd)), ctx);
1069                 off = im11(off);
1070         }
1071
1072         /* ST: *(size *)(dst + off) = imm */
1073         switch (size) {
1074         case BPF_B:
1075                 emit(hppa_stb(lo(rs), off + 0, dstreg), ctx);
1076                 break;
1077         case BPF_H:
1078                 emit(hppa_sth(lo(rs), off + 0, dstreg), ctx);
1079                 break;
1080         case BPF_W:
1081                 emit(hppa_stw(lo(rs), off + 0, dstreg), ctx);
1082                 break;
1083         case BPF_DW:
1084                 emit(hppa_stw(hi(rs), off + 0, dstreg), ctx);
1085                 emit(hppa_stw(lo(rs), off + 4, dstreg), ctx);
1086                 break;
1087         }
1088
1089         return 0;
1090 }
1091
1092 static void emit_rev16(const s8 rd, struct hppa_jit_context *ctx)
1093 {
1094         emit(hppa_extru(rd, 23, 8, HPPA_REG_T1), ctx);
1095         emit(hppa_depwz(rd, 23, 8, HPPA_REG_T1), ctx);
1096         emit(hppa_extru(HPPA_REG_T1, 31, 16, rd), ctx);
1097 }
1098
1099 static void emit_rev32(const s8 rs, const s8 rd, struct hppa_jit_context *ctx)
1100 {
1101         emit(hppa_shrpw(rs, rs, 16, HPPA_REG_T1), ctx);
1102         emit(hppa_depwz(HPPA_REG_T1, 15, 8, HPPA_REG_T1), ctx);
1103         emit(hppa_shrpw(rs, HPPA_REG_T1, 8, rd), ctx);
1104 }
1105
1106 static void emit_zext64(const s8 *dst, struct hppa_jit_context *ctx)
1107 {
1108         const s8 *rd;
1109         const s8 *tmp1 = regmap[TMP_REG_1];
1110
1111         rd = bpf_get_reg64(dst, tmp1, ctx);
1112         emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
1113         bpf_put_reg64(dst, rd, ctx);
1114 }
1115
1116 int bpf_jit_emit_insn(const struct bpf_insn *insn, struct hppa_jit_context *ctx,
1117                       bool extra_pass)
1118 {
1119         bool is64 = BPF_CLASS(insn->code) == BPF_ALU64 ||
1120                 BPF_CLASS(insn->code) == BPF_JMP;
1121         int s, e, paoff, i = insn - ctx->prog->insnsi;
1122         u8 code = insn->code;
1123         s16 off = insn->off;
1124         s32 imm = insn->imm;
1125
1126         const s8 *dst = regmap[insn->dst_reg];
1127         const s8 *src = regmap[insn->src_reg];
1128         const s8 *tmp1 = regmap[TMP_REG_1];
1129         const s8 *tmp2 = regmap[TMP_REG_2];
1130
1131         if (0) printk("CLASS %03d  CODE %#02x ALU64:%d BPF_SIZE %#02x  "
1132                 "BPF_CODE %#02x  src_reg %d  dst_reg %d\n",
1133                 BPF_CLASS(code), code, (code & BPF_ALU64) ? 1:0, BPF_SIZE(code),
1134                 BPF_OP(code), insn->src_reg, insn->dst_reg);
1135
1136         switch (code) {
1137         /* dst = src */
1138         case BPF_ALU64 | BPF_MOV | BPF_X:
1139
1140         case BPF_ALU64 | BPF_ADD | BPF_X:
1141         case BPF_ALU64 | BPF_ADD | BPF_K:
1142
1143         case BPF_ALU64 | BPF_SUB | BPF_X:
1144         case BPF_ALU64 | BPF_SUB | BPF_K:
1145
1146         case BPF_ALU64 | BPF_AND | BPF_X:
1147         case BPF_ALU64 | BPF_OR | BPF_X:
1148         case BPF_ALU64 | BPF_XOR | BPF_X:
1149
1150         case BPF_ALU64 | BPF_MUL | BPF_X:
1151         case BPF_ALU64 | BPF_MUL | BPF_K:
1152
1153         case BPF_ALU64 | BPF_DIV | BPF_X:
1154         case BPF_ALU64 | BPF_DIV | BPF_K:
1155
1156         case BPF_ALU64 | BPF_MOD | BPF_X:
1157         case BPF_ALU64 | BPF_MOD | BPF_K:
1158
1159         case BPF_ALU64 | BPF_LSH | BPF_X:
1160         case BPF_ALU64 | BPF_RSH | BPF_X:
1161         case BPF_ALU64 | BPF_ARSH | BPF_X:
1162                 if (BPF_SRC(code) == BPF_K) {
1163                         emit_imm32(tmp2, imm, ctx);
1164                         src = tmp2;
1165                 }
1166                 emit_alu_r64(dst, src, ctx, BPF_OP(code));
1167                 break;
1168
1169         /* dst = -dst */
1170         case BPF_ALU64 | BPF_NEG:
1171                 emit_alu_r64(dst, tmp2, ctx, BPF_OP(code));
1172                 break;
1173
1174         case BPF_ALU64 | BPF_MOV | BPF_K:
1175         case BPF_ALU64 | BPF_AND | BPF_K:
1176         case BPF_ALU64 | BPF_OR | BPF_K:
1177         case BPF_ALU64 | BPF_XOR | BPF_K:
1178         case BPF_ALU64 | BPF_LSH | BPF_K:
1179         case BPF_ALU64 | BPF_RSH | BPF_K:
1180         case BPF_ALU64 | BPF_ARSH | BPF_K:
1181                 emit_alu_i64(dst, imm, ctx, BPF_OP(code));
1182                 break;
1183
1184         case BPF_ALU | BPF_MOV | BPF_X:
1185                 if (imm == 1) {
1186                         /* Special mov32 for zext. */
1187                         emit_zext64(dst, ctx);
1188                         break;
1189                 }
1190                 fallthrough;
1191         /* dst = dst OP src */
1192         case BPF_ALU | BPF_ADD | BPF_X:
1193         case BPF_ALU | BPF_SUB | BPF_X:
1194         case BPF_ALU | BPF_AND | BPF_X:
1195         case BPF_ALU | BPF_OR | BPF_X:
1196         case BPF_ALU | BPF_XOR | BPF_X:
1197
1198         case BPF_ALU | BPF_MUL | BPF_X:
1199         case BPF_ALU | BPF_MUL | BPF_K:
1200
1201         case BPF_ALU | BPF_DIV | BPF_X:
1202         case BPF_ALU | BPF_DIV | BPF_K:
1203
1204         case BPF_ALU | BPF_MOD | BPF_X:
1205         case BPF_ALU | BPF_MOD | BPF_K:
1206
1207         case BPF_ALU | BPF_LSH | BPF_X:
1208         case BPF_ALU | BPF_RSH | BPF_X:
1209         case BPF_ALU | BPF_ARSH | BPF_X:
1210                 if (BPF_SRC(code) == BPF_K) {
1211                         emit_imm32(tmp2, imm, ctx);
1212                         src = tmp2;
1213                 }
1214                 emit_alu_r32(dst, src, ctx, BPF_OP(code));
1215                 break;
1216
1217         /* dst = dst OP imm */
1218         case BPF_ALU | BPF_MOV | BPF_K:
1219         case BPF_ALU | BPF_ADD | BPF_K:
1220         case BPF_ALU | BPF_SUB | BPF_K:
1221         case BPF_ALU | BPF_AND | BPF_K:
1222         case BPF_ALU | BPF_OR | BPF_K:
1223         case BPF_ALU | BPF_XOR | BPF_K:
1224         case BPF_ALU | BPF_LSH | BPF_K:
1225         case BPF_ALU | BPF_RSH | BPF_K:
1226         case BPF_ALU | BPF_ARSH | BPF_K:
1227                 /*
1228                  * mul,div,mod are handled in the BPF_X case.
1229                  */
1230                 emit_alu_i32(dst, imm, ctx, BPF_OP(code));
1231                 break;
1232
1233         /* dst = -dst */
1234         case BPF_ALU | BPF_NEG:
1235                 /*
1236                  * src is ignored---choose tmp2 as a dummy register since it
1237                  * is not on the stack.
1238                  */
1239                 emit_alu_r32(dst, tmp2, ctx, BPF_OP(code));
1240                 break;
1241
1242         /* dst = BSWAP##imm(dst) */
1243         case BPF_ALU | BPF_END | BPF_FROM_BE:
1244         {
1245                 const s8 *rd = bpf_get_reg64(dst, tmp1, ctx);
1246
1247                 switch (imm) {
1248                 case 16:
1249                         /* zero-extend 16 bits into 64 bits */
1250                         emit(hppa_extru(lo(rd), 31, 16, lo(rd)), ctx);
1251                         fallthrough;
1252                 case 32:
1253                         /* zero-extend 32 bits into 64 bits */
1254                         if (!ctx->prog->aux->verifier_zext)
1255                                 emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
1256                         break;
1257                 case 64:
1258                         /* Do nothing. */
1259                         break;
1260                 default:
1261                         pr_err("bpf-jit: BPF_END imm %d invalid\n", imm);
1262                         return -1;
1263                 }
1264
1265                 bpf_put_reg64(dst, rd, ctx);
1266                 break;
1267         }
1268
1269         case BPF_ALU | BPF_END | BPF_FROM_LE:
1270         {
1271                 const s8 *rd = bpf_get_reg64(dst, tmp1, ctx);
1272
1273                 switch (imm) {
1274                 case 16:
1275                         emit_rev16(lo(rd), ctx);
1276                         if (!ctx->prog->aux->verifier_zext)
1277                                 emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
1278                         break;
1279                 case 32:
1280                         emit_rev32(lo(rd), lo(rd), ctx);
1281                         if (!ctx->prog->aux->verifier_zext)
1282                                 emit_hppa_copy(HPPA_REG_ZERO, hi(rd), ctx);
1283                         break;
1284                 case 64:
1285                         /* Swap upper and lower halves, then each half. */
1286                         emit_hppa_copy(hi(rd), HPPA_REG_T0, ctx);
1287                         emit_rev32(lo(rd), hi(rd), ctx);
1288                         emit_rev32(HPPA_REG_T0, lo(rd), ctx);
1289                         break;
1290                 default:
1291                         pr_err("bpf-jit: BPF_END imm %d invalid\n", imm);
1292                         return -1;
1293                 }
1294
1295                 bpf_put_reg64(dst, rd, ctx);
1296                 break;
1297         }
1298         /* JUMP off */
1299         case BPF_JMP | BPF_JA:
1300                 paoff = hppa_offset(i, off, ctx);
1301                 emit_jump(paoff, false, ctx);
1302                 break;
1303         /* function call */
1304         case BPF_JMP | BPF_CALL:
1305         {
1306                 bool fixed;
1307                 int ret;
1308                 u64 addr;
1309
1310                 ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass, &addr,
1311                                             &fixed);
1312                 if (ret < 0)
1313                         return ret;
1314                 emit_call(fixed, addr, ctx);
1315                 break;
1316         }
1317         /* tail call */
1318         case BPF_JMP | BPF_TAIL_CALL:
1319                 REG_SET_SEEN_ALL(ctx);
1320                 if (emit_bpf_tail_call(i, ctx))
1321                         return -1;
1322                 break;
1323         /* IF (dst COND imm) JUMP off */
1324         case BPF_JMP | BPF_JEQ | BPF_X:
1325         case BPF_JMP | BPF_JEQ | BPF_K:
1326         case BPF_JMP32 | BPF_JEQ | BPF_X:
1327         case BPF_JMP32 | BPF_JEQ | BPF_K:
1328
1329         case BPF_JMP | BPF_JNE | BPF_X:
1330         case BPF_JMP | BPF_JNE | BPF_K:
1331         case BPF_JMP32 | BPF_JNE | BPF_X:
1332         case BPF_JMP32 | BPF_JNE | BPF_K:
1333
1334         case BPF_JMP | BPF_JLE | BPF_X:
1335         case BPF_JMP | BPF_JLE | BPF_K:
1336         case BPF_JMP32 | BPF_JLE | BPF_X:
1337         case BPF_JMP32 | BPF_JLE | BPF_K:
1338
1339         case BPF_JMP | BPF_JLT | BPF_X:
1340         case BPF_JMP | BPF_JLT | BPF_K:
1341         case BPF_JMP32 | BPF_JLT | BPF_X:
1342         case BPF_JMP32 | BPF_JLT | BPF_K:
1343
1344         case BPF_JMP | BPF_JGE | BPF_X:
1345         case BPF_JMP | BPF_JGE | BPF_K:
1346         case BPF_JMP32 | BPF_JGE | BPF_X:
1347         case BPF_JMP32 | BPF_JGE | BPF_K:
1348
1349         case BPF_JMP | BPF_JGT | BPF_X:
1350         case BPF_JMP | BPF_JGT | BPF_K:
1351         case BPF_JMP32 | BPF_JGT | BPF_X:
1352         case BPF_JMP32 | BPF_JGT | BPF_K:
1353
1354         case BPF_JMP | BPF_JSLE | BPF_X:
1355         case BPF_JMP | BPF_JSLE | BPF_K:
1356         case BPF_JMP32 | BPF_JSLE | BPF_X:
1357         case BPF_JMP32 | BPF_JSLE | BPF_K:
1358
1359         case BPF_JMP | BPF_JSLT | BPF_X:
1360         case BPF_JMP | BPF_JSLT | BPF_K:
1361         case BPF_JMP32 | BPF_JSLT | BPF_X:
1362         case BPF_JMP32 | BPF_JSLT | BPF_K:
1363
1364         case BPF_JMP | BPF_JSGE | BPF_X:
1365         case BPF_JMP | BPF_JSGE | BPF_K:
1366         case BPF_JMP32 | BPF_JSGE | BPF_X:
1367         case BPF_JMP32 | BPF_JSGE | BPF_K:
1368
1369         case BPF_JMP | BPF_JSGT | BPF_X:
1370         case BPF_JMP | BPF_JSGT | BPF_K:
1371         case BPF_JMP32 | BPF_JSGT | BPF_X:
1372         case BPF_JMP32 | BPF_JSGT | BPF_K:
1373
1374         case BPF_JMP | BPF_JSET | BPF_X:
1375         case BPF_JMP | BPF_JSET | BPF_K:
1376         case BPF_JMP32 | BPF_JSET | BPF_X:
1377         case BPF_JMP32 | BPF_JSET | BPF_K:
1378                 paoff = hppa_offset(i, off, ctx);
1379                 if (BPF_SRC(code) == BPF_K) {
1380                         s = ctx->ninsns;
1381                         emit_imm32(tmp2, imm, ctx);
1382                         src = tmp2;
1383                         e = ctx->ninsns;
1384                         paoff -= (e - s);
1385                 }
1386                 if (is64)
1387                         emit_branch_r64(dst, src, paoff, ctx, BPF_OP(code));
1388                 else
1389                         emit_branch_r32(dst, src, paoff, ctx, BPF_OP(code));
1390                 break;
1391         /* function return */
1392         case BPF_JMP | BPF_EXIT:
1393                 if (i == ctx->prog->len - 1)
1394                         break;
1395                 /* load epilogue function pointer and jump to it. */
1396                 emit(EXIT_PTR_LOAD(HPPA_REG_RP), ctx);
1397                 emit(EXIT_PTR_JUMP(HPPA_REG_RP, NOP_NEXT_INSTR), ctx);
1398                 break;
1399
1400         /* dst = imm64 */
1401         case BPF_LD | BPF_IMM | BPF_DW:
1402         {
1403                 struct bpf_insn insn1 = insn[1];
1404                 u32 upper = insn1.imm;
1405                 u32 lower = imm;
1406                 const s8 *rd = bpf_get_reg64_ref(dst, tmp1, false, ctx);
1407
1408                 if (0 && bpf_pseudo_func(insn)) {
1409                         WARN_ON(upper); /* we are 32-bit! */
1410                         upper = 0;
1411                         lower = (uintptr_t) dereference_function_descriptor(lower);
1412                 }
1413
1414                 emit_imm64(rd, upper, lower, ctx);
1415                 bpf_put_reg64(dst, rd, ctx);
1416                 return 1;
1417         }
1418
1419         /* LDX: dst = *(size *)(src + off) */
1420         case BPF_LDX | BPF_MEM | BPF_B:
1421         case BPF_LDX | BPF_MEM | BPF_H:
1422         case BPF_LDX | BPF_MEM | BPF_W:
1423         case BPF_LDX | BPF_MEM | BPF_DW:
1424                 if (emit_load_r64(dst, src, off, ctx, BPF_SIZE(code)))
1425                         return -1;
1426                 break;
1427
1428         /* speculation barrier */
1429         case BPF_ST | BPF_NOSPEC:
1430                 break;
1431
1432         /* ST: *(size *)(dst + off) = imm */
1433         case BPF_ST | BPF_MEM | BPF_B:
1434         case BPF_ST | BPF_MEM | BPF_H:
1435         case BPF_ST | BPF_MEM | BPF_W:
1436         case BPF_ST | BPF_MEM | BPF_DW:
1437
1438         case BPF_STX | BPF_MEM | BPF_B:
1439         case BPF_STX | BPF_MEM | BPF_H:
1440         case BPF_STX | BPF_MEM | BPF_W:
1441         case BPF_STX | BPF_MEM | BPF_DW:
1442                 if (BPF_CLASS(code) == BPF_ST) {
1443                         emit_imm32(tmp2, imm, ctx);
1444                         src = tmp2;
1445                 }
1446
1447                 if (emit_store_r64(dst, src, off, ctx, BPF_SIZE(code),
1448                                    BPF_MODE(code)))
1449                         return -1;
1450                 break;
1451
1452         case BPF_STX | BPF_ATOMIC | BPF_W:
1453         case BPF_STX | BPF_ATOMIC | BPF_DW:
1454                 pr_info_once(
1455                         "bpf-jit: not supported: atomic operation %02x ***\n",
1456                         insn->imm);
1457                 return -EFAULT;
1458
1459         default:
1460                 pr_err("bpf-jit: unknown opcode %02x\n", code);
1461                 return -EINVAL;
1462         }
1463
1464         return 0;
1465 }
1466
1467 void bpf_jit_build_prologue(struct hppa_jit_context *ctx)
1468 {
1469         const s8 *tmp = regmap[TMP_REG_1];
1470         const s8 *dst, *reg;
1471         int stack_adjust = 0;
1472         int i;
1473         unsigned long addr;
1474         int bpf_stack_adjust;
1475
1476         /*
1477          * stack on hppa grows up, so if tail calls are used we need to
1478          * allocate the maximum stack size
1479          */
1480         if (REG_ALL_SEEN(ctx))
1481                 bpf_stack_adjust = MAX_BPF_STACK;
1482         else
1483                 bpf_stack_adjust = ctx->prog->aux->stack_depth;
1484         bpf_stack_adjust = round_up(bpf_stack_adjust, STACK_ALIGN);
1485
1486         /* make space for callee-saved registers. */
1487         stack_adjust += NR_SAVED_REGISTERS * REG_SIZE;
1488         /* make space for BPF registers on stack. */
1489         stack_adjust += BPF_JIT_SCRATCH_REGS * REG_SIZE;
1490         /* make space for BPF stack. */
1491         stack_adjust += bpf_stack_adjust;
1492         /* round up for stack alignment. */
1493         stack_adjust = round_up(stack_adjust, STACK_ALIGN);
1494
1495         /*
1496          * The first instruction sets the tail-call-counter (TCC) register.
1497          * This instruction is skipped by tail calls.
1498          * Use a temporary register instead of a caller-saved register initially.
1499          */
1500         emit(hppa_ldi(MAX_TAIL_CALL_CNT, HPPA_REG_TCC_IN_INIT), ctx);
1501
1502         /*
1503          * skip all initializations when called as BPF TAIL call.
1504          */
1505         emit(hppa_ldi(MAX_TAIL_CALL_CNT, HPPA_REG_R1), ctx);
1506         emit(hppa_bne(HPPA_REG_TCC_IN_INIT, HPPA_REG_R1, ctx->prologue_len - 2 - HPPA_BRANCH_DISPLACEMENT), ctx);
1507
1508         /* set up hppa stack frame. */
1509         emit_hppa_copy(HPPA_REG_SP, HPPA_REG_R1, ctx);                  // copy sp,r1 (=prev_sp)
1510         emit(hppa_ldo(stack_adjust, HPPA_REG_SP, HPPA_REG_SP), ctx);    // ldo stack_adjust(sp),sp (increase stack)
1511         emit(hppa_stw(HPPA_REG_R1, -REG_SIZE, HPPA_REG_SP), ctx);       // stw prev_sp,-0x04(sp)
1512         emit(hppa_stw(HPPA_REG_RP, -0x14, HPPA_REG_SP), ctx);           // stw rp,-0x14(sp)
1513
1514         REG_FORCE_SEEN(ctx, HPPA_REG_T0);
1515         REG_FORCE_SEEN(ctx, HPPA_REG_T1);
1516         REG_FORCE_SEEN(ctx, HPPA_REG_T2);
1517         REG_FORCE_SEEN(ctx, HPPA_REG_T3);
1518         REG_FORCE_SEEN(ctx, HPPA_REG_T4);
1519         REG_FORCE_SEEN(ctx, HPPA_REG_T5);
1520
1521         /* save callee-save registers. */
1522         for (i = 3; i <= 18; i++) {
1523                 if (OPTIMIZE_HPPA && !REG_WAS_SEEN(ctx, HPPA_R(i)))
1524                         continue;
1525                 emit(hppa_stw(HPPA_R(i), -REG_SIZE * (8 + (i-3)), HPPA_REG_SP), ctx);   // stw ri,-save_area(sp)
1526         }
1527
1528         /*
1529          * now really set the tail call counter (TCC) register.
1530          */
1531         if (REG_WAS_SEEN(ctx, HPPA_REG_TCC))
1532                 emit(hppa_ldi(MAX_TAIL_CALL_CNT, HPPA_REG_TCC), ctx);
1533
1534         /*
1535          * save epilogue function pointer for outer TCC call chain.
1536          * The main TCC call stores the final RP on stack.
1537          */
1538         addr = (uintptr_t) &ctx->insns[ctx->epilogue_offset];
1539         /* skip first two instructions of exit function, which jump to exit */
1540         addr += 2 * HPPA_INSN_SIZE;
1541         emit(hppa_ldil(addr, HPPA_REG_T2), ctx);
1542         emit(hppa_ldo(im11(addr), HPPA_REG_T2, HPPA_REG_T2), ctx);
1543         emit(EXIT_PTR_STORE(HPPA_REG_T2), ctx);
1544
1545         /* load R1 & R2 from registers, R3-R5 from stack. */
1546         /* use HPPA_REG_R1 which holds the old stack value */
1547         dst = regmap[BPF_REG_5];
1548         reg = bpf_get_reg64_ref(dst, tmp, false, ctx);
1549         if (REG_WAS_SEEN(ctx, lo(reg)) | REG_WAS_SEEN(ctx, hi(reg))) {
1550                 if (REG_WAS_SEEN(ctx, hi(reg)))
1551                         emit(hppa_ldw(-0x48, HPPA_REG_R1, hi(reg)), ctx);
1552                 if (REG_WAS_SEEN(ctx, lo(reg)))
1553                         emit(hppa_ldw(-0x44, HPPA_REG_R1, lo(reg)), ctx);
1554                 bpf_put_reg64(dst, tmp, ctx);
1555         }
1556
1557         dst = regmap[BPF_REG_4];
1558         reg = bpf_get_reg64_ref(dst, tmp, false, ctx);
1559         if (REG_WAS_SEEN(ctx, lo(reg)) | REG_WAS_SEEN(ctx, hi(reg))) {
1560                 if (REG_WAS_SEEN(ctx, hi(reg)))
1561                         emit(hppa_ldw(-0x40, HPPA_REG_R1, hi(reg)), ctx);
1562                 if (REG_WAS_SEEN(ctx, lo(reg)))
1563                         emit(hppa_ldw(-0x3c, HPPA_REG_R1, lo(reg)), ctx);
1564                 bpf_put_reg64(dst, tmp, ctx);
1565         }
1566
1567         dst = regmap[BPF_REG_3];
1568         reg = bpf_get_reg64_ref(dst, tmp, false, ctx);
1569         if (REG_WAS_SEEN(ctx, lo(reg)) | REG_WAS_SEEN(ctx, hi(reg))) {
1570                 if (REG_WAS_SEEN(ctx, hi(reg)))
1571                         emit(hppa_ldw(-0x38, HPPA_REG_R1, hi(reg)), ctx);
1572                 if (REG_WAS_SEEN(ctx, lo(reg)))
1573                         emit(hppa_ldw(-0x34, HPPA_REG_R1, lo(reg)), ctx);
1574                 bpf_put_reg64(dst, tmp, ctx);
1575         }
1576
1577         dst = regmap[BPF_REG_2];
1578         reg = bpf_get_reg64_ref(dst, tmp, false, ctx);
1579         if (REG_WAS_SEEN(ctx, lo(reg)) | REG_WAS_SEEN(ctx, hi(reg))) {
1580                 if (REG_WAS_SEEN(ctx, hi(reg)))
1581                         emit_hppa_copy(HPPA_REG_ARG3, hi(reg), ctx);
1582                 if (REG_WAS_SEEN(ctx, lo(reg)))
1583                         emit_hppa_copy(HPPA_REG_ARG2, lo(reg), ctx);
1584                 bpf_put_reg64(dst, tmp, ctx);
1585         }
1586
1587         dst = regmap[BPF_REG_1];
1588         reg = bpf_get_reg64_ref(dst, tmp, false, ctx);
1589         if (REG_WAS_SEEN(ctx, lo(reg)) | REG_WAS_SEEN(ctx, hi(reg))) {
1590                 if (REG_WAS_SEEN(ctx, hi(reg)))
1591                         emit_hppa_copy(HPPA_REG_ARG1, hi(reg), ctx);
1592                 if (REG_WAS_SEEN(ctx, lo(reg)))
1593                         emit_hppa_copy(HPPA_REG_ARG0, lo(reg), ctx);
1594                 bpf_put_reg64(dst, tmp, ctx);
1595         }
1596
1597         /* Set up BPF frame pointer. */
1598         dst = regmap[BPF_REG_FP];
1599         reg = bpf_get_reg64_ref(dst, tmp, false, ctx);
1600         if (REG_WAS_SEEN(ctx, lo(reg)) | REG_WAS_SEEN(ctx, hi(reg))) {
1601                 if (REG_WAS_SEEN(ctx, lo(reg)))
1602                         emit(hppa_ldo(-REG_SIZE * (NR_SAVED_REGISTERS + BPF_JIT_SCRATCH_REGS),
1603                                 HPPA_REG_SP, lo(reg)), ctx);
1604                 if (REG_WAS_SEEN(ctx, hi(reg)))
1605                         emit_hppa_copy(HPPA_REG_ZERO, hi(reg), ctx);
1606                 bpf_put_reg64(dst, tmp, ctx);
1607         }
1608
1609         emit(hppa_nop(), ctx);
1610 }
1611
1612 void bpf_jit_build_epilogue(struct hppa_jit_context *ctx)
1613 {
1614         __build_epilogue(false, ctx);
1615 }
This page took 0.121147 seconds and 4 git commands to generate.