lkml.org 
[lkml]   [2010]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCHv7 2.6.35-rc3-tip 6/11] uprobes: X86 support for Uprobes

    uprobes: X86 support for Uprobes

    Changelog from V5: Using local_irq_enable() instead of
    native_irq_enable and no more disabling irqs as suggested by Oleg
    Nesterov.

    Provides x86 specific details for uprobes.
    This includes interrupt notifier for uprobes, enabling/disabling
    singlestep.

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

    arch/x86/kernel/signal.c | 13 +++++++++++
    arch/x86/kernel/uprobes.c | 52 +++++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 65 insertions(+), 0 deletions(-)


    diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
    index 4fd173c..3657563 100644
    --- a/arch/x86/kernel/signal.c
    +++ b/arch/x86/kernel/signal.c
    @@ -848,6 +848,19 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
    if (thread_info_flags & _TIF_SIGPENDING)
    do_signal(regs);

    + if (thread_info_flags & _TIF_UPROBE) {
    + clear_thread_flag(TIF_UPROBE);
    +#ifdef CONFIG_X86_32
    + /*
    + * On x86_32, do_notify_resume() gets called with
    + * interrupts disabled. Hence enable interrupts if they
    + * are still disabled.
    + */
    + local_irq_enable();
    +#endif
    + uprobe_notify_resume(regs);
    + }
    +
    if (thread_info_flags & _TIF_NOTIFY_RESUME) {
    clear_thread_flag(TIF_NOTIFY_RESUME);
    tracehook_notify_resume(regs);
    diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
    index 1eb85bb..9456328 100644
    --- a/arch/x86/kernel/uprobes.c
    +++ b/arch/x86/kernel/uprobes.c
    @@ -26,6 +26,7 @@
    #include <linux/ptrace.h>
    #include <linux/uprobes.h>

    +#include <linux/kdebug.h>
    #include <asm/insn.h>

    #ifdef CONFIG_X86_32
    @@ -545,3 +546,54 @@ struct user_bkpt_arch_info user_bkpt_arch_info = {
    .analyze_insn = analyze_insn,
    .post_xol = post_xol,
    };
    +
    +/*
    + * Wrapper routine for handling exceptions.
    + */
    +int uprobes_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;
    +}
    +
    +void arch_uprobe_enable_sstep(struct pt_regs *regs)
    +{
    + /*
    + * Enable single-stepping by
    + * - Set TF on stack
    + * - Set TIF_SINGLESTEP: Guarantees that TF is set when
    + * returning to user mode.
    + * - Indicate that TF is set by us.
    + */
    + regs->flags |= X86_EFLAGS_TF;
    + set_thread_flag(TIF_SINGLESTEP);
    + set_thread_flag(TIF_FORCED_TF);
    +}
    +
    +void arch_uprobe_disable_sstep(struct pt_regs *regs)
    +{
    + /* Disable single-stepping by clearing what we set */
    + clear_thread_flag(TIF_SINGLESTEP);
    + clear_thread_flag(TIF_FORCED_TF);
    + regs->flags &= ~X86_EFLAGS_TF;
    +}

    \
     
     \ /
      Last update: 2010-06-29 20:43    [W:0.029 / U:1.108 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site