Merge tag 'powerpc-4.11-7' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc fixes from Michael Ellerman:
"Some more powerpc fixes for 4.11:

Headed to stable:

- disable HFSCR[TM] if TM is not supported, fixes a potential host
kernel crash triggered by a hostile guest, but only in
configurations that no one uses

- don't try to fix up misaligned load-with-reservation instructions

- fix flush_(d|i)cache_range() called from modules on little endian
kernels

- add missing global TLB invalidate if cxl is active

- fix missing preempt_disable() in crc32c-vpmsum

And a fix for selftests build changes that went in this release:

- selftests/powerpc: Fix standalone powerpc build

Thanks to: Benjamin Herrenschmidt, Frederic Barrat, Oliver O'Halloran,
Paul Mackerras"

* tag 'powerpc-4.11-7' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
powerpc/crypto/crc32c-vpmsum: Fix missing preempt_disable()
powerpc/mm: Add missing global TLB invalidate if cxl is active
powerpc/64: Fix flush_(d|i)cache_range() called from modules
powerpc: Don't try to fix up misaligned load-with-reservation instructions
powerpc: Disable HFSCR[TM] if TM is not supported
selftests/powerpc: Fix standalone powerpc build

+43 -17
+3
arch/powerpc/crypto/crc32c-vpmsum_glue.c
··· 33 33 } 34 34 35 35 if (len & ~VMX_ALIGN_MASK) { 36 + preempt_disable(); 36 37 pagefault_disable(); 37 38 enable_kernel_altivec(); 38 39 crc = __crc32c_vpmsum(crc, p, len & ~VMX_ALIGN_MASK); 40 + disable_kernel_altivec(); 39 41 pagefault_enable(); 42 + preempt_enable(); 40 43 } 41 44 42 45 tail = len & VMX_ALIGN_MASK;
+19 -8
arch/powerpc/kernel/align.c
··· 807 807 nb = aligninfo[instr].len; 808 808 flags = aligninfo[instr].flags; 809 809 810 - /* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */ 811 - if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) { 812 - nb = 8; 813 - flags = LD+SW; 814 - } else if (IS_XFORM(instruction) && 815 - ((instruction >> 1) & 0x3ff) == 660) { 816 - nb = 8; 817 - flags = ST+SW; 810 + /* 811 + * Handle some cases which give overlaps in the DSISR values. 812 + */ 813 + if (IS_XFORM(instruction)) { 814 + switch (get_xop(instruction)) { 815 + case 532: /* ldbrx */ 816 + nb = 8; 817 + flags = LD+SW; 818 + break; 819 + case 660: /* stdbrx */ 820 + nb = 8; 821 + flags = ST+SW; 822 + break; 823 + case 20: /* lwarx */ 824 + case 84: /* ldarx */ 825 + case 116: /* lharx */ 826 + case 276: /* lqarx */ 827 + return 0; /* not emulated ever */ 828 + } 818 829 } 819 830 820 831 /* Byteswap little endian loads and stores */
+2 -2
arch/powerpc/kernel/misc_64.S
··· 67 67 * flush all bytes from start through stop-1 inclusive 68 68 */ 69 69 70 - _GLOBAL(flush_icache_range) 70 + _GLOBAL_TOC(flush_icache_range) 71 71 BEGIN_FTR_SECTION 72 72 PURGE_PREFETCHED_INS 73 73 blr ··· 120 120 * 121 121 * flush all bytes from start to stop-1 inclusive 122 122 */ 123 - _GLOBAL(flush_dcache_range) 123 + _GLOBAL_TOC(flush_dcache_range) 124 124 125 125 /* 126 126 * Flush the data cache to memory
+9
arch/powerpc/kernel/setup_64.c
··· 236 236 mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3); 237 237 } 238 238 239 + /* 240 + * Fixup HFSCR:TM based on CPU features. The bit is set by our 241 + * early asm init because at that point we haven't updated our 242 + * CPU features from firmware and device-tree. Here we have, 243 + * so let's do it. 244 + */ 245 + if (cpu_has_feature(CPU_FTR_HVMODE) && !cpu_has_feature(CPU_FTR_TM_COMP)) 246 + mtspr(SPRN_HFSCR, mfspr(SPRN_HFSCR) & ~HFSCR_TM); 247 + 239 248 /* Set IR and DR in PACA MSR */ 240 249 get_paca()->kernel_msr = MSR_KERNEL; 241 250 }
+5 -2
arch/powerpc/mm/hash_native_64.c
··· 638 638 unsigned long psize = batch->psize; 639 639 int ssize = batch->ssize; 640 640 int i; 641 + unsigned int use_local; 642 + 643 + use_local = local && mmu_has_feature(MMU_FTR_TLBIEL) && 644 + mmu_psize_defs[psize].tlbiel && !cxl_ctx_in_use(); 641 645 642 646 local_irq_save(flags); 643 647 ··· 671 667 } pte_iterate_hashed_end(); 672 668 } 673 669 674 - if (mmu_has_feature(MMU_FTR_TLBIEL) && 675 - mmu_psize_defs[psize].tlbiel && local) { 670 + if (use_local) { 676 671 asm volatile("ptesync":::"memory"); 677 672 for (i = 0; i < number; i++) { 678 673 vpn = batch->vpn[i];
+5 -5
tools/testing/selftests/powerpc/Makefile
··· 34 34 all: $(SUB_DIRS) 35 35 36 36 $(SUB_DIRS): 37 - BUILD_TARGET=$$OUTPUT/$@; mkdir -p $$BUILD_TARGET; $(MAKE) OUTPUT=$$BUILD_TARGET -k -C $@ all 37 + BUILD_TARGET=$(OUTPUT)/$@; mkdir -p $$BUILD_TARGET; $(MAKE) OUTPUT=$$BUILD_TARGET -k -C $@ all 38 38 39 39 include ../lib.mk 40 40 41 41 override define RUN_TESTS 42 42 @for TARGET in $(SUB_DIRS); do \ 43 - BUILD_TARGET=$$OUTPUT/$$TARGET; \ 43 + BUILD_TARGET=$(OUTPUT)/$$TARGET; \ 44 44 $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests;\ 45 45 done; 46 46 endef 47 47 48 48 override define INSTALL_RULE 49 49 @for TARGET in $(SUB_DIRS); do \ 50 - BUILD_TARGET=$$OUTPUT/$$TARGET; \ 50 + BUILD_TARGET=$(OUTPUT)/$$TARGET; \ 51 51 $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install;\ 52 52 done; 53 53 endef 54 54 55 55 override define EMIT_TESTS 56 56 @for TARGET in $(SUB_DIRS); do \ 57 - BUILD_TARGET=$$OUTPUT/$$TARGET; \ 57 + BUILD_TARGET=$(OUTPUT)/$$TARGET; \ 58 58 $(MAKE) OUTPUT=$$BUILD_TARGET -s -C $$TARGET emit_tests;\ 59 59 done; 60 60 endef 61 61 62 62 clean: 63 63 @for TARGET in $(SUB_DIRS); do \ 64 - BUILD_TARGET=$$OUTPUT/$$TARGET; \ 64 + BUILD_TARGET=$(OUTPUT)/$$TARGET; \ 65 65 $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET clean; \ 66 66 done; 67 67 rm -f tags