Index: generic/src/mm/frame.c
===================================================================
--- generic/src/mm/frame.c	(revision 23230aa7450434a64c8b22548941f39b62eac3d9)
+++ generic/src/mm/frame.c	(revision 8b80b72bc933011825a2ff4663337fac00213667)
@@ -137,8 +137,7 @@
 	if (zones.count+1 == ZONES_MAX)
 		panic("Maximum zone(%d) count exceeded.", ZONES_MAX);
-
 	for (i=0; i < zones.count; i++) {
 		/* Check for overflow */
-		z = zones.info[zones.count];
+		z = zones.info[i];
 		if (overlaps(newzone->base,newzone->count,
 			     z->base, z->count)) {
@@ -146,5 +145,5 @@
 			return -1;
 		}
-		if (z->base < newzone->base)
+		if (newzone->base < z->base)
 			break;
 	}
@@ -152,8 +151,6 @@
 	for (j=i;j < zones.count;j++)
 		zones.info[j+1] = zones.info[j];
-
 	zones.info[i] = newzone;
 	zones.count++;
-
 	spinlock_unlock(&zones.lock);
 	interrupts_restore(ipl);
@@ -768,5 +765,5 @@
 		frame_initialize(&z->frames[i]);
 	}
-
+	
 	/* Stuffing frames */
 	for (i = 0; i < count; i++) {
@@ -844,5 +841,4 @@
 			zone_mark_unavailable(z, i - z->base);
 		}
-
 	return znum;
 }
@@ -972,5 +968,5 @@
 	zone_t *zone;
 	int prefzone = 0;
-
+	
 	for (i=0; i < count; i++) {
 		zone = find_zone_and_lock(start+i,&prefzone);
@@ -996,6 +992,7 @@
 	frame_arch_init();
 	if (config.cpu_active == 1) {
-		frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)),
-				       SIZE2FRAMES(config.kernel_size));
+		pfn_t firstframe = ADDR2PFN(KA2PA(config.base));
+		pfn_t lastframe = ADDR2PFN(KA2PA(config.base+config.kernel_size));
+		frame_mark_unavailable(firstframe,lastframe-firstframe+1);
 		if (config.init_size > 0)
 			frame_mark_unavailable(ADDR2PFN(KA2PA(config.init_addr)),
