Index: kernel/arch/sparc64/src/mm/page.c
===================================================================
--- kernel/arch/sparc64/src/mm/page.c	(revision 73a1fe5b91c30e933651a7a22af4e5e3b230a12e)
+++ kernel/arch/sparc64/src/mm/page.c	(revision 79f119b9e03afca087e6fef2c56a7fabb01c8cc1)
@@ -136,7 +136,7 @@
 	 * 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));
+	ASSERT(PA2KA(last_frame));
+	uintptr_t virtaddr = ALIGN_UP(PA2KA(last_frame), 1 << (order + FRAME_WIDTH));
+	last_frame = ALIGN_UP(KA2PA(virtaddr) + size, 1 << (order + FRAME_WIDTH));
 	
 	for (i = 0; i < sizemap[order].count; i++) {
Index: kernel/arch/sparc64/src/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sparc64.c	(revision 73a1fe5b91c30e933651a7a22af4e5e3b230a12e)
+++ kernel/arch/sparc64/src/sparc64.c	(revision 79f119b9e03afca087e6fef2c56a7fabb01c8cc1)
@@ -59,5 +59,5 @@
 
 	for (i = 0; i < bootinfo.taskmap.count; i++) {
-		init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr);
+		init.tasks[i].addr = (uintptr_t) bootinfo.taskmap.tasks[i].addr;
 		init.tasks[i].size = bootinfo.taskmap.tasks[i].size;
 	}
Index: kernel/arch/sparc64/src/start.S
===================================================================
--- kernel/arch/sparc64/src/start.S	(revision 73a1fe5b91c30e933651a7a22af4e5e3b230a12e)
+++ kernel/arch/sparc64/src/start.S	(revision 79f119b9e03afca087e6fef2c56a7fabb01c8cc1)
@@ -68,23 +68,8 @@
 	andn %o0, %l0, %l6				! l6 <= start of physical memory
 
-	sethi %hi(physmem_base), %l5
-	stx %l6, [%l5 + %lo(physmem_base)]
-
-	/*
-	 * Get bits 40:13 of physmem_base.
-	 */ 
-	sethi %hi(mask_40_13), %l4
-	sethi %hi(physmem_base_40_13), %l3
-	ldx [%l4 + %lo(mask_40_13)], %l4
-	and %l6, %l4, %l5				! l5 <= physmem_base[40:13]
-	stx %l5, [%l3 + %lo(physmem_base_40_13)]
-
-	/*
-	 * Prepare kernel 8K TLB data template.
-	 */
-	sethi %hi(kernel_8k_tlb_data_template), %l4
-	ldx [%l4 + %lo(kernel_8k_tlb_data_template)], %l3
-	or %l3, %l5, %l3
-	stx %l3, [%l4 + %lo(kernel_8k_tlb_data_template)]
+	! Get bits 40:13 of physmem_base.
+	srlx %l6, 13, %l5
+	sllx %l5, 13 + (63 - 40), %l5
+	srlx %l5, 63 - 40, %l5				! l5 <= physmem_base[40:13]
 	
 	/*
@@ -245,4 +230,20 @@
 
 	/*
+	 * Save physmem_base for use by the mm subsystem.
+	 * %l6 contains starting physical address
+	 */
+	sethi %hi(physmem_base), %l4
+	stx %l6, [%l4 + %lo(physmem_base)]
+
+	/*
+	 * Precompute kernel 8K TLB data template.
+	 * %l5 contains starting physical address bits [40:13]
+	 */
+	sethi %hi(kernel_8k_tlb_data_template), %l4
+	ldx [%l4 + %lo(kernel_8k_tlb_data_template)], %l3
+	or %l3, %l5, %l3
+	stx %l3, [%l4 + %lo(kernel_8k_tlb_data_template)]
+
+	/*
 	 * So far, we have not touched the stack.
 	 * It is a good idea to set the kernel stack to a known state now.
@@ -341,19 +342,10 @@
 	.quad 0
 
-.global physmem_base_40_13
-physmem_base_40_13:		! physmem_base & mask_40_13
-	.quad 0
-
-.global mask_40_13
-mask_40_13:			! constant with bits 40:13 set
-	.quad (((1 << 41) - 1) & ~((1 << 13) - 1))
-
 /*
  * This variable is used by the fast_data_MMU_miss trap handler.
- * It is initialized to reflect the starting address of physical
- * memory.
+ * In runtime, it is further modified to reflect the starting address of
+ * physical memory.
  */
 .global kernel_8k_tlb_data_template
 kernel_8k_tlb_data_template:
 	.quad ((1 << TTE_V_SHIFT) | TTE_CV | TTE_CP | TTE_P | TTE_W)
-
