lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202412080923.Hmv6ehSj-lkp@intel.com>
Date: Mon, 9 Dec 2024 12:35:56 +0800
From: kernel test robot <lkp@...el.com>
To: "Mike Rapoport (IBM)" <rppt@...nel.org>
Cc: oe-kbuild-all@...ts.linux.dev, linux-kernel@...r.kernel.org,
	Luis Chamberlain <mcgrof@...nel.org>
Subject: arch/powerpc/net/bpf_jit_comp64.c:903:41: sparse: sparse: cast
 truncates bits from constant value (8000000000000000 becomes 0)

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   7503345ac5f5e82fd9a36d6e6b447c016376403a
commit: 2c9e5d4a008293407836d29d35dfd4353615bd2f bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of
date:   7 months ago
config: powerpc64-randconfig-r113-20241208 (https://download.01.org/0day-ci/archive/20241208/202412080923.Hmv6ehSj-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce: (https://download.01.org/0day-ci/archive/20241208/202412080923.Hmv6ehSj-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412080923.Hmv6ehSj-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
>> arch/powerpc/net/bpf_jit_comp64.c:903:41: sparse: sparse: cast truncates bits from constant value (8000000000000000 becomes 0)
>> arch/powerpc/net/bpf_jit_comp64.c:903:41: sparse: sparse: cast truncates bits from constant value (8000000000000000 becomes 0)
>> arch/powerpc/net/bpf_jit_comp64.c:905:41: sparse: sparse: cast truncates bits from constant value (c000000000000000 becomes 0)
>> arch/powerpc/net/bpf_jit_comp64.c:905:41: sparse: sparse: cast truncates bits from constant value (c000000000000000 becomes 0)

vim +903 arch/powerpc/net/bpf_jit_comp64.c

b7540d62509453 Naveen N. Rao    2021-10-06  362  
156d0e290e969c Naveen N. Rao    2016-06-22  363  /* Assemble the body code between the prologue & epilogue */
90d862f370b6e9 Hari Bathini     2023-10-20  364  int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, u32 *fimage, struct codegen_context *ctx,
85e031154c7c14 Christophe Leroy 2023-02-01  365  		       u32 *addrs, int pass, bool extra_pass)
156d0e290e969c Naveen N. Rao    2016-06-22  366  {
b7540d62509453 Naveen N. Rao    2021-10-06  367  	enum stf_barrier_type stf_barrier = stf_barrier_type_get();
156d0e290e969c Naveen N. Rao    2016-06-22  368  	const struct bpf_insn *insn = fp->insnsi;
156d0e290e969c Naveen N. Rao    2016-06-22  369  	int flen = fp->len;
e2c95a61656d29 Daniel Borkmann  2018-11-26  370  	int i, ret;
156d0e290e969c Naveen N. Rao    2016-06-22  371  
156d0e290e969c Naveen N. Rao    2016-06-22  372  	/* Start of epilogue code - will only be valid 2nd pass onwards */
156d0e290e969c Naveen N. Rao    2016-06-22  373  	u32 exit_addr = addrs[flen];
156d0e290e969c Naveen N. Rao    2016-06-22  374  
156d0e290e969c Naveen N. Rao    2016-06-22  375  	for (i = 0; i < flen; i++) {
156d0e290e969c Naveen N. Rao    2016-06-22  376  		u32 code = insn[i].code;
49c3af43e65fbc Naveen N. Rao    2022-02-14  377  		u32 dst_reg = bpf_to_ppc(insn[i].dst_reg);
49c3af43e65fbc Naveen N. Rao    2022-02-14  378  		u32 src_reg = bpf_to_ppc(insn[i].src_reg);
efa95f031bf38c Hari Bathini     2021-10-12  379  		u32 size = BPF_SIZE(code);
49c3af43e65fbc Naveen N. Rao    2022-02-14  380  		u32 tmp1_reg = bpf_to_ppc(TMP_REG_1);
49c3af43e65fbc Naveen N. Rao    2022-02-14  381  		u32 tmp2_reg = bpf_to_ppc(TMP_REG_2);
1e82dfaa7819f0 Hari Bathini     2022-06-10  382  		u32 save_reg, ret_reg;
156d0e290e969c Naveen N. Rao    2016-06-22  383  		s16 off = insn[i].off;
156d0e290e969c Naveen N. Rao    2016-06-22  384  		s32 imm = insn[i].imm;
e2c95a61656d29 Daniel Borkmann  2018-11-26  385  		bool func_addr_fixed;
e2c95a61656d29 Daniel Borkmann  2018-11-26  386  		u64 func_addr;
156d0e290e969c Naveen N. Rao    2016-06-22  387  		u64 imm64;
156d0e290e969c Naveen N. Rao    2016-06-22  388  		u32 true_cond;
b9c1e60e7bf4e6 Daniel Borkmann  2018-07-19  389  		u32 tmp_idx;
f9320c49993ca3 Naveen N. Rao    2022-01-06  390  		int j;
156d0e290e969c Naveen N. Rao    2016-06-22  391  
156d0e290e969c Naveen N. Rao    2016-06-22  392  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  393  		 * addrs[] maps a BPF bytecode address into a real offset from
156d0e290e969c Naveen N. Rao    2016-06-22  394  		 * the start of the body code.
156d0e290e969c Naveen N. Rao    2016-06-22  395  		 */
156d0e290e969c Naveen N. Rao    2016-06-22  396  		addrs[i] = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  397  
156d0e290e969c Naveen N. Rao    2016-06-22  398  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  399  		 * As an optimization, we note down which non-volatile registers
156d0e290e969c Naveen N. Rao    2016-06-22  400  		 * are used so that we can only save/restore those in our
156d0e290e969c Naveen N. Rao    2016-06-22  401  		 * prologue and epilogue. We do this here regardless of whether
156d0e290e969c Naveen N. Rao    2016-06-22  402  		 * the actual BPF instruction uses src/dst registers or not
156d0e290e969c Naveen N. Rao    2016-06-22  403  		 * (for instance, BPF_CALL does not use them). The expectation
156d0e290e969c Naveen N. Rao    2016-06-22  404  		 * is that those instructions will have src_reg/dst_reg set to
156d0e290e969c Naveen N. Rao    2016-06-22  405  		 * 0. Even otherwise, we just lose some prologue/epilogue
156d0e290e969c Naveen N. Rao    2016-06-22  406  		 * optimization but everything else should work without
156d0e290e969c Naveen N. Rao    2016-06-22  407  		 * any issues.
156d0e290e969c Naveen N. Rao    2016-06-22  408  		 */
7b847f523fe07b Naveen N. Rao    2016-09-24  409  		if (dst_reg >= BPF_PPC_NVR_MIN && dst_reg < 32)
ed573b57e77a78 Christophe Leroy 2021-03-22  410  			bpf_set_seen_register(ctx, dst_reg);
7b847f523fe07b Naveen N. Rao    2016-09-24  411  		if (src_reg >= BPF_PPC_NVR_MIN && src_reg < 32)
ed573b57e77a78 Christophe Leroy 2021-03-22  412  			bpf_set_seen_register(ctx, src_reg);
156d0e290e969c Naveen N. Rao    2016-06-22  413  
156d0e290e969c Naveen N. Rao    2016-06-22  414  		switch (code) {
156d0e290e969c Naveen N. Rao    2016-06-22  415  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  416  		 * Arithmetic operations: ADD/SUB/MUL/DIV/MOD/NEG
156d0e290e969c Naveen N. Rao    2016-06-22  417  		 */
156d0e290e969c Naveen N. Rao    2016-06-22  418  		case BPF_ALU | BPF_ADD | BPF_X: /* (u32) dst += (u32) src */
156d0e290e969c Naveen N. Rao    2016-06-22  419  		case BPF_ALU64 | BPF_ADD | BPF_X: /* dst += src */
0654186510a40e Balamuruhan S    2020-06-24  420  			EMIT(PPC_RAW_ADD(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  421  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  422  		case BPF_ALU | BPF_SUB | BPF_X: /* (u32) dst -= (u32) src */
156d0e290e969c Naveen N. Rao    2016-06-22  423  		case BPF_ALU64 | BPF_SUB | BPF_X: /* dst -= src */
3a181237916310 Balamuruhan S    2020-06-24  424  			EMIT(PPC_RAW_SUB(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  425  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  426  		case BPF_ALU | BPF_ADD | BPF_K: /* (u32) dst += (u32) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  427  		case BPF_ALU64 | BPF_ADD | BPF_K: /* dst += imm */
5855c4c1f415ca Naveen N. Rao    2021-10-06  428  			if (!imm) {
5855c4c1f415ca Naveen N. Rao    2021-10-06  429  				goto bpf_alu32_trunc;
5855c4c1f415ca Naveen N. Rao    2021-10-06  430  			} else if (imm >= -32768 && imm < 32768) {
3a181237916310 Balamuruhan S    2020-06-24  431  				EMIT(PPC_RAW_ADDI(dst_reg, dst_reg, IMM_L(imm)));
5855c4c1f415ca Naveen N. Rao    2021-10-06  432  			} else {
3a3fc9bf103974 Jordan Niethe    2022-02-14  433  				PPC_LI32(tmp1_reg, imm);
3a3fc9bf103974 Jordan Niethe    2022-02-14  434  				EMIT(PPC_RAW_ADD(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  435  			}
5855c4c1f415ca Naveen N. Rao    2021-10-06  436  			goto bpf_alu32_trunc;
5855c4c1f415ca Naveen N. Rao    2021-10-06  437  		case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */
5855c4c1f415ca Naveen N. Rao    2021-10-06  438  		case BPF_ALU64 | BPF_SUB | BPF_K: /* dst -= imm */
5855c4c1f415ca Naveen N. Rao    2021-10-06  439  			if (!imm) {
5855c4c1f415ca Naveen N. Rao    2021-10-06  440  				goto bpf_alu32_trunc;
5855c4c1f415ca Naveen N. Rao    2021-10-06  441  			} else if (imm > -32768 && imm <= 32768) {
5855c4c1f415ca Naveen N. Rao    2021-10-06  442  				EMIT(PPC_RAW_ADDI(dst_reg, dst_reg, IMM_L(-imm)));
5855c4c1f415ca Naveen N. Rao    2021-10-06  443  			} else {
3a3fc9bf103974 Jordan Niethe    2022-02-14  444  				PPC_LI32(tmp1_reg, imm);
3a3fc9bf103974 Jordan Niethe    2022-02-14  445  				EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  446  			}
156d0e290e969c Naveen N. Rao    2016-06-22  447  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  448  		case BPF_ALU | BPF_MUL | BPF_X: /* (u32) dst *= (u32) src */
156d0e290e969c Naveen N. Rao    2016-06-22  449  		case BPF_ALU64 | BPF_MUL | BPF_X: /* dst *= src */
156d0e290e969c Naveen N. Rao    2016-06-22  450  			if (BPF_CLASS(code) == BPF_ALU)
3a181237916310 Balamuruhan S    2020-06-24  451  				EMIT(PPC_RAW_MULW(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  452  			else
3a181237916310 Balamuruhan S    2020-06-24  453  				EMIT(PPC_RAW_MULD(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  454  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  455  		case BPF_ALU | BPF_MUL | BPF_K: /* (u32) dst *= (u32) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  456  		case BPF_ALU64 | BPF_MUL | BPF_K: /* dst *= imm */
156d0e290e969c Naveen N. Rao    2016-06-22  457  			if (imm >= -32768 && imm < 32768)
3a181237916310 Balamuruhan S    2020-06-24  458  				EMIT(PPC_RAW_MULI(dst_reg, dst_reg, IMM_L(imm)));
156d0e290e969c Naveen N. Rao    2016-06-22  459  			else {
3a3fc9bf103974 Jordan Niethe    2022-02-14  460  				PPC_LI32(tmp1_reg, imm);
156d0e290e969c Naveen N. Rao    2016-06-22  461  				if (BPF_CLASS(code) == BPF_ALU)
3a3fc9bf103974 Jordan Niethe    2022-02-14  462  					EMIT(PPC_RAW_MULW(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  463  				else
3a3fc9bf103974 Jordan Niethe    2022-02-14  464  					EMIT(PPC_RAW_MULD(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  465  			}
156d0e290e969c Naveen N. Rao    2016-06-22  466  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  467  		case BPF_ALU | BPF_DIV | BPF_X: /* (u32) dst /= (u32) src */
156d0e290e969c Naveen N. Rao    2016-06-22  468  		case BPF_ALU | BPF_MOD | BPF_X: /* (u32) dst %= (u32) src */
156d0e290e969c Naveen N. Rao    2016-06-22  469  			if (BPF_OP(code) == BPF_MOD) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  470  				EMIT(PPC_RAW_DIVWU(tmp1_reg, dst_reg, src_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  471  				EMIT(PPC_RAW_MULW(tmp1_reg, src_reg, tmp1_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  472  				EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  473  			} else
3a181237916310 Balamuruhan S    2020-06-24  474  				EMIT(PPC_RAW_DIVWU(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  475  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  476  		case BPF_ALU64 | BPF_DIV | BPF_X: /* dst /= src */
156d0e290e969c Naveen N. Rao    2016-06-22  477  		case BPF_ALU64 | BPF_MOD | BPF_X: /* dst %= src */
156d0e290e969c Naveen N. Rao    2016-06-22  478  			if (BPF_OP(code) == BPF_MOD) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  479  				EMIT(PPC_RAW_DIVDU(tmp1_reg, dst_reg, src_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  480  				EMIT(PPC_RAW_MULD(tmp1_reg, src_reg, tmp1_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  481  				EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  482  			} else
3a181237916310 Balamuruhan S    2020-06-24  483  				EMIT(PPC_RAW_DIVDU(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  484  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  485  		case BPF_ALU | BPF_MOD | BPF_K: /* (u32) dst %= (u32) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  486  		case BPF_ALU | BPF_DIV | BPF_K: /* (u32) dst /= (u32) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  487  		case BPF_ALU64 | BPF_MOD | BPF_K: /* dst %= imm */
156d0e290e969c Naveen N. Rao    2016-06-22  488  		case BPF_ALU64 | BPF_DIV | BPF_K: /* dst /= imm */
156d0e290e969c Naveen N. Rao    2016-06-22  489  			if (imm == 0)
156d0e290e969c Naveen N. Rao    2016-06-22  490  				return -EINVAL;
8bbc9d822421d9 Naveen N. Rao    2021-10-06  491  			if (imm == 1) {
8bbc9d822421d9 Naveen N. Rao    2021-10-06  492  				if (BPF_OP(code) == BPF_DIV) {
156d0e290e969c Naveen N. Rao    2016-06-22  493  					goto bpf_alu32_trunc;
8bbc9d822421d9 Naveen N. Rao    2021-10-06  494  				} else {
8bbc9d822421d9 Naveen N. Rao    2021-10-06  495  					EMIT(PPC_RAW_LI(dst_reg, 0));
8bbc9d822421d9 Naveen N. Rao    2021-10-06  496  					break;
8bbc9d822421d9 Naveen N. Rao    2021-10-06  497  				}
8bbc9d822421d9 Naveen N. Rao    2021-10-06  498  			}
156d0e290e969c Naveen N. Rao    2016-06-22  499  
3a3fc9bf103974 Jordan Niethe    2022-02-14  500  			PPC_LI32(tmp1_reg, imm);
156d0e290e969c Naveen N. Rao    2016-06-22  501  			switch (BPF_CLASS(code)) {
156d0e290e969c Naveen N. Rao    2016-06-22  502  			case BPF_ALU:
156d0e290e969c Naveen N. Rao    2016-06-22  503  				if (BPF_OP(code) == BPF_MOD) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  504  					EMIT(PPC_RAW_DIVWU(tmp2_reg, dst_reg, tmp1_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  505  					EMIT(PPC_RAW_MULW(tmp1_reg, tmp1_reg, tmp2_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  506  					EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  507  				} else
3a3fc9bf103974 Jordan Niethe    2022-02-14  508  					EMIT(PPC_RAW_DIVWU(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  509  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  510  			case BPF_ALU64:
156d0e290e969c Naveen N. Rao    2016-06-22  511  				if (BPF_OP(code) == BPF_MOD) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  512  					EMIT(PPC_RAW_DIVDU(tmp2_reg, dst_reg, tmp1_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  513  					EMIT(PPC_RAW_MULD(tmp1_reg, tmp1_reg, tmp2_reg));
3a3fc9bf103974 Jordan Niethe    2022-02-14  514  					EMIT(PPC_RAW_SUB(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  515  				} else
3a3fc9bf103974 Jordan Niethe    2022-02-14  516  					EMIT(PPC_RAW_DIVDU(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  517  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  518  			}
156d0e290e969c Naveen N. Rao    2016-06-22  519  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  520  		case BPF_ALU | BPF_NEG: /* (u32) dst = -dst */
156d0e290e969c Naveen N. Rao    2016-06-22  521  		case BPF_ALU64 | BPF_NEG: /* dst = -dst */
3a181237916310 Balamuruhan S    2020-06-24  522  			EMIT(PPC_RAW_NEG(dst_reg, dst_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  523  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  524  
156d0e290e969c Naveen N. Rao    2016-06-22  525  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  526  		 * Logical operations: AND/OR/XOR/[A]LSH/[A]RSH
156d0e290e969c Naveen N. Rao    2016-06-22  527  		 */
156d0e290e969c Naveen N. Rao    2016-06-22  528  		case BPF_ALU | BPF_AND | BPF_X: /* (u32) dst = dst & src */
156d0e290e969c Naveen N. Rao    2016-06-22  529  		case BPF_ALU64 | BPF_AND | BPF_X: /* dst = dst & src */
3a181237916310 Balamuruhan S    2020-06-24  530  			EMIT(PPC_RAW_AND(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  531  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  532  		case BPF_ALU | BPF_AND | BPF_K: /* (u32) dst = dst & imm */
156d0e290e969c Naveen N. Rao    2016-06-22  533  		case BPF_ALU64 | BPF_AND | BPF_K: /* dst = dst & imm */
156d0e290e969c Naveen N. Rao    2016-06-22  534  			if (!IMM_H(imm))
3a181237916310 Balamuruhan S    2020-06-24  535  				EMIT(PPC_RAW_ANDI(dst_reg, dst_reg, IMM_L(imm)));
156d0e290e969c Naveen N. Rao    2016-06-22  536  			else {
156d0e290e969c Naveen N. Rao    2016-06-22  537  				/* Sign-extended */
3a3fc9bf103974 Jordan Niethe    2022-02-14  538  				PPC_LI32(tmp1_reg, imm);
3a3fc9bf103974 Jordan Niethe    2022-02-14  539  				EMIT(PPC_RAW_AND(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  540  			}
156d0e290e969c Naveen N. Rao    2016-06-22  541  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  542  		case BPF_ALU | BPF_OR | BPF_X: /* dst = (u32) dst | (u32) src */
156d0e290e969c Naveen N. Rao    2016-06-22  543  		case BPF_ALU64 | BPF_OR | BPF_X: /* dst = dst | src */
3a181237916310 Balamuruhan S    2020-06-24  544  			EMIT(PPC_RAW_OR(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  545  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  546  		case BPF_ALU | BPF_OR | BPF_K:/* dst = (u32) dst | (u32) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  547  		case BPF_ALU64 | BPF_OR | BPF_K:/* dst = dst | imm */
156d0e290e969c Naveen N. Rao    2016-06-22  548  			if (imm < 0 && BPF_CLASS(code) == BPF_ALU64) {
156d0e290e969c Naveen N. Rao    2016-06-22  549  				/* Sign-extended */
3a3fc9bf103974 Jordan Niethe    2022-02-14  550  				PPC_LI32(tmp1_reg, imm);
3a3fc9bf103974 Jordan Niethe    2022-02-14  551  				EMIT(PPC_RAW_OR(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  552  			} else {
156d0e290e969c Naveen N. Rao    2016-06-22  553  				if (IMM_L(imm))
3a181237916310 Balamuruhan S    2020-06-24  554  					EMIT(PPC_RAW_ORI(dst_reg, dst_reg, IMM_L(imm)));
156d0e290e969c Naveen N. Rao    2016-06-22  555  				if (IMM_H(imm))
3a181237916310 Balamuruhan S    2020-06-24  556  					EMIT(PPC_RAW_ORIS(dst_reg, dst_reg, IMM_H(imm)));
156d0e290e969c Naveen N. Rao    2016-06-22  557  			}
156d0e290e969c Naveen N. Rao    2016-06-22  558  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  559  		case BPF_ALU | BPF_XOR | BPF_X: /* (u32) dst ^= src */
156d0e290e969c Naveen N. Rao    2016-06-22  560  		case BPF_ALU64 | BPF_XOR | BPF_X: /* dst ^= src */
3a181237916310 Balamuruhan S    2020-06-24  561  			EMIT(PPC_RAW_XOR(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  562  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  563  		case BPF_ALU | BPF_XOR | BPF_K: /* (u32) dst ^= (u32) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  564  		case BPF_ALU64 | BPF_XOR | BPF_K: /* dst ^= imm */
156d0e290e969c Naveen N. Rao    2016-06-22  565  			if (imm < 0 && BPF_CLASS(code) == BPF_ALU64) {
156d0e290e969c Naveen N. Rao    2016-06-22  566  				/* Sign-extended */
3a3fc9bf103974 Jordan Niethe    2022-02-14  567  				PPC_LI32(tmp1_reg, imm);
3a3fc9bf103974 Jordan Niethe    2022-02-14  568  				EMIT(PPC_RAW_XOR(dst_reg, dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  569  			} else {
156d0e290e969c Naveen N. Rao    2016-06-22  570  				if (IMM_L(imm))
3a181237916310 Balamuruhan S    2020-06-24  571  					EMIT(PPC_RAW_XORI(dst_reg, dst_reg, IMM_L(imm)));
156d0e290e969c Naveen N. Rao    2016-06-22  572  				if (IMM_H(imm))
3a181237916310 Balamuruhan S    2020-06-24  573  					EMIT(PPC_RAW_XORIS(dst_reg, dst_reg, IMM_H(imm)));
156d0e290e969c Naveen N. Rao    2016-06-22  574  			}
156d0e290e969c Naveen N. Rao    2016-06-22  575  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  576  		case BPF_ALU | BPF_LSH | BPF_X: /* (u32) dst <<= (u32) src */
156d0e290e969c Naveen N. Rao    2016-06-22  577  			/* slw clears top 32 bits */
3a181237916310 Balamuruhan S    2020-06-24  578  			EMIT(PPC_RAW_SLW(dst_reg, dst_reg, src_reg));
a4c927733e74bb Jiong Wang       2019-05-24  579  			/* skip zero extension move, but set address map. */
a4c927733e74bb Jiong Wang       2019-05-24  580  			if (insn_is_zext(&insn[i + 1]))
a4c927733e74bb Jiong Wang       2019-05-24  581  				addrs[++i] = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  582  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  583  		case BPF_ALU64 | BPF_LSH | BPF_X: /* dst <<= src; */
3a181237916310 Balamuruhan S    2020-06-24  584  			EMIT(PPC_RAW_SLD(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  585  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  586  		case BPF_ALU | BPF_LSH | BPF_K: /* (u32) dst <<== (u32) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  587  			/* with imm 0, we still need to clear top 32 bits */
3a181237916310 Balamuruhan S    2020-06-24  588  			EMIT(PPC_RAW_SLWI(dst_reg, dst_reg, imm));
a4c927733e74bb Jiong Wang       2019-05-24  589  			if (insn_is_zext(&insn[i + 1]))
a4c927733e74bb Jiong Wang       2019-05-24  590  				addrs[++i] = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  591  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  592  		case BPF_ALU64 | BPF_LSH | BPF_K: /* dst <<== imm */
156d0e290e969c Naveen N. Rao    2016-06-22  593  			if (imm != 0)
3a181237916310 Balamuruhan S    2020-06-24  594  				EMIT(PPC_RAW_SLDI(dst_reg, dst_reg, imm));
156d0e290e969c Naveen N. Rao    2016-06-22  595  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  596  		case BPF_ALU | BPF_RSH | BPF_X: /* (u32) dst >>= (u32) src */
3a181237916310 Balamuruhan S    2020-06-24  597  			EMIT(PPC_RAW_SRW(dst_reg, dst_reg, src_reg));
a4c927733e74bb Jiong Wang       2019-05-24  598  			if (insn_is_zext(&insn[i + 1]))
a4c927733e74bb Jiong Wang       2019-05-24  599  				addrs[++i] = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  600  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  601  		case BPF_ALU64 | BPF_RSH | BPF_X: /* dst >>= src */
3a181237916310 Balamuruhan S    2020-06-24  602  			EMIT(PPC_RAW_SRD(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  603  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  604  		case BPF_ALU | BPF_RSH | BPF_K: /* (u32) dst >>= (u32) imm */
3a181237916310 Balamuruhan S    2020-06-24  605  			EMIT(PPC_RAW_SRWI(dst_reg, dst_reg, imm));
a4c927733e74bb Jiong Wang       2019-05-24  606  			if (insn_is_zext(&insn[i + 1]))
a4c927733e74bb Jiong Wang       2019-05-24  607  				addrs[++i] = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  608  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  609  		case BPF_ALU64 | BPF_RSH | BPF_K: /* dst >>= imm */
156d0e290e969c Naveen N. Rao    2016-06-22  610  			if (imm != 0)
3a181237916310 Balamuruhan S    2020-06-24  611  				EMIT(PPC_RAW_SRDI(dst_reg, dst_reg, imm));
156d0e290e969c Naveen N. Rao    2016-06-22  612  			break;
44cf43c04bb5f7 Jiong Wang       2018-12-05  613  		case BPF_ALU | BPF_ARSH | BPF_X: /* (s32) dst >>= src */
3a181237916310 Balamuruhan S    2020-06-24  614  			EMIT(PPC_RAW_SRAW(dst_reg, dst_reg, src_reg));
44cf43c04bb5f7 Jiong Wang       2018-12-05  615  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  616  		case BPF_ALU64 | BPF_ARSH | BPF_X: /* (s64) dst >>= src */
3a181237916310 Balamuruhan S    2020-06-24  617  			EMIT(PPC_RAW_SRAD(dst_reg, dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  618  			break;
44cf43c04bb5f7 Jiong Wang       2018-12-05  619  		case BPF_ALU | BPF_ARSH | BPF_K: /* (s32) dst >>= imm */
3a181237916310 Balamuruhan S    2020-06-24  620  			EMIT(PPC_RAW_SRAWI(dst_reg, dst_reg, imm));
44cf43c04bb5f7 Jiong Wang       2018-12-05  621  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  622  		case BPF_ALU64 | BPF_ARSH | BPF_K: /* (s64) dst >>= imm */
156d0e290e969c Naveen N. Rao    2016-06-22  623  			if (imm != 0)
3a181237916310 Balamuruhan S    2020-06-24  624  				EMIT(PPC_RAW_SRADI(dst_reg, dst_reg, imm));
156d0e290e969c Naveen N. Rao    2016-06-22  625  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  626  
156d0e290e969c Naveen N. Rao    2016-06-22  627  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  628  		 * MOV
156d0e290e969c Naveen N. Rao    2016-06-22  629  		 */
156d0e290e969c Naveen N. Rao    2016-06-22  630  		case BPF_ALU | BPF_MOV | BPF_X: /* (u32) dst = src */
156d0e290e969c Naveen N. Rao    2016-06-22  631  		case BPF_ALU64 | BPF_MOV | BPF_X: /* dst = src */
a4c927733e74bb Jiong Wang       2019-05-24  632  			if (imm == 1) {
a4c927733e74bb Jiong Wang       2019-05-24  633  				/* special mov32 for zext */
3a181237916310 Balamuruhan S    2020-06-24  634  				EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0, 0, 31));
a4c927733e74bb Jiong Wang       2019-05-24  635  				break;
a4c927733e74bb Jiong Wang       2019-05-24  636  			}
3a181237916310 Balamuruhan S    2020-06-24  637  			EMIT(PPC_RAW_MR(dst_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  638  			goto bpf_alu32_trunc;
156d0e290e969c Naveen N. Rao    2016-06-22  639  		case BPF_ALU | BPF_MOV | BPF_K: /* (u32) dst = imm */
156d0e290e969c Naveen N. Rao    2016-06-22  640  		case BPF_ALU64 | BPF_MOV | BPF_K: /* dst = (s64) imm */
156d0e290e969c Naveen N. Rao    2016-06-22  641  			PPC_LI32(dst_reg, imm);
156d0e290e969c Naveen N. Rao    2016-06-22  642  			if (imm < 0)
156d0e290e969c Naveen N. Rao    2016-06-22  643  				goto bpf_alu32_trunc;
a4c927733e74bb Jiong Wang       2019-05-24  644  			else if (insn_is_zext(&insn[i + 1]))
a4c927733e74bb Jiong Wang       2019-05-24  645  				addrs[++i] = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  646  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  647  
156d0e290e969c Naveen N. Rao    2016-06-22  648  bpf_alu32_trunc:
156d0e290e969c Naveen N. Rao    2016-06-22  649  		/* Truncate to 32-bits */
a4c927733e74bb Jiong Wang       2019-05-24  650  		if (BPF_CLASS(code) == BPF_ALU && !fp->aux->verifier_zext)
3a181237916310 Balamuruhan S    2020-06-24  651  			EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0, 0, 31));
156d0e290e969c Naveen N. Rao    2016-06-22  652  		break;
156d0e290e969c Naveen N. Rao    2016-06-22  653  
156d0e290e969c Naveen N. Rao    2016-06-22  654  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  655  		 * BPF_FROM_BE/LE
156d0e290e969c Naveen N. Rao    2016-06-22  656  		 */
156d0e290e969c Naveen N. Rao    2016-06-22  657  		case BPF_ALU | BPF_END | BPF_FROM_LE:
156d0e290e969c Naveen N. Rao    2016-06-22  658  		case BPF_ALU | BPF_END | BPF_FROM_BE:
156d0e290e969c Naveen N. Rao    2016-06-22  659  #ifdef __BIG_ENDIAN__
156d0e290e969c Naveen N. Rao    2016-06-22  660  			if (BPF_SRC(code) == BPF_FROM_BE)
156d0e290e969c Naveen N. Rao    2016-06-22  661  				goto emit_clear;
156d0e290e969c Naveen N. Rao    2016-06-22  662  #else /* !__BIG_ENDIAN__ */
156d0e290e969c Naveen N. Rao    2016-06-22  663  			if (BPF_SRC(code) == BPF_FROM_LE)
156d0e290e969c Naveen N. Rao    2016-06-22  664  				goto emit_clear;
156d0e290e969c Naveen N. Rao    2016-06-22  665  #endif
156d0e290e969c Naveen N. Rao    2016-06-22  666  			switch (imm) {
156d0e290e969c Naveen N. Rao    2016-06-22  667  			case 16:
156d0e290e969c Naveen N. Rao    2016-06-22  668  				/* Rotate 8 bits left & mask with 0x0000ff00 */
3a3fc9bf103974 Jordan Niethe    2022-02-14  669  				EMIT(PPC_RAW_RLWINM(tmp1_reg, dst_reg, 8, 16, 23));
156d0e290e969c Naveen N. Rao    2016-06-22  670  				/* Rotate 8 bits right & insert LSB to reg */
3a3fc9bf103974 Jordan Niethe    2022-02-14  671  				EMIT(PPC_RAW_RLWIMI(tmp1_reg, dst_reg, 24, 24, 31));
156d0e290e969c Naveen N. Rao    2016-06-22  672  				/* Move result back to dst_reg */
3a3fc9bf103974 Jordan Niethe    2022-02-14  673  				EMIT(PPC_RAW_MR(dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  674  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  675  			case 32:
156d0e290e969c Naveen N. Rao    2016-06-22  676  				/*
156d0e290e969c Naveen N. Rao    2016-06-22  677  				 * Rotate word left by 8 bits:
156d0e290e969c Naveen N. Rao    2016-06-22  678  				 * 2 bytes are already in their final position
156d0e290e969c Naveen N. Rao    2016-06-22  679  				 * -- byte 2 and 4 (of bytes 1, 2, 3 and 4)
156d0e290e969c Naveen N. Rao    2016-06-22  680  				 */
3a3fc9bf103974 Jordan Niethe    2022-02-14  681  				EMIT(PPC_RAW_RLWINM(tmp1_reg, dst_reg, 8, 0, 31));
156d0e290e969c Naveen N. Rao    2016-06-22  682  				/* Rotate 24 bits and insert byte 1 */
3a3fc9bf103974 Jordan Niethe    2022-02-14  683  				EMIT(PPC_RAW_RLWIMI(tmp1_reg, dst_reg, 24, 0, 7));
156d0e290e969c Naveen N. Rao    2016-06-22  684  				/* Rotate 24 bits and insert byte 3 */
3a3fc9bf103974 Jordan Niethe    2022-02-14  685  				EMIT(PPC_RAW_RLWIMI(tmp1_reg, dst_reg, 24, 16, 23));
3a3fc9bf103974 Jordan Niethe    2022-02-14  686  				EMIT(PPC_RAW_MR(dst_reg, tmp1_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  687  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  688  			case 64:
3f5f766d5f7f95 Naveen N. Rao    2022-01-06  689  				/* Store the value to stack and then use byte-reverse loads */
036d559c0bdea7 Naveen N. Rao    2022-02-14  690  				EMIT(PPC_RAW_STD(dst_reg, _R1, bpf_jit_stack_local(ctx)));
3a3fc9bf103974 Jordan Niethe    2022-02-14  691  				EMIT(PPC_RAW_ADDI(tmp1_reg, _R1, bpf_jit_stack_local(ctx)));
3f5f766d5f7f95 Naveen N. Rao    2022-01-06  692  				if (cpu_has_feature(CPU_FTR_ARCH_206)) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  693  					EMIT(PPC_RAW_LDBRX(dst_reg, 0, tmp1_reg));
3f5f766d5f7f95 Naveen N. Rao    2022-01-06  694  				} else {
3a3fc9bf103974 Jordan Niethe    2022-02-14  695  					EMIT(PPC_RAW_LWBRX(dst_reg, 0, tmp1_reg));
3f5f766d5f7f95 Naveen N. Rao    2022-01-06  696  					if (IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN))
3f5f766d5f7f95 Naveen N. Rao    2022-01-06  697  						EMIT(PPC_RAW_SLDI(dst_reg, dst_reg, 32));
3a3fc9bf103974 Jordan Niethe    2022-02-14  698  					EMIT(PPC_RAW_LI(tmp2_reg, 4));
3a3fc9bf103974 Jordan Niethe    2022-02-14  699  					EMIT(PPC_RAW_LWBRX(tmp2_reg, tmp2_reg, tmp1_reg));
3f5f766d5f7f95 Naveen N. Rao    2022-01-06  700  					if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
3a3fc9bf103974 Jordan Niethe    2022-02-14  701  						EMIT(PPC_RAW_SLDI(tmp2_reg, tmp2_reg, 32));
3a3fc9bf103974 Jordan Niethe    2022-02-14  702  					EMIT(PPC_RAW_OR(dst_reg, dst_reg, tmp2_reg));
3f5f766d5f7f95 Naveen N. Rao    2022-01-06  703  				}
156d0e290e969c Naveen N. Rao    2016-06-22  704  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  705  			}
156d0e290e969c Naveen N. Rao    2016-06-22  706  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  707  
156d0e290e969c Naveen N. Rao    2016-06-22  708  emit_clear:
156d0e290e969c Naveen N. Rao    2016-06-22  709  			switch (imm) {
156d0e290e969c Naveen N. Rao    2016-06-22  710  			case 16:
156d0e290e969c Naveen N. Rao    2016-06-22  711  				/* zero-extend 16 bits into 64 bits */
3a181237916310 Balamuruhan S    2020-06-24  712  				EMIT(PPC_RAW_RLDICL(dst_reg, dst_reg, 0, 48));
a4c927733e74bb Jiong Wang       2019-05-24  713  				if (insn_is_zext(&insn[i + 1]))
a4c927733e74bb Jiong Wang       2019-05-24  714  					addrs[++i] = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  715  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  716  			case 32:
a4c927733e74bb Jiong Wang       2019-05-24  717  				if (!fp->aux->verifier_zext)
156d0e290e969c Naveen N. Rao    2016-06-22  718  					/* zero-extend 32 bits into 64 bits */
3a181237916310 Balamuruhan S    2020-06-24  719  					EMIT(PPC_RAW_RLDICL(dst_reg, dst_reg, 0, 32));
156d0e290e969c Naveen N. Rao    2016-06-22  720  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  721  			case 64:
156d0e290e969c Naveen N. Rao    2016-06-22  722  				/* nop */
156d0e290e969c Naveen N. Rao    2016-06-22  723  				break;
156d0e290e969c Naveen N. Rao    2016-06-22  724  			}
156d0e290e969c Naveen N. Rao    2016-06-22  725  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  726  
f5e81d11175015 Daniel Borkmann  2021-07-13  727  		/*
f5e81d11175015 Daniel Borkmann  2021-07-13  728  		 * BPF_ST NOSPEC (speculation barrier)
f5e81d11175015 Daniel Borkmann  2021-07-13  729  		 */
f5e81d11175015 Daniel Borkmann  2021-07-13  730  		case BPF_ST | BPF_NOSPEC:
b7540d62509453 Naveen N. Rao    2021-10-06  731  			if (!security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) ||
b7540d62509453 Naveen N. Rao    2021-10-06  732  					!security_ftr_enabled(SEC_FTR_STF_BARRIER))
b7540d62509453 Naveen N. Rao    2021-10-06  733  				break;
b7540d62509453 Naveen N. Rao    2021-10-06  734  
b7540d62509453 Naveen N. Rao    2021-10-06  735  			switch (stf_barrier) {
b7540d62509453 Naveen N. Rao    2021-10-06  736  			case STF_BARRIER_EIEIO:
b7540d62509453 Naveen N. Rao    2021-10-06  737  				EMIT(PPC_RAW_EIEIO() | 0x02000000);
b7540d62509453 Naveen N. Rao    2021-10-06  738  				break;
b7540d62509453 Naveen N. Rao    2021-10-06  739  			case STF_BARRIER_SYNC_ORI:
b7540d62509453 Naveen N. Rao    2021-10-06  740  				EMIT(PPC_RAW_SYNC());
3a3fc9bf103974 Jordan Niethe    2022-02-14  741  				EMIT(PPC_RAW_LD(tmp1_reg, _R13, 0));
b7540d62509453 Naveen N. Rao    2021-10-06  742  				EMIT(PPC_RAW_ORI(_R31, _R31, 0));
b7540d62509453 Naveen N. Rao    2021-10-06  743  				break;
b7540d62509453 Naveen N. Rao    2021-10-06  744  			case STF_BARRIER_FALLBACK:
c2067f7f88830c Naveen N. Rao    2022-02-14  745  				ctx->seen |= SEEN_FUNC;
036d559c0bdea7 Naveen N. Rao    2022-02-14  746  				PPC_LI64(_R12, dereference_kernel_function_descriptor(bpf_stf_barrier));
036d559c0bdea7 Naveen N. Rao    2022-02-14  747  				EMIT(PPC_RAW_MTCTR(_R12));
b7540d62509453 Naveen N. Rao    2021-10-06  748  				EMIT(PPC_RAW_BCTRL());
b7540d62509453 Naveen N. Rao    2021-10-06  749  				break;
b7540d62509453 Naveen N. Rao    2021-10-06  750  			case STF_BARRIER_NONE:
b7540d62509453 Naveen N. Rao    2021-10-06  751  				break;
b7540d62509453 Naveen N. Rao    2021-10-06  752  			}
f5e81d11175015 Daniel Borkmann  2021-07-13  753  			break;
f5e81d11175015 Daniel Borkmann  2021-07-13  754  
156d0e290e969c Naveen N. Rao    2016-06-22  755  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  756  		 * BPF_ST(X)
156d0e290e969c Naveen N. Rao    2016-06-22  757  		 */
156d0e290e969c Naveen N. Rao    2016-06-22  758  		case BPF_STX | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = src */
156d0e290e969c Naveen N. Rao    2016-06-22  759  		case BPF_ST | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = imm */
156d0e290e969c Naveen N. Rao    2016-06-22  760  			if (BPF_CLASS(code) == BPF_ST) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  761  				EMIT(PPC_RAW_LI(tmp1_reg, imm));
3a3fc9bf103974 Jordan Niethe    2022-02-14  762  				src_reg = tmp1_reg;
156d0e290e969c Naveen N. Rao    2016-06-22  763  			}
3a181237916310 Balamuruhan S    2020-06-24  764  			EMIT(PPC_RAW_STB(src_reg, dst_reg, off));
156d0e290e969c Naveen N. Rao    2016-06-22  765  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  766  		case BPF_STX | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = src */
156d0e290e969c Naveen N. Rao    2016-06-22  767  		case BPF_ST | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = imm */
156d0e290e969c Naveen N. Rao    2016-06-22  768  			if (BPF_CLASS(code) == BPF_ST) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  769  				EMIT(PPC_RAW_LI(tmp1_reg, imm));
3a3fc9bf103974 Jordan Niethe    2022-02-14  770  				src_reg = tmp1_reg;
156d0e290e969c Naveen N. Rao    2016-06-22  771  			}
3a181237916310 Balamuruhan S    2020-06-24  772  			EMIT(PPC_RAW_STH(src_reg, dst_reg, off));
156d0e290e969c Naveen N. Rao    2016-06-22  773  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  774  		case BPF_STX | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = src */
156d0e290e969c Naveen N. Rao    2016-06-22  775  		case BPF_ST | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = imm */
156d0e290e969c Naveen N. Rao    2016-06-22  776  			if (BPF_CLASS(code) == BPF_ST) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  777  				PPC_LI32(tmp1_reg, imm);
3a3fc9bf103974 Jordan Niethe    2022-02-14  778  				src_reg = tmp1_reg;
156d0e290e969c Naveen N. Rao    2016-06-22  779  			}
3a181237916310 Balamuruhan S    2020-06-24  780  			EMIT(PPC_RAW_STW(src_reg, dst_reg, off));
156d0e290e969c Naveen N. Rao    2016-06-22  781  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  782  		case BPF_STX | BPF_MEM | BPF_DW: /* (u64 *)(dst + off) = src */
156d0e290e969c Naveen N. Rao    2016-06-22  783  		case BPF_ST | BPF_MEM | BPF_DW: /* *(u64 *)(dst + off) = imm */
156d0e290e969c Naveen N. Rao    2016-06-22  784  			if (BPF_CLASS(code) == BPF_ST) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  785  				PPC_LI32(tmp1_reg, imm);
3a3fc9bf103974 Jordan Niethe    2022-02-14  786  				src_reg = tmp1_reg;
156d0e290e969c Naveen N. Rao    2016-06-22  787  			}
794abc08d75e9f Naveen N. Rao    2022-02-14  788  			if (off % 4) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  789  				EMIT(PPC_RAW_LI(tmp2_reg, off));
3a3fc9bf103974 Jordan Niethe    2022-02-14  790  				EMIT(PPC_RAW_STDX(src_reg, dst_reg, tmp2_reg));
794abc08d75e9f Naveen N. Rao    2022-02-14  791  			} else {
794abc08d75e9f Naveen N. Rao    2022-02-14  792  				EMIT(PPC_RAW_STD(src_reg, dst_reg, off));
794abc08d75e9f Naveen N. Rao    2022-02-14  793  			}
156d0e290e969c Naveen N. Rao    2016-06-22  794  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  795  
156d0e290e969c Naveen N. Rao    2016-06-22  796  		/*
91c960b0056672 Brendan Jackman  2021-01-14  797  		 * BPF_STX ATOMIC (atomic ops)
156d0e290e969c Naveen N. Rao    2016-06-22  798  		 */
91c960b0056672 Brendan Jackman  2021-01-14  799  		case BPF_STX | BPF_ATOMIC | BPF_W:
65112709115f48 Hari Bathini     2022-06-10  800  		case BPF_STX | BPF_ATOMIC | BPF_DW:
1e82dfaa7819f0 Hari Bathini     2022-06-10  801  			save_reg = tmp2_reg;
1e82dfaa7819f0 Hari Bathini     2022-06-10  802  			ret_reg = src_reg;
1e82dfaa7819f0 Hari Bathini     2022-06-10  803  
65112709115f48 Hari Bathini     2022-06-10  804  			/* Get offset into TMP_REG_1 */
65112709115f48 Hari Bathini     2022-06-10  805  			EMIT(PPC_RAW_LI(tmp1_reg, off));
b9c1e60e7bf4e6 Daniel Borkmann  2018-07-19  806  			tmp_idx = ctx->idx * 4;
156d0e290e969c Naveen N. Rao    2016-06-22  807  			/* load value from memory into TMP_REG_2 */
65112709115f48 Hari Bathini     2022-06-10  808  			if (size == BPF_DW)
65112709115f48 Hari Bathini     2022-06-10  809  				EMIT(PPC_RAW_LDARX(tmp2_reg, tmp1_reg, dst_reg, 0));
65112709115f48 Hari Bathini     2022-06-10  810  			else
65112709115f48 Hari Bathini     2022-06-10  811  				EMIT(PPC_RAW_LWARX(tmp2_reg, tmp1_reg, dst_reg, 0));
65112709115f48 Hari Bathini     2022-06-10  812  
dbe6e2456fb026 Hari Bathini     2022-06-10  813  			/* Save old value in _R0 */
dbe6e2456fb026 Hari Bathini     2022-06-10  814  			if (imm & BPF_FETCH)
dbe6e2456fb026 Hari Bathini     2022-06-10  815  				EMIT(PPC_RAW_MR(_R0, tmp2_reg));
dbe6e2456fb026 Hari Bathini     2022-06-10  816  
65112709115f48 Hari Bathini     2022-06-10  817  			switch (imm) {
65112709115f48 Hari Bathini     2022-06-10  818  			case BPF_ADD:
dbe6e2456fb026 Hari Bathini     2022-06-10  819  			case BPF_ADD | BPF_FETCH:
3a3fc9bf103974 Jordan Niethe    2022-02-14  820  				EMIT(PPC_RAW_ADD(tmp2_reg, tmp2_reg, src_reg));
156d0e290e969c Naveen N. Rao    2016-06-22  821  				break;
65112709115f48 Hari Bathini     2022-06-10  822  			case BPF_AND:
dbe6e2456fb026 Hari Bathini     2022-06-10  823  			case BPF_AND | BPF_FETCH:
65112709115f48 Hari Bathini     2022-06-10  824  				EMIT(PPC_RAW_AND(tmp2_reg, tmp2_reg, src_reg));
65112709115f48 Hari Bathini     2022-06-10  825  				break;
65112709115f48 Hari Bathini     2022-06-10  826  			case BPF_OR:
dbe6e2456fb026 Hari Bathini     2022-06-10  827  			case BPF_OR | BPF_FETCH:
65112709115f48 Hari Bathini     2022-06-10  828  				EMIT(PPC_RAW_OR(tmp2_reg, tmp2_reg, src_reg));
65112709115f48 Hari Bathini     2022-06-10  829  				break;
65112709115f48 Hari Bathini     2022-06-10  830  			case BPF_XOR:
dbe6e2456fb026 Hari Bathini     2022-06-10  831  			case BPF_XOR | BPF_FETCH:
65112709115f48 Hari Bathini     2022-06-10  832  				EMIT(PPC_RAW_XOR(tmp2_reg, tmp2_reg, src_reg));
65112709115f48 Hari Bathini     2022-06-10  833  				break;
1e82dfaa7819f0 Hari Bathini     2022-06-10  834  			case BPF_CMPXCHG:
1e82dfaa7819f0 Hari Bathini     2022-06-10  835  				/*
1e82dfaa7819f0 Hari Bathini     2022-06-10  836  				 * Return old value in BPF_REG_0 for BPF_CMPXCHG &
1e82dfaa7819f0 Hari Bathini     2022-06-10  837  				 * in src_reg for other cases.
1e82dfaa7819f0 Hari Bathini     2022-06-10  838  				 */
1e82dfaa7819f0 Hari Bathini     2022-06-10  839  				ret_reg = bpf_to_ppc(BPF_REG_0);
1e82dfaa7819f0 Hari Bathini     2022-06-10  840  
1e82dfaa7819f0 Hari Bathini     2022-06-10  841  				/* Compare with old value in BPF_R0 */
1e82dfaa7819f0 Hari Bathini     2022-06-10  842  				if (size == BPF_DW)
1e82dfaa7819f0 Hari Bathini     2022-06-10  843  					EMIT(PPC_RAW_CMPD(bpf_to_ppc(BPF_REG_0), tmp2_reg));
1e82dfaa7819f0 Hari Bathini     2022-06-10  844  				else
1e82dfaa7819f0 Hari Bathini     2022-06-10  845  					EMIT(PPC_RAW_CMPW(bpf_to_ppc(BPF_REG_0), tmp2_reg));
1e82dfaa7819f0 Hari Bathini     2022-06-10  846  				/* Don't set if different from old value */
1e82dfaa7819f0 Hari Bathini     2022-06-10  847  				PPC_BCC_SHORT(COND_NE, (ctx->idx + 3) * 4);
1e82dfaa7819f0 Hari Bathini     2022-06-10  848  				fallthrough;
1e82dfaa7819f0 Hari Bathini     2022-06-10  849  			case BPF_XCHG:
1e82dfaa7819f0 Hari Bathini     2022-06-10  850  				save_reg = src_reg;
1e82dfaa7819f0 Hari Bathini     2022-06-10  851  				break;
65112709115f48 Hari Bathini     2022-06-10  852  			default:
91c960b0056672 Brendan Jackman  2021-01-14  853  				pr_err_ratelimited(
91c960b0056672 Brendan Jackman  2021-01-14  854  					"eBPF filter atomic op code %02x (@%d) unsupported\n",
91c960b0056672 Brendan Jackman  2021-01-14  855  					code, i);
65112709115f48 Hari Bathini     2022-06-10  856  				return -EOPNOTSUPP;
91c960b0056672 Brendan Jackman  2021-01-14  857  			}
91c960b0056672 Brendan Jackman  2021-01-14  858  
dbe6e2456fb026 Hari Bathini     2022-06-10  859  			/* store new value */
65112709115f48 Hari Bathini     2022-06-10  860  			if (size == BPF_DW)
1e82dfaa7819f0 Hari Bathini     2022-06-10  861  				EMIT(PPC_RAW_STDCX(save_reg, tmp1_reg, dst_reg));
65112709115f48 Hari Bathini     2022-06-10  862  			else
1e82dfaa7819f0 Hari Bathini     2022-06-10  863  				EMIT(PPC_RAW_STWCX(save_reg, tmp1_reg, dst_reg));
65112709115f48 Hari Bathini     2022-06-10  864  			/* we're done if this succeeded */
b9c1e60e7bf4e6 Daniel Borkmann  2018-07-19  865  			PPC_BCC_SHORT(COND_NE, tmp_idx);
dbe6e2456fb026 Hari Bathini     2022-06-10  866  
1e82dfaa7819f0 Hari Bathini     2022-06-10  867  			if (imm & BPF_FETCH) {
1e82dfaa7819f0 Hari Bathini     2022-06-10  868  				EMIT(PPC_RAW_MR(ret_reg, _R0));
1e82dfaa7819f0 Hari Bathini     2022-06-10  869  				/*
1e82dfaa7819f0 Hari Bathini     2022-06-10  870  				 * Skip unnecessary zero-extension for 32-bit cmpxchg.
1e82dfaa7819f0 Hari Bathini     2022-06-10  871  				 * For context, see commit 39491867ace5.
1e82dfaa7819f0 Hari Bathini     2022-06-10  872  				 */
1e82dfaa7819f0 Hari Bathini     2022-06-10  873  				if (size != BPF_DW && imm == BPF_CMPXCHG &&
1e82dfaa7819f0 Hari Bathini     2022-06-10  874  				    insn_is_zext(&insn[i + 1]))
1e82dfaa7819f0 Hari Bathini     2022-06-10  875  					addrs[++i] = ctx->idx * 4;
1e82dfaa7819f0 Hari Bathini     2022-06-10  876  			}
156d0e290e969c Naveen N. Rao    2016-06-22  877  			break;
156d0e290e969c Naveen N. Rao    2016-06-22  878  
156d0e290e969c Naveen N. Rao    2016-06-22  879  		/*
156d0e290e969c Naveen N. Rao    2016-06-22  880  		 * BPF_LDX
156d0e290e969c Naveen N. Rao    2016-06-22  881  		 */
156d0e290e969c Naveen N. Rao    2016-06-22  882  		/* dst = *(u8 *)(ul) (src + off) */
156d0e290e969c Naveen N. Rao    2016-06-22  883  		case BPF_LDX | BPF_MEM | BPF_B:
983bdc0245a29c Ravi Bangoria    2021-10-12  884  		case BPF_LDX | BPF_PROBE_MEM | BPF_B:
156d0e290e969c Naveen N. Rao    2016-06-22  885  		/* dst = *(u16 *)(ul) (src + off) */
156d0e290e969c Naveen N. Rao    2016-06-22  886  		case BPF_LDX | BPF_MEM | BPF_H:
983bdc0245a29c Ravi Bangoria    2021-10-12  887  		case BPF_LDX | BPF_PROBE_MEM | BPF_H:
156d0e290e969c Naveen N. Rao    2016-06-22  888  		/* dst = *(u32 *)(ul) (src + off) */
156d0e290e969c Naveen N. Rao    2016-06-22  889  		case BPF_LDX | BPF_MEM | BPF_W:
983bdc0245a29c Ravi Bangoria    2021-10-12  890  		case BPF_LDX | BPF_PROBE_MEM | BPF_W:
156d0e290e969c Naveen N. Rao    2016-06-22  891  		/* dst = *(u64 *)(ul) (src + off) */
156d0e290e969c Naveen N. Rao    2016-06-22  892  		case BPF_LDX | BPF_MEM | BPF_DW:
983bdc0245a29c Ravi Bangoria    2021-10-12  893  		case BPF_LDX | BPF_PROBE_MEM | BPF_DW:
9c70c7147ffec3 Ravi Bangoria    2021-10-12  894  			/*
9c70c7147ffec3 Ravi Bangoria    2021-10-12  895  			 * As PTR_TO_BTF_ID that uses BPF_PROBE_MEM mode could either be a valid
9c70c7147ffec3 Ravi Bangoria    2021-10-12  896  			 * kernel pointer or NULL but not a userspace address, execute BPF_PROBE_MEM
9c70c7147ffec3 Ravi Bangoria    2021-10-12  897  			 * load only if addr is kernel address (see is_kernel_addr()), otherwise
9c70c7147ffec3 Ravi Bangoria    2021-10-12  898  			 * set dst_reg=0 and move on.
9c70c7147ffec3 Ravi Bangoria    2021-10-12  899  			 */
9c70c7147ffec3 Ravi Bangoria    2021-10-12  900  			if (BPF_MODE(code) == BPF_PROBE_MEM) {
3a3fc9bf103974 Jordan Niethe    2022-02-14  901  				EMIT(PPC_RAW_ADDI(tmp1_reg, src_reg, off));
9c70c7147ffec3 Ravi Bangoria    2021-10-12  902  				if (IS_ENABLED(CONFIG_PPC_BOOK3E_64))
3a3fc9bf103974 Jordan Niethe    2022-02-14 @903  					PPC_LI64(tmp2_reg, 0x8000000000000000ul);
9c70c7147ffec3 Ravi Bangoria    2021-10-12  904  				else /* BOOK3S_64 */
3a3fc9bf103974 Jordan Niethe    2022-02-14 @905  					PPC_LI64(tmp2_reg, PAGE_OFFSET);

:::::: The code at line 903 was first introduced by commit
:::::: 3a3fc9bf103974d9a886fa37087d5d491c806e00 powerpc64/bpf: Store temp registers' bpf to ppc mapping

:::::: TO: Jordan Niethe <jniethe5@...il.com>
:::::: CC: Michael Ellerman <mpe@...erman.id.au>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ