From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754512AbdC1HE1 (ORCPT ); Tue, 28 Mar 2017 03:04:27 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:32850 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754306AbdC1HEZ (ORCPT ); Tue, 28 Mar 2017 03:04:25 -0400 Date: Tue, 28 Mar 2017 09:04:19 +0200 From: Ingo Molnar To: Masami Hiramatsu 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: <20170328070419.GA27268@gmail.com> References: <149060091581.12303.13449343279538504544.stgit@devbox> <149060119780.12303.15731372653870703672.stgit@devbox> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <149060119780.12303.15731372653870703672.stgit@devbox> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org * 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. Also, is the (void *) cast required? arch.insns ought to be void * already, right? (I haven't checking whether that's true for all architectures.) 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