Subject: Re: [PATCH] powerpc: Invoke kdump for system reset exception

From: Benjamin Herrenschmidt <[email-masked]>
Date: Thu, 27 Aug 2009 13:54:47 +1000

On Mon, 2009-08-24 at 08:42 +0530, M. Mohan Kumar wrote:
> Invoke kdump for system reset exception
> 
> Dump restart operation from HMC raises system reset exception
> (0x100) and xmon is invoked(even if kdump kernel is loaded). User has to
> exit from xmon by saying 'Don't recover' to invoke kdump. Modify this
> behaviour so that xmon will return immediately for system reset
> exception and kdump kernel will be invoked (if its loaded). If kdump
> kernel is not loaded, proceed with xmon

Hi Mohan !

This is not right. The way things -should- already work is that xmon
will only kick in if it's been enabled (aka initialized). This happens
normally if either:

	- CONFIG_XMON_DEFAULT is set, which forces enable it at boot. This
should not be set on distro kernels

	- The command line says xmon=early or xmon=on, in which case xmon will
be enabled during early boot (and in the case of xmon=early, you'll drop
into it early during boot, for example to get a chance to set some
breakpoints).

So on a normal distro kernel, where CONFIG_XMON_DEFAULT should not be
set (if it is, they need to fix it), xmon will not be initialized, and a
System Reset exception should trigger a kdump. If it doesn't, then
there's a bug elsewhere, but the fix isn't to modify xmon.

Cheers,
Ben.

> Signed-off-by: M. Mohan Kumar <[email-masked]>
> ---
>  arch/powerpc/xmon/xmon.c |    9 +++++++++
>  1 files changed, 9 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> index e1f33a8..6847334 100644
> --- a/arch/powerpc/xmon/xmon.c
> +++ b/arch/powerpc/xmon/xmon.c
> @@ -23,6 +23,7 @@
>  #include <linux/interrupt.h>
>  #include <linux/irq.h>
>  #include <linux/bug.h>
> +#include <linux/kexec.h>
>  
>  #include <asm/ptrace.h>
>  #include <asm/string.h>
> @@ -348,6 +349,14 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
>  	unsigned long timeout;
>  #endif
>  
> +	/*
> +	 * If the exception is 0x100 and if kexec crash image is loaded,
> +	 * continue with kexec_crash
> +	 */
> +	if (kexec_should_crash(current) && kexec_crash_image &&
> +					regs->trap == 0x100)
> +		return 0;
> +
>  	local_irq_save(flags);
>  
>  	bp = in_breakpoint_table(regs->nip, &offset);