diff options
Diffstat (limited to 'src/kernel/softpatch_p8.S')
-rw-r--r-- | src/kernel/softpatch_p8.S | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/kernel/softpatch_p8.S b/src/kernel/softpatch_p8.S new file mode 100644 index 000000000..e28eb2eb2 --- /dev/null +++ b/src/kernel/softpatch_p8.S @@ -0,0 +1,145 @@ +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: src/kernel/softpatch_p8.S $ +# +# IBM CONFIDENTIAL +# +# COPYRIGHT International Business Machines Corp. 2011,2013 +# +# p1 +# +# Object Code Only (OCO) source materials +# Licensed Internal Code Source Materials +# IBM HostBoot Licensed Internal Code +# +# The source code for this program is not published or otherwise +# divested of its trade secrets, irrespective of what has been +# deposited with the U.S. Copyright Office. +# +# Origin: 30 +# +# IBM_PROLOG_END_TAG +.include "kernel/ppcconsts.S" + +/** @fn p8_softpatch_denorm_assist + * @brief Performs denormalization assistance for floating point operations. + * + * Called by the softpatch exception when a denormalization assistance is + * detected. The procedure is to run a denormalization instruction through + * the VSX unit on each floating point register so that the floating point + * instruction which took the exception may execute correctly. + * + * @param[in] r3 - Pointer to task's context_fp_t structure. + * + * Destroys the data in r4/r5. This is safe by the ABI since these are + * parameter registers which are otherwise unused by this function. + */ +.global p8_softpatch_denorm_assist +p8_softpatch_denorm_assist: + mfmsr r4 # Load the MSR + oris r5,r4,0x2080 # Turn on FP,VSX available + mtmsrd r5 # Set the MSR + # Load the FPRs from task context. + lfd f0, TASK_FPR_0(r3) + lfd f1, TASK_FPR_1(r3) + lfd f2, TASK_FPR_2(r3) + lfd f3, TASK_FPR_3(r3) + lfd f4, TASK_FPR_4(r3) + lfd f5, TASK_FPR_5(r3) + lfd f6, TASK_FPR_6(r3) + lfd f7, TASK_FPR_7(r3) + lfd f8, TASK_FPR_8(r3) + lfd f9, TASK_FPR_9(r3) + lfd f10, TASK_FPR_10(r3) + lfd f11, TASK_FPR_11(r3) + lfd f12, TASK_FPR_12(r3) + lfd f13, TASK_FPR_13(r3) + lfd f14, TASK_FPR_14(r3) + lfd f15, TASK_FPR_15(r3) + lfd f16, TASK_FPR_16(r3) + lfd f17, TASK_FPR_17(r3) + lfd f18, TASK_FPR_18(r3) + lfd f19, TASK_FPR_19(r3) + lfd f20, TASK_FPR_20(r3) + lfd f21, TASK_FPR_21(r3) + lfd f22, TASK_FPR_22(r3) + lfd f23, TASK_FPR_23(r3) + lfd f24, TASK_FPR_24(r3) + lfd f25, TASK_FPR_25(r3) + lfd f26, TASK_FPR_26(r3) + lfd f27, TASK_FPR_27(r3) + lfd f28, TASK_FPR_28(r3) + lfd f29, TASK_FPR_29(r3) + lfd f30, TASK_FPR_30(r3) + lfd f31, TASK_FPR_31(r3) + + xvcpsgndp f0,f0,f0 # Normalize all of the FPR contents + xvcpsgndp f1,f1,f1 + xvcpsgndp f2,f2,f2 + xvcpsgndp f3,f3,f3 + xvcpsgndp f4,f4,f4 + xvcpsgndp f5,f5,f5 + xvcpsgndp f6,f6,f6 + xvcpsgndp f7,f7,f7 + xvcpsgndp f8,f8,f8 + xvcpsgndp f9,f9,f9 + xvcpsgndp f10,f10,f10 + xvcpsgndp f11,f11,f11 + xvcpsgndp f12,f12,f12 + xvcpsgndp f13,f13,f13 + xvcpsgndp f14,f14,f14 + xvcpsgndp f15,f15,f15 + xvcpsgndp f16,f16,f16 + xvcpsgndp f17,f17,f17 + xvcpsgndp f18,f18,f18 + xvcpsgndp f19,f19,f19 + xvcpsgndp f20,f20,f20 + xvcpsgndp f21,f21,f21 + xvcpsgndp f22,f22,f22 + xvcpsgndp f23,f23,f23 + xvcpsgndp f24,f24,f24 + xvcpsgndp f25,f25,f25 + xvcpsgndp f26,f26,f26 + xvcpsgndp f27,f27,f27 + xvcpsgndp f28,f28,f28 + xvcpsgndp f29,f29,f29 + xvcpsgndp f30,f30,f30 + xvcpsgndp f31,f31,f31 + # Save the FPRs to task context. + stfd f0, TASK_FPR_0(r3) + stfd f1, TASK_FPR_1(r3) + stfd f2, TASK_FPR_2(r3) + stfd f3, TASK_FPR_3(r3) + stfd f4, TASK_FPR_4(r3) + stfd f5, TASK_FPR_5(r3) + stfd f6, TASK_FPR_6(r3) + stfd f7, TASK_FPR_7(r3) + stfd f8, TASK_FPR_8(r3) + stfd f9, TASK_FPR_9(r3) + stfd f10, TASK_FPR_10(r3) + stfd f11, TASK_FPR_11(r3) + stfd f12, TASK_FPR_12(r3) + stfd f13, TASK_FPR_13(r3) + stfd f14, TASK_FPR_14(r3) + stfd f15, TASK_FPR_15(r3) + stfd f16, TASK_FPR_16(r3) + stfd f17, TASK_FPR_17(r3) + stfd f18, TASK_FPR_18(r3) + stfd f19, TASK_FPR_19(r3) + stfd f20, TASK_FPR_20(r3) + stfd f21, TASK_FPR_21(r3) + stfd f22, TASK_FPR_22(r3) + stfd f23, TASK_FPR_23(r3) + stfd f24, TASK_FPR_24(r3) + stfd f25, TASK_FPR_25(r3) + stfd f26, TASK_FPR_26(r3) + stfd f27, TASK_FPR_27(r3) + stfd f28, TASK_FPR_28(r3) + stfd f29, TASK_FPR_29(r3) + stfd f30, TASK_FPR_30(r3) + stfd f31, TASK_FPR_31(r3) + + mtmsrd r5; # Reset the MSR + blr + |