[PATCH] ppc32: handle Book E debug exceptions on kernel stack

Kumar Gala galak at kernel.crashing.org
Thu Feb 23 15:19:54 EST 2006


On Tue, 14 Feb 2006, Dale Farnsworth wrote:

> From: Dale Farnsworth <dale at farnsworth.org>
> 
> On PPC Book E processsors, we currently handle debug
> exceptions on the critical exception stack (debug stack
> for E200).  This causes problems with the kgdb single
> step handler, which calls smp_processor_id() and spin_lock(),
> which reference current_thread_info(), which only works when
> we are on the kernel stack.
> 
> We address this by switching to the kernel stack early while
> handling debug exceptions.  Note that the entry values of r10
> and r11 are still saved on the critical exception (or debug) stack.
> 
> Signed-off-by: Dale Farnsworth <dale at farnsworth.org>
> 

Paul,

We were wondering if you or David remember why a specific critical
exception stack was added in the 40x port from 2.4 to 2.6?

- kumar

> ---
> 
> This is low level code and needs careful review.
> I've only tested it on mpc8548cds.
> 
> I didn't find the corresponding code in arch/powerpc,
> so I assume Book E support hasn't been merged yet.
> 
>  arch/ppc/kernel/head_booke.h |   15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/ppc/kernel/head_booke.h b/arch/ppc/kernel/head_booke.h
> index f3d274c..a5eec51 100644
> --- a/arch/ppc/kernel/head_booke.h
> +++ b/arch/ppc/kernel/head_booke.h
> @@ -92,7 +92,8 @@
>   * registers as the normal prolog above. Instead we use a portion of the
>   * critical/machine check exception stack at low physical addresses.
>   */
> -#define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0, exc_level_srr1) \
> +#define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0,		     \
> +				   exc_level_srr1, kernel_sp_reg)	     \
>  	mtspr	exc_level##_SPRG,r8;					     \
>  	BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \
>  	stw	r10,GPR10-INT_FRAME_SIZE(r8);				     \
> @@ -100,7 +101,7 @@
>  	mfcr	r10;			/* save CR in r10 for now	   */\
>  	mfspr	r11,exc_level_srr1;	/* check whether user or kernel    */\
>  	andi.	r11,r11,MSR_PR;						     \
> -	mr	r11,r8;							     \
> +	mr	r11,kernel_sp_reg;					     \
>  	mfspr	r8,exc_level##_SPRG;					     \
>  	beq	1f;							     \
>  	/* COMING FROM USER MODE */					     \
> @@ -128,11 +129,13 @@
>  	SAVE_2GPRS(7, r11)
>  
>  #define CRITICAL_EXCEPTION_PROLOG \
> -		EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1)
> +		EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1, r8)
> +#define CRITICAL_EXCEPTION_ON_KERNEL_STACK_PROLOG \
> +		EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1, r1)
>  #define DEBUG_EXCEPTION_PROLOG \
> -		EXC_LEVEL_EXCEPTION_PROLOG(DEBUG, SPRN_DSRR0, SPRN_DSRR1)
> +		EXC_LEVEL_EXCEPTION_PROLOG(DEBUG, SPRN_DSRR0, SPRN_DSRR1, r1)
>  #define MCHECK_EXCEPTION_PROLOG \
> -		EXC_LEVEL_EXCEPTION_PROLOG(MCHECK, SPRN_MCSRR0, SPRN_MCSRR1)
> +		EXC_LEVEL_EXCEPTION_PROLOG(MCHECK, SPRN_MCSRR0, SPRN_MCSRR1, r8)
>  
>  /*
>   * Exception vectors.
> @@ -268,7 +271,7 @@ label:
>  #else
>  #define DEBUG_EXCEPTION							      \
>  	START_EXCEPTION(Debug);						      \
> -	CRITICAL_EXCEPTION_PROLOG;					      \
> +	CRITICAL_EXCEPTION_ON_KERNEL_STACK_PROLOG;			      \
>  									      \
>  	/*								      \
>  	 * If there is a single step or branch-taken exception in an	      \
> 





More information about the Linuxppc-embedded mailing list