Index: kernel/arch/mips64/src/mm/frame.c
===================================================================
--- kernel/arch/mips64/src/mm/frame.c	(revision ddcc8a0d63f8ff64bcff9151c6d65b103343d22c)
+++ kernel/arch/mips64/src/mm/frame.c	(revision 9aed1447765df907632291e993be7acf559d0057)
@@ -123,25 +123,38 @@
 }
 
-static void frame_add_region(pfn_t start_frame, pfn_t end_frame)
-{
-	if (end_frame > start_frame) {
-		/* Convert 1M frames to 16K frames */
-		pfn_t first = ADDR2PFN(start_frame << ZERO_PAGE_WIDTH);
-		pfn_t count = ADDR2PFN((end_frame - start_frame) << ZERO_PAGE_WIDTH);
-		
+static void frame_add_region(pfn_t start_frame, pfn_t end_frame, bool low)
+{
+	if (end_frame <= start_frame)
+		return;
+
+	uintptr_t base = start_frame << ZERO_PAGE_WIDTH;
+	size_t size = (end_frame - start_frame) << ZERO_PAGE_WIDTH;
+
+	if (!frame_adjust_zone_bounds(low, &base, &size))
+		return; 
+
+	pfn_t first = ADDR2PFN(base);
+	size_t count = SIZE2FRAMES(size);
+	pfn_t conf_frame;
+
+	if (low) {
 		/* Interrupt vector frame is blacklisted */
-		pfn_t conf_frame;
 		if (first == 0)
 			conf_frame = 1;
 		else
 			conf_frame = first;
+		zone_create(first, count, conf_frame,
+		    ZONE_AVAILABLE | ZONE_LOWMEM);
+	} else {
+		conf_frame = zone_external_conf_alloc(count);
+		zone_create(first, count, conf_frame,
+		    ZONE_AVAILABLE | ZONE_HIGHMEM);
+	}
 		
-		zone_create(first, count, conf_frame, 0);
 		
-		if (phys_regions_count < MAX_REGIONS) {
-			phys_regions[phys_regions_count].start = first;
-			phys_regions[phys_regions_count].count = count;
-			phys_regions_count++;
-		}
+	if (phys_regions_count < MAX_REGIONS) {
+		phys_regions[phys_regions_count].start = first;
+		phys_regions[phys_regions_count].count = count;
+		phys_regions_count++;
 	}
 }
@@ -207,5 +220,5 @@
 		
 		if (!avail) {
-			frame_add_region(start_frame, frame);
+			frame_add_region(start_frame, frame, true);
 			start_frame = frame + 1;
 			avail = true;
@@ -213,5 +226,5 @@
 	}
 	
-	frame_add_region(start_frame, frame);
+	frame_add_region(start_frame, frame, true);
 	
 	/* Blacklist interrupt vector frame */
