Index: kernel/arch/amd64/include/mm/frame.h
===================================================================
--- kernel/arch/amd64/include/mm/frame.h	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/amd64/include/mm/frame.h	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -43,5 +43,4 @@
 #include <typedefs.h>
 
-extern uintptr_t last_frame;
 extern void frame_low_arch_init(void);
 extern void frame_high_arch_init(void);
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/amd64/src/mm/page.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -64,7 +64,7 @@
 		
 	/*
-	 * PA2KA(identity) mapping for all frames.
+	 * PA2KA(identity) mapping for all low-memory frames.
 	 */
-	for (cur = 0; cur < min(config.identity_size, last_frame);
+	for (cur = 0; cur < min(config.identity_size, config.physmem_end);
 	    cur += FRAME_SIZE)
 		page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, identity_flags);
Index: kernel/arch/arm32/include/mm/frame.h
===================================================================
--- kernel/arch/arm32/include/mm/frame.h	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/arm32/include/mm/frame.h	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -61,6 +61,4 @@
 #endif
 
-extern uintptr_t last_frame;
-
 extern void frame_low_arch_init(void);
 extern void frame_high_arch_init(void);
Index: kernel/arch/arm32/src/mm/frame.c
===================================================================
--- kernel/arch/arm32/src/mm/frame.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/arm32/src/mm/frame.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -41,8 +41,4 @@
 #include <macros.h>
 
-// TODO: remove me
-/** Address of the last frame in the memory. */
-uintptr_t last_frame = 0;
-
 static void frame_common_arch_init(bool low)
 {
@@ -74,11 +70,4 @@
 void frame_low_arch_init(void)
 {
-	uintptr_t mem_start;
-	size_t mem_size;
-
-	machine_get_memory_extents(&mem_start, &mem_size);
-	// TODO: remove me
-	last_frame = ALIGN_DOWN(mem_start + mem_size, FRAME_SIZE);
-	
 	frame_common_arch_init(true);
 
Index: kernel/arch/arm32/src/mm/page.c
===================================================================
--- kernel/arch/arm32/src/mm/page.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/arm32/src/mm/page.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -58,7 +58,9 @@
 	
 	uintptr_t cur;
+
 	/* Kernel identity mapping */
 	for (cur = PHYSMEM_START_ADDR;
-	    cur < min(config.identity_base, last_frame); cur += FRAME_SIZE)
+	    cur < min(config.identity_size, config.physmem_end);
+	    cur += FRAME_SIZE)
 		page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
 	
Index: kernel/arch/ia32/include/mm/frame.h
===================================================================
--- kernel/arch/ia32/include/mm/frame.h	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/ia32/include/mm/frame.h	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -43,6 +43,4 @@
 #include <typedefs.h>
 
-extern uintptr_t last_frame;
-
 extern void frame_low_arch_init(void);
 extern void frame_high_arch_init(void);
Index: kernel/arch/ia32/src/mm/frame.c
===================================================================
--- kernel/arch/ia32/src/mm/frame.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/ia32/src/mm/frame.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -49,7 +49,4 @@
 size_t hardcoded_unmapped_kdata_size = 0;
 
-// XXX: remove me
-uintptr_t last_frame = 0;
-
 static void init_e820_memory(pfn_t minconf, bool low)
 {
@@ -85,8 +82,4 @@
 				    ZONE_AVAILABLE | ZONE_HIGHMEM);
 			}
-			
-			// XXX: remove me
-			if (last_frame < new_base + new_size)
-				last_frame = new_base + new_size;
 		} else if ((e820table[i].type == MEMMAP_MEMORY_ACPI) ||
 		    (e820table[i].type == MEMMAP_MEMORY_NVS)) {
Index: kernel/arch/ia32/src/mm/page.c
===================================================================
--- kernel/arch/ia32/src/mm/page.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/ia32/src/mm/page.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -66,12 +66,12 @@
 	
 	/*
-	 * PA2KA(identity) mapping for all frames until last_frame.
+	 * PA2KA(identity) mapping for all low-memory frames.
 	 */
 	page_table_lock(AS_KERNEL, true);
-	for (cur = 0; cur < min(config.identity_size, last_frame);
+	for (cur = 0; cur < min(config.identity_size, config.physmem_end);
 	    cur += FRAME_SIZE) {
 		flags = PAGE_CACHEABLE | PAGE_WRITE;
-		if ((PA2KA(cur) >= config.base) && (PA2KA(cur) <
-		    config.base + config.kernel_size))
+		if ((PA2KA(cur) >= config.base) &&
+		    (PA2KA(cur) < config.base + config.kernel_size))
 			flags |= PAGE_GLOBAL;
 		page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
Index: kernel/arch/ia64/include/mm/frame.h
===================================================================
--- kernel/arch/ia64/include/mm/frame.h	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/ia64/include/mm/frame.h	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -43,6 +43,4 @@
 #include <typedefs.h>
 
-extern uintptr_t last_frame;
-
 extern void frame_low_arch_init(void);
 extern void frame_high_arch_init(void);
Index: kernel/arch/ia64/src/mm/frame.c
===================================================================
--- kernel/arch/ia64/src/mm/frame.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/ia64/src/mm/frame.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -51,7 +51,4 @@
 #define MINCONF 1
 
-// XXX: remove me
-uintptr_t last_frame = 0;
-
 static void frame_common_arch_init(bool low)
 {
@@ -68,8 +65,4 @@
 		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))
Index: kernel/arch/ppc32/include/mm/frame.h
===================================================================
--- kernel/arch/ppc32/include/mm/frame.h	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/ppc32/include/mm/frame.h	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -44,6 +44,4 @@
 #include <trace.h>
 
-extern uintptr_t last_frame;
-
 NO_TRACE static inline uint32_t physmem_top(void)
 {
Index: kernel/arch/ppc32/src/mm/frame.c
===================================================================
--- kernel/arch/ppc32/src/mm/frame.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/ppc32/src/mm/frame.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -40,7 +40,4 @@
 #include <print.h>
 
-// XXX: remove me
-uintptr_t last_frame = 0;
-
 memmap_t memmap;
 
@@ -67,8 +64,4 @@
 		size_t size = ALIGN_DOWN(memmap.zones[i].size -
 		    (base - ((uintptr_t) memmap.zones[i].start)), FRAME_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))
Index: kernel/arch/sparc64/include/mm/sun4u/frame.h
===================================================================
--- kernel/arch/sparc64/include/mm/sun4u/frame.h	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/sparc64/include/mm/sun4u/frame.h	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -72,5 +72,4 @@
 typedef union frame_address frame_address_t;
 
-extern uintptr_t last_frame;
 extern uintptr_t end_of_identity;
 
Index: kernel/arch/sparc64/include/mm/sun4v/frame.h
===================================================================
--- kernel/arch/sparc64/include/mm/sun4v/frame.h	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/sparc64/include/mm/sun4v/frame.h	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -46,5 +46,4 @@
 #include <typedefs.h>
 
-extern uintptr_t last_frame;
 extern void frame_low_arch_init(void);
 extern void frame_high_arch_init(void);
Index: kernel/arch/sparc64/src/mm/sun4u/frame.c
===================================================================
--- kernel/arch/sparc64/src/mm/sun4u/frame.c	(revision 056ddc301e4424ece6667c2456e0e37110d4cdbe)
+++ kernel/arch/sparc64/src/mm/sun4u/frame.c	(revision b4e59b35396fd1c4445d74278acf9652804a140c)
@@ -41,7 +41,4 @@
 #include <macros.h>
 
-// TODO: remove me
-uintptr_t last_frame = (uintptr_t) NULL;
-
 /** Create memory zones according to information stored in memmap.
  *
@@ -66,7 +63,4 @@
 		    (base - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE);
 		
-		// TODO: remove me
-		last_frame = max(last_frame, base + size);
-
 		if (!frame_adjust_zone_bounds(low, &base, &size))
 			continue;
@@ -106,6 +100,7 @@
 	 */
 	frame_mark_unavailable(ADDR2PFN(KA2PA(PFN2ADDR(0))), 1);
-	
-	end_of_identity = PA2KA(last_frame);
+
+	/* PA2KA will work only on low-memory. */
+	end_of_identity = PA2KA(config.physmem_end - FRAME_SIZE) + PAGE_SIZE;
 }
 
