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