aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/exceptions-64s.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-64s.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-64s.S')
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S6
1 files changed, 3 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index d8ff6d37fc4d..0fb42ae21694 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -762,8 +762,8 @@ fp_unavailable_common:
762 EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN) 762 EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN)
763 bne 1f /* if from user, just load it up */ 763 bne 1f /* if from user, just load it up */
764 bl .save_nvgprs 764 bl .save_nvgprs
765 DISABLE_INTS
765 addi r3,r1,STACK_FRAME_OVERHEAD 766 addi r3,r1,STACK_FRAME_OVERHEAD
766 ENABLE_INTS
767 bl .kernel_fp_unavailable_exception 767 bl .kernel_fp_unavailable_exception
768 BUG_OPCODE 768 BUG_OPCODE
7691: bl .load_up_fpu 7691: bl .load_up_fpu
@@ -782,8 +782,8 @@ BEGIN_FTR_SECTION
782END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) 782END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
783#endif 783#endif
784 bl .save_nvgprs 784 bl .save_nvgprs
785 DISABLE_INTS
785 addi r3,r1,STACK_FRAME_OVERHEAD 786 addi r3,r1,STACK_FRAME_OVERHEAD
786 ENABLE_INTS
787 bl .altivec_unavailable_exception 787 bl .altivec_unavailable_exception
788 b .ret_from_except 788 b .ret_from_except
789 789
@@ -798,8 +798,8 @@ BEGIN_FTR_SECTION
798END_FTR_SECTION_IFSET(CPU_FTR_VSX) 798END_FTR_SECTION_IFSET(CPU_FTR_VSX)
799#endif 799#endif
800 bl .save_nvgprs 800 bl .save_nvgprs
801 DISABLE_INTS
801 addi r3,r1,STACK_FRAME_OVERHEAD 802 addi r3,r1,STACK_FRAME_OVERHEAD
802 ENABLE_INTS
803 bl .vsx_unavailable_exception 803 bl .vsx_unavailable_exception
804 b .ret_from_except 804 b .ret_from_except
805 805