[PATCH] add reg and stack dump to booke WD handler

Kumar Gala galak at kernel.crashing.org
Sat Apr 14 06:11:51 EST 2007


On Apr 13, 2007, at 3:06 PM, Dave Jiang wrote:

> Have the booke watchdog dump some useful information when  
> triggered. Hopefully
> that'll give the user some hint of what happened rather than just a  
> mysterious
> reboot.

Forgot the signed-off-by again (git-commit -s)

> --
>
>  Ok here's try 2. Modified the watchdog driver instead per Sergei's  
> suggestion.

I'm against having a WatchdogHandler in booke_wdt.c.  The idea behind  
the weak symbol in traps.c is to allow platform code to override the  
behavior.  I'm ok if we put the spew in the generic case.

Also, how are you testing this?

- k

>
>  drivers/char/watchdog/booke_wdt.c |   37 ++++++++++++++++++++++++++ 
> +++++++++++
>  1 files changed, 37 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/char/watchdog/booke_wdt.c b/drivers/char/ 
> watchdog/booke_wdt.c
> index 0e23f29..90e5301 100644
> --- a/drivers/char/watchdog/booke_wdt.c
> +++ b/drivers/char/watchdog/booke_wdt.c
> @@ -23,6 +23,7 @@
>  #include <asm/reg_booke.h>
>  #include <asm/uaccess.h>
>  #include <asm/system.h>
> +#include <asm/machdep.h>
>
>  /* If the kernel parameter wdt_enable=1, the watchdog will be  
> enabled at boot.
>   * Also, the wdt_period sets the watchdog timer period timeout.
> @@ -47,6 +48,42 @@ u32 booke_wdt_period = WDT_PERIOD_DEFAULT;
>  #define WDTP(x)		(TCR_WP(x))
>  #endif
>
> +void WatchdogHandler(struct pt_regs *regs)
> +{
> +	unsigned long flags;
> +
> +	mtspr(SPRN_TCR, mfspr(SPRN_TCR) & ~TCR_WIE);
> +	oops_enter();
> +
> +	console_verbose();
> +	bust_spinlocks(1);
> +	local_save_flags(flags);
> +
> +#ifdef CONFIG_PREEMPT
> +	printk("PREEMPT ");
> +#endif
> +#ifdef CONFIG_SMP
> +	printk("SMP NR_CPUS=%d ", NR_CPUS);
> +#endif
> +#ifdef CONFIG_DEBUG_PAGEALLOC
> +	printk("DEBUG_PAGEALLOC ");
> +#endif
> +#ifdef CONFIG_NUMA
> +	printk("NUMA ");
> +#endif
> +	printk("%s\n", ppc_md.name ? ppc_md.name : "");
> +
> +	print_modules();
> +	show_regs(regs);
> +
> +	bust_spinlocks(0);
> +
> +	printk(KERN_EMERG "Waiting for hardware watchdog reset...\n");
> +	/* spin until hardware reset */
> +	while(1)
> +		cpu_relax();
> +}
> +
>  /*
>   * booke_wdt_ping:
>   */




More information about the Linuxppc-dev mailing list