powerpc: Clear RI and EE at the same time in system call exit
authorAnton Blanchard <anton@samba.org>
Tue, 29 May 2012 12:22:00 +0000 (12:22 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 3 Jul 2012 04:14:43 +0000 (14:14 +1000)
mtmsrd is an expensive instruction, we save a few cycles by
doing it once instead of twice.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/entry_64.S

index 5971c85df1369780decc5dbc6feb0b10f9d23a05..cf38a17ab28a24ad161e2a662ba0c6aa8fe519aa 100644 (file)
@@ -197,7 +197,16 @@ syscall_exit:
        wrteei  0
 #else
        ld      r10,PACAKMSR(r13)
-       mtmsrd  r10,1
+       /*
+        * For performance reasons we clear RI the same time that we
+        * clear EE. We only need to clear RI just before we restore r13
+        * below, but batching it with EE saves us one expensive mtmsrd call.
+        * We have to be careful to restore RI if we branch anywhere from
+        * here (eg syscall_exit_work).
+        */
+       li      r9,MSR_RI
+       andc    r11,r10,r9
+       mtmsrd  r11,1
 #endif /* CONFIG_PPC_BOOK3E */
 
        ld      r9,TI_FLAGS(r12)
@@ -214,17 +223,6 @@ BEGIN_FTR_SECTION
 END_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
        andi.   r6,r8,MSR_PR
        ld      r4,_LINK(r1)
-       /*
-        * Clear RI before restoring r13.  If we are returning to
-        * userspace and we take an exception after restoring r13,
-        * we end up corrupting the userspace r13 value.
-        */
-#ifdef CONFIG_PPC_BOOK3S
-       /* No MSR:RI on BookE */
-       li      r12,MSR_RI
-       andc    r11,r10,r12
-       mtmsrd  r11,1                   /* clear MSR.RI */
-#endif /* CONFIG_PPC_BOOK3S */
 
        beq-    1f
        ACCOUNT_CPU_USER_EXIT(r11, r12)
@@ -271,6 +269,9 @@ syscall_enosys:
        b       syscall_exit
        
 syscall_exit_work:
+#ifdef CONFIG_PPC_BOOK3S
+       mtmsrd  r10,1           /* Restore RI */
+#endif
        /* If TIF_RESTOREALL is set, don't scribble on either r3 or ccr.
         If TIF_NOERROR is set, just save r3 as it is. */