From 3270a8204e2d1709e819a11475f5f888ebe61d4a Mon Sep 17 00:00:00 2001 From: Anton Vorontsov Date: Mon, 24 Sep 2012 14:27:50 -0700 Subject: [PATCH] --- yaml --- r: 325791 b: refs/heads/master c: 5a14fead07bcf4e0acc877a8d9e1d1f40a441153 h: refs/heads/master i: 325789: d4c3c701a33ab02f5bbf9cd0c5afe45149498048 325787: 31a5d7e758529dfa91b5f524b1984f841d081cf2 325783: 4ad1f52056daf45efae922f87b116aa557532aec 325775: a4a5121ff37c87030fbd4253d2857d35574cab73 325759: 8d713cdf49df1f3dea62ee70c97ed5ebea5d61ef v: v3 --- [refs] | 2 +- trunk/include/linux/kgdb.h | 3 +++ trunk/kernel/debug/debug_core.c | 14 +++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 85dd8bff8b3b..9a9dd48f11a8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c5dd553b9fd069892c9e2de734f4f604e280fa7a +refs/heads/master: 5a14fead07bcf4e0acc877a8d9e1d1f40a441153 diff --git a/trunk/include/linux/kgdb.h b/trunk/include/linux/kgdb.h index c4d2fc194ede..7800cce284db 100644 --- a/trunk/include/linux/kgdb.h +++ b/trunk/include/linux/kgdb.h @@ -240,6 +240,7 @@ extern void kgdb_arch_late(void); * hardware breakpoints. * @correct_hw_break: Allow an architecture to specify how to correct the * hardware debug registers. + * @enable_nmi: Manage NMI-triggered entry to KGDB */ struct kgdb_arch { unsigned char gdb_bpt_instr[BREAK_INSTR_SIZE]; @@ -252,6 +253,8 @@ struct kgdb_arch { void (*disable_hw_break)(struct pt_regs *regs); void (*remove_all_hw_break)(void); void (*correct_hw_break)(void); + + void (*enable_nmi)(bool on); }; /** diff --git a/trunk/kernel/debug/debug_core.c b/trunk/kernel/debug/debug_core.c index 0557f24c6bca..17e073c309e6 100644 --- a/trunk/kernel/debug/debug_core.c +++ b/trunk/kernel/debug/debug_core.c @@ -672,6 +672,10 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs) { struct kgdb_state kgdb_var; struct kgdb_state *ks = &kgdb_var; + int ret = 0; + + if (arch_kgdb_ops.enable_nmi) + arch_kgdb_ops.enable_nmi(0); ks->cpu = raw_smp_processor_id(); ks->ex_vector = evector; @@ -681,11 +685,15 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs) ks->linux_regs = regs; if (kgdb_reenter_check(ks)) - return 0; /* Ouch, double exception ! */ + goto out; /* Ouch, double exception ! */ if (kgdb_info[ks->cpu].enter_kgdb != 0) - return 0; + goto out; - return kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER); + ret = kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER); +out: + if (arch_kgdb_ops.enable_nmi) + arch_kgdb_ops.enable_nmi(1); + return ret; } int kgdb_nmicallback(int cpu, void *regs)