Index: kernel/arch/arm32/include/mach/integratorcp/integratorcp.h
===================================================================
--- kernel/arch/arm32/include/mach/integratorcp/integratorcp.h	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/include/mach/integratorcp/integratorcp.h	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -103,5 +103,5 @@
 extern void icp_cpu_halt(void);
 extern void icp_irq_exception(unsigned int, istate_t *);
-extern void icp_get_memory_extents(uintptr_t *, uintptr_t *);
+extern void icp_get_memory_extents(uintptr_t *, size_t *);
 extern void icp_frame_init(void);
 extern size_t icp_get_irq_count(void);
Index: kernel/arch/arm32/include/mach/testarm/testarm.h
===================================================================
--- kernel/arch/arm32/include/mach/testarm/testarm.h	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/include/mach/testarm/testarm.h	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -71,5 +71,5 @@
 extern void gxemul_cpu_halt(void);
 extern void gxemul_irq_exception(unsigned int, istate_t *);
-extern void gxemul_get_memory_extents(uintptr_t *, uintptr_t *);
+extern void gxemul_get_memory_extents(uintptr_t *, size_t *);
 extern void gxemul_frame_init(void);
 extern size_t gxemul_get_irq_count(void);
Index: kernel/arch/arm32/include/machine_func.h
===================================================================
--- kernel/arch/arm32/include/machine_func.h	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/include/machine_func.h	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -50,5 +50,5 @@
 	void (*machine_timer_irq_start)(void);
 	void (*machine_cpu_halt)(void);
-	void (*machine_get_memory_extents)(uintptr_t *, uintptr_t *);
+	void (*machine_get_memory_extents)(uintptr_t *, size_t *);
 	void (*machine_irq_exception)(unsigned int, istate_t *);
 	void (*machine_frame_init)(void);
@@ -81,5 +81,5 @@
  * @param size		Place to store memory size.
  */
-extern void machine_get_memory_extents(uintptr_t *start, uintptr_t *size);
+extern void machine_get_memory_extents(uintptr_t *start, size_t *size);
 
 /** Interrupt exception handler.
Index: kernel/arch/arm32/src/mach/gta02/gta02.c
===================================================================
--- kernel/arch/arm32/src/mach/gta02/gta02.c	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/src/mach/gta02/gta02.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -65,5 +65,5 @@
 static void gta02_timer_irq_start(void);
 static void gta02_cpu_halt(void);
-static void gta02_get_memory_extents(uintptr_t *start, uintptr_t *size);
+static void gta02_get_memory_extents(uintptr_t *start, size_t *size);
 static void gta02_irq_exception(unsigned int exc_no, istate_t *istate);
 static void gta02_frame_init(void);
@@ -123,5 +123,5 @@
  * @param size		Place to store memory size.
  */
-static void gta02_get_memory_extents(uintptr_t *start, uintptr_t *size)
+static void gta02_get_memory_extents(uintptr_t *start, size_t *size)
 {
 	*start = GTA02_MEMORY_START + GTA02_MEMORY_SKIP;
Index: kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
===================================================================
--- kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -220,5 +220,5 @@
  * @param size		Place to store memory size.
  */
-void icp_get_memory_extents(uintptr_t *start, uintptr_t *size)
+void icp_get_memory_extents(uintptr_t *start, size_t *size)
 {
 	*start = 0;
Index: kernel/arch/arm32/src/mach/testarm/testarm.c
===================================================================
--- kernel/arch/arm32/src/mach/testarm/testarm.c	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/src/mach/testarm/testarm.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -202,8 +202,8 @@
  * @param size		Place to store memory size.
  */
-void gxemul_get_memory_extents(uintptr_t *start, uintptr_t *size)
+void gxemul_get_memory_extents(uintptr_t *start, size_t *size)
 {
 	*start = 0;
-        *size = *((uintptr_t *) (GXEMUL_MP_ADDRESS + GXEMUL_MP_MEMSIZE_OFFSET));
+	*size = *((uintptr_t *) (GXEMUL_MP_ADDRESS + GXEMUL_MP_MEMSIZE_OFFSET));
 }
 
Index: kernel/arch/arm32/src/machine_func.c
===================================================================
--- kernel/arch/arm32/src/machine_func.c	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/src/machine_func.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -85,5 +85,5 @@
  * @param size		Place to store memory size.
  */
-void machine_get_memory_extents(uintptr_t *start, uintptr_t *size)
+void machine_get_memory_extents(uintptr_t *start, size_t *size)
 {
 	(machine_ops->machine_get_memory_extents)(start, size);
Index: kernel/arch/arm32/src/mm/frame.c
===================================================================
--- kernel/arch/arm32/src/mm/frame.c	(revision 9d4e1704695fcf4bdd0d097a2dc12155e07a840f)
+++ kernel/arch/arm32/src/mm/frame.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -45,8 +45,35 @@
 uintptr_t last_frame = 0;
 
+static void frame_common_arch_init(bool low)
+{
+	uintptr_t base;
+	size_t size;
+
+	machine_get_memory_extents(&base, &size);
+	base = ALIGN_UP(base, FRAME_SIZE);
+	size = ALIGN_DOWN(size, FRAME_SIZE);
+	
+	if (!frame_adjust_zone_bounds(low, &base, &size))
+		return;
+
+	if (low) {
+		zone_create(ADDR2PFN(base), SIZE2FRAMES(size),
+		    BOOT_PAGE_TABLE_START_FRAME +
+		    BOOT_PAGE_TABLE_SIZE_IN_FRAMES,
+		    ZONE_AVAILABLE | ZONE_LOWMEM);
+	} else {
+		pfn_t conf = zone_external_conf_alloc(SIZE2FRAMES(size));
+
+		zone_create(ADDR2PFN(base), SIZE2FRAMES(size), conf,
+		    ZONE_AVAILABLE | ZONE_HIGHMEM);
+	}
+	
+}
+
 /** Create low memory zones. */
 void frame_low_arch_init(void)
 {
-	uintptr_t mem_start, mem_end, mem_size;
+	uintptr_t mem_start;
+	size_t mem_size;
 
 	machine_get_memory_extents(&mem_start, &mem_size);
@@ -54,12 +81,6 @@
 	last_frame = ALIGN_DOWN(mem_start + mem_size, FRAME_SIZE);
 	
-	mem_start = ALIGN_UP(mem_start, FRAME_SIZE);
-	mem_end = min(ALIGN_DOWN(mem_start + mem_size, FRAME_SIZE),
-	    config.identity_size);
+	frame_common_arch_init(true);
 
-	zone_create(ADDR2PFN(mem_start), SIZE2FRAMES(mem_end - mem_start),
-	    BOOT_PAGE_TABLE_START_FRAME + BOOT_PAGE_TABLE_SIZE_IN_FRAMES,
-	    ZONE_AVAILABLE | ZONE_LOWMEM);
-	
 	/* blacklist boot page table */
 	frame_mark_unavailable(BOOT_PAGE_TABLE_START_FRAME,
@@ -72,21 +93,5 @@
 void frame_high_arch_init(void)
 {
-	uintptr_t mem_start, mem_end, mem_size;
-	size_t frames;
-	uintptr_t conf;
-
-	machine_get_memory_extents(&mem_start, &mem_size);
-
-	mem_end = ALIGN_DOWN(mem_start + mem_size, FRAME_SIZE);
-	if (mem_end <= config.identity_size) {
-		/* There is no high memory to init. */
-		return;
-	}
-
-	frames = SIZE2FRAMES(mem_end - config.identity_size);
-	conf = zone_external_conf_alloc(frames);
-
-	zone_create(ADDR2PFN(config.identity_size), frames, conf,
-	    ZONE_AVAILABLE | ZONE_HIGHMEM);
+	frame_common_arch_init(false);
 }
 
