]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kernel/fpu.S
Merge branch 'master'
[karo-tx-linux.git] / arch / powerpc / kernel / fpu.S
index 563d445ff58422c6539b7a925913fefed7df4af8..4d6001fa1cf269db574ab37e8521a8d1093bbfa9 100644 (file)
@@ -40,17 +40,17 @@ _GLOBAL(load_up_fpu)
  */
 #ifndef CONFIG_SMP
        LOADBASE(r3, last_task_used_math)
-       tophys(r3,r3)
+       toreal(r3)
        LDL     r4,OFF(last_task_used_math)(r3)
        CMPI    0,r4,0
        beq     1f
-       tophys(r4,r4)
+       toreal(r4)
        addi    r4,r4,THREAD            /* want last_task_used_math->thread */
        SAVE_32FPRS(0, r4)
        mffs    fr0
-       stfd    fr0,THREAD_FPSCR-4(r4)
+       stfd    fr0,THREAD_FPSCR(r4)
        LDL     r5,PT_REGS(r4)
-       tophys(r5,r5)
+       toreal(r5)
        LDL     r4,_MSR-STACK_FRAME_OVERHEAD(r5)
        li      r10,MSR_FP|MSR_FE0|MSR_FE1
        andc    r4,r4,r10               /* disable FP for previous task */
@@ -71,12 +71,12 @@ _GLOBAL(load_up_fpu)
        or      r12,r12,r4
        std     r12,_MSR(r1)
 #endif
-       lfd     fr0,THREAD_FPSCR-4(r5)
+       lfd     fr0,THREAD_FPSCR(r5)
        mtfsf   0xff,fr0
        REST_32FPRS(0, r5)
 #ifndef CONFIG_SMP
        subi    r4,r5,THREAD
-       tovirt(r4,r4)
+       fromreal(r4)
        STL     r4,OFF(last_task_used_math)(r3)
 #endif /* CONFIG_SMP */
        /* restore registers and return */
@@ -104,7 +104,7 @@ _GLOBAL(giveup_fpu)
        CMPI    0,r5,0
        SAVE_32FPRS(0, r3)
        mffs    fr0
-       stfd    fr0,THREAD_FPSCR-4(r3)
+       stfd    fr0,THREAD_FPSCR(r3)
        beq     1f
        LDL     r4,_MSR-STACK_FRAME_OVERHEAD(r5)
        li      r3,MSR_FP|MSR_FE0|MSR_FE1
@@ -117,3 +117,28 @@ _GLOBAL(giveup_fpu)
        STL     r5,OFF(last_task_used_math)(r4)
 #endif /* CONFIG_SMP */
        blr
+
+/*
+ * These are used in the alignment trap handler when emulating
+ * single-precision loads and stores.
+ * We restore and save the fpscr so the task gets the same result
+ * and exceptions as if the cpu had performed the load or store.
+ */
+
+_GLOBAL(cvt_fd)
+       lfd     0,THREAD_FPSCR(r5)      /* load up fpscr value */
+       mtfsf   0xff,0
+       lfs     0,0(r3)
+       stfd    0,0(r4)
+       mffs    0
+       stfd    0,THREAD_FPSCR(r5)      /* save new fpscr value */
+       blr
+
+_GLOBAL(cvt_df)
+       lfd     0,THREAD_FPSCR(r5)      /* load up fpscr value */
+       mtfsf   0xff,0
+       lfd     0,0(r3)
+       stfs    0,0(r4)
+       mffs    0
+       stfd    0,THREAD_FPSCR(r5)      /* save new fpscr value */
+       blr