lkml.org 
[lkml]   [2004]   [Feb]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH][2/3] Update CVS KGDB's have kgdb_{schedule,process}_breakpoint
    The following adds, and then makes use of kgdb_process_breakpoint /
    kgdb_schedule_breakpoint. Using it i kgdb_8250.c isn't strictly needed,
    but it isn't wrong either.

    # This is a BitKeeper generated patch for the following project:
    # Project Name: Linux kernel tree
    # This patch format is intended for GNU patch command version 2.5 or higher.
    # This patch includes the following deltas:
    # ChangeSet 1.1663 -> 1.1664
    # arch/i386/kernel/irq.c 1.48 -> 1.49
    # drivers/net/kgdb_eth.c 1.2 -> 1.3
    # arch/x86_64/kernel/irq.c 1.21 -> 1.22
    # drivers/serial/kgdb_8250.c 1.3 -> 1.4
    # kernel/kgdb.c 1.3 -> 1.4
    # arch/ppc/kernel/irq.c 1.36 -> 1.37
    # include/linux/kgdb.h 1.3 -> 1.4
    #
    # The following is the BitKeeper ChangeSet Log
    # --------------------------------------------
    # 04/02/25 trini@kernel.crashing.org 1.1664
    # process_breakpoint/schedule_breakpoint.
    # --------------------------------------------
    #
    diff -Nru a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
    --- a/arch/i386/kernel/irq.c Wed Feb 25 14:21:32 2004
    +++ b/arch/i386/kernel/irq.c Wed Feb 25 14:21:32 2004
    @@ -34,6 +34,7 @@
    #include <linux/proc_fs.h>
    #include <linux/seq_file.h>
    #include <linux/kallsyms.h>
    +#include <linux/kgdb.h>

    #include <asm/atomic.h>
    #include <asm/io.h>
    @@ -507,6 +508,8 @@
    spin_unlock(&desc->lock);

    irq_exit();
    +
    + kgdb_process_breakpoint();

    return 1;
    }
    diff -Nru a/arch/ppc/kernel/irq.c b/arch/ppc/kernel/irq.c
    --- a/arch/ppc/kernel/irq.c Wed Feb 25 14:21:32 2004
    +++ b/arch/ppc/kernel/irq.c Wed Feb 25 14:21:32 2004
    @@ -46,6 +46,7 @@
    #include <linux/random.h>
    #include <linux/seq_file.h>
    #include <linux/cpumask.h>
    +#include <linux/kgdb.h>

    #include <asm/uaccess.h>
    #include <asm/bitops.h>
    @@ -536,7 +537,9 @@
    if (irq != -2 && first)
    /* That's not SMP safe ... but who cares ? */
    ppc_spurious_interrupts++;
    - irq_exit();
    + irq_exit();
    +
    + kgdb_process_breakpoint();
    }

    unsigned long probe_irq_on (void)
    diff -Nru a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c
    --- a/arch/x86_64/kernel/irq.c Wed Feb 25 14:21:32 2004
    +++ b/arch/x86_64/kernel/irq.c Wed Feb 25 14:21:32 2004
    @@ -405,6 +405,8 @@
    spin_unlock(&desc->lock);

    irq_exit();
    +
    + kgdb_process_breakpoint();
    return 1;
    }

    diff -Nru a/drivers/net/kgdb_eth.c b/drivers/net/kgdb_eth.c
    --- a/drivers/net/kgdb_eth.c Wed Feb 25 14:21:32 2004
    +++ b/drivers/net/kgdb_eth.c Wed Feb 25 14:21:32 2004
    @@ -60,7 +60,6 @@
    static atomic_t in_count;
    int kgdboe = 0; /* Default to tty mode */

    -extern void breakpoint(void);
    static void rx_hook(struct netpoll *np, int port, char *msg, int len);

    static struct netpoll np = {
    @@ -106,14 +105,12 @@

    np->remote_port = port;

    - /* Is this gdb trying to attach? */
    - if (!netpoll_trap() && len == 8 && !strncmp(msg, "$Hc-1#09", 8))
    - breakpoint();
    + /* Is this gdb trying to attach (!kgdb_connected) or break in
    + * (msg[0] == 3) ? */
    + if (!netpoll_trap() && (!kgdb_connected || msg[0] == 3))
    + kgdb_schedule_breakpoint();

    for (i = 0; i < len; i++) {
    - if (msg[i] == 3)
    - breakpoint();
    -
    if (atomic_read(&in_count) >= IN_BUF_SIZE) {
    /* buffer overflow, clear it */
    in_head = in_tail = 0;
    diff -Nru a/drivers/serial/kgdb_8250.c b/drivers/serial/kgdb_8250.c
    --- a/drivers/serial/kgdb_8250.c Wed Feb 25 14:21:32 2004
    +++ b/drivers/serial/kgdb_8250.c Wed Feb 25 14:21:32 2004
    @@ -248,7 +248,7 @@

    /* If we get an interrupt, then KGDB is trying to connect. */
    if (!kgdb_connected) {
    - breakpoint();
    + kgdb_schedule_breakpoint();
    return IRQ_HANDLED;
    }

    diff -Nru a/include/linux/kgdb.h b/include/linux/kgdb.h
    --- a/include/linux/kgdb.h Wed Feb 25 14:21:32 2004
    +++ b/include/linux/kgdb.h Wed Feb 25 14:21:32 2004
    @@ -11,8 +11,22 @@
    #include <asm/atomic.h>
    #include <linux/debugger.h>

    +/*
    + * This file should not include ANY others. This makes it usable
    + * most anywhere without the fear of include order or inclusion.
    + * TODO: Make it so!
    + *
    + * This file may be included all the time. It is only active if
    + * CONFIG_KGDB is defined, otherwise it stubs out all the macros
    + * and entry points.
    + */
    +
    +#if defined(CONFIG_KGDB) && !defined(__ASSEMBLY__)
    /* To enter the debugger explicitly. */
    -void breakpoint(void);
    +extern void breakpoint(void);
    +extern void kgdb_schedule_breakpoint(void);
    +extern void kgdb_process_breakpoint(void);
    +extern volatile int kgdb_connected;

    #ifndef KGDB_MAX_NO_CPUS
    #if CONFIG_NR_CPUS > 8
    @@ -112,4 +126,7 @@
    char *kgdb_hex2mem(char *buf, char *mem, int count);
    int kgdb_get_mem(char *addr, unsigned char *buf, int count);

    +#else
    +#define kgdb_process_breakpoint() do {} while(0)
    +#endif /* KGDB && !__ASSEMBLY__ */
    #endif /* _KGDB_H_ */
    diff -Nru a/kernel/kgdb.c b/kernel/kgdb.c
    --- a/kernel/kgdb.c Wed Feb 25 14:21:32 2004
    +++ b/kernel/kgdb.c Wed Feb 25 14:21:32 2004
    @@ -1169,6 +1169,29 @@
    printk("Connected.\n");
    }

    +/*
    + * Sometimes we need to schedule a breakpoint because we can't break
    + * right where we are.
    + */
    +static int kgdb_need_breakpoint[NR_CPUS];
    +
    +void kgdb_schedule_breakpoint(void)
    +{
    + kgdb_need_breakpoint[smp_processor_id()] = 1;
    +}
    +
    +void kgdb_process_breakpoint(void)
    +{
    + /*
    + * Handle a breakpoint queued from inside network driver code
    + * to avoid reentrancy issues
    + */
    + if (kgdb_need_breakpoint[smp_processor_id()]) {
    + kgdb_need_breakpoint[smp_processor_id()] = 0;
    + breakpoint();
    + }
    +}
    +
    #ifdef CONFIG_KGDB_CONSOLE
    char kgdbconbuf[BUFMAX];

    --
    Tom Rini
    http://gate.crashing.org/~trini/
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-03-22 14:01    [W:2.329 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site