21 Feb, 2007

1 commit

  • This patch lists all active probes in the system by scanning through
    kprobe_table[]. It takes care of aggregate handlers and prints the type of
    the probe. Letter "k" for kprobes, "j" for jprobes, "r" for kretprobes.
    It also lists address of the instruction,its symbolic name(function name +
    offset) and the module name. One can access this file through
    /sys/kernel/debug/kprobes/list.

    Output looks like this
    =====================
    llm40:~/a # cat /sys/kernel/debug/kprobes/list
    c0169ae3 r sys_read+0x0
    c0169ae3 k sys_read+0x0
    c01694c8 k vfs_write+0x0
    c0167d20 r sys_open+0x0
    f8e658a6 k reiserfs_delete_inode+0x0 reiserfs
    c0120f4a k do_fork+0x0
    c0120f4a j do_fork+0x0
    c0169b4a r sys_write+0x0
    c0169b4a k sys_write+0x0
    c0169622 r vfs_read+0x0
    =================================

    [akpm@linux-foundation.org: cleanup]
    [ananth@in.ibm.com: sparc build fix]
    Signed-off-by: Srinivasa DS
    Cc: Prasanna S Panchamukhi
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Signed-off-by: Ananth N Mavinakayanahalli
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Srinivasa Ds
     

31 Jan, 2007

1 commit

  • Replace the magic numbers with an enum, and gets rid of a warning on the
    specific architectures (ex. powerpc) on which the compiler considers
    'char' as 'unsigned char'.

    Signed-off-by: Masami Hiramatsu
    Cc: Prasanna S Panchamukhi
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Masami Hiramatsu
     

08 Dec, 2006

1 commit

  • When we are unregistering a kprobe-booster, we can't release its
    instruction buffer immediately on the preemptive kernel, because some
    processes might be preempted on the buffer. The freeze_processes() and
    thaw_processes() functions can clean most of processes up from the buffer.
    There are still some non-frozen threads who have the PF_NOFREEZE flag. If
    those threads are sleeping (not preempted) at the known place outside the
    buffer, we can ensure safety of freeing.

    However, the processing of this check routine takes a long time. So, this
    patch introduces the garbage collection mechanism of insn_slot. It also
    introduces the "dirty" flag to free_insn_slot because of efficiency.

    The "clean" instruction slots (dirty flag is cleared) are released
    immediately. But the "dirty" slots which are used by boosted kprobes, are
    marked as garbages. collect_garbage_slots() will be invoked to release
    "dirty" slots if there are more than INSNS_PER_PAGE garbage slots or if
    there are no unused slots.

    Cc: "Keshavamurthy, Anil S"
    Cc: Ananth N Mavinakayanahalli
    Cc: "bibo,mao"
    Cc: Prasanna S Panchamukhi
    Cc: Yumiko Sugita
    Cc: Satoshi Oshima
    Cc: Hideo Aoki
    Signed-off-by: Masami Hiramatsu
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Masami Hiramatsu
     

02 Oct, 2006

3 commits

  • kprobe_flush_task() possibly calls kfree function during holding
    kretprobe_lock spinlock, if kfree function is probed by kretprobe that will
    incur spinlock deadlock. This patch moves kfree function out scope of
    kretprobe_lock.

    Signed-off-by: bibo, mao
    Signed-off-by: Ananth N Mavinakayanahalli
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    bibo,mao
     
  • Whitespace is used to indent, this patch cleans up these sentences by
    kernel coding style.

    Signed-off-by: bibo, mao
    Signed-off-by: Ananth N Mavinakayanahalli
    Cc: "Luck, Tony"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    bibo,mao
     
  • In an effort to make kprobe modules more portable, here is a patch that:

    o Introduces the "symbol_name" field to struct kprobe.
    The symbol->address resolution now happens in the kernel in an
    architecture agnostic manner. 64-bit powerpc users no longer have
    to specify the ".symbols"
    o Introduces the "offset" field to struct kprobe to allow a user to
    specify an offset into a symbol.
    o The legacy mechanism of specifying the kprobe.addr is still supported.
    However, if both the kprobe.addr and kprobe.symbol_name are specified,
    probe registration fails with an -EINVAL.
    o The symbol resolution code uses kallsyms_lookup_name(). So
    CONFIG_KPROBES now depends on CONFIG_KALLSYMS
    o Apparantly kprobe modules were the only legitimate out-of-tree user of
    the kallsyms_lookup_name() EXPORT. Now that the symbol resolution
    happens in-kernel, remove the EXPORT as suggested by Christoph Hellwig
    o Modify tcp_probe.c that uses the kprobe interface so as to make it
    work on multiple platforms (in its earlier form, the code wouldn't
    work, say, on powerpc)

    Signed-off-by: Ananth N Mavinakayanahalli
    Signed-off-by: Prasanna S Panchamukhi
    Signed-off-by: Christoph Hellwig
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ananth N Mavinakayanahalli
     

01 Aug, 2006

1 commit

  • Kprobe inserts breakpoint instruction in probepoint and then jumps to
    instruction slot when breakpoint is hit, the instruction slot icache must
    be consistent with dcache. Here is the patch which invalidates instruction
    slot icache area.

    Without this patch, in some machines there will be fault when executing
    instruction slot where icache content is inconsistent with dcache.

    Signed-off-by: bibo,mao
    Acked-by: "Luck, Tony"
    Acked-by: Keshavamurthy Anil S
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    bibo, mao
     

27 Jun, 2006

3 commits

  • With this patch Kprobes now registers for page fault notifications only when
    their is an active probe registered. Once all the active probes are
    unregistered their is no need to be notified of page faults and kprobes
    unregisters itself from the page fault notifications. Hence we will have ZERO
    side effects when no probes are active.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Anil S Keshavamurthy
     
  • Kprobes now registers for page fault notifications.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Anil S Keshavamurthy
     
  • If there are multi kprobes on the same probepoint, there will be one extra
    aggr_kprobe on the head of kprobe list. The aggr_kprobe has
    aggr_post_handler/aggr_break_handler whether the other kprobe
    post_hander/break_handler is NULL or not. This patch modifies this, only
    when there is one or more kprobe in the list whose post_handler is not
    NULL, post_handler of aggr_kprobe will be set as aggr_post_handler.

    [soshima@redhat.com: !CONFIG_PREEMPT fix]
    Signed-off-by: bibo, mao
    Cc: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: "Keshavamurthy, Anil S"
    Cc: Prasanna S Panchamukhi
    Cc: Jim Keniston
    Cc: Yumiko Sugita
    Cc: Hideo Aoki
    Signed-off-by: Satoshi Oshima
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    mao, bibo
     

20 Apr, 2006

1 commit

  • In cases where a struct kretprobe's *_handler fields are non-NULL, it is
    possible to cause a system crash, due to the possibility of calls ending up
    in zombie functions. Documentation clearly states that unused *_handlers
    should be set to NULL, but kprobe users sometimes fail to do so.

    Fix it by setting the non-relevant fields of the struct kretprobe to NULL.

    Signed-off-by: Ananth N Mavinakayanahalli
    Acked-by: Jim Keniston
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ananth N Mavinakayanahalli
     

27 Mar, 2006

1 commit

  • When kretprobe probes the schedule() function, if the probed process exits
    then schedule() will never return, so some kretprobe instances will never
    be recycled.

    In this patch the parent process will recycle retprobe instances of the
    probed function and there will be no memory leak of kretprobe instances.

    Signed-off-by: bibo mao
    Cc: Masami Hiramatsu
    Cc: Prasanna S Panchamukhi
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    bibo mao
     

23 Mar, 2006

1 commit

  • Semaphore to mutex conversion.

    The conversion was generated via scripts, and the result was validated
    automatically via a script as well.

    Signed-off-by: Ingo Molnar
    Acked-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

04 Feb, 2006

2 commits

  • When two function-return probes are inserted on kfree()[1] and the second
    on say, sys_link()[2], and later [2] is unregistered, we have a deadlock as
    kfree is called with the kretprobe_lock held and the function-return probe
    on kfree will also try to grab the same lock.

    However, we can move the kfree() during unregistration to outside the
    spinlock as we are sure that no instances from the free list will be used
    after synchronized_sched() returns during the unregistration process.
    Thanks to Masami Hiramatsu for spotting this.

    Signed-off-by: Ananth N Mavinakayanahalli
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ananth N Mavinakayanahalli
     
  • kernel/kprobes.c:353: warning: 'pre_handler_kretprobe' defined but not used

    Signed-off-by: Adrian Bunk
    Acked-by: Ananth N Mavinakayanahalli
    Acked-by: "Keshavamurthy, Anil S"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Adrian Bunk
     

12 Jan, 2006

1 commit

  • When a kprobes modules is written in such a way that probes are inserted on
    itself, then unload of that moudle was not possible due to reference
    couning on the same module.

    The below patch makes a check and incrementes the module refcount only if
    it is not a self probed module.

    We need to allow modules to probe themself for kprobes performance
    measurements

    This patch has been tested on several x86_64, ppc64 and IA64 architectures.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Keshavamurthy Anil S
     

11 Jan, 2006

6 commits

  • Signed-of-by: Anil S Keshavamurthy

    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Keshavamurthy Anil S
     
  • The following patch (against 2.6.15-rc5-mm3) fixes a kprobes build break
    due to changes introduced in the kprobe locking in 2.6.15-rc5-mm3. In
    addition, the patch reverts back the open-coding of kprobe_mutex.

    Signed-off-by: Ananth N Mavinakayanahalli
    Acked-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ananth N Mavinakayanahalli
     
  • Currently arch_remove_kprobes() is only implemented/required for x86_64 and
    powerpc. All other architecture like IA64, i386 and sparc64 implementes a
    dummy function which is being called from arch independent kprobes.c file.

    This patch removes the dummy functions and replaces it with
    #define arch_remove_kprobe(p, s) do { } while(0)

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Anil S Keshavamurthy
     
  • Based on some feedback from Oleg Nesterov, I have made few changes to
    previously posted patch.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Keshavamurthy Anil S
     
  • Since Kprobes runtime exception handlers is now lock free as this code path is
    now using RCU to walk through the list, there is no need for the
    register/unregister{_kprobe} to use spin_{lock/unlock}_isr{save/restore}. The
    serialization during registration/unregistration is now possible using just a
    mutex.

    In the above process, this patch also fixes a minor memory leak for x86_64 and
    powerpc.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Anil S Keshavamurthy
     
  • Kernel/kprobes.c defines get_insn_slot() and free_insn_slot() which are
    currently required _only_ for x86_64 and powerpc (which has no-exec support).

    FYI, get{free}_insn_slot() functions manages the memory page which is mapped
    as executable, required for instruction emulation.

    This patch moves those two functions under __ARCH_WANT_KPROBES_INSN_SLOT and
    defines __ARCH_WANT_KPROBES_INSN_SLOT in arch specific kprobes.h file.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Anil S Keshavamurthy
     

13 Dec, 2005

3 commits

  • When multiple probes are registered at the same address and if due to some
    recursion (probe getting triggered within a probe handler), we skip calling
    pre_handlers and just increment nmissed field.

    The below patch make sure it walks the list for multiple probes case.
    Without the below patch we get incorrect results of nmissed count for
    multiple probe case.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Keshavamurthy Anil S
     
  • When registering multiple kprobes at the same address, we leave a small
    window where the kprobe hlist will not contain a reference to the
    registered kprobe, leading to potentially, a system crash if the breakpoint
    is hit on another processor.

    Patch below now automically relpace the old kprobe with the new
    kprobe from the hash list.

    Signed-off-by: Anil S Keshavamurthy
    Acked-by: Ananth N Mavinakayanahalli
    Cc: "Paul E. McKenney"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Keshavamurthy Anil S
     
  • When a Kprobes are inserted/removed on a modules, the modules must be ref
    counted so as not to allow to unload while probes are registered on that
    module.

    Without this patch, the probed module is free to unload, and when the
    probing module unregister the probe, the kpobes code while trying to
    replace the original instruction might crash.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Mao Bibo
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mao, Bibo
     

07 Nov, 2005

3 commits


31 Oct, 2005

1 commit

  • I recently picked up my older work to remove unnecessary #includes of
    sched.h, starting from a patch by Dave Jones to not include sched.h
    from module.h. This reduces the number of indirect includes of sched.h
    by ~300. Another ~400 pointless direct includes can be removed after
    this disentangling (patch to follow later).
    However, quite a few indirect includes need to be fixed up for this.

    In order to feed the patches through -mm with as little disturbance as
    possible, I've split out the fixes I accumulated up to now (complete for
    i386 and x86_64, more archs to follow later) and post them before the real
    patch. This way this large part of the patch is kept simple with only
    adding #includes, and all hunks are independent of each other. So if any
    hunk rejects or gets in the way of other patches, just drop it. My scripts
    will pick it up again in the next round.

    Signed-off-by: Tim Schmielau
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Tim Schmielau
     

08 Sep, 2005

2 commits

  • This patch fixes a race condition where in system used to hang or sometime
    crash within minutes when kprobes are inserted on ISR routine and a task
    routine.

    The fix has been stress tested on i386, ia64, pp64 and on x86_64. To
    reproduce the problem insert kprobes on schedule() and do_IRQ() functions
    and you should see hang or system crash.

    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Ananth N Mavinakayanahalli
    Acked-by: Prasanna S Panchamukhi
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Keshavamurthy Anil S
     
  • There are possible race conditions if probes are placed on routines within the
    kprobes files and routines used by the kprobes. For example if you put probe
    on get_kprobe() routines, the system can hang while inserting probes on any
    routine such as do_fork(). Because while inserting probes on do_fork(),
    register_kprobes() routine grabs the kprobes spin lock and executes
    get_kprobe() routine and to handle probe of get_kprobe(), kprobes_handler()
    gets executed and tries to grab kprobes spin lock, and spins forever. This
    patch avoids such possible race conditions by preventing probes on routines
    within the kprobes file and routines used by kprobes.

    I have modified the patches as per Andi Kleen's suggestion to move kprobes
    routines and other routines used by kprobes to a seperate section
    .kprobes.text.

    Also moved page fault and exception handlers, general protection fault to
    .kprobes.text section.

    These patches have been tested on i386, x86_64 and ppc64 architectures, also
    compiled on ia64 and sparc64 architectures.

    Signed-off-by: Prasanna S Panchamukhi
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Prasanna S Panchamukhi
     

06 Jul, 2005

1 commit

  • The following renames arch_init, a kprobes function for performing any
    architecture specific initialization, to arch_init_kprobes in order to
    cleanup the namespace.

    Also, this patch adds arch_init_kprobes to sparc64 to fix the sparc64 kprobes
    build from the last return probe patch.

    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rusty Lynch
     

28 Jun, 2005

2 commits

  • The following is the second version of the function return probe patches
    I sent out earlier this week. Changes since my last submission include:

    * Fix in ppc64 code removing an unneeded call to re-enable preemption
    * Fix a build problem in ia64 when kprobes was turned off
    * Added another BUG_ON check to each of the architecture trampoline
    handlers

    My initial patch description ==>

    From my experiences with adding return probes to x86_64 and ia64, and the
    feedback on LKML to those patches, I think we can simplify the design
    for return probes.

    The following patch tweaks the original design such that:

    * Instead of storing the stack address in the return probe instance, the
    task pointer is stored. This gives us all we need in order to:
    - find the correct return probe instance when we enter the trampoline
    (even if we are recursing)
    - find all left-over return probe instances when the task is going away

    This has the side effect of simplifying the implementation since more
    work can be done in kernel/kprobes.c since architecture specific knowledge
    of the stack layout is no longer required. Specifically, we no longer have:
    - arch_get_kprobe_task()
    - arch_kprobe_flush_task()
    - get_rp_inst_tsk()
    - get_rp_inst()
    - trampoline_post_handler()

    * Instead of splitting the return probe handling and cleanup logic across
    the pre and post trampoline handlers, all the work is pushed into the
    pre function (trampoline_probe_handler), and then we skip single stepping
    the original function. In this case the original instruction to be single
    stepped was just a NOP, and we can do without the extra interruption.

    The new flow of events to having a return probe handler execute when a target
    function exits is:

    * At system initialization time, a kprobe is inserted at the beginning of
    kretprobe_trampoline. kernel/kprobes.c use to handle this on it's own,
    but ia64 needed to do this a little differently (i.e. a function pointer
    is really a pointer to a structure containing the instruction pointer and
    a global pointer), so I added the notion of arch_init(), so that
    kernel/kprobes.c:init_kprobes() now allows architecture specific
    initialization by calling arch_init() before exiting. Each architecture
    now registers a kprobe on it's own trampoline function.

    * register_kretprobe() will insert a kprobe at the beginning of the targeted
    function with the kprobe pre_handler set to arch_prepare_kretprobe
    (still no change)

    * When the target function is entered, the kprobe is fired, calling
    arch_prepare_kretprobe (still no change)

    * In arch_prepare_kretprobe() we try to get a free instance and if one is
    available then we fill out the instance with a pointer to the return probe,
    the original return address, and a pointer to the task structure (instead
    of the stack address.) Just like before we change the return address
    to the trampoline function and mark the instance as used.

    If multiple return probes are registered for a given target function,
    then arch_prepare_kretprobe() will get called multiple times for the same
    task (since our kprobe implementation is able to handle multiple kprobes
    at the same address.) Past the first call to arch_prepare_kretprobe,
    we end up with the original address stored in the return probe instance
    pointing to our trampoline function. (This is a significant difference
    from the original arch_prepare_kretprobe design.)

    * Target function executes like normal and then returns to kretprobe_trampoline.

    * kprobe inserted on the first instruction of kretprobe_trampoline is fired
    and calls trampoline_probe_handler() (no change here)

    * trampoline_probe_handler() consumes each of the instances associated with
    the current task by calling the registered handler function and marking
    the instance as unused until an instance is found that has a return address
    different then the trampoline function.

    (change similar to my previous ia64 RFC)

    * If the task is killed with some left-over return probe instances (meaning
    that a target function was entered, but never returned), then we just
    free any instances associated with the task. (Not much different other
    then we can handle this without calling architecture specific functions.)

    There is a known problem that this patch does not yet solve where
    registering a return probe flush_old_exec or flush_thread will put us
    in a bad state. Most likely the best way to handle this is to not allow
    registering return probes on these two functions.

    (Significant change)

    This patch series applies to the 2.6.12-rc6-mm1 kernel, and provides:
    * kernel/kprobes.c changes
    * i386 patch of existing return probes implementation
    * x86_64 patch of existing return probe implementation
    * ia64 implementation
    * ppc64 implementation (provided by Ananth)

    This patch implements the architecture independant changes for a reworking
    of the kprobes based function return probes design. Changes include:

    * Removing functions for querying a return probe instance off a stack address
    * Removing the stack_addr field from the kretprobe_instance definition,
    and adding a task pointer
    * Adding architecture specific initialization via arch_init()
    * Removing extern definitions for the architecture trampoline functions
    (this isn't needed anymore since the architecture handles the
    initialization of the kprobe in the return probe trampoline function.)

    Signed-off-by: Rusty Lynch
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rusty Lynch
     
  • Now that PPC64 has no-execute support, here is a second try to fix the
    single step out of line during kprobe execution. Kprobes on x86_64 already
    solved this problem by allocating an executable page and using it as the
    scratch area for stepping out of line. Reuse that.

    Signed-off-by: Ananth N Mavinakayanahalli
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ananth N Mavinakayanahalli
     

24 Jun, 2005

5 commits

  • Presently either multiple kprobes or only one jprobe could be inserted.
    This patch removes the above limitation and allows one jprobe and multiple
    kprobes to coexist at the same address. However multiple jprobes cannot
    coexist with multiple kprobes. Currently I am working on the prototype to
    allow multiple jprobes coexist with multiple kprobes.

    Signed-off-by: Ananth N Mavinakayanhalli
    Signed-off-by: Prasanna S Panchamukhi
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Prasanna S Panchamukhi
     
  • In situations where a kprobes handler calls a routine which has a probe on it,
    then kprobes_handler() disarms the new probe forever. This patch removes the
    above limitation by temporarily disarming the new probe. When the another
    probe hits while handling the old probe, the kprobes_handler() saves previous
    kprobes state and handles the new probe without calling the new kprobes
    registered handlers. kprobe_post_handler() restores back the previous kprobes
    state and the normal execution continues.

    However on x86_64 architecture, re-rentrancy is provided only through
    pre_handler(). If a routine having probe is referenced through
    post_handler(), then the probes on that routine are disarmed forever, since
    the exception stack is gets changed after the processor single steps the
    instruction of the new probe.

    This patch includes generic changes to support temporary disarming on
    reentrancy of probes.

    Signed-of-by: Prasanna S Panchamukhi

    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Prasanna S Panchamukhi
     
  • This patch moves the lock/unlock of the arch specific kprobe_flush_task()
    to the non-arch specific kprobe_flusk_task().

    Signed-off-by: Hien Nguyen
    Acked-by: Prasanna S Panchamukhi
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Hien Nguyen
     
  • The architecture independent code of the current kprobes implementation is
    arming and disarming kprobes at registration time. The problem is that the
    code is assuming that arming and disarming is a just done by a simple write
    of some magic value to an address. This is problematic for ia64 where our
    instructions look more like structures, and we can not insert break points
    by just doing something like:

    *p->addr = BREAKPOINT_INSTRUCTION;

    The following patch to 2.6.12-rc4-mm2 adds two new architecture dependent
    functions:

    * void arch_arm_kprobe(struct kprobe *p)
    * void arch_disarm_kprobe(struct kprobe *p)

    and then adds the new functions for each of the architectures that already
    implement kprobes (spar64/ppc64/i386/x86_64).

    I thought arch_[dis]arm_kprobe was the most descriptive of what was really
    happening, but each of the architectures already had a disarm_kprobe()
    function that was really a "disarm and do some other clean-up items as
    needed when you stumble across a recursive kprobe." So... I took the
    liberty of changing the code that was calling disarm_kprobe() to call
    arch_disarm_kprobe(), and then do the cleanup in the block of code dealing
    with the recursive kprobe case.

    So far this patch as been tested on i386, x86_64, and ppc64, but still
    needs to be tested in sparc64.

    Signed-off-by: Rusty Lynch
    Signed-off-by: Anil S Keshavamurthy
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rusty Lynch
     
  • This patch adds function-return probes to kprobes for the i386
    architecture. This enables you to establish a handler to be run when a
    function returns.

    1. API

    Two new functions are added to kprobes:

    int register_kretprobe(struct kretprobe *rp);
    void unregister_kretprobe(struct kretprobe *rp);

    2. Registration and unregistration

    2.1 Register

    To register a function-return probe, the user populates the following
    fields in a kretprobe object and calls register_kretprobe() with the
    kretprobe address as an argument:

    kp.addr - the function's address

    handler - this function is run after the ret instruction executes, but
    before control returns to the return address in the caller.

    maxactive - The maximum number of instances of the probed function that
    can be active concurrently. For example, if the function is non-
    recursive and is called with a spinlock or mutex held, maxactive = 1
    should be enough. If the function is non-recursive and can never
    relinquish the CPU (e.g., via a semaphore or preemption), NR_CPUS should
    be enough. maxactive is used to determine how many kretprobe_instance
    objects to allocate for this particular probed function. If maxactive
    Signed-off-by: Prasanna S Panchamukhi
    Signed-off-by: Frederik Deweerdt
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Hien Nguyen
     

06 May, 2005

1 commit