diff options
| author | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2009-09-23 03:51:04 +0000 | 
|---|---|---|
| committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-09-24 15:31:49 +1000 | 
| commit | daf8f40391b2a1978ea2071c20959d91fade6b1a (patch) | |
| tree | 6c0cd6e6ee27b2453edc4039bb6a26688db82c14 | |
| parent | f32af63ed1327451cb91e3816fa043b6c2c52db1 (diff) | |
| download | olio-linux-3.10-daf8f40391b2a1978ea2071c20959d91fade6b1a.tar.xz olio-linux-3.10-daf8f40391b2a1978ea2071c20959d91fade6b1a.zip  | |
powerpc/4xx: Fix erroneous xmon warning on PowerPC 4xx
The xmon code relies on MSR_RI being non-zero to indicate that an exception
is recoverable.  If it is not, it prints a warning message.  However, the
PowerPC 4xx cores do not have an MSR_RI bit and this warning is produced for
every xmon event.
This introduces an unrecoverable_excp function to determine if an exception
is recoverable or not.  This gets rid of the erroneous warnings on 4xx.
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
| -rw-r--r-- | arch/powerpc/xmon/xmon.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index 0e09a45ac79..c6f0a71b405 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c @@ -335,6 +335,16 @@ int cpus_are_in_xmon(void)  }  #endif +static inline int unrecoverable_excp(struct pt_regs *regs) +{ +#ifdef CONFIG_4xx +	/* We have no MSR_RI bit on 4xx, so we simply return false */ +	return 0; +#else +	return ((regs->msr & MSR_RI) == 0); +#endif +} +  static int xmon_core(struct pt_regs *regs, int fromipi)  {  	int cmd = 0; @@ -388,7 +398,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi)  	bp = NULL;  	if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF))  		bp = at_breakpoint(regs->nip); -	if (bp || (regs->msr & MSR_RI) == 0) +	if (bp || unrecoverable_excp(regs))  		fromipi = 0;  	if (!fromipi) { @@ -399,7 +409,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi)  			       cpu, BP_NUM(bp));  			xmon_print_symbol(regs->nip, " ", ")\n");  		} -		if ((regs->msr & MSR_RI) == 0) +		if (unrecoverable_excp(regs))  			printf("WARNING: exception is not recoverable, "  			       "can't continue\n");  		release_output_lock(); @@ -490,7 +500,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi)  			printf("Stopped at breakpoint %x (", BP_NUM(bp));  			xmon_print_symbol(regs->nip, " ", ")\n");  		} -		if ((regs->msr & MSR_RI) == 0) +		if (unrecoverable_excp(regs))  			printf("WARNING: exception is not recoverable, "  			       "can't continue\n");  		remove_bpts();  |