Index: kernel/arch/sparc64/src/mm/frame.c
===================================================================
--- kernel/arch/sparc64/src/mm/frame.c	(revision 10b890bd989b140b5238140ffa8ce961f23dd113)
+++ kernel/arch/sparc64/src/mm/frame.c	(revision 231fcb23cee33316ea3e310a65aa685ed0fc8538)
@@ -36,6 +36,10 @@
 #include <mm/frame.h>
 #include <arch/boot/boot.h>
+#include <arch/types.h>
 #include <config.h>
 #include <align.h>
+#include <macros.h>
+
+uintptr_t last_frame = NULL;
 
 /** Create memory zones according to information stored in bootinfo.
@@ -51,4 +55,6 @@
 
 	for (i = 0; i < bootinfo.memmap.count; i++) {
+		uintptr_t start = bootinfo.memmap.zones[i].start;
+		size_t size = bootinfo.memmap.zones[i].size;
 
 		/*
@@ -57,10 +63,10 @@
 		 */
 	
-		confdata = ADDR2PFN(bootinfo.memmap.zones[i].start);
+		confdata = ADDR2PFN(start);
 		if (confdata == 0)
 			confdata = 2;
-		zone_create(ADDR2PFN(bootinfo.memmap.zones[i].start),
-			SIZE2FRAMES(ALIGN_DOWN(bootinfo.memmap.zones[i].size, PAGE_SIZE)),
-			confdata, 0);
+		zone_create(ADDR2PFN(start), SIZE2FRAMES(ALIGN_DOWN(size, FRAME_SIZE)),	confdata, 0);
+		
+		last_frame = max(last_frame, start + ALIGN_UP(size, FRAME_SIZE));
 	}
 
Index: kernel/arch/sparc64/src/mm/page.c
===================================================================
--- kernel/arch/sparc64/src/mm/page.c	(revision 10b890bd989b140b5238140ffa8ce961f23dd113)
+++ kernel/arch/sparc64/src/mm/page.c	(revision 231fcb23cee33316ea3e310a65aa685ed0fc8538)
@@ -27,5 +27,5 @@
  */
 
- /** @addtogroup sparc64mm	
+/** @addtogroup sparc64mm	
  * @{
  */
@@ -37,6 +37,8 @@
 #include <genarch/mm/page_ht.h>
 #include <mm/frame.h>
+#include <arch/mm/frame.h>
 #include <bitops.h>
 #include <debug.h>
+#include <align.h>
 
 void page_arch_init(void)
@@ -73,7 +75,14 @@
 	else
 		order = (fnzb32(size - 1) + 1) - FRAME_WIDTH;
+
+	/*
+	 * Use virtual addresses that are beyond the limit of physical memory.
+	 * Thus, the physical address space will not be wasted by holes created
+	 * by frame_alloc().
+	 */
+	ASSERT(last_frame);
+	uintptr_t virtaddr = ALIGN_UP(last_frame, 1<<(order + FRAME_WIDTH));
+	last_frame = ALIGN_UP(virtaddr + size, 1<<(order + FRAME_WIDTH));
 	
-	uintptr_t virtaddr = (uintptr_t) frame_alloc(order, FRAME_KA);
-
 	for (i = 0; i < sizemap[order].count; i++)
 		dtlb_insert_mapping(virtaddr + i*sizemap[order].increment,
@@ -84,5 +93,4 @@
 }
 
- /** @}
+/** @}
  */
-
Index: kernel/arch/sparc64/src/mm/tlb.c
===================================================================
--- kernel/arch/sparc64/src/mm/tlb.c	(revision 10b890bd989b140b5238140ffa8ce961f23dd113)
+++ kernel/arch/sparc64/src/mm/tlb.c	(revision 231fcb23cee33316ea3e310a65aa685ed0fc8538)
@@ -60,4 +60,9 @@
 void tlb_arch_init(void)
 {
+	/*
+	 * TLBs are actually initialized by
+	 * take_over_tlb_and_tt() early
+	 * in start.S.
+	 */
 }
 
