Index: kernel/arch/ia64/src/mm/frame.c
===================================================================
--- kernel/arch/ia64/src/mm/frame.c	(revision ddcc8a0d63f8ff64bcff9151c6d65b103343d22c)
+++ kernel/arch/ia64/src/mm/frame.c	(revision 50177dcd51d58a030da7707ce62ab9fad45123a6)
@@ -51,43 +51,70 @@
 #define MINCONF 1
 
+// XXX: remove me
 uintptr_t last_frame = 0;
+
+static void frame_common_arch_init(bool low)
+{
+	unsigned int i;
+
+	for (i = 0; i < bootinfo->memmap_items; i++) {
+		if (bootinfo->memmap[i].type != MEMMAP_FREE_MEM)
+			continue;
+
+		uintptr_t base = bootinfo->memmap[i].base;
+		size_t size = bootinfo->memmap[i].size;
+		uintptr_t abase = ALIGN_UP(base, FRAME_SIZE);
+
+		if (size > FRAME_SIZE)
+			size -= abase - base;
+
+		// FIXME: remove me
+		if (abase + size > last_frame)
+			last_frame = abase + size;
+
+		if (!frame_adjust_zone_bounds(low, &abase, &size))
+			continue;
+
+		if (size > MIN_ZONE_SIZE) {
+			pfn_t pfn = ADDR2PFN(abase);
+			size_t count = SIZE2FRAMES(size);
+
+			if (low) {
+				zone_create(pfn, count, max(MINCONF, pfn),
+				    ZONE_AVAILABLE | ZONE_LOWMEM);
+			} else {
+				pfn_t conf;
+
+				conf = zone_external_conf_alloc(count);
+				zone_create(pfn, count, conf,
+				    ZONE_AVAILABLE | ZONE_HIGHMEM);
+			}
+		}
+	}
+}
 
 void frame_low_arch_init(void)
 {
-	if (config.cpu_active == 1) {
-		unsigned int i;
-		for (i = 0; i < bootinfo->memmap_items; i++) {
-			if (bootinfo->memmap[i].type == MEMMAP_FREE_MEM) {
-				uint64_t base = bootinfo->memmap[i].base;
-				uint64_t size = bootinfo->memmap[i].size;
-				uint64_t abase = ALIGN_UP(base, FRAME_SIZE);
+	if (config.cpu_active > 1)
+		return;
+	
+	frame_common_arch_init(true);
+	
+	/*
+	 * Blacklist ROM regions.
+	 */
+	frame_mark_unavailable(ADDR2PFN(ROM_BASE),
+	    SIZE2FRAMES(ROM_SIZE));
 
-				if (size > FRAME_SIZE)
-					size -= abase - base;
-
-				if (size > MIN_ZONE_SIZE) {
-					zone_create(abase >> FRAME_WIDTH,
-					    size >> FRAME_WIDTH,
-					    max(MINCONF, abase >> FRAME_WIDTH),
-					    0);
-				}
-				if (abase + size > last_frame)
-					last_frame = abase + size;
-			}
-		}
-		
-		/*
-		 * Blacklist ROM regions.
-		 */
-		frame_mark_unavailable(ADDR2PFN(ROM_BASE),
-		    SIZE2FRAMES(ROM_SIZE));
-
-		frame_mark_unavailable(ADDR2PFN(KERNEL_RESERVED_AREA_BASE),
-		    SIZE2FRAMES(KERNEL_RESERVED_AREA_SIZE));
-	}	
+	frame_mark_unavailable(ADDR2PFN(KERNEL_RESERVED_AREA_BASE),
+	    SIZE2FRAMES(KERNEL_RESERVED_AREA_SIZE));
 }
 
 void frame_high_arch_init(void)
 {
+	if (config.cpu_active > 1)
+		return;
+	
+	frame_common_arch_init(false);
 }
 
