Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 93165be1285f3a50e69871962061a2e2fcfb9ae6)
+++ generic/src/mm/as.c	(revision 4e49572dad56d20917516259581d99e2ff0d8c6c)
@@ -52,4 +52,5 @@
 #include <debug.h>
 #include <memstr.h>
+#include <macros.h>
 #include <arch.h>
 #include <print.h>
@@ -538,7 +539,13 @@
 	as_area_t *a;
 	
+	/*
+	 * We don't want any area to have conflicts with NULL page.
+	 */
+	if (overlaps(va, size, NULL, PAGE_SIZE))
+		return false;
+	
 	for (cur = as->as_area_head.next; cur != &as->as_area_head; cur = cur->next) {
-		__address start;
-		__address end;
+		__address a_start;
+		size_t a_size;
 	
 		a = list_get_instance(cur, as_area_t, link);
@@ -548,30 +555,21 @@
 		spinlock_lock(&a->lock);
 
-		start = a->base;
-		end = a->base + a->pages * PAGE_SIZE - 1;
+		a_start = a->base;
+		a_size = a->pages * PAGE_SIZE;
 
 		spinlock_unlock(&a->lock);
 
-		if ((va >= start) && (va <= end)) {
-			/*
-			 * Tested area is inside another area.
-			 */
-			return false;
-		}
-		
-		if ((start >= va) && (start < va + size)) {
-			/*
-			 * Another area starts in tested area.
-			 */
-			return false;
-		}
-		
-		if ((end >= va) && (end < va + size)) {
-			/*
-			 * Another area ends in tested area.
-			 */
-			return false;
-		}
-
+		if (overlaps(va, size, a_start, a_size))
+			return false;		
+
+	}
+
+	/*
+	 * So far, the area does not conflict with other areas.
+	 * Check if it doesn't conflict with kernel address space.
+	 */	 
+	if (!KERNEL_ADDRESS_SPACE_SHADOWED) {
+		return !overlaps(va, size, 
+			KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START);
 	}
 
