powerpc/32: Enter exceptions with MSR_EE unset
All exceptions handlers know when to reenable interrupts, so it is safer to enter all of them with MSR_EE unset, except for syscalls. Suggested-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> [splited out from benh RFC patch] Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
f97dec21a3
commit
642770dd96
|
@ -341,7 +341,7 @@ Alignment:
|
|||
mfspr r5,SPRN_DSISR
|
||||
stw r5,_DSISR(r11)
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE(0x600, alignment_exception)
|
||||
EXC_XFER_STD(0x600, alignment_exception)
|
||||
|
||||
/* Program check exception */
|
||||
EXCEPTION(0x700, ProgramCheck, program_check_exception, EXC_XFER_STD)
|
||||
|
@ -362,13 +362,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_FPU_UNAVAILABLE)
|
|||
bl load_up_fpu /* if from user, just load it up */
|
||||
b fast_exception_return
|
||||
1: addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE_LITE(0x800, kernel_fp_unavailable_exception)
|
||||
EXC_XFER_LITE(0x800, kernel_fp_unavailable_exception)
|
||||
|
||||
/* Decrementer */
|
||||
EXCEPTION(0x900, Decrementer, timer_interrupt, EXC_XFER_LITE)
|
||||
|
||||
EXCEPTION(0xa00, Trap_0a, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0xb00, Trap_0b, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0xa00, Trap_0a, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0xb00, Trap_0b, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* System call */
|
||||
. = 0xc00
|
||||
|
@ -379,7 +379,7 @@ SystemCall:
|
|||
|
||||
/* Single step - not used on 601 */
|
||||
EXCEPTION(0xd00, SingleStep, single_step_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0xe00, Trap_0e, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0xe00, Trap_0e, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/*
|
||||
* The Altivec unavailable trap is at 0x0f20. Foo.
|
||||
|
@ -611,35 +611,35 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU)
|
|||
#define altivec_assist_exception unknown_exception
|
||||
#endif
|
||||
|
||||
EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_EE)
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_STD)
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD)
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1c00, Trap_1c, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2000, RunMode, RunModeException, EXC_XFER_EE)
|
||||
EXCEPTION(0x2100, Trap_21, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2200, Trap_22, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2300, Trap_23, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2400, Trap_24, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2500, Trap_25, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2600, Trap_26, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2700, Trap_27, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2800, Trap_28, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2900, Trap_29, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2a00, Trap_2a, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2b00, Trap_2b, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2c00, Trap_2c, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2d00, Trap_2d, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2e00, Trap_2e, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x2f00, Trap_2f, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1c00, Trap_1c, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2000, RunMode, RunModeException, EXC_XFER_STD)
|
||||
EXCEPTION(0x2100, Trap_21, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2200, Trap_22, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2300, Trap_23, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2400, Trap_24, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2500, Trap_25, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2600, Trap_26, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2700, Trap_27, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2800, Trap_28, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2900, Trap_29, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2a00, Trap_2a, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2b00, Trap_2b, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2c00, Trap_2c, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2d00, Trap_2d, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2e00, Trap_2e, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2f00, Trap_2f, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
. = 0x3000
|
||||
|
||||
|
@ -651,7 +651,7 @@ AltiVecUnavailable:
|
|||
b fast_exception_return
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
1: addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception)
|
||||
EXC_XFER_LITE(0xf20, altivec_unavailable_exception)
|
||||
|
||||
PerformanceMonitor:
|
||||
EXCEPTION_PROLOG
|
||||
|
|
|
@ -127,12 +127,4 @@ label:
|
|||
EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL | MSR_EE, NOCOPY, transfer_to_handler, \
|
||||
ret_from_except)
|
||||
|
||||
#define EXC_XFER_EE(n, hdlr) \
|
||||
EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \
|
||||
ret_from_except_full)
|
||||
|
||||
#define EXC_XFER_EE_LITE(n, hdlr) \
|
||||
EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, COPY_EE, transfer_to_handler, \
|
||||
ret_from_except)
|
||||
|
||||
#endif /* __HEAD_32_H__ */
|
||||
|
|
|
@ -332,7 +332,7 @@ _ENTRY(saved_ksp_limit)
|
|||
mfspr r4,SPRN_DEAR /* Grab the DEAR and save it */
|
||||
stw r4,_DEAR(r11)
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE(0x600, alignment_exception)
|
||||
EXC_XFER_STD(0x600, alignment_exception)
|
||||
|
||||
/* 0x0700 - Program Exception */
|
||||
START_EXCEPTION(0x0700, ProgramCheck)
|
||||
|
@ -342,19 +342,19 @@ _ENTRY(saved_ksp_limit)
|
|||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0x700, program_check_exception)
|
||||
|
||||
EXCEPTION(0x0800, Trap_08, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x0900, Trap_09, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x0A00, Trap_0A, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x0B00, Trap_0B, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x0800, Trap_08, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x0900, Trap_09, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x0A00, Trap_0A, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x0B00, Trap_0B, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* 0x0C00 - System Call Exception */
|
||||
START_EXCEPTION(0x0C00, SystemCall)
|
||||
EXCEPTION_PROLOG
|
||||
EXC_XFER_SYS(0xc00, DoSyscall)
|
||||
|
||||
EXCEPTION(0x0D00, Trap_0D, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x0E00, Trap_0E, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x0F00, Trap_0F, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x0D00, Trap_0D, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x0E00, Trap_0E, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x0F00, Trap_0F, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* 0x1000 - Programmable Interval Timer (PIT) Exception */
|
||||
. = 0x1000
|
||||
|
@ -571,25 +571,25 @@ _ENTRY(saved_ksp_limit)
|
|||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
b InstructionAccess
|
||||
|
||||
EXCEPTION(0x1300, Trap_13, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1400, Trap_14, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1300, Trap_13, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1400, Trap_14, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_STD)
|
||||
#ifdef CONFIG_IBM405_ERR51
|
||||
/* 405GP errata 51 */
|
||||
START_EXCEPTION(0x1700, Trap_17)
|
||||
b DTLBMiss
|
||||
#else
|
||||
EXCEPTION(0x1700, Trap_17, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1700, Trap_17, unknown_exception, EXC_XFER_STD)
|
||||
#endif
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1A00, Trap_1A, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1B00, Trap_1B, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1C00, Trap_1C, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1D00, Trap_1D, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1E00, Trap_1E, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1F00, Trap_1F, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1A00, Trap_1A, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1B00, Trap_1B, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1C00, Trap_1C, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1D00, Trap_1D, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1E00, Trap_1E, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1F00, Trap_1F, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* Check for a single step debug exception while in an exception
|
||||
* handler before state has been saved. This is to catch the case
|
||||
|
@ -665,7 +665,7 @@ Decrementer:
|
|||
FITException:
|
||||
EXCEPTION_PROLOG
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD;
|
||||
EXC_XFER_EE(0x1010, unknown_exception)
|
||||
EXC_XFER_STD(0x1010, unknown_exception)
|
||||
|
||||
/* Watchdog Timer (WDT) Exception. (from 0x1020) */
|
||||
WDTException:
|
||||
|
|
|
@ -281,7 +281,7 @@ interrupt_base:
|
|||
FP_UNAVAILABLE_EXCEPTION
|
||||
#else
|
||||
EXCEPTION(0x2010, BOOKE_INTERRUPT_FP_UNAVAIL, \
|
||||
FloatingPointUnavailable, unknown_exception, EXC_XFER_EE)
|
||||
FloatingPointUnavailable, unknown_exception, EXC_XFER_STD)
|
||||
#endif
|
||||
/* System Call Interrupt */
|
||||
START_EXCEPTION(SystemCall)
|
||||
|
@ -290,7 +290,7 @@ interrupt_base:
|
|||
|
||||
/* Auxiliary Processor Unavailable Interrupt */
|
||||
EXCEPTION(0x2020, BOOKE_INTERRUPT_AP_UNAVAIL, \
|
||||
AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE)
|
||||
AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* Decrementer Interrupt */
|
||||
DECREMENTER_EXCEPTION
|
||||
|
@ -298,7 +298,7 @@ interrupt_base:
|
|||
/* Fixed Internal Timer Interrupt */
|
||||
/* TODO: Add FIT support */
|
||||
EXCEPTION(0x1010, BOOKE_INTERRUPT_FIT, FixedIntervalTimer, \
|
||||
unknown_exception, EXC_XFER_EE)
|
||||
unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* Watchdog Timer Interrupt */
|
||||
/* TODO: Add watchdog support */
|
||||
|
|
|
@ -167,7 +167,7 @@ Alignment:
|
|||
mfspr r5,SPRN_DSISR
|
||||
stw r5,_DSISR(r11)
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE(0x600, alignment_exception)
|
||||
EXC_XFER_STD(0x600, alignment_exception)
|
||||
|
||||
/* Program check exception */
|
||||
EXCEPTION(0x700, ProgramCheck, program_check_exception, EXC_XFER_STD)
|
||||
|
@ -179,8 +179,8 @@ Alignment:
|
|||
/* Decrementer */
|
||||
EXCEPTION(0x900, Decrementer, timer_interrupt, EXC_XFER_LITE)
|
||||
|
||||
EXCEPTION(0xa00, Trap_0a, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0xb00, Trap_0b, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0xa00, Trap_0a, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0xb00, Trap_0b, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* System call */
|
||||
. = 0xc00
|
||||
|
@ -190,8 +190,8 @@ SystemCall:
|
|||
|
||||
/* Single step - not used on 601 */
|
||||
EXCEPTION(0xd00, SingleStep, single_step_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0xe00, Trap_0e, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0xf00, Trap_0f, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0xe00, Trap_0e, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0xf00, Trap_0f, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* On the MPC8xx, this is a software emulation interrupt. It occurs
|
||||
* for all unimplemented and illegal instructions.
|
||||
|
@ -521,13 +521,13 @@ DARFixed:/* Return from dcbx instruction bug workaround */
|
|||
/* 0x300 is DataAccess exception, needed by bad_page_fault() */
|
||||
EXC_XFER_LITE(0x300, handle_page_fault)
|
||||
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1700, Trap_17, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1700, Trap_17, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* On the MPC8xx, these next four traps are used for development
|
||||
* support of breakpoints and such. Someday I will get around to
|
||||
|
@ -549,7 +549,7 @@ DataBreakpoint:
|
|||
mfspr r4,SPRN_BAR
|
||||
stw r4,_DAR(r11)
|
||||
mfspr r5,SPRN_DSISR
|
||||
EXC_XFER_EE(0x1c00, do_break)
|
||||
EXC_XFER_STD(0x1c00, do_break)
|
||||
11:
|
||||
mtcr r10
|
||||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
|
@ -569,10 +569,10 @@ InstructionBreakpoint:
|
|||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
rfi
|
||||
#else
|
||||
EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_STD)
|
||||
#endif
|
||||
EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
. = 0x2000
|
||||
|
||||
|
|
|
@ -255,14 +255,6 @@ label:
|
|||
EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL | MSR_EE, NOCOPY, transfer_to_handler, \
|
||||
ret_from_except)
|
||||
|
||||
#define EXC_XFER_EE(n, hdlr) \
|
||||
EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \
|
||||
ret_from_except_full)
|
||||
|
||||
#define EXC_XFER_EE_LITE(n, hdlr) \
|
||||
EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, COPY_EE, transfer_to_handler, \
|
||||
ret_from_except)
|
||||
|
||||
/* Check for a single step debug exception while in an exception
|
||||
* handler before state has been saved. This is to catch the case
|
||||
* where an instruction that we are trying to single step causes
|
||||
|
@ -405,7 +397,7 @@ label:
|
|||
mfspr r4,SPRN_DEAR; /* Grab the DEAR and save it */ \
|
||||
stw r4,_DEAR(r11); \
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
EXC_XFER_EE(0x0600, alignment_exception)
|
||||
EXC_XFER_STD(0x0600, alignment_exception)
|
||||
|
||||
#define PROGRAM_EXCEPTION \
|
||||
START_EXCEPTION(Program) \
|
||||
|
@ -430,7 +422,7 @@ label:
|
|||
bl load_up_fpu; /* if from user, just load it up */ \
|
||||
b fast_exception_return; \
|
||||
1: addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
EXC_XFER_EE_LITE(0x800, kernel_fp_unavailable_exception)
|
||||
EXC_XFER_STD(0x800, kernel_fp_unavailable_exception)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
struct exception_regs {
|
||||
|
|
|
@ -383,7 +383,7 @@ interrupt_base:
|
|||
EXC_XFER_LITE(0x0300, handle_page_fault)
|
||||
1:
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE_LITE(0x0300, CacheLockingException)
|
||||
EXC_XFER_LITE(0x0300, CacheLockingException)
|
||||
|
||||
/* Instruction Storage Interrupt */
|
||||
INSTRUCTION_STORAGE_EXCEPTION
|
||||
|
@ -404,10 +404,10 @@ interrupt_base:
|
|||
#ifdef CONFIG_E200
|
||||
/* E200 treats 'normal' floating point instructions as FP Unavail exception */
|
||||
EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
|
||||
program_check_exception, EXC_XFER_EE)
|
||||
program_check_exception, EXC_XFER_STD)
|
||||
#else
|
||||
EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
|
||||
unknown_exception, EXC_XFER_EE)
|
||||
unknown_exception, EXC_XFER_STD)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -418,7 +418,7 @@ interrupt_base:
|
|||
|
||||
/* Auxiliary Processor Unavailable Interrupt */
|
||||
EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \
|
||||
unknown_exception, EXC_XFER_EE)
|
||||
unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* Decrementer Interrupt */
|
||||
DECREMENTER_EXCEPTION
|
||||
|
@ -426,7 +426,7 @@ interrupt_base:
|
|||
/* Fixed Internal Timer Interrupt */
|
||||
/* TODO: Add FIT support */
|
||||
EXCEPTION(0x3100, FIT, FixedIntervalTimer, \
|
||||
unknown_exception, EXC_XFER_EE)
|
||||
unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* Watchdog Timer Interrupt */
|
||||
#ifdef CONFIG_BOOKE_WDT
|
||||
|
@ -636,25 +636,25 @@ END_BTB_FLUSH_SECTION
|
|||
bl load_up_spe
|
||||
b fast_exception_return
|
||||
1: addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE_LITE(0x2010, KernelSPE)
|
||||
EXC_XFER_LITE(0x2010, KernelSPE)
|
||||
#elif defined(CONFIG_SPE_POSSIBLE)
|
||||
EXCEPTION(0x2020, SPE_UNAVAIL, SPEUnavailable, \
|
||||
unknown_exception, EXC_XFER_EE)
|
||||
unknown_exception, EXC_XFER_STD)
|
||||
#endif /* CONFIG_SPE_POSSIBLE */
|
||||
|
||||
/* SPE Floating Point Data */
|
||||
#ifdef CONFIG_SPE
|
||||
EXCEPTION(0x2030, SPE_FP_DATA, SPEFloatingPointData,
|
||||
SPEFloatingPointException, EXC_XFER_EE)
|
||||
SPEFloatingPointException, EXC_XFER_STD)
|
||||
|
||||
/* SPE Floating Point Round */
|
||||
EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
|
||||
SPEFloatingPointRoundException, EXC_XFER_EE)
|
||||
SPEFloatingPointRoundException, EXC_XFER_STD)
|
||||
#elif defined(CONFIG_SPE_POSSIBLE)
|
||||
EXCEPTION(0x2040, SPE_FP_DATA, SPEFloatingPointData,
|
||||
unknown_exception, EXC_XFER_EE)
|
||||
unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
|
||||
unknown_exception, EXC_XFER_EE)
|
||||
unknown_exception, EXC_XFER_STD)
|
||||
#endif /* CONFIG_SPE_POSSIBLE */
|
||||
|
||||
|
||||
|
@ -677,10 +677,10 @@ END_BTB_FLUSH_SECTION
|
|||
unknown_exception)
|
||||
|
||||
/* Hypercall */
|
||||
EXCEPTION(0, HV_SYSCALL, Hypercall, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0, HV_SYSCALL, Hypercall, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
/* Embedded Hypervisor Privilege */
|
||||
EXCEPTION(0, HV_PRIV, Ehvpriv, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0, HV_PRIV, Ehvpriv, unknown_exception, EXC_XFER_STD)
|
||||
|
||||
interrupt_end:
|
||||
|
||||
|
|
Loading…
Reference in New Issue