lkml.org 
[lkml]   [2011]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH v7 3.2-rc2 13/30] x86: define a x86 specific exception notifier.

    Uprobes uses notifier mechanism to get in control when an application
    encounters a breakpoint or a singlestep exception.

    Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
    Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    ---

    Changelog (since v5)
    - No more do a i386 specific enable interrupts. (Its now part of another
    patchset posted separately)

    arch/x86/include/asm/uprobes.h | 4 ++++
    arch/x86/kernel/signal.c | 6 ++++++
    arch/x86/kernel/uprobes.c | 29 +++++++++++++++++++++++++++++
    3 files changed, 39 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/include/asm/uprobes.h b/arch/x86/include/asm/uprobes.h
    index 509c023..19a5949 100644
    --- a/arch/x86/include/asm/uprobes.h
    +++ b/arch/x86/include/asm/uprobes.h
    @@ -23,6 +23,8 @@
    * Jim Keniston
    */

    +#include <linux/notifier.h>
    +
    typedef u8 uprobe_opcode_t;
    #define MAX_UINSN_BYTES 16
    #define UPROBES_XOL_SLOT_BYTES 128 /* to keep it cache aligned */
    @@ -40,4 +42,6 @@ struct uprobe_arch_info {};
    struct uprobe;
    extern int analyze_insn(struct mm_struct *mm, struct uprobe *uprobe);
    extern void set_instruction_pointer(struct pt_regs *regs, unsigned long vaddr);
    +extern int uprobe_exception_notify(struct notifier_block *self,
    + unsigned long val, void *data);
    #endif /* _ASM_UPROBES_H */
    diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
    index 54ddaeb..4fdf470 100644
    --- a/arch/x86/kernel/signal.c
    +++ b/arch/x86/kernel/signal.c
    @@ -20,6 +20,7 @@
    #include <linux/personality.h>
    #include <linux/uaccess.h>
    #include <linux/user-return-notifier.h>
    +#include <linux/uprobes.h>

    #include <asm/processor.h>
    #include <asm/ucontext.h>
    @@ -820,6 +821,11 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
    mce_notify_process();
    #endif /* CONFIG_X86_64 && CONFIG_X86_MCE */

    + if (thread_info_flags & _TIF_UPROBE) {
    + clear_thread_flag(TIF_UPROBE);
    + uprobe_notify_resume(regs);
    + }
    +
    /* deal with pending signal delivery */
    if (thread_info_flags & _TIF_SIGPENDING)
    do_signal(regs);
    diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
    index 67b926f..2ee5ddc 100644
    --- a/arch/x86/kernel/uprobes.c
    +++ b/arch/x86/kernel/uprobes.c
    @@ -407,3 +407,32 @@ void set_instruction_pointer(struct pt_regs *regs, unsigned long vaddr)
    {
    regs->ip = vaddr;
    }
    +
    +/*
    + * Wrapper routine for handling exceptions.
    + */
    +int uprobe_exception_notify(struct notifier_block *self,
    + unsigned long val, void *data)
    +{
    + struct die_args *args = data;
    + struct pt_regs *regs = args->regs;
    + int ret = NOTIFY_DONE;
    +
    + /* We are only interested in userspace traps */
    + if (regs && !user_mode_vm(regs))
    + return NOTIFY_DONE;
    +
    + switch (val) {
    + case DIE_INT3:
    + /* Run your handler here */
    + if (uprobe_bkpt_notifier(regs))
    + ret = NOTIFY_STOP;
    + break;
    + case DIE_DEBUG:
    + if (uprobe_post_notifier(regs))
    + ret = NOTIFY_STOP;
    + default:
    + break;
    + }
    + return ret;
    +}


    \
     
     \ /
      Last update: 2011-11-18 12:39    [W:0.025 / U:92.144 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site