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