• Masami Hiramatsu's avatar
    kprobes/x86: Fix page-fault handling logic · 6381c24c
    Masami Hiramatsu authored
    Current kprobes in-kernel page fault handler doesn't
    expect that its single-stepping can be interrupted by
    an NMI handler which may cause a page fault(e.g. perf
    with callback tracing).
    
    In that case, the page-fault handled by kprobes and it
    misunderstands the page-fault has been caused by the
    single-stepping code and tries to recover IP address
    to probed address.
    
    But the truth is the page-fault has been caused by the
    NMI handler, and do_page_fault failes to handle real
    page fault because the IP address is modified and
    causes Kernel BUGs like below.
    
     ----
     [ 2264.726905] BUG: unable to handle kernel NULL pointer dereference at 0000000000000020
     [ 2264.727190] IP: [<ffffffff813c46e0>] copy_user_generic_string+0x0/0x40
    
    To handle this correctly, I fixed the kprobes fault
    handler to ensure the faulted ip address is its own
    single-step buffer instead of checking current kprobe
    state.
    Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
    Cc: Sandeepa Prabhu <sandeepa.prabhu@linaro.org>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: fche@redhat.com
    Cc: systemtap@sourceware.org
    Link: http://lkml.kernel.org/r/20140417081644.26341.52351.stgit@ltc230.yrl.intra.hitachi.co.jpSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    6381c24c
core.c 31.2 KB