Merge branch 'core-rseq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / powerpc / kernel / entry_64.S
index 1c37438..729e9ef 100644 (file)
@@ -36,6 +36,7 @@
 #include <asm/context_tracking.h>
 #include <asm/tm.h>
 #include <asm/ppc-opcode.h>
+#include <asm/barrier.h>
 #include <asm/export.h>
 #ifdef CONFIG_PPC_BOOK3S
 #include <asm/exception-64s.h>
@@ -178,6 +179,15 @@ system_call:                       /* label this so stack traces look sane */
        clrldi  r8,r8,32
 15:
        slwi    r0,r0,4
+
+       barrier_nospec_asm
+       /*
+        * Prevent the load of the handler below (based on the user-passed
+        * system call number) being speculatively executed until the test
+        * against NR_syscalls and branch to .Lsyscall_enosys above has
+        * committed.
+        */
+
        ldx     r12,r11,r0      /* Fetch system call handler [ptr] */
        mtctr   r12
        bctrl                   /* Call handler */
@@ -604,6 +614,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
         * actually hit this code path.
         */
 
+       isync
        slbie   r6
        slbie   r6              /* Workaround POWER5 < DD2.1 issue */
        slbmte  r7,r0