[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