Messages in this thread | | | Date | Tue, 28 Mar 2017 09:04:19 +0200 | From | Ingo Molnar <> | Subject | Re: [RFC PATCH tip/master V2 4/8] kprobes/x86: Do not modify singlestep buffer while resuming |
| |
* Masami Hiramatsu <mhiramat@kernel.org> 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 <mhiramat@kernel.org> > --- > 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
| |