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          \
> 



Reply via email to