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

> From: Scott Wood <scottw...@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 <scottw...@freescale.com>
> Signed-off-by: Alexander Graf <ag...@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@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 majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to