aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/net/bpf_jit_comp64.c
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@kernel.org>2018-12-07 16:30:49 -0500
committerAlexei Starovoitov <ast@kernel.org>2018-12-07 16:30:49 -0500
commit6baefa1aa46f0e90aefbd13b8c926e89068fabba (patch)
tree376ae3306dbeee7a83d76f705159e7de1d61b464 /arch/powerpc/net/bpf_jit_comp64.c
parent17f6c83fb5ebf7db4fcc94a5be4c22d5a7bfe428 (diff)
parentc099f3f413f354ecdd518e4be6a232592e91d5b9 (diff)
Merge branch 'support-alu32_arsh'
Jiong Wang says: ==================== BPF_ALU | BPF_ARSH | BPF_* were rejected by commit: 7891a87efc71 ("bpf: arsh is not supported in 32 bit alu thus reject it"). As explained in the commit message, this is due to there is no complete support for them on interpreter and various JIT compilation back-ends. This patch set is a follow-up which completes the missing bits. This also pave the way for running bpf program compiled with ALU32 instruction enabled by specifing -mattr=+alu32 to LLVM for which case there is likely to have more BPF_ALU | BPF_ARSH insns that will trigger the rejection code. test_verifier.c is updated accordingly. I have tested this patch set on x86-64 and NFP, I need help of review and test on the arch changes (mips/ppc/s390). Note, there might be merge confict on mips change which is better to be applied on top of: commit: 20b880a05f06 ("mips: bpf: fix encoding bug for mm_srlv32_op"), which is on mips-fixes branch at the moment. Thanks. v1->v2: - Fix ppc implementation bug. Should zero high bits explicitly. ==================== Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'arch/powerpc/net/bpf_jit_comp64.c')
-rw-r--r--arch/powerpc/net/bpf_jit_comp64.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c
index 17482f5de3e2..7dc81877057d 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -529,9 +529,15 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
529 if (imm != 0) 529 if (imm != 0)
530 PPC_SRDI(dst_reg, dst_reg, imm); 530 PPC_SRDI(dst_reg, dst_reg, imm);
531 break; 531 break;
532 case BPF_ALU | BPF_ARSH | BPF_X: /* (s32) dst >>= src */
533 PPC_SRAW(dst_reg, dst_reg, src_reg);
534 goto bpf_alu32_trunc;
532 case BPF_ALU64 | BPF_ARSH | BPF_X: /* (s64) dst >>= src */ 535 case BPF_ALU64 | BPF_ARSH | BPF_X: /* (s64) dst >>= src */
533 PPC_SRAD(dst_reg, dst_reg, src_reg); 536 PPC_SRAD(dst_reg, dst_reg, src_reg);
534 break; 537 break;
538 case BPF_ALU | BPF_ARSH | BPF_K: /* (s32) dst >>= imm */
539 PPC_SRAWI(dst_reg, dst_reg, imm);
540 goto bpf_alu32_trunc;
535 case BPF_ALU64 | BPF_ARSH | BPF_K: /* (s64) dst >>= imm */ 541 case BPF_ALU64 | BPF_ARSH | BPF_K: /* (s64) dst >>= imm */
536 if (imm != 0) 542 if (imm != 0)
537 PPC_SRADI(dst_reg, dst_reg, imm); 543 PPC_SRADI(dst_reg, dst_reg, imm);