powerpc/mm/radix: Update PID switch sequence
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Wed, 13 Jul 2016 09:35:27 +0000 (15:05 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 17 Jul 2016 06:42:53 +0000 (16:42 +1000)
Update the PID switch as per ISA doc. slbia is needed in radix to
invalidate any implementation specific lookaside information.
We use the .long format due to build errors with the below compiler
version.

gcc (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413
GNU assembler (GNU Binutils for Ubuntu) 2.26

CC      arch/powerpc/mm//mmu_context_book3s64.o
{standard input}: Assembler messages:
{standard input}:506: Error: junk at end of line: `0x7'
scripts/Makefile.build:291: recipe for target 'arch/powerpc/mm//mmu_context_book3s64.o' failed
make[1]: *** [arch/powerpc/mm//mmu_context_book3s64.o] Error 1
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/ppc-opcode.h
arch/powerpc/mm/mmu_context_book3s64.c

index 1c18a43e0d658dc7cfe9d75fa7122ade148b112c..5ecfb04fec98ffc7b044a39bd2002b619b5ba984 100644 (file)
 #define PPC_INST_MTSPR_DSCR_USER       0x7c0303a6
 #define PPC_INST_MTSPR_DSCR_USER_MASK  0xfc1fffff
 #define PPC_INST_SLBFEE                        0x7c0007a7
+#define PPC_INST_SLBIA                 0x7c0003e4
 
 #define PPC_INST_STRING                        0x7c00042a
 #define PPC_INST_STRING_MASK           0xfc0007fe
                                               ___PPC_RA(a) |           \
                                               ___PPC_RB(b))
 
+#define PPC_SLBIA(IH)  stringify_in_c(.long PPC_INST_SLBIA | \
+                                      ((IH & 0x7) << 21))
 
 #endif /* _ASM_POWERPC_PPC_OPCODE_H */
index 196222227e8207ca7b71ae28e2f8e8a0ffb1565e..b114f8b93ec92145e5a541dbcc8c3c7708cf590e 100644 (file)
@@ -181,7 +181,10 @@ void destroy_context(struct mm_struct *mm)
 #ifdef CONFIG_PPC_RADIX_MMU
 void radix__switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
 {
-       mtspr(SPRN_PID, next->context.id);
        asm volatile("isync": : :"memory");
+       mtspr(SPRN_PID, next->context.id);
+       asm volatile("isync \n"
+                    PPC_SLBIA(0x7)
+                    : : :"memory");
 }
 #endif