Per the kernel.org up merge, it has been requested to remove the 
DIE_PAGE_FAULT because the notify chain kgdb attaches to does not 
receive this, and also to reorganize the kgdb_notify() routine to be 
cleaner.   Run time testing of all the edge cases shows there is no 
difference with this implementation vs the prior implementation.

Jason.


Signed-off-by: Jason Wessel <[EMAIL PROTECTED]>

---
 arch/i386/kernel/kgdb.c   |   71 
++++++++++++++++++++++++++++------------------
 arch/x86_64/kernel/kgdb.c |   68 
++++++++++++++++++++++++++++----------------
 include/asm-mips/kdebug.h |    1
 3 files changed, 88 insertions(+), 52 deletions(-)

Index: linux-2.6.21-standard/arch/i386/kernel/kgdb.c
===================================================================
--- linux-2.6.21-standard.orig/arch/i386/kernel/kgdb.c
+++ linux-2.6.21-standard/arch/i386/kernel/kgdb.c
@@ -303,41 +303,58 @@ int kgdb_arch_handle_exception(int e_vec
     return -1;
 }
 
-/* Register KGDB with the i386die_chain so that we hook into all of the 
right
- * spots. */
+static inline int single_step_cont(struct pt_regs *regs,
+            struct die_args *args)
+{
+    /* single step exception from kernel space to user space so
+     * eat the exception and continue the process
+     */
+    printk(KERN_ERR "KGDB: trap/step from kernel to user space,"
+            " resuming...\n");
+    kgdb_arch_handle_exception(args->trapnr, args->signr,
+            args->err, "c", "", regs);
+
+    return NOTIFY_STOP;
+}
+
 static int kgdb_notify(struct notifier_block *self, unsigned long cmd,
                void *ptr)
 {
     struct die_args *args = ptr;
     struct pt_regs *regs = args->regs;
 
-    /* Bad memory access? */
-    if (cmd == DIE_PAGE_FAULT_NO_CONTEXT && atomic_read(&debugger_active)
-        && kgdb_may_fault) {
-        kgdb_fault_longjmp(kgdb_fault_jmp_regs);
-        return NOTIFY_STOP;
-    } else if (cmd == DIE_PAGE_FAULT)
-        /* A normal page fault, ignore. */
+    switch (cmd) {
+    case DIE_NMI:
+    case DIE_NMI_IPI:
+        if (atomic_read(&debugger_active)) {
+            /* KGDB CPU roundup */
+            kgdb_nmihook(raw_smp_processor_id(), regs);
+            return NOTIFY_STOP;
+        }
         return NOTIFY_DONE;
-    else if ((cmd == DIE_NMI || cmd == DIE_NMI_IPI ||
-              cmd == DIE_NMIWATCHDOG) && atomic_read(&debugger_active)) {
-        /* CPU roundup */
-        kgdb_nmihook(raw_smp_processor_id(), regs);
-        return NOTIFY_STOP;
-    } else if (cmd == DIE_DEBUG
-               && atomic_read(&cpu_doing_single_step) == 
raw_smp_processor_id()
-               && user_mode(regs)) {
-        /* single step exception from kernel space to user space so
-         * eat the exception and continue the process
-         */
-        printk(KERN_ERR "KGDB: trap/step from kernel to user space, 
resuming...\n");
-        kgdb_arch_handle_exception(args->trapnr, args->signr, 
args->err, "c","",regs);
+    case DIE_NMIWATCHDOG:
+        if (atomic_read(&debugger_active)) {
+            /* KGDB CPU roundup */
+            kgdb_nmihook(raw_smp_processor_id(), regs);
+            return NOTIFY_STOP;
+        }
+        /* Enter debugger */
+        break;
+    case DIE_DEBUG:
+        if (atomic_read(&cpu_doing_single_step) ==
+            raw_smp_processor_id() &&
+            user_mode(regs))
+            return single_step_cont(regs, args);
+        /* fall through */
+    default:
+        if (user_mode(regs))
+            return NOTIFY_DONE;
+    }
+
+    if (kgdb_may_fault) {
+        kgdb_fault_longjmp(kgdb_fault_jmp_regs);
         return NOTIFY_STOP;
-    } else if (cmd == DIE_NMI_IPI || cmd == DIE_NMI || user_mode(regs) ||
-               (cmd == DIE_DEBUG && atomic_read(&debugger_active)))
-        /* Normal watchdog event or userspace debugging, or spurious
-         * debug exception, ignore. */
-        return NOTIFY_DONE;
+    }
 
     if (kgdb_handle_exception(args->trapnr, args->signr,
        args->err, regs))
Index: linux-2.6.21-standard/arch/x86_64/kernel/kgdb.c
===================================================================
--- linux-2.6.21-standard.orig/arch/x86_64/kernel/kgdb.c
+++ linux-2.6.21-standard/arch/x86_64/kernel/kgdb.c
@@ -379,38 +379,58 @@ struct pt_regs *kgdb_shadow_regs(struct
     return NULL;
 }
 
-/* Register KGDB with the die_chain so that we hook into all of the right
- * spots. */
+static inline int single_step_cont(struct pt_regs *regs,
+            struct die_args *args)
+{
+    /* single step exception from kernel space to user space so
+     * eat the exception and continue the process
+     */
+    printk(KERN_ERR "KGDB: trap/step from kernel to user space,"
+            " resuming...\n");
+    kgdb_arch_handle_exception(args->trapnr, args->signr,
+            args->err, "c", "", regs);
+
+    return NOTIFY_STOP;
+}
+
 static int kgdb_notify(struct notifier_block *self, unsigned long cmd,
                void *ptr)
 {
     struct die_args *args = ptr;
     struct pt_regs *regs = args->regs;
 
-    if (cmd == DIE_PAGE_FAULT_NO_CONTEXT && atomic_read(&debugger_active)
-            && kgdb_may_fault) {
+    switch (cmd) {
+    case DIE_NMI:
+    case DIE_NMI_IPI:
+        if (atomic_read(&debugger_active)) {
+            /* KGDB CPU roundup */
+            kgdb_nmihook(raw_smp_processor_id(), regs);
+            return NOTIFY_STOP;
+        }
+        return NOTIFY_DONE;
+    case DIE_NMIWATCHDOG:
+        if (atomic_read(&debugger_active)) {
+            /* KGDB CPU roundup */
+            kgdb_nmihook(raw_smp_processor_id(), regs);
+            return NOTIFY_STOP;
+        }
+        /* Enter debugger */
+        break;
+    case DIE_DEBUG:
+        if (atomic_read(&cpu_doing_single_step) ==
+            raw_smp_processor_id() &&
+            user_mode(regs))
+            return single_step_cont(regs, args);
+        /* fall through */
+    default:
+        if (user_mode(regs))
+            return NOTIFY_DONE;
+    }
+
+    if (kgdb_may_fault) {
         kgdb_fault_longjmp(kgdb_fault_jmp_regs);
         return NOTIFY_STOP;
-    /* CPU roundup? */
-    } else if (atomic_read(&debugger_active) && cmd == DIE_NMI_IPI) {
-        kgdb_nmihook(raw_smp_processor_id(), regs);
-        return NOTIFY_STOP;
-        /* See if KGDB is interested. */
-    } else if (cmd == DIE_DEBUG
-               && atomic_read(&cpu_doing_single_step) == 
raw_smp_processor_id()
-               && user_mode(regs)) {
-        /* single step exception from kernel space to user space so
-         * eat the exception and continue the process
-         */
-        printk(KERN_ERR "KGDB: trap/step from kernel to user space, 
resuming...\n");
-        kgdb_arch_handle_exception(args->trapnr, args->signr, 
args->err, "c","",regs);
-        return NOTIFY_STOP;
-    } else if (cmd == DIE_PAGE_FAULT || user_mode(regs) ||
-           cmd == DIE_NMI_IPI || (cmd == DIE_DEBUG &&
-                      atomic_read(&debugger_active)))
-        /* Userpace events, normal watchdog event, or spurious
-         * debug exception.  Ignore. */
-        return NOTIFY_DONE;
+    }
 
     if (kgdb_handle_exception(args->trapnr, args->signr,
         args->err, regs))
Index: linux-2.6.21-standard/include/asm-mips/kdebug.h
===================================================================
--- linux-2.6.21-standard.orig/include/asm-mips/kdebug.h
+++ linux-2.6.21-standard/include/asm-mips/kdebug.h
@@ -30,7 +30,6 @@ enum die_val {
     DIE_DIE,
     DIE_KERNELDEBUG,
     DIE_TRAP,
-    DIE_PAGE_FAULT,
 };
 
 /*


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Kgdb-bugreport mailing list
Kgdb-bugreport@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

Reply via email to