|
@@ -2,6 +2,8 @@
|
|
#define __HEAD_BOOKE_H__
|
|
#define __HEAD_BOOKE_H__
|
|
|
|
|
|
#include <asm/ptrace.h> /* for STACK_FRAME_REGS_MARKER */
|
|
#include <asm/ptrace.h> /* for STACK_FRAME_REGS_MARKER */
|
|
|
|
+#include <asm/kvm_asm.h>
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Macros used for common Book-e exception handling
|
|
* Macros used for common Book-e exception handling
|
|
*/
|
|
*/
|
|
@@ -28,7 +30,7 @@
|
|
*/
|
|
*/
|
|
#define THREAD_NORMSAVE(offset) (THREAD_NORMSAVES + (offset * 4))
|
|
#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 */ \
|
|
mtspr SPRN_SPRG_WSCRATCH0, r10; /* save one register */ \
|
|
mfspr r10, SPRN_SPRG_THREAD; \
|
|
mfspr r10, SPRN_SPRG_THREAD; \
|
|
stw r11, THREAD_NORMSAVE(0)(r10); \
|
|
stw r11, THREAD_NORMSAVE(0)(r10); \
|
|
@@ -113,7 +115,7 @@
|
|
* registers as the normal prolog above. Instead we use a portion of the
|
|
* registers as the normal prolog above. Instead we use a portion of the
|
|
* critical/machine check exception stack at low physical addresses.
|
|
* 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; \
|
|
mtspr SPRN_SPRG_WSCRATCH_##exc_level,r8; \
|
|
BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \
|
|
BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \
|
|
stw r9,GPR9(r8); /* save various registers */\
|
|
stw r9,GPR9(r8); /* save various registers */\
|
|
@@ -162,12 +164,13 @@
|
|
SAVE_4GPRS(3, r11); \
|
|
SAVE_4GPRS(3, r11); \
|
|
SAVE_2GPRS(7, 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 \
|
|
#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 \
|
|
#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.
|
|
* Exception vectors.
|
|
@@ -181,16 +184,16 @@ label:
|
|
.long func; \
|
|
.long func; \
|
|
.long ret_from_except_full
|
|
.long ret_from_except_full
|
|
|
|
|
|
-#define EXCEPTION(n, label, hdlr, xfer) \
|
|
|
|
|
|
+#define EXCEPTION(n, intno, label, hdlr, xfer) \
|
|
START_EXCEPTION(label); \
|
|
START_EXCEPTION(label); \
|
|
- NORMAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ NORMAL_EXCEPTION_PROLOG(intno); \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
xfer(n, hdlr)
|
|
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)), \
|
|
EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
|
|
NOCOPY, crit_transfer_to_handler, \
|
|
NOCOPY, crit_transfer_to_handler, \
|
|
ret_from_crit_exc)
|
|
ret_from_crit_exc)
|
|
@@ -302,7 +305,7 @@ label:
|
|
|
|
|
|
#define DEBUG_CRIT_EXCEPTION \
|
|
#define DEBUG_CRIT_EXCEPTION \
|
|
START_EXCEPTION(DebugCrit); \
|
|
START_EXCEPTION(DebugCrit); \
|
|
- CRITICAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ CRITICAL_EXCEPTION_PROLOG(DEBUG); \
|
|
\
|
|
\
|
|
/* \
|
|
/* \
|
|
* If there is a single step or branch-taken exception in an \
|
|
* If there is a single step or branch-taken exception in an \
|
|
@@ -355,7 +358,7 @@ label:
|
|
|
|
|
|
#define DATA_STORAGE_EXCEPTION \
|
|
#define DATA_STORAGE_EXCEPTION \
|
|
START_EXCEPTION(DataStorage) \
|
|
START_EXCEPTION(DataStorage) \
|
|
- NORMAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ NORMAL_EXCEPTION_PROLOG(DATA_STORAGE); \
|
|
mfspr r5,SPRN_ESR; /* Grab the ESR and save it */ \
|
|
mfspr r5,SPRN_ESR; /* Grab the ESR and save it */ \
|
|
stw r5,_ESR(r11); \
|
|
stw r5,_ESR(r11); \
|
|
mfspr r4,SPRN_DEAR; /* Grab the DEAR */ \
|
|
mfspr r4,SPRN_DEAR; /* Grab the DEAR */ \
|
|
@@ -363,7 +366,7 @@ label:
|
|
|
|
|
|
#define INSTRUCTION_STORAGE_EXCEPTION \
|
|
#define INSTRUCTION_STORAGE_EXCEPTION \
|
|
START_EXCEPTION(InstructionStorage) \
|
|
START_EXCEPTION(InstructionStorage) \
|
|
- NORMAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ NORMAL_EXCEPTION_PROLOG(INST_STORAGE); \
|
|
mfspr r5,SPRN_ESR; /* Grab the ESR and save it */ \
|
|
mfspr r5,SPRN_ESR; /* Grab the ESR and save it */ \
|
|
stw r5,_ESR(r11); \
|
|
stw r5,_ESR(r11); \
|
|
mr r4,r12; /* Pass SRR0 as arg2 */ \
|
|
mr r4,r12; /* Pass SRR0 as arg2 */ \
|
|
@@ -372,7 +375,7 @@ label:
|
|
|
|
|
|
#define ALIGNMENT_EXCEPTION \
|
|
#define ALIGNMENT_EXCEPTION \
|
|
START_EXCEPTION(Alignment) \
|
|
START_EXCEPTION(Alignment) \
|
|
- NORMAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ NORMAL_EXCEPTION_PROLOG(ALIGNMENT); \
|
|
mfspr r4,SPRN_DEAR; /* Grab the DEAR and save it */ \
|
|
mfspr r4,SPRN_DEAR; /* Grab the DEAR and save it */ \
|
|
stw r4,_DEAR(r11); \
|
|
stw r4,_DEAR(r11); \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
@@ -380,7 +383,7 @@ label:
|
|
|
|
|
|
#define PROGRAM_EXCEPTION \
|
|
#define PROGRAM_EXCEPTION \
|
|
START_EXCEPTION(Program) \
|
|
START_EXCEPTION(Program) \
|
|
- NORMAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ NORMAL_EXCEPTION_PROLOG(PROGRAM); \
|
|
mfspr r4,SPRN_ESR; /* Grab the ESR and save it */ \
|
|
mfspr r4,SPRN_ESR; /* Grab the ESR and save it */ \
|
|
stw r4,_ESR(r11); \
|
|
stw r4,_ESR(r11); \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
@@ -388,7 +391,7 @@ label:
|
|
|
|
|
|
#define DECREMENTER_EXCEPTION \
|
|
#define DECREMENTER_EXCEPTION \
|
|
START_EXCEPTION(Decrementer) \
|
|
START_EXCEPTION(Decrementer) \
|
|
- NORMAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ NORMAL_EXCEPTION_PROLOG(DECREMENTER); \
|
|
lis r0,TSR_DIS@h; /* Setup the DEC interrupt mask */ \
|
|
lis r0,TSR_DIS@h; /* Setup the DEC interrupt mask */ \
|
|
mtspr SPRN_TSR,r0; /* Clear the DEC interrupt */ \
|
|
mtspr SPRN_TSR,r0; /* Clear the DEC interrupt */ \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
@@ -396,7 +399,7 @@ label:
|
|
|
|
|
|
#define FP_UNAVAILABLE_EXCEPTION \
|
|
#define FP_UNAVAILABLE_EXCEPTION \
|
|
START_EXCEPTION(FloatingPointUnavailable) \
|
|
START_EXCEPTION(FloatingPointUnavailable) \
|
|
- NORMAL_EXCEPTION_PROLOG; \
|
|
|
|
|
|
+ NORMAL_EXCEPTION_PROLOG(FP_UNAVAIL); \
|
|
beq 1f; \
|
|
beq 1f; \
|
|
bl load_up_fpu; /* if from user, just load it up */ \
|
|
bl load_up_fpu; /* if from user, just load it up */ \
|
|
b fast_exception_return; \
|
|
b fast_exception_return; \
|