powerepc/book3s64/hash: Align start/end address correctly with bolt mapping
[linux-2.6-microblaze.git] / arch / powerpc / mm / book3s64 / hash_utils.c
index 1da9dbb..7185bc4 100644 (file)
@@ -232,6 +232,8 @@ unsigned long htab_convert_pte_flags(unsigned long pteflags)
                rflags |= HPTE_R_I;
        else if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_NON_IDEMPOTENT)
                rflags |= (HPTE_R_I | HPTE_R_G);
+       else if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_SAO)
+               rflags |= (HPTE_R_W | HPTE_R_I | HPTE_R_M);
        else
                /*
                 * Add memory coherence if cache inhibited is not set
@@ -258,8 +260,12 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
        DBG("htab_bolt_mapping(%lx..%lx -> %lx (%lx,%d,%d)\n",
            vstart, vend, pstart, prot, psize, ssize);
 
-       for (vaddr = vstart, paddr = pstart; vaddr < vend;
-            vaddr += step, paddr += step) {
+       /* Carefully map only the possible range */
+       vaddr = ALIGN(vstart, step);
+       paddr = ALIGN(pstart, step);
+       vend  = ALIGN_DOWN(vend, step);
+
+       for (; vaddr < vend; vaddr += step, paddr += step) {
                unsigned long hash, hpteg;
                unsigned long vsid = get_kernel_vsid(vaddr, ssize);
                unsigned long vpn  = hpt_vpn(vaddr, vsid, ssize);
@@ -341,7 +347,9 @@ int htab_remove_mapping(unsigned long vstart, unsigned long vend,
        if (!mmu_hash_ops.hpte_removebolted)
                return -ENODEV;
 
-       for (vaddr = vstart; vaddr < vend; vaddr += step) {
+       /* Unmap the full range specificied */
+       vaddr = ALIGN_DOWN(vstart, step);
+       for (;vaddr < vend; vaddr += step) {
                rc = mmu_hash_ops.hpte_removebolted(vaddr, psize, ssize);
                if (rc == -ENOENT) {
                        ret = -ENOENT;
@@ -1115,8 +1123,10 @@ void hash__early_init_mmu_secondary(void)
                        && cpu_has_feature(CPU_FTR_HVMODE))
                tlbiel_all();
 
-       if (IS_ENABLED(CONFIG_PPC_MEM_KEYS) && mmu_has_feature(MMU_FTR_PKEY))
+#ifdef CONFIG_PPC_MEM_KEYS
+       if (mmu_has_feature(MMU_FTR_PKEY))
                mtspr(SPRN_UAMOR, default_uamor);
+#endif
 }
 #endif /* CONFIG_SMP */