Index: kernel/arch/ia32/src/mm/frame.c
===================================================================
--- kernel/arch/ia32/src/mm/frame.c	(revision 10b890bd989b140b5238140ffa8ce961f23dd113)
+++ kernel/arch/ia32/src/mm/frame.c	(revision c6e314a78bffc7c64e7095fea28ffc280b031237)
@@ -137,5 +137,5 @@
 		
 #ifdef CONFIG_SIMICS_FIX
-		/* Don't know why, but this addresses help */
+		/* Don't know why, but these addresses help */
 		frame_mark_unavailable(0xd000 >> FRAME_WIDTH,3);
 #endif
Index: kernel/arch/sparc64/include/mm/frame.h
===================================================================
--- kernel/arch/sparc64/include/mm/frame.h	(revision 10b890bd989b140b5238140ffa8ce961f23dd113)
+++ kernel/arch/sparc64/include/mm/frame.h	(revision c6e314a78bffc7c64e7095fea28ffc280b031237)
@@ -27,5 +27,5 @@
  */
 
- /** @addtogroup sparc64mm	
+/** @addtogroup sparc64mm	
  * @{
  */
@@ -48,6 +48,6 @@
 	struct {
 		unsigned : 23;
-		uint64_t pfn : 28;         /**< Physical Frame Number. */
-		unsigned offset : 13;   /**< Offset. */
+		uint64_t pfn : 28;	/**< Physical Frame Number. */
+		unsigned offset : 13;	/**< Offset. */
 	} __attribute__ ((packed));
 };
@@ -55,4 +55,5 @@
 typedef union frame_address frame_address_t;
 
+extern uintptr_t last_frame;
 extern void frame_arch_init(void);
 
@@ -62,5 +63,4 @@
 #endif
 
- /** @}
+/** @}
  */
-
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 c6e314a78bffc7c64e7095fea28ffc280b031237)
@@ -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 c6e314a78bffc7c64e7095fea28ffc280b031237)
@@ -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 c6e314a78bffc7c64e7095fea28ffc280b031237)
@@ -60,4 +60,9 @@
 void tlb_arch_init(void)
 {
+	/*
+	 * TLBs are actually initialized by
+	 * take_over_tlb_and_tt() early
+	 * in start.S.
+	 */
 }
 
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision 10b890bd989b140b5238140ffa8ce961f23dd113)
+++ kernel/generic/src/mm/as.c	(revision c6e314a78bffc7c64e7095fea28ffc280b031237)
@@ -1522,5 +1522,5 @@
 }
 
-/** Wrapper for as_area_resize. */
+/** Wrapper for as_area_resize(). */
 unative_t sys_as_area_resize(uintptr_t address, size_t size, int flags)
 {
@@ -1528,5 +1528,5 @@
 }
 
-/** Wrapper for as_area_destroy. */
+/** Wrapper for as_area_destroy(). */
 unative_t sys_as_area_destroy(uintptr_t address)
 {
