1 From ca10918a278b3ee96fe2540cb0cdc7dccc0ce26e Mon Sep 17 00:00:00 2001
2 From: Jiong Wang <jiong.wang@netronome.com>
3 Date: Fri, 22 Feb 2019 22:36:04 +0000
4 Subject: nfp: bpf: fix ALU32 high bits clearance bug
6 [ Upstream commit f036ebd9bfbe1e91a3d855e85e05fc5ff156b641 ]
8 NFP BPF JIT compiler is doing a couple of small optimizations when jitting
9 ALU imm instructions, some of these optimizations could save code-gen, for
16 However, for ALU32, high 32-bit of the 64-bit register should still be
17 cleared according to ISA semantics.
19 Fixes: cd7df56ed3e6 ("nfp: add BPF to NFP code translator")
20 Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
21 Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
22 Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
23 Signed-off-by: Sasha Levin <sashal@kernel.org>
25 drivers/net/ethernet/netronome/nfp/bpf/jit.c | 17 ++++++-----------
26 1 file changed, 6 insertions(+), 11 deletions(-)
28 diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c
29 index 3105ee5bbf8e..c1ffec85817a 100644
30 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c
31 +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c
32 @@ -756,15 +756,10 @@ wrp_alu64_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
35 wrp_alu32_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
36 - enum alu_op alu_op, bool skip)
39 const struct bpf_insn *insn = &meta->insn;
46 wrp_alu_imm(nfp_prog, insn->dst_reg * 2, alu_op, insn->imm);
47 wrp_immed(nfp_prog, reg_both(insn->dst_reg * 2 + 1), 0);
49 @@ -1017,7 +1012,7 @@ static int xor_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
51 static int xor_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
53 - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR, !meta->insn.imm);
54 + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR);
57 static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
58 @@ -1027,7 +1022,7 @@ static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
60 static int and_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
62 - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND, !~meta->insn.imm);
63 + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND);
66 static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
67 @@ -1037,7 +1032,7 @@ static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
69 static int or_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
71 - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR, !meta->insn.imm);
72 + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR);
75 static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
76 @@ -1047,7 +1042,7 @@ static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
78 static int add_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
80 - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD, !meta->insn.imm);
81 + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD);
84 static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
85 @@ -1057,7 +1052,7 @@ static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
87 static int sub_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
89 - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB, !meta->insn.imm);
90 + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB);
93 static int shl_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)