summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h')
-rw-r--r--c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h
index 98ac23f347..28dd4aad64 100644
--- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h
+++ b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h
@@ -520,6 +520,27 @@ wrap_disable_thread_dispatching_done_\_FLVR:
wrap_change_msr_done_\_FLVR:
+#ifdef __ALTIVEC__
+ LA SCRATCH_REGISTER_0, _CPU_save_altivec_volatile
+ mtctr SCRATCH_REGISTER_0
+ addi r3, FRAME_REGISTER, EXC_VEC_OFFSET
+ bctrl
+ /*
+ * Establish defaults for vrsave and vscr
+ */
+ li SCRATCH_REGISTER_0, 0
+ mtvrsave SCRATCH_REGISTER_0
+ /*
+ * Use java/c9x mode; clear saturation bit
+ */
+ vxor 0, 0, 0
+ mtvscr 0
+ /*
+ * Reload VECTOR_REGISTER
+ */
+ lwz VECTOR_REGISTER, EXCEPTION_NUMBER_OFFSET(FRAME_REGISTER)
+#endif
+
/*
* Call high level exception handler
*/
@@ -619,6 +640,13 @@ wrap_handler_done_\_FLVR:
wrap_thread_dispatching_done_\_FLVR:
+#ifdef __ALTIVEC__
+ LA SCRATCH_REGISTER_0, _CPU_load_altivec_volatile
+ mtctr SCRATCH_REGISTER_0
+ addi r3, FRAME_REGISTER, EXC_VEC_OFFSET
+ bctrl
+#endif
+
/* Restore MSR? */
bne CR_MSR, wrap_restore_msr_\_FLVR