• Petr Mladek's avatar
    kprobes/x86: Use 5-byte NOP when the code might be modified by ftrace · 650b7b23
    Petr Mladek authored
    can_probe() checks if the given address points to the beginning
    of an instruction. It analyzes all the instructions from the
    beginning of the function until the given address. The code
    might be modified by another Kprobe. In this case, the current
    code is read into a buffer, int3 breakpoint is replaced by the
    saved opcode in the buffer, and can_probe() analyzes the buffer
    instead.
    
    There is a bug that __recover_probed_insn() tries to restore
    the original code even for Kprobes using the ftrace framework.
    But in this case, the opcode is not stored. See the difference
    between arch_prepare_kprobe() and arch_prepare_kprobe_ftrace().
    The opcode is stored by arch_copy_kprobe() only from
    arch_prepare_kprobe().
    
    This patch makes Kprobe to use the ideal 5-byte NOP when the
    code can be modified by ftrace. It is the original instruction,
    see ftrace_make_nop() and ftrace_nop_replace().
    
    Note that we always need to use the NOP for ftrace locations.
    Kprobes do not block ftrace and the instruction might get
    modified at anytime. It might even be in an inconsistent state
    because it is modified step by step using the int3 breakpoint.
    
    The patch also fixes indentation of the touched comment.
    
    Note that I found this problem when playing with Kprobes. I did
    it on x86_64 with gcc-4.8.3 that supported -mfentry. I modified
    samples/kprobes/kprobe_example.c and added offset 5 to put
    the probe right after the fentry area:
    
     static struct kprobe kp = {
     	.symbol_name	= "do_fork",
    +	.offset = 5,
     };
    
    Then I was able to load kprobe_example before jprobe_example
    but not the other way around:
    
      $> modprobe jprobe_example
      $> modprobe kprobe_example
      modprobe: ERROR: could not insert 'kprobe_example': Invalid or incomplete multibyte or wide character
    
    It did not make much sense and debugging pointed to the bug
    described above.
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.cz>
    Acked-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Ananth NMavinakayanahalli <ananth@in.ibm.com>
    Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Jiri Kosina <jkosina@suse.cz>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Link: http://lkml.kernel.org/r/1424441250-27146-2-git-send-email-pmladek@suse.czSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    650b7b23
core.c 32.5 KB