提交 5a14fead 编写于 作者: A Anton Vorontsov 提交者: Greg Kroah-Hartman

kernel/debug: Mask KGDB NMI upon entry

The new arch callback should manage NMIs that usually cause KGDB to
enter. That is, not all NMIs should be enabled/disabled, but only
those that issue kgdb_handle_exception().

We must mask it as serial-line interrupt can be used as an NMI, so
if the original KGDB-entry cause was say a breakpoint, then every
input to KDB console will cause KGDB to reenter, which we don't want.
Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
Acked-by: NJason Wessel <jason.wessel@windriver.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 c5dd553b
...@@ -240,6 +240,7 @@ extern void kgdb_arch_late(void); ...@@ -240,6 +240,7 @@ extern void kgdb_arch_late(void);
* hardware breakpoints. * hardware breakpoints.
* @correct_hw_break: Allow an architecture to specify how to correct the * @correct_hw_break: Allow an architecture to specify how to correct the
* hardware debug registers. * hardware debug registers.
* @enable_nmi: Manage NMI-triggered entry to KGDB
*/ */
struct kgdb_arch { struct kgdb_arch {
unsigned char gdb_bpt_instr[BREAK_INSTR_SIZE]; unsigned char gdb_bpt_instr[BREAK_INSTR_SIZE];
...@@ -252,6 +253,8 @@ struct kgdb_arch { ...@@ -252,6 +253,8 @@ struct kgdb_arch {
void (*disable_hw_break)(struct pt_regs *regs); void (*disable_hw_break)(struct pt_regs *regs);
void (*remove_all_hw_break)(void); void (*remove_all_hw_break)(void);
void (*correct_hw_break)(void); void (*correct_hw_break)(void);
void (*enable_nmi)(bool on);
}; };
/** /**
......
...@@ -672,6 +672,10 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs) ...@@ -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 kgdb_var;
struct kgdb_state *ks = &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->cpu = raw_smp_processor_id();
ks->ex_vector = evector; ks->ex_vector = evector;
...@@ -681,11 +685,15 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs) ...@@ -681,11 +685,15 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs)
ks->linux_regs = regs; ks->linux_regs = regs;
if (kgdb_reenter_check(ks)) if (kgdb_reenter_check(ks))
return 0; /* Ouch, double exception ! */ goto out; /* Ouch, double exception ! */
if (kgdb_info[ks->cpu].enter_kgdb != 0) 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) int kgdb_nmicallback(int cpu, void *regs)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册