powerpc/booke: Provide exception macros with interrupt name
authorScott Wood <scottwood@freescale.com>
Tue, 20 Dec 2011 15:34:40 +0000 (15:34 +0000)
committerAvi Kivity <avi@redhat.com>
Sun, 8 Apr 2012 09:51:17 +0000 (12:51 +0300)
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.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/head_booke.h
arch/powerpc/kernel/head_fsl_booke.S

index 7dd2981bcc50579a059f3a6fb446660d133eed2a..d1192c577ed31682e5a18833ad50524fecfe4842 100644 (file)
@@ -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 */
index 0e4175388f478af5456d7095a860a2d621e3ad3c..51fd0724e095cbf813fd9c8817d3e469be861893 100644 (file)
@@ -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);                                \
  * 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          */\
        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;                                        \
index 28e62598d0e81c10d18940b8461a969dd97ebde5..7c406dd9fea6d8665353cd2bfd3fa3e7608c038c 100644 (file)
@@ -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