]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-4.14/nfp-bpf-fix-alu32-high-bits-clearance-bug.patch
drop some duplicated patches that somehow got merged.
[thirdparty/kernel/stable-queue.git] / queue-4.14 / nfp-bpf-fix-alu32-high-bits-clearance-bug.patch
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
5
6 [ Upstream commit f036ebd9bfbe1e91a3d855e85e05fc5ff156b641 ]
7
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
10 example:
11
12 A & -1 = A
13 A | 0 = A
14 A ^ 0 = A
15
16 However, for ALU32, high 32-bit of the 64-bit register should still be
17 cleared according to ISA semantics.
18
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>
24 ---
25 drivers/net/ethernet/netronome/nfp/bpf/jit.c | 17 ++++++-----------
26 1 file changed, 6 insertions(+), 11 deletions(-)
27
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,
33
34 static int
35 wrp_alu32_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
36 - enum alu_op alu_op, bool skip)
37 + enum alu_op alu_op)
38 {
39 const struct bpf_insn *insn = &meta->insn;
40
41 - if (skip) {
42 - meta->skip = true;
43 - return 0;
44 - }
45 -
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);
48
49 @@ -1017,7 +1012,7 @@ static int xor_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
50
51 static int xor_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
52 {
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);
55 }
56
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)
59
60 static int and_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
61 {
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);
64 }
65
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)
68
69 static int or_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
70 {
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);
73 }
74
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)
77
78 static int add_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
79 {
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);
82 }
83
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)
86
87 static int sub_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
88 {
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);
91 }
92
93 static int shl_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
94 --
95 2.19.1
96