File Index
Files and directories
Sign in
FILE

bpf_jit_comp64.c

File preview with syntax highlighting.

linux-6.19.14/arch/powerpc/net/bpf_jit_comp64.c C
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * bpf_jit_comp64.c: eBPF JIT compiler
   4 *
   5 * Copyright 2016 Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
   6 *		  IBM Corporation
   7 *
   8 * Based on the powerpc classic BPF JIT compiler by Matt Evans
   9 */
  10#include <linux/moduleloader.h>
  11#include <asm/cacheflush.h>
  12#include <asm/asm-compat.h>
  13#include <linux/netdevice.h>
  14#include <linux/filter.h>
  15#include <linux/if_vlan.h>
  16#include <asm/kprobes.h>
  17#include <linux/bpf.h>
  18#include <asm/security_features.h>
  19
  20#include "bpf_jit.h"
  21
  22/*
  23 * Stack layout:
  24 * Ensure the top half (upto local_tmp_var) stays consistent
  25 * with our redzone usage.
  26 *
  27 *		[	prev sp		] <-------------
  28 *		[   nv gpr save area	] 6*8		|
  29 *		[    tail_call_cnt	] 8		|
  30 *		[    local_tmp_var	] 24		|
  31 * fp (r31) -->	[   ebpf stack space	] upto 512	|
  32 *		[     frame header	] 32/112	|
  33 * sp (r1) --->	[    stack pointer	] --------------
  34 */
  35
  36/* for gpr non volatile registers BPG_REG_6 to 10 */
  37#define BPF_PPC_STACK_SAVE	(6*8)
  38/* for bpf JIT code internal usage */
  39#define BPF_PPC_STACK_LOCALS	32
  40/* stack frame excluding BPF stack, ensure this is quadword aligned */
  41#define BPF_PPC_STACKFRAME	(STACK_FRAME_MIN_SIZE + \
  42				 BPF_PPC_STACK_LOCALS + BPF_PPC_STACK_SAVE)
  43
  44/* BPF register usage */
  45#define TMP_REG_1	(MAX_BPF_JIT_REG + 0)
  46#define TMP_REG_2	(MAX_BPF_JIT_REG + 1)
  47#define ARENA_VM_START  (MAX_BPF_JIT_REG + 2)
  48
  49/* BPF to ppc register mappings */
  50void bpf_jit_init_reg_mapping(struct codegen_context *ctx)
  51{
  52	/* function return value */
  53	ctx->b2p[BPF_REG_0] = _R8;
  54	/* function arguments */
  55	ctx->b2p[BPF_REG_1] = _R3;
  56	ctx->b2p[BPF_REG_2] = _R4;
  57	ctx->b2p[BPF_REG_3] = _R5;
  58	ctx->b2p[BPF_REG_4] = _R6;
  59	ctx->b2p[BPF_REG_5] = _R7;
  60	/* non volatile registers */
  61	ctx->b2p[BPF_REG_6] = _R27;
  62	ctx->b2p[BPF_REG_7] = _R28;
  63	ctx->b2p[BPF_REG_8] = _R29;
  64	ctx->b2p[BPF_REG_9] = _R30;
  65	/* frame pointer aka BPF_REG_10 */
  66	ctx->b2p[BPF_REG_FP] = _R31;
  67	/* eBPF jit internal registers */
  68	ctx->b2p[BPF_REG_AX] = _R12;
  69	ctx->b2p[TMP_REG_1] = _R9;
  70	ctx->b2p[TMP_REG_2] = _R10;
  71	/* non volatile register for kern_vm_start address */
  72	ctx->b2p[ARENA_VM_START] = _R26;
  73}
  74
  75/* PPC NVR range -- update this if we ever use NVRs below r26 */
  76#define BPF_PPC_NVR_MIN		_R26
  77
  78static inline bool bpf_has_stack_frame(struct codegen_context *ctx)
  79{
  80	/*
  81	 * We only need a stack frame if:
  82	 * - we call other functions (kernel helpers), or
  83	 * - the bpf program uses its stack area
  84	 * The latter condition is deduced from the usage of BPF_REG_FP
  85	 */
  86	return ctx->seen & SEEN_FUNC || bpf_is_seen_register(ctx, bpf_to_ppc(BPF_REG_FP));
  87}
  88
  89/*
  90 * When not setting up our own stackframe, the redzone (288 bytes) usage is:
  91 *
  92 *		[	prev sp		] <-------------
  93 *		[	  ...       	] 		|
  94 * sp (r1) --->	[    stack pointer	] --------------
  95 *		[   nv gpr save area	] 6*8
  96 *		[    tail_call_cnt	] 8
  97 *		[    local_tmp_var	] 24
  98 *		[   unused red zone	] 224
  99 */
 100static int bpf_jit_stack_local(struct codegen_context *ctx)
 101{
 102	if (bpf_has_stack_frame(ctx))
 103		return STACK_FRAME_MIN_SIZE + ctx->stack_size;
 104	else
 105		return -(BPF_PPC_STACK_SAVE + 32);
 106}
 107
 108static int bpf_jit_stack_tailcallcnt(struct codegen_context *ctx)
 109{
 110	return bpf_jit_stack_local(ctx) + 24;
 111}
 112
 113static int bpf_jit_stack_offsetof(struct codegen_context *ctx, int reg)
 114{
 115	if (reg >= BPF_PPC_NVR_MIN && reg < 32)
 116		return (bpf_has_stack_frame(ctx) ?
 117			(BPF_PPC_STACKFRAME + ctx->stack_size) : 0)
 118				- (8 * (32 - reg));
 119
 120	pr_err("BPF JIT is asking about unknown registers");
 121	BUG();
 122}
 123
 124void bpf_jit_realloc_regs(struct codegen_context *ctx)
 125{
 126}
 127
 128void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx)
 129{
 130	int i;
 131
 132	/* Instruction for trampoline attach */
 133	EMIT(PPC_RAW_NOP());
 134
 135#ifndef CONFIG_PPC_KERNEL_PCREL
 136	if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2))
 137		EMIT(PPC_RAW_LD(_R2, _R13, offsetof(struct paca_struct, kernel_toc)));
 138#endif
 139
 140	/*
 141	 * Initialize tail_call_cnt if we do tail calls.
 142	 * Otherwise, put in NOPs so that it can be skipped when we are
 143	 * invoked through a tail call.
 144	 */
 145	if (ctx->seen & SEEN_TAILCALL) {
 146		EMIT(PPC_RAW_LI(bpf_to_ppc(TMP_REG_1), 0));
 147		/* this goes in the redzone */
 148		EMIT(PPC_RAW_STD(bpf_to_ppc(TMP_REG_1), _R1, -(BPF_PPC_STACK_SAVE + 8)));
 149	} else {
 150		EMIT(PPC_RAW_NOP());
 151		EMIT(PPC_RAW_NOP());
 152	}
 153
 154	if (bpf_has_stack_frame(ctx)) {
 155		/*
 156		 * We need a stack frame, but we don't necessarily need to
 157		 * save/restore LR unless we call other functions
 158		 */
 159		if (ctx->seen & SEEN_FUNC) {
 160			EMIT(PPC_RAW_MFLR(_R0));
 161			EMIT(PPC_RAW_STD(_R0, _R1, PPC_LR_STKOFF));
 162		}
 163
 164		EMIT(PPC_RAW_STDU(_R1, _R1, -(BPF_PPC_STACKFRAME + ctx->stack_size)));
 165	}
 166
 167	/*
 168	 * Back up non-volatile regs -- BPF registers 6-10
 169	 * If we haven't created our own stack frame, we save these
 170	 * in the protected zone below the previous stack frame
 171	 */
 172	for (i = BPF_REG_6; i <= BPF_REG_10; i++)
 173		if (bpf_is_seen_register(ctx, bpf_to_ppc(i)))
 174			EMIT(PPC_RAW_STD(bpf_to_ppc(i), _R1, bpf_jit_stack_offsetof(ctx, bpf_to_ppc(i))));
 175
 176	if (ctx->arena_vm_start)
 177		EMIT(PPC_RAW_STD(bpf_to_ppc(ARENA_VM_START), _R1,
 178				 bpf_jit_stack_offsetof(ctx, bpf_to_ppc(ARENA_VM_START))));
 179
 180	/* Setup frame pointer to point to the bpf stack area */
 181	if (bpf_is_seen_register(ctx, bpf_to_ppc(BPF_REG_FP)))
 182		EMIT(PPC_RAW_ADDI(bpf_to_ppc(BPF_REG_FP), _R1,
 183				STACK_FRAME_MIN_SIZE + ctx->stack_size));
 184
 185	if (ctx->arena_vm_start)
 186		PPC_LI64(bpf_to_ppc(ARENA_VM_START), ctx->arena_vm_start);
 187}
 188
 189static void bpf_jit_emit_common_epilogue(u32 *image, struct codegen_context *ctx)
 190{
 191	int i;
 192
 193	/* Restore NVRs */
 194	for (i = BPF_REG_6; i <= BPF_REG_10; i++)
 195		if (bpf_is_seen_register(ctx, bpf_to_ppc(i)))
 196			EMIT(PPC_RAW_LD(bpf_to_ppc(i), _R1, bpf_jit_stack_offsetof(ctx, bpf_to_ppc(i))));
 197
 198	if (ctx->arena_vm_start)
 199		EMIT(PPC_RAW_LD(bpf_to_ppc(ARENA_VM_START), _R1,
 200				bpf_jit_stack_offsetof(ctx, bpf_to_ppc(ARENA_VM_START))));
 201
 202	/* Tear down our stack frame */
 203	if (bpf_has_stack_frame(ctx)) {
 204		EMIT(PPC_RAW_ADDI(_R1, _R1, BPF_PPC_STACKFRAME + ctx->stack_size));
 205		if (ctx->seen & SEEN_FUNC) {
 206			EMIT(PPC_RAW_LD(_R0, _R1, PPC_LR_STKOFF));
 207			EMIT(PPC_RAW_MTLR(_R0));
 208		}
 209	}
 210}
 211
 212void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
 213{
 214	bpf_jit_emit_common_epilogue(image, ctx);
 215
 216	/* Move result to r3 */
 217	EMIT(PPC_RAW_MR(_R3, bpf_to_ppc(BPF_REG_0)));
 218
 219	EMIT(PPC_RAW_BLR());
 220
 221	bpf_jit_build_fentry_stubs(image, ctx);
 222}
 223
 224int bpf_jit_emit_func_call_rel(u32 *image, u32 *fimage, struct codegen_context *ctx, u64 func)
 225{
 226	unsigned long func_addr = func ? ppc_function_entry((void *)func) : 0;
 227	long reladdr;
 228
 229	/* bpf to bpf call, func is not known in the initial pass. Emit 5 nops as a placeholder */
 230	if (!func) {
 231		for (int i = 0; i < 5; i++)
 232			EMIT(PPC_RAW_NOP());
 233		/* elfv1 needs an additional instruction to load addr from descriptor */
 234		if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V1))
 235			EMIT(PPC_RAW_NOP());
 236		EMIT(PPC_RAW_MTCTR(_R12));
 237		EMIT(PPC_RAW_BCTRL());
 238		return 0;
 239	}
 240
 241#ifdef CONFIG_PPC_KERNEL_PCREL
 242	reladdr = func_addr - local_paca->kernelbase;
 243
 244	/*
 245	 * If fimage is NULL (the initial pass to find image size),
 246	 * account for the maximum no. of instructions possible.
 247	 */
 248	if (!fimage) {
 249		ctx->idx += 7;
 250		return 0;
 251	} else if (reladdr < (long)SZ_8G && reladdr >= -(long)SZ_8G) {
 252		EMIT(PPC_RAW_LD(_R12, _R13, offsetof(struct paca_struct, kernelbase)));
 253		/* Align for subsequent prefix instruction */
 254		if (!IS_ALIGNED((unsigned long)fimage + CTX_NIA(ctx), 8))
 255			EMIT(PPC_RAW_NOP());
 256		/* paddi r12,r12,addr */
 257		EMIT(PPC_PREFIX_MLS | __PPC_PRFX_R(0) | IMM_H18(reladdr));
 258		EMIT(PPC_INST_PADDI | ___PPC_RT(_R12) | ___PPC_RA(_R12) | IMM_L(reladdr));
 259	} else {
 260		unsigned long pc = (unsigned long)fimage + CTX_NIA(ctx);
 261		bool alignment_needed = !IS_ALIGNED(pc, 8);
 262
 263		reladdr = func_addr - (alignment_needed ? pc + 4 :  pc);
 264
 265		if (reladdr < (long)SZ_8G && reladdr >= -(long)SZ_8G) {
 266			if (alignment_needed)
 267				EMIT(PPC_RAW_NOP());
 268			/* pla r12,addr */
 269			EMIT(PPC_PREFIX_MLS | __PPC_PRFX_R(1) | IMM_H18(reladdr));
 270			EMIT(PPC_INST_PADDI | ___PPC_RT(_R12) | IMM_L(reladdr));
 271		} else {
 272			/* We can clobber r12 */
 273			PPC_LI64(_R12, func);
 274		}
 275	}
 276	EMIT(PPC_RAW_MTCTR(_R12));
 277	EMIT(PPC_RAW_BCTRL());
 278#else
 279	if (core_kernel_text(func_addr)) {
 280		reladdr = func_addr - kernel_toc_addr();
 281		if (reladdr > 0x7FFFFFFF || reladdr < -(0x80000000L)) {
 282			pr_err("eBPF: address of %ps out of range of kernel_toc.\n", (void *)func);
 283			return -ERANGE;
 284		}
 285
 286		EMIT(PPC_RAW_ADDIS(_R12, _R2, PPC_HA(reladdr)));
 287		EMIT(PPC_RAW_ADDI(_R12, _R12, PPC_LO(reladdr)));
 288		EMIT(PPC_RAW_MTCTR(_R12));
 289		EMIT(PPC_RAW_BCTRL());
 290	} else {
 291		if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V1)) {
 292			/* func points to the function descriptor */
 293			PPC_LI64(bpf_to_ppc(TMP_REG_2), func);
 294			/* Load actual entry point from function descriptor */
 295			EMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_1), bpf_to_ppc(TMP_REG_2), 0));
 296			/* ... and move it to CTR */
 297			EMIT(PPC_RAW_MTCTR(bpf_to_ppc(TMP_REG_1)));
 298			/*
 299			 * Load TOC from function descriptor at offset 8.
 300			 * We can clobber r2 since we get called through a
 301			 * function pointer (so caller will save/restore r2).
 302			 */
 303			if (is_module_text_address(func_addr))
 304				EMIT(PPC_RAW_LD(_R2, bpf_to_ppc(TMP_REG_2), 8));
 305		} else {
 306			PPC_LI64(_R12, func);
 307			EMIT(PPC_RAW_MTCTR(_R12));
 308		}
 309		EMIT(PPC_RAW_BCTRL());
 310		/*
 311		 * Load r2 with kernel TOC as kernel TOC is used if function address falls
 312		 * within core kernel text.
 313		 */
 314		if (is_module_text_address(func_addr))
 315			EMIT(PPC_RAW_LD(_R2, _R13, offsetof(struct paca_struct, kernel_toc)));
 316	}
 317#endif
 318
 319	return 0;
 320}
 321
 322static int zero_extend(u32 *image, struct codegen_context *ctx, u32 src_reg, u32 dst_reg, u32 size)
 323{
 324	switch (size) {
 325	case 1:
 326		 /* zero-extend 8 bits into 64 bits */
 327		EMIT(PPC_RAW_RLDICL(dst_reg, src_reg, 0, 56));
 328		return 0;
 329	case 2:
 330		 /* zero-extend 16 bits into 64 bits */
 331		EMIT(PPC_RAW_RLDICL(dst_reg, src_reg, 0, 48));
 332		return 0;
 333	case 4:
 334		 /* zero-extend 32 bits into 64 bits */
 335		EMIT(PPC_RAW_RLDICL(dst_reg, src_reg, 0, 32));
 336		fallthrough;
 337	case 8:
 338		/* Nothing to do */
 339		return 0;
 340	default:
 341		return -1;
 342	}
 343}
 344
 345static int sign_extend(u32 *image, struct codegen_context *ctx, u32 src_reg, u32 dst_reg, u32 size)
 346{
 347	switch (size) {
 348	case 1:
 349		 /* sign-extend 8 bits into 64 bits */
 350		EMIT(PPC_RAW_EXTSB(dst_reg, src_reg));
 351		return 0;
 352	case 2:
 353		 /* sign-extend 16 bits into 64 bits */
 354		EMIT(PPC_RAW_EXTSH(dst_reg, src_reg));
 355		return 0;
 356	case 4:
 357		 /* sign-extend 32 bits into 64 bits */
 358		EMIT(PPC_RAW_EXTSW(dst_reg, src_reg));
 359		fallthrough;
 360	case 8:
 361		/* Nothing to do */
 362		return 0;
 363	default:
 364		return -1;
 365	}
 366}
 367
 368/*
 369 * Handle powerpc ABI expectations from caller:
 370 *   - Unsigned arguments are zero-extended.
 371 *   - Signed arguments are sign-extended.
 372 */
 373static int prepare_for_kfunc_call(const struct bpf_prog *fp, u32 *image,
 374				  struct codegen_context *ctx,
 375				  const struct bpf_insn *insn)
 376{
 377	const struct btf_func_model *m = bpf_jit_find_kfunc_model(fp, insn);
 378	int i;
 379
 380	if (!m)
 381		return -1;
 382
 383	for (i = 0; i < m->nr_args; i++) {
 384		/* Note that BPF ABI only allows up to 5 args for kfuncs */
 385		u32 reg = bpf_to_ppc(BPF_REG_1 + i), size = m->arg_size[i];
 386
 387		if (!(m->arg_flags[i] & BTF_FMODEL_SIGNED_ARG)) {
 388			if (zero_extend(image, ctx, reg, reg, size))
 389				return -1;
 390		} else {
 391			if (sign_extend(image, ctx, reg, reg, size))
 392				return -1;
 393		}
 394	}
 395
 396	return 0;
 397}
 398
 399static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out)
 400{
 401	/*
 402	 * By now, the eBPF program has already setup parameters in r3, r4 and r5
 403	 * r3/BPF_REG_1 - pointer to ctx -- passed as is to the next bpf program
 404	 * r4/BPF_REG_2 - pointer to bpf_array
 405	 * r5/BPF_REG_3 - index in bpf_array
 406	 */
 407	int b2p_bpf_array = bpf_to_ppc(BPF_REG_2);
 408	int b2p_index = bpf_to_ppc(BPF_REG_3);
 409	int bpf_tailcall_prologue_size = 12;
 410
 411	if (!IS_ENABLED(CONFIG_PPC_KERNEL_PCREL) && IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2))
 412		bpf_tailcall_prologue_size += 4; /* skip past the toc load */
 413
 414	/*
 415	 * if (index >= array->map.max_entries)
 416	 *   goto out;
 417	 */
 418	EMIT(PPC_RAW_LWZ(bpf_to_ppc(TMP_REG_1), b2p_bpf_array, offsetof(struct bpf_array, map.max_entries)));
 419	EMIT(PPC_RAW_RLWINM(b2p_index, b2p_index, 0, 0, 31));
 420	EMIT(PPC_RAW_CMPLW(b2p_index, bpf_to_ppc(TMP_REG_1)));
 421	PPC_BCC_SHORT(COND_GE, out);
 422
 423	/*
 424	 * if (tail_call_cnt >= MAX_TAIL_CALL_CNT)
 425	 *   goto out;
 426	 */
 427	EMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_1), _R1, bpf_jit_stack_tailcallcnt(ctx)));
 428	EMIT(PPC_RAW_CMPLWI(bpf_to_ppc(TMP_REG_1), MAX_TAIL_CALL_CNT));
 429	PPC_BCC_SHORT(COND_GE, out);
 430
 431	/*
 432	 * tail_call_cnt++;
 433	 * Writeback this updated value only if tailcall succeeds.
 434	 */
 435	EMIT(PPC_RAW_ADDI(bpf_to_ppc(TMP_REG_1), bpf_to_ppc(TMP_REG_1), 1));
 436
 437	/* prog = array->ptrs[index]; */
 438	EMIT(PPC_RAW_MULI(bpf_to_ppc(TMP_REG_2), b2p_index, 8));
 439	EMIT(PPC_RAW_ADD(bpf_to_ppc(TMP_REG_2), bpf_to_ppc(TMP_REG_2), b2p_bpf_array));
 440	EMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_2), bpf_to_ppc(TMP_REG_2),
 441			offsetof(struct bpf_array, ptrs)));
 442
 443	/*
 444	 * if (prog == NULL)
 445	 *   goto out;
 446	 */
 447	EMIT(PPC_RAW_CMPLDI(bpf_to_ppc(TMP_REG_2), 0));
 448	PPC_BCC_SHORT(COND_EQ, out);
 449
 450	/* goto *(prog->bpf_func + prologue_size); */
 451	EMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_2), bpf_to_ppc(TMP_REG_2),
 452			offsetof(struct bpf_prog, bpf_func)));
 453	EMIT(PPC_RAW_ADDI(bpf_to_ppc(TMP_REG_2), bpf_to_ppc(TMP_REG_2),
 454			  FUNCTION_DESCR_SIZE + bpf_tailcall_prologue_size));
 455	EMIT(PPC_RAW_MTCTR(bpf_to_ppc(TMP_REG_2)));
 456
 457	/* Writeback updated tailcall count */
 458	EMIT(PPC_RAW_STD(bpf_to_ppc(TMP_REG_1), _R1, bpf_jit_stack_tailcallcnt(ctx)));
 459
 460	/* tear down stack, restore NVRs, ... */
 461	bpf_jit_emit_common_epilogue(image, ctx);
 462
 463	EMIT(PPC_RAW_BCTR());
 464
 465	/* out: */
 466	return 0;
 467}
 468
 469bool bpf_jit_bypass_spec_v1(void)
 470{
 471#if defined(CONFIG_PPC_E500) || defined(CONFIG_PPC_BOOK3S_64)
 472	return !(security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
 473		 security_ftr_enabled(SEC_FTR_BNDS_CHK_SPEC_BAR));
 474#else
 475	return true;
 476#endif
 477}
 478
 479bool bpf_jit_bypass_spec_v4(void)
 480{
 481	return !(security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
 482		 security_ftr_enabled(SEC_FTR_STF_BARRIER) &&
 483		 stf_barrier_type_get() != STF_BARRIER_NONE);
 484}
 485
 486/*
 487 * We spill into the redzone always, even if the bpf program has its own stackframe.
 488 * Offsets hardcoded based on BPF_PPC_STACK_SAVE -- see bpf_jit_stack_local()
 489 */
 490void bpf_stf_barrier(void);
 491
 492asm (
 493"		.global bpf_stf_barrier		;"
 494"	bpf_stf_barrier:			;"
 495"		std	21,-80(1)		;"
 496"		std	22,-72(1)		;"
 497"		sync				;"
 498"		ld	21,-80(1)		;"
 499"		ld	22,-72(1)		;"
 500"		ori	31,31,0			;"
 501"		.rept 14			;"
 502"		b	1f			;"
 503"	1:					;"
 504"		.endr				;"
 505"		blr				;"
 506);
 507
 508static int bpf_jit_emit_atomic_ops(u32 *image, struct codegen_context *ctx,
 509				   const struct bpf_insn *insn, u32 *jmp_off,
 510				   u32 *tmp_idx, u32 *addrp)
 511{
 512	u32 tmp1_reg = bpf_to_ppc(TMP_REG_1);
 513	u32 tmp2_reg = bpf_to_ppc(TMP_REG_2);
 514	u32 size = BPF_SIZE(insn->code);
 515	u32 src_reg = bpf_to_ppc(insn->src_reg);
 516	u32 dst_reg = bpf_to_ppc(insn->dst_reg);
 517	s32 imm = insn->imm;
 518
 519	u32 save_reg = tmp2_reg;
 520	u32 ret_reg = src_reg;
 521	u32 fixup_idx;
 522
 523	/* Get offset into TMP_REG_1 */
 524	EMIT(PPC_RAW_LI(tmp1_reg, insn->off));
 525       /*
 526	* Enforce full ordering for operations with BPF_FETCH by emitting a 'sync'
 527	* before and after the operation.
 528	*
 529	* This is a requirement in the Linux Kernel Memory Model.
 530	* See __cmpxchg_u64() in asm/cmpxchg.h as an example.
 531	*/
 532	if ((imm & BPF_FETCH) && IS_ENABLED(CONFIG_SMP))
 533		EMIT(PPC_RAW_SYNC());
 534
 535	*tmp_idx = ctx->idx;
 536
 537	/* load value from memory into TMP_REG_2 */
 538	if (size == BPF_DW)
 539		EMIT(PPC_RAW_LDARX(tmp2_reg, tmp1_reg, dst_reg, 0));
 540	else
 541		EMIT(PPC_RAW_LWARX(tmp2_reg, tmp1_reg, dst_reg, 0));
 542	/* Save old value in _R0 */
 543	if (imm & BPF_FETCH)
 544		EMIT(PPC_RAW_MR(_R0, tmp2_reg));
 545
 546	switch (imm) {
 547	case BPF_ADD:
 548	case BPF_ADD | BPF_FETCH:
 549		EMIT(PPC_RAW_ADD(tmp2_reg, tmp2_reg, src_reg));
 550		break;
 551	case BPF_AND:
 552	case BPF_AND | BPF_FETCH:
 553		EMIT(PPC_RAW_AND(tmp2_reg, tmp2_reg, src_reg));
 554		break;
 555	case BPF_OR:
 556	case BPF_OR | BPF_FETCH:
 557		EMIT(PPC_RAW_OR(tmp2_reg, tmp2_reg, src_reg));
 558		break;
 559	case BPF_XOR:
 560	case BPF_XOR | BPF_FETCH:
 561		EMIT(PPC_RAW_XOR(tmp2_reg, tmp2_reg, src_reg));
 562		break;
 563	case BPF_CMPXCHG:
 564	       /*
 565		* Return old value in BPF_REG_0 for BPF_CMPXCHG &
 566		* in src_reg for other cases.
 567		*/
 568		ret_reg = bpf_to_ppc(BPF_REG_0);
 569
 570		/* Compare with old value in BPF_R0 */
 571		if (size == BPF_DW)
 572			EMIT(PPC_RAW_CMPD(bpf_to_ppc(BPF_REG_0), tmp2_reg));
 573		else
 574			EMIT(PPC_RAW_CMPW(bpf_to_ppc(BPF_REG_0), tmp2_reg));
 575		/* Don't set if different from old value */
 576		PPC_BCC_SHORT(COND_NE, (ctx->idx + 3) * 4);
 577		fallthrough;
 578	case BPF_XCHG:
 579		save_reg = src_reg;
 580		break;
 581	default:
 582		return -EOPNOTSUPP;
 583	}
 584
 585	/* store new value */
 586	if (size == BPF_DW)
 587		EMIT(PPC_RAW_STDCX(save_reg, tmp1_reg, dst_reg));
 588	else
 589		EMIT(PPC_RAW_STWCX(save_reg, tmp1_reg, dst_reg));
 590	/* we're done if this succeeded */
 591	PPC_BCC_SHORT(COND_NE, *tmp_idx * 4);
 592	fixup_idx = ctx->idx;
 593
 594	if (imm & BPF_FETCH) {
 595		/* Emit 'sync' to enforce full ordering */
 596		if (IS_ENABLED(CONFIG_SMP))
 597			EMIT(PPC_RAW_SYNC());
 598		EMIT(PPC_RAW_MR(ret_reg, _R0));
 599		/*
 600		 * Skip unnecessary zero-extension for 32-bit cmpxchg.
 601		 * For context, see commit 39491867ace5.
 602		 */
 603		if (size != BPF_DW && imm == BPF_CMPXCHG &&
 604		    insn_is_zext(insn + 1))
 605			*addrp = ctx->idx * 4;
 606	}
 607
 608	*jmp_off = (fixup_idx - *tmp_idx) * 4;
 609
 610	return 0;
 611}
 612
 613static int bpf_jit_emit_probe_mem_store(struct codegen_context *ctx, u32 src_reg, s16 off,
 614					u32 code, u32 *image)
 615{
 616	u32 tmp1_reg = bpf_to_ppc(TMP_REG_1);
 617	u32 tmp2_reg = bpf_to_ppc(TMP_REG_2);
 618
 619	switch (BPF_SIZE(code)) {
 620	case BPF_B:
 621		EMIT(PPC_RAW_STB(src_reg, tmp1_reg, off));
 622		break;
 623	case BPF_H:
 624		EMIT(PPC_RAW_STH(src_reg, tmp1_reg, off));
 625		break;
 626	case BPF_W:
 627		EMIT(PPC_RAW_STW(src_reg, tmp1_reg, off));
 628		break;
 629	case BPF_DW:
 630		if (off % 4) {
 631			EMIT(PPC_RAW_LI(tmp2_reg, off));
 632			EMIT(PPC_RAW_STDX(src_reg, tmp1_reg, tmp2_reg));
 633		} else {
 634			EMIT(PPC_RAW_STD(src_reg, tmp1_reg, off));
 635		}
 636		break;
 637	default:
 638		return -EINVAL;
 639	}
 640	return 0;
 641}
 642
 643static int emit_atomic_ld_st(const struct bpf_insn insn, struct codegen_context *ctx, u32 *image)
 644{
 645	u32 code = insn.code;
 646	u32 dst_reg = bpf_to_ppc(insn.dst_reg);
 647	u32 src_reg = bpf_to_ppc(insn.src_reg);
 648	u32 size = BPF_SIZE(code);
 649	u32 tmp1_reg = bpf_to_ppc(TMP_REG_1);
 650	u32 tmp2_reg = bpf_to_ppc(TMP_REG_2);
 651	s16 off = insn.off;
 652	s32 imm = insn.imm;
 653
 654	switch (imm) {
 655	case BPF_LOAD_ACQ:
 656		switch (size) {
 657		case BPF_B:
 658			EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
 659			break;
 660		case BPF_H:
 661			EMIT(PPC_RAW_LHZ(dst_reg, src_reg, off));
 662			break;
 663		case BPF_W:
 664			EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off));
 665			break;
 666		case BPF_DW:
 667			if (off % 4) {
 668				EMIT(PPC_RAW_LI(tmp1_reg, off));
 669				EMIT(PPC_RAW_LDX(dst_reg, src_reg, tmp1_reg));
 670			} else {
 671				EMIT(PPC_RAW_LD(dst_reg, src_reg, off));
 672			}
 673			break;
 674		}
 675		EMIT(PPC_RAW_LWSYNC());
 676		break;
 677	case BPF_STORE_REL:
 678		EMIT(PPC_RAW_LWSYNC());
 679		switch (size) {
 680		case BPF_B:
 681			EMIT(PPC_RAW_STB(src_reg, dst_reg, off));
 682			break;
 683		case BPF_H:
 684			EMIT(PPC_RAW_STH(src_reg, dst_reg, off));
 685			break;
 686		case BPF_W:
 687			EMIT(PPC_RAW_STW(src_reg, dst_reg, off));
 688			break;
 689		case BPF_DW:
 690			if (off % 4) {
 691				EMIT(PPC_RAW_LI(tmp2_reg, off));
 692				EMIT(PPC_RAW_STDX(src_reg, dst_reg, tmp2_reg));
 693			} else {
 694				EMIT(PPC_RAW_STD(src_reg, dst_reg, off));
 695			}
 696			break;
 697		}
 698		break;
 699	default:
 700		pr_err_ratelimited("unexpected atomic load/store op code %02x\n",
 701				   imm);
 702		return -EINVAL;
 703	}
 704
 705	return 0;
 706}
 707
 708/* Assemble the body code between the prologue & epilogue */
 709int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, u32 *fimage, struct codegen_context *ctx,
 710		       u32 *addrs, int pass, bool extra_pass)
 711{
 712	enum stf_barrier_type stf_barrier = stf_barrier_type_get();
 713	bool sync_emitted, ori31_emitted;
 714	const struct bpf_insn *insn = fp->insnsi;
 715	int flen = fp->len;
 716	int i, ret;
 717
 718	/* Start of epilogue code - will only be valid 2nd pass onwards */
 719	u32 exit_addr = addrs[flen];
 720
 721	for (i = 0; i < flen; i++) {
 722		u32 code = insn[i].code;
 723		u32 dst_reg = bpf_to_ppc(insn[i].dst_reg);
 724		u32 src_reg = bpf_to_ppc(insn[i].src_reg);
 725		u32 size = BPF_SIZE(code);
 726		u32 tmp1_reg = bpf_to_ppc(TMP_REG_1);
 727		u32 tmp2_reg = bpf_to_ppc(TMP_REG_2);
 728		s16 off = insn[i].off;
 729		s32 imm = insn[i].imm;
 730		bool func_addr_fixed;
 731		u64 func_addr;
 732		u64 imm64;
 733		u32 true_cond;
 734		u32 tmp_idx;
 735		u32 jmp_off;
 736
 737		/*
 738		 * addrs[] maps a BPF bytecode address into a real offset from
 739		 * the start of the body code.
 740		 */
 741		addrs[i] = ctx->idx * 4;
 742
 743		/*
 744		 * As an optimization, we note down which non-volatile registers
 745		 * are used so that we can only save/restore those in our
 746		 * prologue and epilogue. We do this here regardless of whether
 747		 * the actual BPF instruction uses src/dst registers or not
 748		 * (for instance, BPF_CALL does not use them). The expectation
 749		 * is that those instructions will have src_reg/dst_reg set to
 750		 * 0. Even otherwise, we just lose some prologue/epilogue
 751		 * optimization but everything else should work without
 752		 * any issues.
 753		 */
 754		if (dst_reg >= BPF_PPC_NVR_MIN && dst_reg < 32)
 755			bpf_set_seen_register(ctx, dst_reg);
 756		if (src_reg >= BPF_PPC_NVR_MIN && src_reg < 32)
 757			bpf_set_seen_register(ctx, src_reg);
 758
 759		switch (code) {
 760		/*
 761		 * Arithmetic operations: ADD/SUB/MUL/DIV/MOD/NEG
 762		 */
 763		case BPF_ALU | BPF_ADD | BPF_X: /* (u32) dst += (u32) src */
 764		case BPF_ALU64 | BPF_ADD | BPF_X: /* dst += src */
 765			EMIT(PPC_RAW_ADD(dst_reg, dst_reg, src_reg));
 766			goto bpf_alu32_trunc;
 767		case BPF_ALU | BPF_SUB | BPF_X: /* (u32) dst -= (u32) src */
 768		case BPF_ALU64 | BPF_SUB | BPF_X: /* dst -= src */
 769			EMIT(PPC_RAW_SUB(dst_reg, dst_reg, src_reg));
 770			goto bpf_alu32_trunc;
 771		case BPF_ALU | BPF_ADD | BPF_K: /* (u32) dst += (u32) imm */
 772		case BPF_ALU64 | BPF_ADD | BPF_K: /* dst += imm */
 773			if (!imm) {
 774				goto bpf_alu32_trunc;
 775			} else if (imm >= -32768 && imm < 32768) {
 776				EMIT(PPC_RAW_ADDI(dst_reg, dst_reg, IMM_L(imm)));
 777			} else {
 778				PPC_LI32(tmp1_reg, imm);
 779				EMIT(PPC_RAW_ADD(dst_reg, dst_reg, tmp1_reg));
 780			}
 781			goto bpf_alu32_trunc;
 782		case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */
 783		case BPF_ALU64 | BPF_SUB | BPF_K: /* dst -= imm */
 784			if (!imm) {
 785				goto bpf_alu32_trunc;
 786			} else if (imm > -32768 && imm <= 32768) {
 787				EMIT(PPC_RAW_ADDI(dst_reg, dst_reg, IMM_L(-imm)));
 788			} else {
 789				PPC_LI32(tmp1_reg, imm);
 790				EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
 791			}
 792			goto bpf_alu32_trunc;
 793		case BPF_ALU | BPF_MUL | BPF_X: /* (u32) dst *= (u32) src */
 794		case BPF_ALU64 | BPF_MUL | BPF_X: /* dst *= src */
 795			if (BPF_CLASS(code) == BPF_ALU)
 796				EMIT(PPC_RAW_MULW(dst_reg, dst_reg, src_reg));
 797			else
 798				EMIT(PPC_RAW_MULD(dst_reg, dst_reg, src_reg));
 799			goto bpf_alu32_trunc;
 800		case BPF_ALU | BPF_MUL | BPF_K: /* (u32) dst *= (u32) imm */
 801		case BPF_ALU64 | BPF_MUL | BPF_K: /* dst *= imm */
 802			if (imm >= -32768 && imm < 32768)
 803				EMIT(PPC_RAW_MULI(dst_reg, dst_reg, IMM_L(imm)));
 804			else {
 805				PPC_LI32(tmp1_reg, imm);
 806				if (BPF_CLASS(code) == BPF_ALU)
 807					EMIT(PPC_RAW_MULW(dst_reg, dst_reg, tmp1_reg));
 808				else
 809					EMIT(PPC_RAW_MULD(dst_reg, dst_reg, tmp1_reg));
 810			}
 811			goto bpf_alu32_trunc;
 812		case BPF_ALU | BPF_DIV | BPF_X: /* (u32) dst /= (u32) src */
 813		case BPF_ALU | BPF_MOD | BPF_X: /* (u32) dst %= (u32) src */
 814			if (BPF_OP(code) == BPF_MOD) {
 815				if (off)
 816					EMIT(PPC_RAW_DIVW(tmp1_reg, dst_reg, src_reg));
 817				else
 818					EMIT(PPC_RAW_DIVWU(tmp1_reg, dst_reg, src_reg));
 819
 820				EMIT(PPC_RAW_MULW(tmp1_reg, src_reg, tmp1_reg));
 821				EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
 822			} else
 823				if (off)
 824					EMIT(PPC_RAW_DIVW(dst_reg, dst_reg, src_reg));
 825				else
 826					EMIT(PPC_RAW_DIVWU(dst_reg, dst_reg, src_reg));
 827			goto bpf_alu32_trunc;
 828		case BPF_ALU64 | BPF_DIV | BPF_X: /* dst /= src */
 829		case BPF_ALU64 | BPF_MOD | BPF_X: /* dst %= src */
 830			if (BPF_OP(code) == BPF_MOD) {
 831				if (off)
 832					EMIT(PPC_RAW_DIVD(tmp1_reg, dst_reg, src_reg));
 833				else
 834					EMIT(PPC_RAW_DIVDU(tmp1_reg, dst_reg, src_reg));
 835				EMIT(PPC_RAW_MULD(tmp1_reg, src_reg, tmp1_reg));
 836				EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
 837			} else
 838				if (off)
 839					EMIT(PPC_RAW_DIVD(dst_reg, dst_reg, src_reg));
 840				else
 841					EMIT(PPC_RAW_DIVDU(dst_reg, dst_reg, src_reg));
 842			break;
 843		case BPF_ALU | BPF_MOD | BPF_K: /* (u32) dst %= (u32) imm */
 844		case BPF_ALU | BPF_DIV | BPF_K: /* (u32) dst /= (u32) imm */
 845		case BPF_ALU64 | BPF_MOD | BPF_K: /* dst %= imm */
 846		case BPF_ALU64 | BPF_DIV | BPF_K: /* dst /= imm */
 847			if (imm == 0)
 848				return -EINVAL;
 849			if (imm == 1) {
 850				if (BPF_OP(code) == BPF_DIV) {
 851					goto bpf_alu32_trunc;
 852				} else {
 853					EMIT(PPC_RAW_LI(dst_reg, 0));
 854					break;
 855				}
 856			}
 857
 858			PPC_LI32(tmp1_reg, imm);
 859			switch (BPF_CLASS(code)) {
 860			case BPF_ALU:
 861				if (BPF_OP(code) == BPF_MOD) {
 862					if (off)
 863						EMIT(PPC_RAW_DIVW(tmp2_reg, dst_reg, tmp1_reg));
 864					else
 865						EMIT(PPC_RAW_DIVWU(tmp2_reg, dst_reg, tmp1_reg));
 866					EMIT(PPC_RAW_MULW(tmp1_reg, tmp1_reg, tmp2_reg));
 867					EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
 868				} else
 869					if (off)
 870						EMIT(PPC_RAW_DIVW(dst_reg, dst_reg, tmp1_reg));
 871					else
 872						EMIT(PPC_RAW_DIVWU(dst_reg, dst_reg, tmp1_reg));
 873				break;
 874			case BPF_ALU64:
 875				if (BPF_OP(code) == BPF_MOD) {
 876					if (off)
 877						EMIT(PPC_RAW_DIVD(tmp2_reg, dst_reg, tmp1_reg));
 878					else
 879						EMIT(PPC_RAW_DIVDU(tmp2_reg, dst_reg, tmp1_reg));
 880					EMIT(PPC_RAW_MULD(tmp1_reg, tmp1_reg, tmp2_reg));
 881					EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
 882				} else
 883					if (off)
 884						EMIT(PPC_RAW_DIVD(dst_reg, dst_reg, tmp1_reg));
 885					else
 886						EMIT(PPC_RAW_DIVDU(dst_reg, dst_reg, tmp1_reg));
 887				break;
 888			}
 889			goto bpf_alu32_trunc;
 890		case BPF_ALU | BPF_NEG: /* (u32) dst = -dst */
 891		case BPF_ALU64 | BPF_NEG: /* dst = -dst */
 892			EMIT(PPC_RAW_NEG(dst_reg, dst_reg));
 893			goto bpf_alu32_trunc;
 894
 895		/*
 896		 * Logical operations: AND/OR/XOR/[A]LSH/[A]RSH
 897		 */
 898		case BPF_ALU | BPF_AND | BPF_X: /* (u32) dst = dst & src */
 899		case BPF_ALU64 | BPF_AND | BPF_X: /* dst = dst & src */
 900			EMIT(PPC_RAW_AND(dst_reg, dst_reg, src_reg));
 901			goto bpf_alu32_trunc;
 902		case BPF_ALU | BPF_AND | BPF_K: /* (u32) dst = dst & imm */
 903		case BPF_ALU64 | BPF_AND | BPF_K: /* dst = dst & imm */
 904			if (!IMM_H(imm))
 905				EMIT(PPC_RAW_ANDI(dst_reg, dst_reg, IMM_L(imm)));
 906			else {
 907				/* Sign-extended */
 908				PPC_LI32(tmp1_reg, imm);
 909				EMIT(PPC_RAW_AND(dst_reg, dst_reg, tmp1_reg));
 910			}
 911			goto bpf_alu32_trunc;
 912		case BPF_ALU | BPF_OR | BPF_X: /* dst = (u32) dst | (u32) src */
 913		case BPF_ALU64 | BPF_OR | BPF_X: /* dst = dst | src */
 914			EMIT(PPC_RAW_OR(dst_reg, dst_reg, src_reg));
 915			goto bpf_alu32_trunc;
 916		case BPF_ALU | BPF_OR | BPF_K:/* dst = (u32) dst | (u32) imm */
 917		case BPF_ALU64 | BPF_OR | BPF_K:/* dst = dst | imm */
 918			if (imm < 0 && BPF_CLASS(code) == BPF_ALU64) {
 919				/* Sign-extended */
 920				PPC_LI32(tmp1_reg, imm);
 921				EMIT(PPC_RAW_OR(dst_reg, dst_reg, tmp1_reg));
 922			} else {
 923				if (IMM_L(imm))
 924					EMIT(PPC_RAW_ORI(dst_reg, dst_reg, IMM_L(imm)));
 925				if (IMM_H(imm))
 926					EMIT(PPC_RAW_ORIS(dst_reg, dst_reg, IMM_H(imm)));
 927			}
 928			goto bpf_alu32_trunc;
 929		case BPF_ALU | BPF_XOR | BPF_X: /* (u32) dst ^= src */
 930		case BPF_ALU64 | BPF_XOR | BPF_X: /* dst ^= src */
 931			EMIT(PPC_RAW_XOR(dst_reg, dst_reg, src_reg));
 932			goto bpf_alu32_trunc;
 933		case BPF_ALU | BPF_XOR | BPF_K: /* (u32) dst ^= (u32) imm */
 934		case BPF_ALU64 | BPF_XOR | BPF_K: /* dst ^= imm */
 935			if (imm < 0 && BPF_CLASS(code) == BPF_ALU64) {
 936				/* Sign-extended */
 937				PPC_LI32(tmp1_reg, imm);
 938				EMIT(PPC_RAW_XOR(dst_reg, dst_reg, tmp1_reg));
 939			} else {
 940				if (IMM_L(imm))
 941					EMIT(PPC_RAW_XORI(dst_reg, dst_reg, IMM_L(imm)));
 942				if (IMM_H(imm))
 943					EMIT(PPC_RAW_XORIS(dst_reg, dst_reg, IMM_H(imm)));
 944			}
 945			goto bpf_alu32_trunc;
 946		case BPF_ALU | BPF_LSH | BPF_X: /* (u32) dst <<= (u32) src */
 947			/* slw clears top 32 bits */
 948			EMIT(PPC_RAW_SLW(dst_reg, dst_reg, src_reg));
 949			/* skip zero extension move, but set address map. */
 950			if (insn_is_zext(&insn[i + 1]))
 951				addrs[++i] = ctx->idx * 4;
 952			break;
 953		case BPF_ALU64 | BPF_LSH | BPF_X: /* dst <<= src; */
 954			EMIT(PPC_RAW_SLD(dst_reg, dst_reg, src_reg));
 955			break;
 956		case BPF_ALU | BPF_LSH | BPF_K: /* (u32) dst <<== (u32) imm */
 957			/* with imm 0, we still need to clear top 32 bits */
 958			EMIT(PPC_RAW_SLWI(dst_reg, dst_reg, imm));
 959			if (insn_is_zext(&insn[i + 1]))
 960				addrs[++i] = ctx->idx * 4;
 961			break;
 962		case BPF_ALU64 | BPF_LSH | BPF_K: /* dst <<== imm */
 963			if (imm != 0)
 964				EMIT(PPC_RAW_SLDI(dst_reg, dst_reg, imm));
 965			break;
 966		case BPF_ALU | BPF_RSH | BPF_X: /* (u32) dst >>= (u32) src */
 967			EMIT(PPC_RAW_SRW(dst_reg, dst_reg, src_reg));
 968			if (insn_is_zext(&insn[i + 1]))
 969				addrs[++i] = ctx->idx * 4;
 970			break;
 971		case BPF_ALU64 | BPF_RSH | BPF_X: /* dst >>= src */
 972			EMIT(PPC_RAW_SRD(dst_reg, dst_reg, src_reg));
 973			break;
 974		case BPF_ALU | BPF_RSH | BPF_K: /* (u32) dst >>= (u32) imm */
 975			EMIT(PPC_RAW_SRWI(dst_reg, dst_reg, imm));
 976			if (insn_is_zext(&insn[i + 1]))
 977				addrs[++i] = ctx->idx * 4;
 978			break;
 979		case BPF_ALU64 | BPF_RSH | BPF_K: /* dst >>= imm */
 980			if (imm != 0)
 981				EMIT(PPC_RAW_SRDI(dst_reg, dst_reg, imm));
 982			break;
 983		case BPF_ALU | BPF_ARSH | BPF_X: /* (s32) dst >>= src */
 984			EMIT(PPC_RAW_SRAW(dst_reg, dst_reg, src_reg));
 985			goto bpf_alu32_trunc;
 986		case BPF_ALU64 | BPF_ARSH | BPF_X: /* (s64) dst >>= src */
 987			EMIT(PPC_RAW_SRAD(dst_reg, dst_reg, src_reg));
 988			break;
 989		case BPF_ALU | BPF_ARSH | BPF_K: /* (s32) dst >>= imm */
 990			EMIT(PPC_RAW_SRAWI(dst_reg, dst_reg, imm));
 991			goto bpf_alu32_trunc;
 992		case BPF_ALU64 | BPF_ARSH | BPF_K: /* (s64) dst >>= imm */
 993			if (imm != 0)
 994				EMIT(PPC_RAW_SRADI(dst_reg, dst_reg, imm));
 995			break;
 996
 997		/*
 998		 * MOV
 999		 */
1000		case BPF_ALU | BPF_MOV | BPF_X: /* (u32) dst = src */
1001		case BPF_ALU64 | BPF_MOV | BPF_X: /* dst = src */
1002
1003			if (insn_is_cast_user(&insn[i])) {
1004				EMIT(PPC_RAW_RLDICL_DOT(tmp1_reg, src_reg, 0, 32));
1005				PPC_LI64(dst_reg, (ctx->user_vm_start & 0xffffffff00000000UL));
1006				PPC_BCC_SHORT(COND_EQ, (ctx->idx + 2) * 4);
1007				EMIT(PPC_RAW_OR(tmp1_reg, dst_reg, tmp1_reg));
1008				EMIT(PPC_RAW_MR(dst_reg, tmp1_reg));
1009				break;
1010			}
1011
1012			if (imm == 1) {
1013				/* special mov32 for zext */
1014				EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0, 0, 31));
1015				break;
1016			}
1017			if (off == 0) {
1018				/* MOV */
1019				if (dst_reg != src_reg)
1020					EMIT(PPC_RAW_MR(dst_reg, src_reg));
1021			} else {
1022				/* MOVSX: dst = (s8,s16,s32)src (off = 8,16,32) */
1023				if (sign_extend(image, ctx, src_reg, dst_reg, off / 8))
1024					return -1;
1025			}
1026			goto bpf_alu32_trunc;
1027		case BPF_ALU | BPF_MOV | BPF_K: /* (u32) dst = imm */
1028		case BPF_ALU64 | BPF_MOV | BPF_K: /* dst = (s64) imm */
1029			PPC_LI32(dst_reg, imm);
1030			if (imm < 0)
1031				goto bpf_alu32_trunc;
1032			else if (insn_is_zext(&insn[i + 1]))
1033				addrs[++i] = ctx->idx * 4;
1034			break;
1035
1036bpf_alu32_trunc:
1037		/* Truncate to 32-bits */
1038		if (BPF_CLASS(code) == BPF_ALU && !fp->aux->verifier_zext)
1039			EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0, 0, 31));
1040		break;
1041
1042		/*
1043		 * BPF_FROM_BE/LE
1044		 */
1045		case BPF_ALU | BPF_END | BPF_FROM_LE:
1046		case BPF_ALU | BPF_END | BPF_FROM_BE:
1047		case BPF_ALU64 | BPF_END | BPF_FROM_LE:
1048#ifdef __BIG_ENDIAN__
1049			if (BPF_SRC(code) == BPF_FROM_BE)
1050				goto emit_clear;
1051#else /* !__BIG_ENDIAN__ */
1052			if (BPF_CLASS(code) == BPF_ALU && BPF_SRC(code) == BPF_FROM_LE)
1053				goto emit_clear;
1054#endif
1055			switch (imm) {
1056			case 16:
1057				/* Rotate 8 bits left & mask with 0x0000ff00 */
1058				EMIT(PPC_RAW_RLWINM(tmp1_reg, dst_reg, 8, 16, 23));
1059				/* Rotate 8 bits right & insert LSB to reg */
1060				EMIT(PPC_RAW_RLWIMI(tmp1_reg, dst_reg, 24, 24, 31));
1061				/* Move result back to dst_reg */
1062				EMIT(PPC_RAW_MR(dst_reg, tmp1_reg));
1063				break;
1064			case 32:
1065				/*
1066				 * Rotate word left by 8 bits:
1067				 * 2 bytes are already in their final position
1068				 * -- byte 2 and 4 (of bytes 1, 2, 3 and 4)
1069				 */
1070				EMIT(PPC_RAW_RLWINM(tmp1_reg, dst_reg, 8, 0, 31));
1071				/* Rotate 24 bits and insert byte 1 */
1072				EMIT(PPC_RAW_RLWIMI(tmp1_reg, dst_reg, 24, 0, 7));
1073				/* Rotate 24 bits and insert byte 3 */
1074				EMIT(PPC_RAW_RLWIMI(tmp1_reg, dst_reg, 24, 16, 23));
1075				EMIT(PPC_RAW_MR(dst_reg, tmp1_reg));
1076				break;
1077			case 64:
1078				/* Store the value to stack and then use byte-reverse loads */
1079				EMIT(PPC_RAW_STD(dst_reg, _R1, bpf_jit_stack_local(ctx)));
1080				EMIT(PPC_RAW_ADDI(tmp1_reg, _R1, bpf_jit_stack_local(ctx)));
1081				if (cpu_has_feature(CPU_FTR_ARCH_206)) {
1082					EMIT(PPC_RAW_LDBRX(dst_reg, 0, tmp1_reg));
1083				} else {
1084					EMIT(PPC_RAW_LWBRX(dst_reg, 0, tmp1_reg));
1085					if (IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN))
1086						EMIT(PPC_RAW_SLDI(dst_reg, dst_reg, 32));
1087					EMIT(PPC_RAW_LI(tmp2_reg, 4));
1088					EMIT(PPC_RAW_LWBRX(tmp2_reg, tmp2_reg, tmp1_reg));
1089					if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
1090						EMIT(PPC_RAW_SLDI(tmp2_reg, tmp2_reg, 32));
1091					EMIT(PPC_RAW_OR(dst_reg, dst_reg, tmp2_reg));
1092				}
1093				break;
1094			}
1095			break;
1096
1097emit_clear:
1098			switch (imm) {
1099			case 16:
1100				/* zero-extend 16 bits into 64 bits */
1101				EMIT(PPC_RAW_RLDICL(dst_reg, dst_reg, 0, 48));
1102				if (insn_is_zext(&insn[i + 1]))
1103					addrs[++i] = ctx->idx * 4;
1104				break;
1105			case 32:
1106				if (!fp->aux->verifier_zext)
1107					/* zero-extend 32 bits into 64 bits */
1108					EMIT(PPC_RAW_RLDICL(dst_reg, dst_reg, 0, 32));
1109				break;
1110			case 64:
1111				/* nop */
1112				break;
1113			}
1114			break;
1115
1116		/*
1117		 * BPF_ST NOSPEC (speculation barrier)
1118		 *
1119		 * The following must act as a barrier against both Spectre v1
1120		 * and v4 if we requested both mitigations. Therefore, also emit
1121		 * 'isync; sync' on E500 or 'ori31' on BOOK3S_64 in addition to
1122		 * the insns needed for a Spectre v4 barrier.
1123		 *
1124		 * If we requested only !bypass_spec_v1 OR only !bypass_spec_v4,
1125		 * we can skip the respective other barrier type as an
1126		 * optimization.
1127		 */
1128		case BPF_ST | BPF_NOSPEC:
1129			sync_emitted = false;
1130			ori31_emitted = false;
1131			if (IS_ENABLED(CONFIG_PPC_E500) &&
1132			    !bpf_jit_bypass_spec_v1()) {
1133				EMIT(PPC_RAW_ISYNC());
1134				EMIT(PPC_RAW_SYNC());
1135				sync_emitted = true;
1136			}
1137			if (!bpf_jit_bypass_spec_v4()) {
1138				switch (stf_barrier) {
1139				case STF_BARRIER_EIEIO:
1140					EMIT(PPC_RAW_EIEIO() | 0x02000000);
1141					break;
1142				case STF_BARRIER_SYNC_ORI:
1143					if (!sync_emitted)
1144						EMIT(PPC_RAW_SYNC());
1145					EMIT(PPC_RAW_LD(tmp1_reg, _R13, 0));
1146					EMIT(PPC_RAW_ORI(_R31, _R31, 0));
1147					ori31_emitted = true;
1148					break;
1149				case STF_BARRIER_FALLBACK:
1150					ctx->seen |= SEEN_FUNC;
1151					PPC_LI64(_R12, dereference_kernel_function_descriptor(bpf_stf_barrier));
1152					EMIT(PPC_RAW_MTCTR(_R12));
1153					EMIT(PPC_RAW_BCTRL());
1154					break;
1155				case STF_BARRIER_NONE:
1156					break;
1157				}
1158			}
1159			if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) &&
1160			    !bpf_jit_bypass_spec_v1() &&
1161			    !ori31_emitted)
1162				EMIT(PPC_RAW_ORI(_R31, _R31, 0));
1163			break;
1164
1165		/*
1166		 * BPF_ST(X)
1167		 */
1168		case BPF_STX | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = src */
1169		case BPF_ST | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = imm */
1170			if (BPF_CLASS(code) == BPF_ST) {
1171				EMIT(PPC_RAW_LI(tmp1_reg, imm));
1172				src_reg = tmp1_reg;
1173			}
1174			EMIT(PPC_RAW_STB(src_reg, dst_reg, off));
1175			break;
1176		case BPF_STX | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = src */
1177		case BPF_ST | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = imm */
1178			if (BPF_CLASS(code) == BPF_ST) {
1179				EMIT(PPC_RAW_LI(tmp1_reg, imm));
1180				src_reg = tmp1_reg;
1181			}
1182			EMIT(PPC_RAW_STH(src_reg, dst_reg, off));
1183			break;
1184		case BPF_STX | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = src */
1185		case BPF_ST | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = imm */
1186			if (BPF_CLASS(code) == BPF_ST) {
1187				PPC_LI32(tmp1_reg, imm);
1188				src_reg = tmp1_reg;
1189			}
1190			EMIT(PPC_RAW_STW(src_reg, dst_reg, off));
1191			break;
1192		case BPF_STX | BPF_MEM | BPF_DW: /* (u64 *)(dst + off) = src */
1193		case BPF_ST | BPF_MEM | BPF_DW: /* *(u64 *)(dst + off) = imm */
1194			if (BPF_CLASS(code) == BPF_ST) {
1195				PPC_LI32(tmp1_reg, imm);
1196				src_reg = tmp1_reg;
1197			}
1198			if (off % 4) {
1199				EMIT(PPC_RAW_LI(tmp2_reg, off));
1200				EMIT(PPC_RAW_STDX(src_reg, dst_reg, tmp2_reg));
1201			} else {
1202				EMIT(PPC_RAW_STD(src_reg, dst_reg, off));
1203			}
1204			break;
1205
1206		case BPF_STX | BPF_PROBE_MEM32 | BPF_B:
1207		case BPF_STX | BPF_PROBE_MEM32 | BPF_H:
1208		case BPF_STX | BPF_PROBE_MEM32 | BPF_W:
1209		case BPF_STX | BPF_PROBE_MEM32 | BPF_DW:
1210
1211			EMIT(PPC_RAW_ADD(tmp1_reg, dst_reg, bpf_to_ppc(ARENA_VM_START)));
1212
1213			ret = bpf_jit_emit_probe_mem_store(ctx, src_reg, off, code, image);
1214			if (ret)
1215				return ret;
1216
1217			ret = bpf_add_extable_entry(fp, image, fimage, pass, ctx,
1218						    ctx->idx - 1, 4, -1, code);
1219			if (ret)
1220				return ret;
1221
1222			break;
1223
1224		case BPF_ST | BPF_PROBE_MEM32 | BPF_B:
1225		case BPF_ST | BPF_PROBE_MEM32 | BPF_H:
1226		case BPF_ST | BPF_PROBE_MEM32 | BPF_W:
1227		case BPF_ST | BPF_PROBE_MEM32 | BPF_DW:
1228
1229			EMIT(PPC_RAW_ADD(tmp1_reg, dst_reg, bpf_to_ppc(ARENA_VM_START)));
1230
1231			if (BPF_SIZE(code) == BPF_W || BPF_SIZE(code) == BPF_DW) {
1232				PPC_LI32(tmp2_reg, imm);
1233				src_reg = tmp2_reg;
1234			} else {
1235				EMIT(PPC_RAW_LI(tmp2_reg, imm));
1236				src_reg = tmp2_reg;
1237			}
1238
1239			ret = bpf_jit_emit_probe_mem_store(ctx, src_reg, off, code, image);
1240			if (ret)
1241				return ret;
1242
1243			ret = bpf_add_extable_entry(fp, image, fimage, pass, ctx,
1244						    ctx->idx - 1, 4, -1, code);
1245			if (ret)
1246				return ret;
1247
1248			break;
1249
1250		/*
1251		 * BPF_STX PROBE_ATOMIC (arena atomic ops)
1252		 */
1253		case BPF_STX | BPF_PROBE_ATOMIC | BPF_W:
1254		case BPF_STX | BPF_PROBE_ATOMIC | BPF_DW:
1255			EMIT(PPC_RAW_ADD(dst_reg, dst_reg, bpf_to_ppc(ARENA_VM_START)));
1256			ret = bpf_jit_emit_atomic_ops(image, ctx, &insn[i],
1257						      &jmp_off, &tmp_idx, &addrs[i + 1]);
1258			if (ret) {
1259				if (ret == -EOPNOTSUPP) {
1260					pr_err_ratelimited(
1261						"eBPF filter atomic op code %02x (@%d) unsupported\n",
1262						code, i);
1263				}
1264				return ret;
1265			}
1266			/* LDARX/LWARX should land here on exception. */
1267			ret = bpf_add_extable_entry(fp, image, fimage, pass, ctx,
1268						    tmp_idx, jmp_off, dst_reg, code);
1269			if (ret)
1270				return ret;
1271
1272			/* Retrieve the dst_reg */
1273			EMIT(PPC_RAW_SUB(dst_reg, dst_reg, bpf_to_ppc(ARENA_VM_START)));
1274			break;
1275
1276		/*
1277		 * BPF_STX ATOMIC (atomic ops)
1278		 */
1279		case BPF_STX | BPF_ATOMIC | BPF_B:
1280		case BPF_STX | BPF_ATOMIC | BPF_H:
1281		case BPF_STX | BPF_ATOMIC | BPF_W:
1282		case BPF_STX | BPF_ATOMIC | BPF_DW:
1283			if (bpf_atomic_is_load_store(&insn[i])) {
1284				ret = emit_atomic_ld_st(insn[i], ctx, image);
1285				if (ret)
1286					return ret;
1287
1288				if (size != BPF_DW && insn_is_zext(&insn[i + 1]))
1289					addrs[++i] = ctx->idx * 4;
1290				break;
1291			} else if (size == BPF_B || size == BPF_H) {
1292				pr_err_ratelimited(
1293					"eBPF filter atomic op code %02x (@%d) unsupported\n",
1294					code, i);
1295				return -EOPNOTSUPP;
1296			}
1297
1298			ret = bpf_jit_emit_atomic_ops(image, ctx, &insn[i],
1299						      &jmp_off, &tmp_idx, &addrs[i + 1]);
1300			if (ret) {
1301				if (ret == -EOPNOTSUPP) {
1302					pr_err_ratelimited(
1303						"eBPF filter atomic op code %02x (@%d) unsupported\n",
1304						code, i);
1305				}
1306				return ret;
1307			}
1308			break;
1309
1310		/*
1311		 * BPF_LDX
1312		 */
1313		/* dst = *(u8 *)(ul) (src + off) */
1314		case BPF_LDX | BPF_MEM | BPF_B:
1315		case BPF_LDX | BPF_MEMSX | BPF_B:
1316		case BPF_LDX | BPF_PROBE_MEM | BPF_B:
1317		case BPF_LDX | BPF_PROBE_MEMSX | BPF_B:
1318		/* dst = *(u16 *)(ul) (src + off) */
1319		case BPF_LDX | BPF_MEM | BPF_H:
1320		case BPF_LDX | BPF_MEMSX | BPF_H:
1321		case BPF_LDX | BPF_PROBE_MEM | BPF_H:
1322		case BPF_LDX | BPF_PROBE_MEMSX | BPF_H:
1323		/* dst = *(u32 *)(ul) (src + off) */
1324		case BPF_LDX | BPF_MEM | BPF_W:
1325		case BPF_LDX | BPF_MEMSX | BPF_W:
1326		case BPF_LDX | BPF_PROBE_MEM | BPF_W:
1327		case BPF_LDX | BPF_PROBE_MEMSX | BPF_W:
1328		/* dst = *(u64 *)(ul) (src + off) */
1329		case BPF_LDX | BPF_MEM | BPF_DW:
1330		case BPF_LDX | BPF_PROBE_MEM | BPF_DW:
1331			/*
1332			 * As PTR_TO_BTF_ID that uses BPF_PROBE_MEM mode could either be a valid
1333			 * kernel pointer or NULL but not a userspace address, execute BPF_PROBE_MEM
1334			 * load only if addr is kernel address (see is_kernel_addr()), otherwise
1335			 * set dst_reg=0 and move on.
1336			 */
1337			if (BPF_MODE(code) == BPF_PROBE_MEM || BPF_MODE(code) == BPF_PROBE_MEMSX) {
1338				EMIT(PPC_RAW_ADDI(tmp1_reg, src_reg, off));
1339				if (IS_ENABLED(CONFIG_PPC_BOOK3E_64))
1340					PPC_LI64(tmp2_reg, 0x8000000000000000ul);
1341				else /* BOOK3S_64 */
1342					PPC_LI64(tmp2_reg, PAGE_OFFSET);
1343				EMIT(PPC_RAW_CMPLD(tmp1_reg, tmp2_reg));
1344				PPC_BCC_SHORT(COND_GT, (ctx->idx + 3) * 4);
1345				EMIT(PPC_RAW_LI(dst_reg, 0));
1346				/*
1347				 * Check if 'off' is word aligned for BPF_DW, because
1348				 * we might generate two instructions.
1349				 */
1350				if ((BPF_SIZE(code) == BPF_DW && (off & 3)) ||
1351				    (BPF_SIZE(code) == BPF_B &&
1352				     BPF_MODE(code) == BPF_PROBE_MEMSX) ||
1353				    (BPF_SIZE(code) == BPF_B && BPF_MODE(code) == BPF_MEMSX))
1354					PPC_JMP((ctx->idx + 3) * 4);
1355				else
1356					PPC_JMP((ctx->idx + 2) * 4);
1357			}
1358
1359			if (BPF_MODE(code) == BPF_MEMSX || BPF_MODE(code) == BPF_PROBE_MEMSX) {
1360				switch (size) {
1361				case BPF_B:
1362					EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
1363					EMIT(PPC_RAW_EXTSB(dst_reg, dst_reg));
1364					break;
1365				case BPF_H:
1366					EMIT(PPC_RAW_LHA(dst_reg, src_reg, off));
1367					break;
1368				case BPF_W:
1369					EMIT(PPC_RAW_LWA(dst_reg, src_reg, off));
1370					break;
1371				}
1372			} else {
1373				switch (size) {
1374				case BPF_B:
1375					EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
1376					break;
1377				case BPF_H:
1378					EMIT(PPC_RAW_LHZ(dst_reg, src_reg, off));
1379					break;
1380				case BPF_W:
1381					EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off));
1382					break;
1383				case BPF_DW:
1384					if (off % 4) {
1385						EMIT(PPC_RAW_LI(tmp1_reg, off));
1386						EMIT(PPC_RAW_LDX(dst_reg, src_reg, tmp1_reg));
1387					} else {
1388						EMIT(PPC_RAW_LD(dst_reg, src_reg, off));
1389					}
1390					break;
1391				}
1392			}
1393
1394			if (size != BPF_DW && insn_is_zext(&insn[i + 1]))
1395				addrs[++i] = ctx->idx * 4;
1396
1397			if (BPF_MODE(code) == BPF_PROBE_MEM) {
1398				ret = bpf_add_extable_entry(fp, image, fimage, pass, ctx,
1399							    ctx->idx - 1, 4, dst_reg, code);
1400				if (ret)
1401					return ret;
1402			}
1403			break;
1404
1405		/* dst = *(u64 *)(ul) (src + ARENA_VM_START + off) */
1406		case BPF_LDX | BPF_PROBE_MEM32 | BPF_B:
1407		case BPF_LDX | BPF_PROBE_MEM32 | BPF_H:
1408		case BPF_LDX | BPF_PROBE_MEM32 | BPF_W:
1409		case BPF_LDX | BPF_PROBE_MEM32 | BPF_DW:
1410
1411			EMIT(PPC_RAW_ADD(tmp1_reg, src_reg, bpf_to_ppc(ARENA_VM_START)));
1412
1413			switch (size) {
1414			case BPF_B:
1415				EMIT(PPC_RAW_LBZ(dst_reg, tmp1_reg, off));
1416				break;
1417			case BPF_H:
1418				EMIT(PPC_RAW_LHZ(dst_reg, tmp1_reg, off));
1419				break;
1420			case BPF_W:
1421				EMIT(PPC_RAW_LWZ(dst_reg, tmp1_reg, off));
1422				break;
1423			case BPF_DW:
1424				if (off % 4) {
1425					EMIT(PPC_RAW_LI(tmp2_reg, off));
1426					EMIT(PPC_RAW_LDX(dst_reg, tmp1_reg, tmp2_reg));
1427				} else {
1428					EMIT(PPC_RAW_LD(dst_reg, tmp1_reg, off));
1429				}
1430				break;
1431			}
1432
1433			if (size != BPF_DW && insn_is_zext(&insn[i + 1]))
1434				addrs[++i] = ctx->idx * 4;
1435
1436			ret = bpf_add_extable_entry(fp, image, fimage, pass, ctx,
1437						    ctx->idx - 1, 4, dst_reg, code);
1438			if (ret)
1439				return ret;
1440			break;
1441
1442		/*
1443		 * Doubleword load
1444		 * 16 byte instruction that uses two 'struct bpf_insn'
1445		 */
1446		case BPF_LD | BPF_IMM | BPF_DW: /* dst = (u64) imm */
1447			imm64 = ((u64)(u32) insn[i].imm) |
1448				    (((u64)(u32) insn[i+1].imm) << 32);
1449			PPC_LI64(dst_reg, imm64);
1450			/* Adjust for two bpf instructions */
1451			addrs[++i] = ctx->idx * 4;
1452			break;
1453
1454		/*
1455		 * Return/Exit
1456		 */
1457		case BPF_JMP | BPF_EXIT:
1458			/*
1459			 * If this isn't the very last instruction, branch to
1460			 * the epilogue. If we _are_ the last instruction,
1461			 * we'll just fall through to the epilogue.
1462			 */
1463			if (i != flen - 1) {
1464				ret = bpf_jit_emit_exit_insn(image, ctx, tmp1_reg, exit_addr);
1465				if (ret)
1466					return ret;
1467			}
1468			/* else fall through to the epilogue */
1469			break;
1470
1471		/*
1472		 * Call kernel helper or bpf function
1473		 */
1474		case BPF_JMP | BPF_CALL:
1475			ctx->seen |= SEEN_FUNC;
1476
1477			ret = bpf_jit_get_func_addr(fp, &insn[i], extra_pass,
1478						    &func_addr, &func_addr_fixed);
1479			if (ret < 0)
1480				return ret;
1481
1482			/* Take care of powerpc ABI requirements before kfunc call */
1483			if (insn[i].src_reg == BPF_PSEUDO_KFUNC_CALL) {
1484				if (prepare_for_kfunc_call(fp, image, ctx, &insn[i]))
1485					return -1;
1486			}
1487
1488			ret = bpf_jit_emit_func_call_rel(image, fimage, ctx, func_addr);
1489			if (ret)
1490				return ret;
1491
1492			/* move return value from r3 to BPF_REG_0 */
1493			EMIT(PPC_RAW_MR(bpf_to_ppc(BPF_REG_0), _R3));
1494			break;
1495
1496		/*
1497		 * Jumps and branches
1498		 */
1499		case BPF_JMP | BPF_JA:
1500			PPC_JMP(addrs[i + 1 + off]);
1501			break;
1502		case BPF_JMP32 | BPF_JA:
1503			PPC_JMP(addrs[i + 1 + imm]);
1504			break;
1505
1506		case BPF_JMP | BPF_JGT | BPF_K:
1507		case BPF_JMP | BPF_JGT | BPF_X:
1508		case BPF_JMP | BPF_JSGT | BPF_K:
1509		case BPF_JMP | BPF_JSGT | BPF_X:
1510		case BPF_JMP32 | BPF_JGT | BPF_K:
1511		case BPF_JMP32 | BPF_JGT | BPF_X:
1512		case BPF_JMP32 | BPF_JSGT | BPF_K:
1513		case BPF_JMP32 | BPF_JSGT | BPF_X:
1514			true_cond = COND_GT;
1515			goto cond_branch;
1516		case BPF_JMP | BPF_JLT | BPF_K:
1517		case BPF_JMP | BPF_JLT | BPF_X:
1518		case BPF_JMP | BPF_JSLT | BPF_K:
1519		case BPF_JMP | BPF_JSLT | BPF_X:
1520		case BPF_JMP32 | BPF_JLT | BPF_K:
1521		case BPF_JMP32 | BPF_JLT | BPF_X:
1522		case BPF_JMP32 | BPF_JSLT | BPF_K:
1523		case BPF_JMP32 | BPF_JSLT | BPF_X:
1524			true_cond = COND_LT;
1525			goto cond_branch;
1526		case BPF_JMP | BPF_JGE | BPF_K:
1527		case BPF_JMP | BPF_JGE | BPF_X:
1528		case BPF_JMP | BPF_JSGE | BPF_K:
1529		case BPF_JMP | BPF_JSGE | BPF_X:
1530		case BPF_JMP32 | BPF_JGE | BPF_K:
1531		case BPF_JMP32 | BPF_JGE | BPF_X:
1532		case BPF_JMP32 | BPF_JSGE | BPF_K:
1533		case BPF_JMP32 | BPF_JSGE | BPF_X:
1534			true_cond = COND_GE;
1535			goto cond_branch;
1536		case BPF_JMP | BPF_JLE | BPF_K:
1537		case BPF_JMP | BPF_JLE | BPF_X:
1538		case BPF_JMP | BPF_JSLE | BPF_K:
1539		case BPF_JMP | BPF_JSLE | BPF_X:
1540		case BPF_JMP32 | BPF_JLE | BPF_K:
1541		case BPF_JMP32 | BPF_JLE | BPF_X:
1542		case BPF_JMP32 | BPF_JSLE | BPF_K:
1543		case BPF_JMP32 | BPF_JSLE | BPF_X:
1544			true_cond = COND_LE;
1545			goto cond_branch;
1546		case BPF_JMP | BPF_JEQ | BPF_K:
1547		case BPF_JMP | BPF_JEQ | BPF_X:
1548		case BPF_JMP32 | BPF_JEQ | BPF_K:
1549		case BPF_JMP32 | BPF_JEQ | BPF_X:
1550			true_cond = COND_EQ;
1551			goto cond_branch;
1552		case BPF_JMP | BPF_JNE | BPF_K:
1553		case BPF_JMP | BPF_JNE | BPF_X:
1554		case BPF_JMP32 | BPF_JNE | BPF_K:
1555		case BPF_JMP32 | BPF_JNE | BPF_X:
1556			true_cond = COND_NE;
1557			goto cond_branch;
1558		case BPF_JMP | BPF_JSET | BPF_K:
1559		case BPF_JMP | BPF_JSET | BPF_X:
1560		case BPF_JMP32 | BPF_JSET | BPF_K:
1561		case BPF_JMP32 | BPF_JSET | BPF_X:
1562			true_cond = COND_NE;
1563			/* Fall through */
1564
1565cond_branch:
1566			switch (code) {
1567			case BPF_JMP | BPF_JGT | BPF_X:
1568			case BPF_JMP | BPF_JLT | BPF_X:
1569			case BPF_JMP | BPF_JGE | BPF_X:
1570			case BPF_JMP | BPF_JLE | BPF_X:
1571			case BPF_JMP | BPF_JEQ | BPF_X:
1572			case BPF_JMP | BPF_JNE | BPF_X:
1573			case BPF_JMP32 | BPF_JGT | BPF_X:
1574			case BPF_JMP32 | BPF_JLT | BPF_X:
1575			case BPF_JMP32 | BPF_JGE | BPF_X:
1576			case BPF_JMP32 | BPF_JLE | BPF_X:
1577			case BPF_JMP32 | BPF_JEQ | BPF_X:
1578			case BPF_JMP32 | BPF_JNE | BPF_X:
1579				/* unsigned comparison */
1580				if (BPF_CLASS(code) == BPF_JMP32)
1581					EMIT(PPC_RAW_CMPLW(dst_reg, src_reg));
1582				else
1583					EMIT(PPC_RAW_CMPLD(dst_reg, src_reg));
1584				break;
1585			case BPF_JMP | BPF_JSGT | BPF_X:
1586			case BPF_JMP | BPF_JSLT | BPF_X:
1587			case BPF_JMP | BPF_JSGE | BPF_X:
1588			case BPF_JMP | BPF_JSLE | BPF_X:
1589			case BPF_JMP32 | BPF_JSGT | BPF_X:
1590			case BPF_JMP32 | BPF_JSLT | BPF_X:
1591			case BPF_JMP32 | BPF_JSGE | BPF_X:
1592			case BPF_JMP32 | BPF_JSLE | BPF_X:
1593				/* signed comparison */
1594				if (BPF_CLASS(code) == BPF_JMP32)
1595					EMIT(PPC_RAW_CMPW(dst_reg, src_reg));
1596				else
1597					EMIT(PPC_RAW_CMPD(dst_reg, src_reg));
1598				break;
1599			case BPF_JMP | BPF_JSET | BPF_X:
1600			case BPF_JMP32 | BPF_JSET | BPF_X:
1601				if (BPF_CLASS(code) == BPF_JMP) {
1602					EMIT(PPC_RAW_AND_DOT(tmp1_reg, dst_reg, src_reg));
1603				} else {
1604					EMIT(PPC_RAW_AND(tmp1_reg, dst_reg, src_reg));
1605					EMIT(PPC_RAW_RLWINM_DOT(tmp1_reg, tmp1_reg, 0, 0, 31));
1606				}
1607				break;
1608			case BPF_JMP | BPF_JNE | BPF_K:
1609			case BPF_JMP | BPF_JEQ | BPF_K:
1610			case BPF_JMP | BPF_JGT | BPF_K:
1611			case BPF_JMP | BPF_JLT | BPF_K:
1612			case BPF_JMP | BPF_JGE | BPF_K:
1613			case BPF_JMP | BPF_JLE | BPF_K:
1614			case BPF_JMP32 | BPF_JNE | BPF_K:
1615			case BPF_JMP32 | BPF_JEQ | BPF_K:
1616			case BPF_JMP32 | BPF_JGT | BPF_K:
1617			case BPF_JMP32 | BPF_JLT | BPF_K:
1618			case BPF_JMP32 | BPF_JGE | BPF_K:
1619			case BPF_JMP32 | BPF_JLE | BPF_K:
1620			{
1621				bool is_jmp32 = BPF_CLASS(code) == BPF_JMP32;
1622
1623				/*
1624				 * Need sign-extended load, so only positive
1625				 * values can be used as imm in cmpldi
1626				 */
1627				if (imm >= 0 && imm < 32768) {
1628					if (is_jmp32)
1629						EMIT(PPC_RAW_CMPLWI(dst_reg, imm));
1630					else
1631						EMIT(PPC_RAW_CMPLDI(dst_reg, imm));
1632				} else {
1633					/* sign-extending load */
1634					PPC_LI32(tmp1_reg, imm);
1635					/* ... but unsigned comparison */
1636					if (is_jmp32)
1637						EMIT(PPC_RAW_CMPLW(dst_reg, tmp1_reg));
1638					else
1639						EMIT(PPC_RAW_CMPLD(dst_reg, tmp1_reg));
1640				}
1641				break;
1642			}
1643			case BPF_JMP | BPF_JSGT | BPF_K:
1644			case BPF_JMP | BPF_JSLT | BPF_K:
1645			case BPF_JMP | BPF_JSGE | BPF_K:
1646			case BPF_JMP | BPF_JSLE | BPF_K:
1647			case BPF_JMP32 | BPF_JSGT | BPF_K:
1648			case BPF_JMP32 | BPF_JSLT | BPF_K:
1649			case BPF_JMP32 | BPF_JSGE | BPF_K:
1650			case BPF_JMP32 | BPF_JSLE | BPF_K:
1651			{
1652				bool is_jmp32 = BPF_CLASS(code) == BPF_JMP32;
1653
1654				/*
1655				 * signed comparison, so any 16-bit value
1656				 * can be used in cmpdi
1657				 */
1658				if (imm >= -32768 && imm < 32768) {
1659					if (is_jmp32)
1660						EMIT(PPC_RAW_CMPWI(dst_reg, imm));
1661					else
1662						EMIT(PPC_RAW_CMPDI(dst_reg, imm));
1663				} else {
1664					PPC_LI32(tmp1_reg, imm);
1665					if (is_jmp32)
1666						EMIT(PPC_RAW_CMPW(dst_reg, tmp1_reg));
1667					else
1668						EMIT(PPC_RAW_CMPD(dst_reg, tmp1_reg));
1669				}
1670				break;
1671			}
1672			case BPF_JMP | BPF_JSET | BPF_K:
1673			case BPF_JMP32 | BPF_JSET | BPF_K:
1674				/* andi does not sign-extend the immediate */
1675				if (imm >= 0 && imm < 32768)
1676					/* PPC_ANDI is _only/always_ dot-form */
1677					EMIT(PPC_RAW_ANDI(tmp1_reg, dst_reg, imm));
1678				else {
1679					PPC_LI32(tmp1_reg, imm);
1680					if (BPF_CLASS(code) == BPF_JMP) {
1681						EMIT(PPC_RAW_AND_DOT(tmp1_reg, dst_reg,
1682								     tmp1_reg));
1683					} else {
1684						EMIT(PPC_RAW_AND(tmp1_reg, dst_reg, tmp1_reg));
1685						EMIT(PPC_RAW_RLWINM_DOT(tmp1_reg, tmp1_reg,
1686									0, 0, 31));
1687					}
1688				}
1689				break;
1690			}
1691			PPC_BCC(true_cond, addrs[i + 1 + off]);
1692			break;
1693
1694		/*
1695		 * Tail call
1696		 */
1697		case BPF_JMP | BPF_TAIL_CALL:
1698			ctx->seen |= SEEN_TAILCALL;
1699			ret = bpf_jit_emit_tail_call(image, ctx, addrs[i + 1]);
1700			if (ret < 0)
1701				return ret;
1702			break;
1703
1704		default:
1705			/*
1706			 * The filter contains something cruel & unusual.
1707			 * We don't handle it, but also there shouldn't be
1708			 * anything missing from our list.
1709			 */
1710			pr_err_ratelimited("eBPF filter opcode %04x (@%d) unsupported\n",
1711					code, i);
1712			return -ENOTSUPP;
1713		}
1714	}
1715
1716	/* Set end-of-body-code address for exit. */
1717	addrs[i] = ctx->idx * 4;
1718
1719	return 0;
1720}
~/ Read-only file preview.