From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753065AbdC1P2i (ORCPT ); Tue, 28 Mar 2017 11:28:38 -0400 Received: from mail.kernel.org ([198.145.29.136]:58000 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751569AbdC1P2g (ORCPT ); Tue, 28 Mar 2017 11:28:36 -0400 Date: Wed, 29 Mar 2017 00:28:14 +0900 From: Masami Hiramatsu To: Ingo Molnar Cc: linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Thomas Gleixner , "H . Peter Anvin" , Ananth N Mavinakayanahalli , Anil S Keshavamurthy , "David S . Miller" , Andrey Ryabinin , Ye Xiaolong Subject: Re: [RFC PATCH tip/master V2 4/8] kprobes/x86: Do not modify singlestep buffer while resuming Message-Id: <20170329002814.b7d02fad5172ad718c1e9731@kernel.org> In-Reply-To: <20170328070419.GA27268@gmail.com> References: <149060091581.12303.13449343279538504544.stgit@devbox> <149060119780.12303.15731372653870703672.stgit@devbox> <20170328070419.GA27268@gmail.com> X-Mailer: Sylpheed 3.5.0 (GTK+ 2.24.30; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 28 Mar 2017 09:04:19 +0200 Ingo Molnar wrote: > > * Masami Hiramatsu wrote: > > > Do not modify singlestep execution buffer (kprobe.ainsn.insn) > > while resuming from single-stepping, instead, modifies > > the buffer to add a jump back instruction at preparing > > buffer. > > > > Signed-off-by: Masami Hiramatsu > > --- > > arch/x86/kernel/kprobes/core.c | 42 +++++++++++++++++++--------------------- > > 1 file changed, 20 insertions(+), 22 deletions(-) > > > > diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c > > index 6327f95..ea3b8e5 100644 > > --- a/arch/x86/kernel/kprobes/core.c > > +++ b/arch/x86/kernel/kprobes/core.c > > @@ -399,23 +399,36 @@ int __copy_instruction(u8 *dest, u8 *src) > > return length; > > } > > > > +/* Prepare reljump right after instruction to boost */ > > +static void prepare_boost(struct kprobe *p, int length) > > +{ > > + if (can_boost(p->ainsn.insn, p->addr) && > > + MAX_INSN_SIZE - length >= RELATIVEJUMP_SIZE) { > > + /* > > + * These instructions can be executed directly if it > > + * jumps back to correct address. > > + */ > > + synthesize_reljump((void *)p->ainsn.insn + length, > > + (void *)p->addr + length); > > + p->ainsn.boostable = 1; > > + } else > > + p->ainsn.boostable = -1; > > Those imbalanced curly braces are not proper kernel style. Ah, OK, I'll fix that. > > Also, is the (void *) cast required? arch.insns ought to be void * already, right? Hmm, it is kprobe_opcode_t *, but anyway, on x86 it is same,, since kprobe_opcode_t on x86 is u8. > (I haven't checking whether that's true for all architectures.) It is OK because this is x86 very specific code. Thank you, > > Btw., the original code had the curly braces right: > > > - if (p->ainsn.boostable == 0) { > > - if ((regs->ip > copy_ip) && > > - (regs->ip - copy_ip) + 5 < MAX_INSN_SIZE) { > > - /* > > - * These instructions can be executed directly if it > > - * jumps back to correct address. > > - */ > > - synthesize_reljump((void *)regs->ip, > > - (void *)orig_ip + (regs->ip - copy_ip)); > > - p->ainsn.boostable = 1; > > - } else { > > - p->ainsn.boostable = -1; > > - } > > - } > > Thanks, > > Ingo -- Masami Hiramatsu