Index: arch/mips32/src/mm/tlb.c
===================================================================
--- arch/mips32/src/mm/tlb.c	(revision 8b1439e8e30b99c70043159c1395344827b7e749)
+++ arch/mips32/src/mm/tlb.c	(revision 2d01bbdac368338c32d0749e74b5fea2340a22b7)
@@ -39,4 +39,5 @@
 #include <print.h>
 #include <debug.h>
+#include <align.h>
 
 static void tlb_refill_fail(istate_t *istate);
@@ -391,5 +392,5 @@
 void prepare_entry_hi(entry_hi_t *hi, asid_t asid, __address addr)
 {
-	hi->value = (((addr/PAGE_SIZE)/2)*PAGE_SIZE*2);
+	hi->value = ALIGN_DOWN(addr, PAGE_SIZE * 2);
 	hi->asid = asid;
 }
@@ -514,5 +515,5 @@
 	ipl = interrupts_disable();
 
-	for (i = 0; i < cnt; i++) {
+	for (i = 0; i < cnt+1; i+=2) {
 		hi.value = 0;
 		prepare_entry_hi(&hi, asid, page + i * PAGE_SIZE);
Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 8b1439e8e30b99c70043159c1395344827b7e749)
+++ generic/src/mm/as.c	(revision 2d01bbdac368338c32d0749e74b5fea2340a22b7)
@@ -404,6 +404,6 @@
 				ASSERT(PTE_PRESENT(pte));
 				frame_free(ADDR2PFN(PTE_GET_FRAME(pte)));
+				page_mapping_remove(as, area->base + i*PAGE_SIZE);
 			}
-			page_mapping_remove(as, area->base + i*PAGE_SIZE);
 		}
 		/*
@@ -413,10 +413,7 @@
 		tlb_invalidate_pages(AS->asid, area->base + pages*PAGE_SIZE, area->size - pages);
 		tlb_shootdown_finalize();
-	} else {
-		/*
-		 * Growing the area.
-		 */
-		area->size = size;
-	}
+	} 
+
+	area->size = pages;
 	
 	spinlock_unlock(&area->lock);
