|
@@ -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. */
|
|
|
|