aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/exceptions-64e.S
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-02-29 23:47:44 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-03-08 18:55:10 -0500
commit9f2f79e3a3c19ae745d0439d6e0eed31df28de3c (patch)
tree0f68f198e3ce6233c5c96d0267de9a73832858a4 /arch/powerpc/kernel/exceptions-64e.S
parenta546498f3bf9aac311c66f965186373aee2ca0b0 (diff)
powerpc: Disable interrupts in 64-bit kernel FP and vector faults
If we get a floating point, altivec or vsx unavaible interrupt in kernel, we trigger a kernel error. There is no point preserving the interrupt state, in fact, that can even make debugging harder as the processor state might change (we may even preempt) between taking the exception and landing in a debugger. So just make those 3 disable interrupts unconditionally. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- v2: On BookE only disable when hitting the kernel unavailable path, otherwise it will fail to restore softe as fast_exception_return doesn't do it.
Diffstat (limited to 'arch/powerpc/kernel/exceptions-64e.S')
-rw-r--r--arch/powerpc/kernel/exceptions-64e.S7
1 files changed, 3 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 573613d747ac..3de9993c5c65 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -354,9 +354,9 @@ interrupt_end_book3e:
354 /* we can probably do a shorter exception entry for that one... */ 354 /* we can probably do a shorter exception entry for that one... */
355 EXCEPTION_COMMON(0x800, PACA_EXGEN, INTS_KEEP) 355 EXCEPTION_COMMON(0x800, PACA_EXGEN, INTS_KEEP)
356 bne 1f /* if from user, just load it up */ 356 bne 1f /* if from user, just load it up */
357 INTS_DISABLE_ALL
357 bl .save_nvgprs 358 bl .save_nvgprs
358 addi r3,r1,STACK_FRAME_OVERHEAD 359 addi r3,r1,STACK_FRAME_OVERHEAD
359 INTS_RESTORE_HARD
360 bl .kernel_fp_unavailable_exception 360 bl .kernel_fp_unavailable_exception
361 BUG_OPCODE 361 BUG_OPCODE
3621: ld r12,_MSR(r1) 3621: ld r12,_MSR(r1)
@@ -391,10 +391,9 @@ interrupt_end_book3e:
391/* Auxiliary Processor Unavailable Interrupt */ 391/* Auxiliary Processor Unavailable Interrupt */
392 START_EXCEPTION(ap_unavailable); 392 START_EXCEPTION(ap_unavailable);
393 NORMAL_EXCEPTION_PROLOG(0xf20, PROLOG_ADDITION_NONE) 393 NORMAL_EXCEPTION_PROLOG(0xf20, PROLOG_ADDITION_NONE)
394 EXCEPTION_COMMON(0xf20, PACA_EXGEN, INTS_KEEP) 394 EXCEPTION_COMMON(0xf20, PACA_EXGEN, INTS_DISABLE_ALL)
395 addi r3,r1,STACK_FRAME_OVERHEAD
396 bl .save_nvgprs 395 bl .save_nvgprs
397 INTS_RESTORE_HARD 396 addi r3,r1,STACK_FRAME_OVERHEAD
398 bl .unknown_exception 397 bl .unknown_exception
399 b .ret_from_except 398 b .ret_from_except
400 399