Re: [RFC][PATCH 5/5 v2] x86: Allow NMIs to hit breakpoints in i386

From: Mathieu Desnoyers
Date: Wed Dec 14 2011 - 08:30:29 EST


* Steven Rostedt (rostedt@xxxxxxxxxxx) wrote:
[...]> From: Steven Rostedt <srostedt@xxxxxxxxxx>
> +#define nmi_preprocess(regs) \
> + do { \
> + if (__get_cpu_var(nmi_state) != NMI_NOT_RUNNING) { \
> + __get_cpu_var(nmi_state) = NMI_LATCHED; \
> + return; \
> + } \
> + nmi_restart: \
> + __get_cpu_var(nmi_state) = NMI_EXECUTING; \
> + } while (0)
> +
> +#define nmi_postprocess() \
> + do { \
> + if (cmpxchg(&__get_cpu_var(nmi_state), \
> + NMI_EXECUTING, NMI_NOT_RUNNING) != NMI_EXECUTING) \
> + goto nmi_restart; \
> + } while (0)
> +
[...]
> +dotraplinkage notrace __kprobes void
> +do_nmi(struct pt_regs *regs, long error_code)
> +{
> + nmi_preprocess(regs);
> +
> nmi_enter();
>
> inc_irq_stat(__nmi_count);
> @@ -428,8 +515,7 @@ do_nmi(struct pt_regs *regs, long error_code)
>
> nmi_exit();
>
> - if (unlikely(update_debug_stack))
> - reset_debug_stack();
> + nmi_postprocess();

Just to make sure I understand: if an NMI nests over do_nmi between
nmi_postprocess() and the following iret (in which case the CPU is in
state NMI_NOT_RUNNING), we will end up with two NMI handlers nested on
the stack, right ? Given that there is no upper-bound on the nesting
level of this situation (although nesting like this more than once is
extremely unlikely), is this side-effect something we should care about
in terms of stack space usage ? Also, is the stack dump OOPS handler
aware of this stack layout that was until now impossible ?

Thanks,

Mathieu

> }
>
> void stop_nmi(void)
> --
> 1.7.7.3
>
>

--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/