| From 3b0f977d42379ab3f66bfe85710f3519ef0450dd Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 26 Nov 2018 14:52:18 -0800 |
| Subject: sparc: Correct ctx->saw_frame_pointer logic. |
| |
| From: David Miller <davem@davemloft.net> |
| |
| [ Upstream commit e2ac579a7a18bcd9e8cf14cf42eac0b8a2ba6c4b ] |
| |
| We need to initialize the frame pointer register not just if it is |
| seen as a source operand, but also if it is seen as the destination |
| operand of a store or an atomic instruction (which effectively is a |
| source operand). |
| |
| This is exercised by test_verifier's "non-invalid fp arithmetic" |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/sparc/net/bpf_jit_comp_64.c | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| diff --git a/arch/sparc/net/bpf_jit_comp_64.c b/arch/sparc/net/bpf_jit_comp_64.c |
| index 7217d63596431..ec4da4dc98f12 100644 |
| --- a/arch/sparc/net/bpf_jit_comp_64.c |
| +++ b/arch/sparc/net/bpf_jit_comp_64.c |
| @@ -1270,6 +1270,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) |
| const u8 tmp2 = bpf2sparc[TMP_REG_2]; |
| u32 opcode = 0, rs2; |
| |
| + if (insn->dst_reg == BPF_REG_FP) |
| + ctx->saw_frame_pointer = true; |
| + |
| ctx->tmp_2_used = true; |
| emit_loadimm(imm, tmp2, ctx); |
| |
| @@ -1308,6 +1311,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) |
| const u8 tmp = bpf2sparc[TMP_REG_1]; |
| u32 opcode = 0, rs2; |
| |
| + if (insn->dst_reg == BPF_REG_FP) |
| + ctx->saw_frame_pointer = true; |
| + |
| switch (BPF_SIZE(code)) { |
| case BPF_W: |
| opcode = ST32; |
| @@ -1340,6 +1346,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) |
| const u8 tmp2 = bpf2sparc[TMP_REG_2]; |
| const u8 tmp3 = bpf2sparc[TMP_REG_3]; |
| |
| + if (insn->dst_reg == BPF_REG_FP) |
| + ctx->saw_frame_pointer = true; |
| + |
| ctx->tmp_1_used = true; |
| ctx->tmp_2_used = true; |
| ctx->tmp_3_used = true; |
| @@ -1360,6 +1369,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) |
| const u8 tmp2 = bpf2sparc[TMP_REG_2]; |
| const u8 tmp3 = bpf2sparc[TMP_REG_3]; |
| |
| + if (insn->dst_reg == BPF_REG_FP) |
| + ctx->saw_frame_pointer = true; |
| + |
| ctx->tmp_1_used = true; |
| ctx->tmp_2_used = true; |
| ctx->tmp_3_used = true; |
| -- |
| 2.20.1 |
| |