[PATCH 12/38] powerpc/booke: Provide exception macros with interrupt name

Kumar Gala galak at kernel.crashing.org
Thu Mar 22 05:04:43 EST 2012


On Feb 28, 2012, at 6:09 PM, Alexander Graf wrote:

> From: Scott Wood <scottwood at freescale.com>
> 
> DO_KVM will need to identify the particular exception type.
> 
> There is an existing set of arbitrary numbers that Linux passes,
> but it's an undocumented mess that sort of corresponds to server/classic
> exception vectors but not really.

So what do the new names correspond to?  What header is defining MACHINE_CHECK, BOOKE_INTERRUPT_EXTERNAL, etc (asm/kvm_asm.h)?  If so we really should move these out of asm/kvm_asm.h and into something a bit more appropriate.

> Signed-off-by: Scott Wood <scottwood at freescale.com>
> Signed-off-by: Alexander Graf <agraf at suse.de>
> ---
> arch/powerpc/kernel/head_44x.S       |   23 +++++++++------
> arch/powerpc/kernel/head_booke.h     |   41 ++++++++++++++------------
> arch/powerpc/kernel/head_fsl_booke.S |   52 +++++++++++++++++++++-------------
> 3 files changed, 68 insertions(+), 48 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
> index 7dd2981..d1192c5 100644
> --- a/arch/powerpc/kernel/head_44x.S
> +++ b/arch/powerpc/kernel/head_44x.S
> @@ -248,10 +248,11 @@ _ENTRY(_start);
> 
> interrupt_base:
> 	/* Critical Input Interrupt */
> -	CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception)
> +	CRITICAL_EXCEPTION(0x0100, CRITICAL, CriticalInput, unknown_exception)
> 
> 	/* Machine Check Interrupt */
> -	CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
> +	CRITICAL_EXCEPTION(0x0200, MACHINE_CHECK, MachineCheck, \
> +			   machine_check_exception)
> 	MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception)
> 
> 	/* Data Storage Interrupt */
> @@ -261,7 +262,8 @@ interrupt_base:
> 	INSTRUCTION_STORAGE_EXCEPTION
> 
> 	/* External Input Interrupt */
> -	EXCEPTION(0x0500, ExternalInput, do_IRQ, EXC_XFER_LITE)
> +	EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \
> +		  do_IRQ, EXC_XFER_LITE)
> 
> 	/* Alignment Interrupt */
> 	ALIGNMENT_EXCEPTION
> @@ -273,29 +275,32 @@ interrupt_base:
> #ifdef CONFIG_PPC_FPU
> 	FP_UNAVAILABLE_EXCEPTION
> #else
> -	EXCEPTION(0x2010, FloatingPointUnavailable, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x2010, BOOKE_INTERRUPT_FP_UNAVAIL, \
> +		  FloatingPointUnavailable, unknown_exception, EXC_XFER_EE)
> #endif
> 	/* System Call Interrupt */
> 	START_EXCEPTION(SystemCall)
> -	NORMAL_EXCEPTION_PROLOG
> +	NORMAL_EXCEPTION_PROLOG(BOOKE_INTERRUPT_SYSCALL)
> 	EXC_XFER_EE_LITE(0x0c00, DoSyscall)
> 
> 	/* Auxiliary Processor Unavailable Interrupt */
> -	EXCEPTION(0x2020, AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x2020, BOOKE_INTERRUPT_AP_UNAVAIL, \
> +		  AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE)
> 
> 	/* Decrementer Interrupt */
> 	DECREMENTER_EXCEPTION
> 
> 	/* Fixed Internal Timer Interrupt */
> 	/* TODO: Add FIT support */
> -	EXCEPTION(0x1010, FixedIntervalTimer, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x1010, BOOKE_INTERRUPT_FIT, FixedIntervalTimer, \
> +		  unknown_exception, EXC_XFER_EE)
> 
> 	/* Watchdog Timer Interrupt */
> 	/* TODO: Add watchdog support */
> #ifdef CONFIG_BOOKE_WDT
> -	CRITICAL_EXCEPTION(0x1020, WatchdogTimer, WatchdogException)
> +	CRITICAL_EXCEPTION(0x1020, WATCHDOG, WatchdogTimer, WatchdogException)
> #else
> -	CRITICAL_EXCEPTION(0x1020, WatchdogTimer, unknown_exception)
> +	CRITICAL_EXCEPTION(0x1020, WATCHDOG, WatchdogTimer, unknown_exception)
> #endif
> 
> 	/* Data TLB Error Interrupt */
> diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
> index fc921bf..06ab353 100644
> --- a/arch/powerpc/kernel/head_booke.h
> +++ b/arch/powerpc/kernel/head_booke.h
> @@ -2,6 +2,8 @@
> #define __HEAD_BOOKE_H__
> 
> #include <asm/ptrace.h>	/* for STACK_FRAME_REGS_MARKER */
> +#include <asm/kvm_asm.h>
> +
> /*
>  * Macros used for common Book-e exception handling
>  */
> @@ -28,7 +30,7 @@
>  */
> #define THREAD_NORMSAVE(offset)	(THREAD_NORMSAVES + (offset * 4))
> 
> -#define NORMAL_EXCEPTION_PROLOG						     \
> +#define NORMAL_EXCEPTION_PROLOG(intno)						     \
> 	mtspr	SPRN_SPRG_WSCRATCH0, r10;	/* save one register */	     \
> 	mfspr	r10, SPRN_SPRG_THREAD;					     \
> 	stw	r11, THREAD_NORMSAVE(0)(r10);				     \
> @@ -113,7 +115,7 @@
>  * 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, intno, exc_level_srr0, exc_level_srr1) \
> 	mtspr	SPRN_SPRG_WSCRATCH_##exc_level,r8;			     \
> 	BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \
> 	stw	r9,GPR9(r8);		/* save various registers	   */\
> @@ -162,12 +164,13 @@
> 	SAVE_4GPRS(3, r11);						     \
> 	SAVE_2GPRS(7, r11)
> 
> -#define CRITICAL_EXCEPTION_PROLOG \
> -		EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1)
> +#define CRITICAL_EXCEPTION_PROLOG(intno) \
> +		EXC_LEVEL_EXCEPTION_PROLOG(CRIT, intno, SPRN_CSRR0, SPRN_CSRR1)
> #define DEBUG_EXCEPTION_PROLOG \
> -		EXC_LEVEL_EXCEPTION_PROLOG(DBG, SPRN_DSRR0, SPRN_DSRR1)
> +		EXC_LEVEL_EXCEPTION_PROLOG(DBG, DEBUG, SPRN_DSRR0, SPRN_DSRR1)
> #define MCHECK_EXCEPTION_PROLOG \
> -		EXC_LEVEL_EXCEPTION_PROLOG(MC, SPRN_MCSRR0, SPRN_MCSRR1)
> +		EXC_LEVEL_EXCEPTION_PROLOG(MC, MACHINE_CHECK, \
> +			SPRN_MCSRR0, SPRN_MCSRR1)
> 
> /*
>  * Exception vectors.
> @@ -181,16 +184,16 @@ label:
> 	.long	func;						\
> 	.long	ret_from_except_full
> 
> -#define EXCEPTION(n, label, hdlr, xfer)				\
> +#define EXCEPTION(n, intno, label, hdlr, xfer)			\
> 	START_EXCEPTION(label);					\
> -	NORMAL_EXCEPTION_PROLOG;				\
> +	NORMAL_EXCEPTION_PROLOG(intno);				\
> 	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
> 	xfer(n, hdlr)
> 
> -#define CRITICAL_EXCEPTION(n, label, hdlr)			\
> -	START_EXCEPTION(label);					\
> -	CRITICAL_EXCEPTION_PROLOG;				\
> -	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
> +#define CRITICAL_EXCEPTION(n, intno, label, hdlr)			\
> +	START_EXCEPTION(label);						\
> +	CRITICAL_EXCEPTION_PROLOG(intno);				\
> +	addi	r3,r1,STACK_FRAME_OVERHEAD;				\
> 	EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
> 			  NOCOPY, crit_transfer_to_handler, \
> 			  ret_from_crit_exc)
> @@ -302,7 +305,7 @@ label:
> 
> #define DEBUG_CRIT_EXCEPTION						      \
> 	START_EXCEPTION(DebugCrit);					      \
> -	CRITICAL_EXCEPTION_PROLOG;					      \
> +	CRITICAL_EXCEPTION_PROLOG(DEBUG);				      \
> 									      \
> 	/*								      \
> 	 * If there is a single step or branch-taken exception in an	      \
> @@ -355,7 +358,7 @@ label:
> 
> #define DATA_STORAGE_EXCEPTION						      \
> 	START_EXCEPTION(DataStorage)					      \
> -	NORMAL_EXCEPTION_PROLOG;					      \
> +	NORMAL_EXCEPTION_PROLOG(DATA_STORAGE);		      \
> 	mfspr	r5,SPRN_ESR;		/* Grab the ESR and save it */	      \
> 	stw	r5,_ESR(r11);						      \
> 	mfspr	r4,SPRN_DEAR;		/* Grab the DEAR */		      \
> @@ -363,7 +366,7 @@ label:
> 
> #define INSTRUCTION_STORAGE_EXCEPTION					      \
> 	START_EXCEPTION(InstructionStorage)				      \
> -	NORMAL_EXCEPTION_PROLOG;					      \
> +	NORMAL_EXCEPTION_PROLOG(INST_STORAGE);		      \
> 	mfspr	r5,SPRN_ESR;		/* Grab the ESR and save it */	      \
> 	stw	r5,_ESR(r11);						      \
> 	mr      r4,r12;                 /* Pass SRR0 as arg2 */		      \
> @@ -372,7 +375,7 @@ label:
> 
> #define ALIGNMENT_EXCEPTION						      \
> 	START_EXCEPTION(Alignment)					      \
> -	NORMAL_EXCEPTION_PROLOG;					      \
> +	NORMAL_EXCEPTION_PROLOG(ALIGNMENT);		      \
> 	mfspr   r4,SPRN_DEAR;           /* Grab the DEAR and save it */	      \
> 	stw     r4,_DEAR(r11);						      \
> 	addi    r3,r1,STACK_FRAME_OVERHEAD;				      \
> @@ -380,7 +383,7 @@ label:
> 
> #define PROGRAM_EXCEPTION						      \
> 	START_EXCEPTION(Program)					      \
> -	NORMAL_EXCEPTION_PROLOG;					      \
> +	NORMAL_EXCEPTION_PROLOG(PROGRAM);		      \
> 	mfspr	r4,SPRN_ESR;		/* Grab the ESR and save it */	      \
> 	stw	r4,_ESR(r11);						      \
> 	addi	r3,r1,STACK_FRAME_OVERHEAD;				      \
> @@ -388,7 +391,7 @@ label:
> 
> #define DECREMENTER_EXCEPTION						      \
> 	START_EXCEPTION(Decrementer)					      \
> -	NORMAL_EXCEPTION_PROLOG;					      \
> +	NORMAL_EXCEPTION_PROLOG(DECREMENTER);		      \
> 	lis     r0,TSR_DIS at h;           /* Setup the DEC interrupt mask */    \
> 	mtspr   SPRN_TSR,r0;		/* Clear the DEC interrupt */	      \
> 	addi    r3,r1,STACK_FRAME_OVERHEAD;				      \
> @@ -396,7 +399,7 @@ label:
> 
> #define FP_UNAVAILABLE_EXCEPTION					      \
> 	START_EXCEPTION(FloatingPointUnavailable)			      \
> -	NORMAL_EXCEPTION_PROLOG;					      \
> +	NORMAL_EXCEPTION_PROLOG(FP_UNAVAIL);		      \
> 	beq	1f;							      \
> 	bl	load_up_fpu;		/* if from user, just load it up */   \
> 	b	fast_exception_return;					      \
> diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
> index d5d78c4..418931f 100644
> --- a/arch/powerpc/kernel/head_fsl_booke.S
> +++ b/arch/powerpc/kernel/head_fsl_booke.S
> @@ -301,19 +301,20 @@ _ENTRY(__early_start)
> 
> interrupt_base:
> 	/* Critical Input Interrupt */
> -	CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception)
> +	CRITICAL_EXCEPTION(0x0100, CRITICAL, CriticalInput, unknown_exception)
> 
> 	/* Machine Check Interrupt */
> #ifdef CONFIG_E200
> 	/* no RFMCI, MCSRRs on E200 */
> -	CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
> +	CRITICAL_EXCEPTION(0x0200, MACHINE_CHECK, MachineCheck, \
> +			   machine_check_exception)
> #else
> 	MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
> #endif
> 
> 	/* Data Storage Interrupt */
> 	START_EXCEPTION(DataStorage)
> -	NORMAL_EXCEPTION_PROLOG
> +	NORMAL_EXCEPTION_PROLOG(DATA_STORAGE)
> 	mfspr	r5,SPRN_ESR		/* Grab the ESR, save it, pass arg3 */
> 	stw	r5,_ESR(r11)
> 	mfspr	r4,SPRN_DEAR		/* Grab the DEAR, save it, pass arg2 */
> @@ -328,7 +329,7 @@ interrupt_base:
> 	INSTRUCTION_STORAGE_EXCEPTION
> 
> 	/* External Input Interrupt */
> -	EXCEPTION(0x0500, ExternalInput, do_IRQ, EXC_XFER_LITE)
> +	EXCEPTION(0x0500, EXTERNAL, ExternalInput, do_IRQ, EXC_XFER_LITE)
> 
> 	/* Alignment Interrupt */
> 	ALIGNMENT_EXCEPTION
> @@ -342,32 +343,36 @@ interrupt_base:
> #else
> #ifdef CONFIG_E200
> 	/* E200 treats 'normal' floating point instructions as FP Unavail exception */
> -	EXCEPTION(0x0800, FloatingPointUnavailable, program_check_exception, EXC_XFER_EE)
> +	EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
> +		  program_check_exception, EXC_XFER_EE)
> #else
> -	EXCEPTION(0x0800, FloatingPointUnavailable, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
> +		  unknown_exception, EXC_XFER_EE)
> #endif
> #endif
> 
> 	/* System Call Interrupt */
> 	START_EXCEPTION(SystemCall)
> -	NORMAL_EXCEPTION_PROLOG
> +	NORMAL_EXCEPTION_PROLOG(SYSCALL)
> 	EXC_XFER_EE_LITE(0x0c00, DoSyscall)
> 
> 	/* Auxiliary Processor Unavailable Interrupt */
> -	EXCEPTION(0x2900, AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \
> +		  unknown_exception, EXC_XFER_EE)
> 
> 	/* Decrementer Interrupt */
> 	DECREMENTER_EXCEPTION
> 
> 	/* Fixed Internal Timer Interrupt */
> 	/* TODO: Add FIT support */
> -	EXCEPTION(0x3100, FixedIntervalTimer, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x3100, FIT, FixedIntervalTimer, \
> +		  unknown_exception, EXC_XFER_EE)
> 
> 	/* Watchdog Timer Interrupt */
> #ifdef CONFIG_BOOKE_WDT
> -	CRITICAL_EXCEPTION(0x3200, WatchdogTimer, WatchdogException)
> +	CRITICAL_EXCEPTION(0x3200, WATCHDOG, WatchdogTimer, WatchdogException)
> #else
> -	CRITICAL_EXCEPTION(0x3200, WatchdogTimer, unknown_exception)
> +	CRITICAL_EXCEPTION(0x3200, WATCHDOG, WatchdogTimer, unknown_exception)
> #endif
> 
> 	/* Data TLB Error Interrupt */
> @@ -538,31 +543,38 @@ interrupt_base:
> #ifdef CONFIG_SPE
> 	/* SPE Unavailable */
> 	START_EXCEPTION(SPEUnavailable)
> -	NORMAL_EXCEPTION_PROLOG
> +	NORMAL_EXCEPTION_PROLOG(SPE_UNAVAIL)
> 	bne	load_up_spe
> 	addi	r3,r1,STACK_FRAME_OVERHEAD
> 	EXC_XFER_EE_LITE(0x2010, KernelSPE)
> #else
> -	EXCEPTION(0x2020, SPEUnavailable, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x2020, SPE_UNAVAIL, SPEUnavailable, \
> +		  unknown_exception, EXC_XFER_EE)
> #endif /* CONFIG_SPE */
> 
> 	/* SPE Floating Point Data */
> #ifdef CONFIG_SPE
> -	EXCEPTION(0x2030, SPEFloatingPointData, SPEFloatingPointException, EXC_XFER_EE);
> +	EXCEPTION(0x2030, SPE_FP_DATA, SPEFloatingPointData, \
> +		  SPEFloatingPointException, EXC_XFER_EE);
> 
> 	/* SPE Floating Point Round */
> -	EXCEPTION(0x2050, SPEFloatingPointRound, SPEFloatingPointRoundException, EXC_XFER_EE)
> +	EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
> +		  SPEFloatingPointRoundException, EXC_XFER_EE)
> #else
> -	EXCEPTION(0x2040, SPEFloatingPointData, unknown_exception, EXC_XFER_EE)
> -	EXCEPTION(0x2050, SPEFloatingPointRound, unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x2040, SPE_FP_DATA, SPEFloatingPointData, \
> +		  unknown_exception, EXC_XFER_EE)
> +	EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
> +		  unknown_exception, EXC_XFER_EE)
> #endif /* CONFIG_SPE */
> 
> 	/* Performance Monitor */
> -	EXCEPTION(0x2060, PerformanceMonitor, performance_monitor_exception, EXC_XFER_STD)
> +	EXCEPTION(0x2060, PERFORMANCE_MONITOR, PerformanceMonitor, \
> +		  performance_monitor_exception, EXC_XFER_STD)
> 
> -	EXCEPTION(0x2070, Doorbell, doorbell_exception, EXC_XFER_STD)
> +	EXCEPTION(0x2070, DOORBELL, Doorbell, doorbell_exception, EXC_XFER_STD)
> 
> -	CRITICAL_EXCEPTION(0x2080, CriticalDoorbell, unknown_exception)
> +	CRITICAL_EXCEPTION(0x2080, DOORBELL_CRITICAL, \
> +			   CriticalDoorbell, unknown_exception)
> 
> 	/* Debug Interrupt */
> 	DEBUG_DEBUG_EXCEPTION
> -- 
> 1.6.0.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the Linuxppc-dev mailing list