Index: kernel/arch/ppc32/src/mm/frame.c
===================================================================
--- kernel/arch/ppc32/src/mm/frame.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
+++ kernel/arch/ppc32/src/mm/frame.c	(revision 7978177c2d4315e6f729fb207b2a4c861e0fc170)
@@ -40,5 +40,7 @@
 #include <print.h>
 
+// XXX: remove me
 uintptr_t last_frame = 0;
+
 memmap_t memmap;
 
@@ -54,5 +56,5 @@
 }
 
-void frame_low_arch_init(void)
+static void frame_common_arch_init(bool low)
 {
 	pfn_t minconf = 2;
@@ -61,23 +63,39 @@
 	for (i = 0; i < memmap.cnt; i++) {
 		/* To be safe, make the available zone possibly smaller */
-		uintptr_t new_start = ALIGN_UP((uintptr_t) memmap.zones[i].start,
+		uintptr_t base = ALIGN_UP((uintptr_t) memmap.zones[i].start,
 		    FRAME_SIZE);
-		size_t new_size = ALIGN_DOWN(memmap.zones[i].size -
-		    (new_start - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE);
+		size_t size = ALIGN_DOWN(memmap.zones[i].size -
+		    (base - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE);
 		
-		pfn_t pfn = ADDR2PFN(new_start);
-		size_t count = SIZE2FRAMES(new_size);
+		// XXX: remove me
+		if (last_frame < ALIGN_UP(base + size, FRAME_SIZE))
+			last_frame = ALIGN_UP(base + size, FRAME_SIZE);
 		
+		if (!frame_adjust_zone_bounds(low, &base, &size))
+			return;
+
+		pfn_t pfn = ADDR2PFN(base);
+		size_t count = SIZE2FRAMES(size);
 		pfn_t conf;
-		if ((minconf < pfn) || (minconf >= pfn + count))
-			conf = pfn;
-		else
-			conf = minconf;
-		
-		zone_create(pfn, count, conf, 0);
-		
-		if (last_frame < ALIGN_UP(new_start + new_size, FRAME_SIZE))
-			last_frame = ALIGN_UP(new_start + new_size, FRAME_SIZE);
+
+		if (low) {
+			if ((minconf < pfn) || (minconf >= pfn + count))
+				conf = pfn;
+			else
+				conf = minconf;
+			zone_create(pfn, count, conf,
+			    ZONE_AVAILABLE | ZONE_LOWMEM);
+		} else {
+			conf = zone_external_conf_alloc(count);
+			zone_create(pfn, count, conf,
+			    ZONE_AVAILABLE | ZONE_HIGHMEM);
+		}
 	}
+	
+}
+
+void frame_low_arch_init(void)
+{
+	frame_common_arch_init(true);
 	
 	/* First is exception vector, second is 'implementation specific',
@@ -94,4 +112,5 @@
 void frame_high_arch_init(void)
 {
+	frame_common_arch_init(false);
 }
 
