[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