27 Jul, 2011

1 commit

  • This allows us to move duplicated code in
    (atomic_inc_not_zero() for now) to

    Signed-off-by: Arun Sharma
    Reviewed-by: Eric Dumazet
    Cc: Ingo Molnar
    Cc: David Miller
    Cc: Eric Dumazet
    Acked-by: Mike Frysinger
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arun Sharma
     

31 Mar, 2011

1 commit


30 Oct, 2010

1 commit

  • The kgdb_disable_hw_debug() was an architecture specific function for
    disabling all hardware breakpoints on a per cpu basis when entering
    the debug core.

    This patch will remove the weak function kdbg_disable_hw_debug() and
    change it into a call back which lives with the rest of hw breakpoint
    call backs in struct kgdb_arch.

    Signed-off-by: Dongdong Deng
    Signed-off-by: Jason Wessel

    Dongdong Deng
     

23 Oct, 2010

5 commits

  • The kdb shell needs to enforce switching back to the original CPU that
    took the exception before restoring normal kernel execution. Resuming
    from a different CPU than what took the original exception will cause
    problems with spin locks that are freed from the a different processor
    than had taken the lock.

    The special logic in dbg_cpu_switch() can go away entirely with
    because the state of what cpus want to be masters or slaves will
    remain unchanged between entry and exit of the debug_core exception
    context.

    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • For quite some time there have been problems with memory barriers and
    various races with NMI on multi processor systems using the kernel
    debugger. The algorithm for entering the kernel debug core and
    resuming kernel execution was racy and had several known edge case
    problems with attempting to debug something on a heavily loaded system
    using breakpoints that are hit repeatedly and quickly.

    The prior "locking" design entry worked as follows:

    * The atomic counter kgdb_active was used with atomic exchange in
    order to elect a master cpu out of all the cpus that may have
    taken a debug exception.
    * The master cpu increments all elements of passive_cpu_wait[].
    * The master cpu issues the round up cpus message.
    * Each "slave cpu" that enters the debug core increments its own
    element in cpu_in_kgdb[].
    * Each "slave cpu" spins on passive_cpu_wait[] until it becomes 0.
    * The master cpu debugs the system.

    The new scheme removes the two arrays of atomic counters and replaces
    them with 2 single counters. One counter is used to count the number
    of cpus waiting to become a master cpu (because one or more hit an
    exception). The second counter is use to indicate how many cpus have
    entered as slave cpus.

    The new entry logic works as follows:

    * One or more cpus enters via kgdb_handle_exception() and increments
    the masters_in_kgdb. Each cpu attempts to get the spin lock called
    dbg_master_lock.
    * The master cpu sets kgdb_active to the current cpu.
    * The master cpu takes the spinlock dbg_slave_lock.
    * The master cpu asks to round up all the other cpus.
    * Each slave cpu that is not already in kgdb_handle_exception()
    will enter and increment slaves_in_kgdb. Each slave will now spin
    try_locking on dbg_slave_lock.
    * The master cpu waits for the sum of masters_in_kgdb and slaves_in_kgdb
    to be equal to the sum of the online cpus.
    * The master cpu debugs the system.

    In the new design the kgdb_active can only be changed while holding
    dbg_master_lock. Stress testing has not turned up any further
    entry/exit races that existed in the prior locking design. The prior
    locking design suffered from atomic variables not being truly atomic
    (in the capacity as used by kgdb) along with memory barrier races.

    Signed-off-by: Jason Wessel
    Acked-by: Dongdong Deng

    Jason Wessel
     
  • The slave cpus do not have the hw breakpoints disabled upon entry to
    the debug_core and as a result could cause unrecoverable recursive
    faults on badly placed breakpoints, or get out of sync with the arch
    specific hw breakpoint operations.

    This patch addresses the problem by invoking kgdb_disable_hw_debug()
    earlier in kgdb_enter_cpu for each cpu that enters the debug core.

    The hw breakpoint dis/enable flow should be:

    master_debug_cpu slave_debug_cpu
    \ /
    kgdb_cpu_enter
    |
    kgdb_disable_hw_debug --> uninstall pre-enabled hw_breakpoint
    |
    do add/rm dis/enable operates to hw_breakpoints on master_debug_cpu..
    |
    correct_hw_break --> correct/install the enabled hw_breakpoint
    |
    leave_kgdb

    Signed-off-by: Dongdong Deng
    Signed-off-by: Jason Wessel

    Dongdong Deng
     
  • When returning from the kernel debugger reset the rcu jiffies_stall
    value to prevent the rcu stall detector from sending NMI events which
    invoke a stack dump for each cpu in the system.

    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • Move the various clock and watch dog syncs to a single function in
    advance of adding another sync for the rcu stall detector.

    Signed-off-by: Jason Wessel

    Jason Wessel
     

20 Aug, 2010

1 commit


06 Aug, 2010

1 commit

  • * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb:
    debug_core,kdb: fix crash when arch does not have single step
    kgdb,x86: use macro HBP_NUM to replace magic number 4
    kgdb,mips: remove unused kgdb_cpu_doing_single_step operations
    mm,kdb,kgdb: Add a debug reference for the kdb kmap usage
    KGDB: Remove set but unused newPC
    ftrace,kdb: Allow dumping a specific cpu's buffer with ftdump
    ftrace,kdb: Extend kdb to be able to dump the ftrace buffer
    kgdb,powerpc: Replace hardcoded offset by BREAK_INSTR_SIZE
    arm,kgdb: Add ability to trap into debugger on notify_die
    gdbstub: do not directly use dbg_reg_def[] in gdb_cmd_reg_set()
    gdbstub: Implement gdbserial 'p' and 'P' packets
    kgdb,arm: Individual register get/set for arm
    kgdb,mips: Individual register get/set for mips
    kgdb,x86: Individual register get/set for x86
    kgdb,kdb: individual register set and and get API
    gdbstub: Optimize kgdb's "thread:" response for the gdb serial protocol
    kgdb: remove custom hex_to_bin()implementation

    Linus Torvalds
     

05 Aug, 2010

1 commit

  • When an arch such as mips and microblaze does not implement either HW
    or software single stepping the debug core should re-enter kdb. The
    kdb code will properly ignore the single step operation. Attempting
    to single step the kernel without software or hardware support causes
    unpredictable kernel crashes.

    Signed-off-by: Jason Wessel

    Jason Wessel
     

04 Aug, 2010

1 commit


22 Jul, 2010

1 commit

  • Immediately following an exit from the kdb shell the kgdb_connected
    variable should be set to zero, unless there are breakpoints planted.
    If the kgdb_connected variable is not zeroed out with kdb, it is
    impossible to turn off kdb.

    This patch is merely a work around for now, the real fix will check
    for the breakpoints.

    Signed-off-by: Jason Wessel

    Jason Wessel
     

19 Jul, 2010

1 commit


21 May, 2010

11 commits

  • The kernel debugger can operate well before mm_init(), but the x86
    hardware breakpoint code which uses the perf api requires that the
    kernel allocators are initialized.

    This means the kernel debug core needs to provide an optional arch
    specific call back to allow the initialization functions to run after
    the kernel has been further initialized.

    The kdb shell already had a similar restriction with an early
    initialization and late initialization. The kdb_init() was moved into
    the debug core's version of the late init which is called
    dbg_late_init();

    CC: kgdb-bugreport@lists.sourceforge.net
    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • It is highly desirable to trap into kdb on panic. The debug core will
    attempt to register as the first in line for the panic notifier.

    CC: Ingo Molnar
    CC: Andrew Morton
    CC: Eric W. Biederman
    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • This allows kdb to debug a crash with in the kms code with a
    single level recursive re-entry.

    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • Some kgdb I/O modules require the ability to create a breakpoint
    tasklet, such as kgdboc and external modules such as kgdboe. The
    breakpoint tasklet is used as an asynchronous entry point into the
    debugger which will have a different function scope than the current
    execution path where it might not be safe to have an inline
    breakpoint. This is true of some of the kgdb I/O drivers which share
    code with kgdb and rest of the kernel users.

    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • The only way the debugger can handle a trap in inside rcu_lock,
    notify_die, or atomic_notifier_call_chain without a triple fault is
    to have a low level "first opportunity handler" in the int3 exception
    handler.

    Generally this will be something the vast majority of folks will not
    need, but for those who need it, it is added as a kernel .config
    option called KGDB_LOW_LEVEL_TRAP.

    CC: Ingo Molnar
    CC: Thomas Gleixner
    CC: H. Peter Anvin
    CC: x86@kernel.org
    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • Remove all the references to the kgdb_post_primary_code. This
    function serves no useful purpose because you can obtain the same
    information from the "struct kgdb_state *ks" from with in the
    debugger, if for some reason you want the data.

    Also remove the unintentional duplicate assignment for ks->ex_vector.

    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • One of the driving forces behind integrating another front end (kdb)
    to the debug core is to allow front end commands to be accessible via
    gdb's monitor command. It is true that you could write gdb macros to
    get certain data, but you may want to just use gdb to access the
    commands that are available in the kdb front end.

    This patch implements the Rcmd gdb stub packet. In gdb you access
    this with the "monitor" command. For instance you could type "monitor
    help", "monitor lsmod" or "monitor ps A" etc...

    There is no error checking or command restrictions on what you can and
    cannot access at this point. Doing something like trying to set
    breakpoints with the monitor command is going to cause nothing but
    problems. Perhaps in the future only the commands that are actually
    known to work with the gdb monitor command will be available.

    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • The design of the kdb shell requires that every device that can
    provide input to kdb have a polling routine that exits immediately if
    there is no character available. This is required in order to get the
    page scrolling mechanism working.

    Changing the kernel debugger I/O API to require all polling character
    routines to exit immediately if there is no data allows the kernel
    debugger to process multiple input channels.

    NO_POLL_CHAR will be the return code to the polling routine when ever
    there is no character available.

    CC: linux-serial@vger.kernel.org
    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • These are the minimum changes to the kgdb core in order to enable an
    API to connect a new front end (kdb) to the debug core.

    This patch introduces the dbg_kdb_mode variable controls where the
    user level I/O is routed. It will be routed to the gdbstub (kgdb) or
    to the kdb front end which is a simple shell available over the kgdboc
    connection.

    You can switch back and forth between kdb or the gdb stub mode of
    operation dynamically. From gdb stub mode you can blindly type
    "$3#33", or from the kdb mode you can enter "kgdb" to switch to the
    gdb stub.

    The logic in the debug core depends on kdb to look for the typical gdb
    connection sequences and return immediately with KGDB_PASS_EVENT if a
    gdb serial command sequence is detected. That should allow a
    reasonably seamless transition between kdb -> gdb without leaving the
    kernel exception state. The two gdb serial queries that kdb is
    responsible for detecting are the "?" and "qSupported" packets.

    CC: Ingo Molnar
    Signed-off-by: Jason Wessel
    Acked-by: Martin Hicks

    Jason Wessel
     
  • Split the former kernel/kgdb.c into debug_core.c which contains the
    kernel debugger exception logic and to the gdbstub.c which contains
    the logic for allowing gdb to talk to the debug core.

    This also created a private include file called debug_core.h which
    contains all the definitions to glue the debug_core to any other
    debugger connections.

    CC: Ingo Molnar
    Signed-off-by: Jason Wessel

    Jason Wessel
     
  • Move kgdb.c in preparation to separate the gdbstub from the debug
    core and exception handling.

    CC: Ingo Molnar
    Signed-off-by: Jason Wessel

    Jason Wessel