From: David Daney <david.daney@cavium.com>
To: linux-mips@linux-mips.org, ralf@linux-mips.org,
James Hogan <james.hogan@imgtec.com>,
Alexei Starovoitov <ast@kernel.org>,
netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
"Steven J. Hill" <steven.hill@cavium.com>,
David Daney <david.daney@cavium.com>
Subject: [PATCH v2 4/5] MIPS: BPF: Quit clobbering callee saved registers in JIT code.
Date: Tue, 14 Mar 2017 14:21:43 -0700 [thread overview]
Message-ID: <20170314212144.29988-5-david.daney@cavium.com> (raw)
In-Reply-To: <20170314212144.29988-1-david.daney@cavium.com>
If bpf_needs_clear_a() returns true, only actually clear it if it is
ever used. If it is not used, we don't save and restore it, so the
clearing has the nasty side effect of clobbering caller state.
Also, don't emit stack pointer adjustment instructions if the
adjustment amount is zero.
Signed-off-by: David Daney <david.daney@cavium.com>
---
arch/mips/net/bpf_jit.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/mips/net/bpf_jit.c b/arch/mips/net/bpf_jit.c
index a68cd36..44b9250 100644
--- a/arch/mips/net/bpf_jit.c
+++ b/arch/mips/net/bpf_jit.c
@@ -532,7 +532,8 @@ static void save_bpf_jit_regs(struct jit_ctx *ctx, unsigned offset)
u32 sflags, tmp_flags;
/* Adjust the stack pointer */
- emit_stack_offset(-align_sp(offset), ctx);
+ if (offset)
+ emit_stack_offset(-align_sp(offset), ctx);
tmp_flags = sflags = ctx->flags >> SEEN_SREG_SFT;
/* sflags is essentially a bitmap */
@@ -584,7 +585,8 @@ static void restore_bpf_jit_regs(struct jit_ctx *ctx,
emit_load_stack_reg(r_ra, r_sp, real_off, ctx);
/* Restore the sp and discard the scrach memory */
- emit_stack_offset(align_sp(offset), ctx);
+ if (offset)
+ emit_stack_offset(align_sp(offset), ctx);
}
static unsigned int get_stack_depth(struct jit_ctx *ctx)
@@ -631,8 +633,14 @@ static void build_prologue(struct jit_ctx *ctx)
if (ctx->flags & SEEN_X)
emit_jit_reg_move(r_X, r_zero, ctx);
- /* Do not leak kernel data to userspace */
- if (bpf_needs_clear_a(&ctx->skf->insns[0]))
+ /*
+ * Do not leak kernel data to userspace, we only need to clear
+ * r_A if it is ever used. In fact if it is never used, we
+ * will not save/restore it, so clearing it in this case would
+ * corrupt the state of the caller.
+ */
+ if (bpf_needs_clear_a(&ctx->skf->insns[0]) &&
+ (ctx->flags & SEEN_A))
emit_jit_reg_move(r_A, r_zero, ctx);
}
--
2.9.3
next prev parent reply other threads:[~2017-03-14 21:22 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-14 21:21 [PATCH v2 0/5] MIPS: BPF: JIT fixes and improvements David Daney
2017-03-14 21:21 ` [PATCH v2 1/5] MIPS: uasm: Add support for LHU David Daney
2017-03-14 21:21 ` [PATCH v2 2/5] MIPS: BPF: Add JIT support for SKF_AD_HATYPE David Daney
2017-03-14 21:21 ` [PATCH v2 3/5] MIPS: BPF: Use unsigned access for unsigned SKB fields David Daney
2017-03-14 21:21 ` David Daney [this message]
2017-03-14 21:21 ` [PATCH v2 5/5] MIPS: BPF: Fix multiple problems in JIT skb access helpers David Daney
2017-03-14 22:29 ` [PATCH v2 0/5] MIPS: BPF: JIT fixes and improvements Daniel Borkmann
2017-03-14 22:35 ` David Daney
2017-03-14 22:49 ` Alexei Starovoitov
2017-03-14 22:59 ` David Daney
2017-03-15 0:29 ` David Miller
2017-03-15 0:34 ` David Daney
2017-03-15 0:36 ` David Miller
2017-03-15 13:08 ` Ralf Baechle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170314212144.29988-5-david.daney@cavium.com \
--to=david.daney@cavium.com \
--cc=ast@kernel.org \
--cc=james.hogan@imgtec.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=netdev@vger.kernel.org \
--cc=ralf@linux-mips.org \
--cc=steven.hill@cavium.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox