powerepc/book3s64/hash: Align start/end address correctly with bolt mapping
[linux-2.6-microblaze.git] / arch / powerpc / mm / book3s64 / hash_utils.c
index c663e7b..7185bc4 100644 (file)
@@ -260,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);
@@ -343,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;