]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kernel/vector.S
Merge remote-tracking branch 'wireless-next/master'
[karo-tx-linux.git] / arch / powerpc / kernel / vector.S
index a48df870b6960ebcc6d7b94389edec89da868335..eacda4eea2d70af507771df52dfa37bd20c73f55 100644 (file)
@@ -36,6 +36,28 @@ _GLOBAL(do_load_up_transact_altivec)
        blr
 #endif
 
+/*
+ * Load state from memory into VMX registers including VSCR.
+ * Assumes the caller has enabled VMX in the MSR.
+ */
+_GLOBAL(load_vr_state)
+       li      r4,VRSTATE_VSCR
+       lvx     vr0,r4,r3
+       mtvscr  vr0
+       REST_32VRS(0,r4,r3)
+       blr
+
+/*
+ * Store VMX state into memory, including VSCR.
+ * Assumes the caller has enabled VMX in the MSR.
+ */
+_GLOBAL(store_vr_state)
+       SAVE_32VRS(0, r4, r3)
+       mfvscr  vr0
+       li      r4, VRSTATE_VSCR
+       stvx    vr0, r4, r3
+       blr
+
 /*
  * Disable VMX for the task which had it previously,
  * and save its vector registers in its thread_struct.
@@ -144,9 +166,12 @@ _GLOBAL(giveup_altivec)
        PPC_LCMPI       0,r3,0
        beqlr                           /* if no previous owner, done */
        addi    r3,r3,THREAD            /* want THREAD of task */
-       addi    r7,r3,THREAD_VRSTATE
+       PPC_LL  r7,THREAD_VRSAVEAREA(r3)
        PPC_LL  r5,PT_REGS(r3)
-       PPC_LCMPI       0,r5,0
+       PPC_LCMPI       0,r7,0
+       bne     2f
+       addi    r7,r3,THREAD_VRSTATE
+2:     PPC_LCMPI       0,r5,0
        SAVE_32VRS(0,r4,r7)
        mfvscr  vr0
        li      r4,VRSTATE_VSCR