Index: arch/sparc64/_link.ld.in
===================================================================
--- arch/sparc64/_link.ld.in	(revision 37c8975a5116482f4bdd559722bb5883196b0b85)
+++ arch/sparc64/_link.ld.in	(revision 0e4dd7b95bffe673fac48922bc9a9259c32b00ad)
@@ -8,9 +8,10 @@
 
 #define __ASM__
+#include <arch/boot/boot.h>
 
 ENTRY(kernel_image_start)
 
 SECTIONS {
-	.image 0x4000: AT (0x4000) { 
+	.image VMA: AT (LMA) { 
 		ktext_start = .;
 		*(K_TEXT_START)
@@ -31,5 +32,5 @@
 		QUAD(kdata_end - kdata_start);
 		hardcoded_load_address = .;
-		QUAD(0x4000);
+		QUAD(VMA);
 		*(.bss);		/* uninitialized static variables */	
 		*(COMMON); 		/* global variables */
Index: arch/sparc64/include/boot/boot.h
===================================================================
--- arch/sparc64/include/boot/boot.h	(revision 0e4dd7b95bffe673fac48922bc9a9259c32b00ad)
+++ arch/sparc64/include/boot/boot.h	(revision 0e4dd7b95bffe673fac48922bc9a9259c32b00ad)
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __sparc64_BOOT_H__
+#define __sparc64_BOOT_H__
+
+#define BOOT_OFFSET		0x4000
+#define VMA			0x400000
+#define LMA			BOOT_OFFSET
+
+#endif
Index: arch/sparc64/src/mm/tlb.c
===================================================================
--- arch/sparc64/src/mm/tlb.c	(revision 37c8975a5116482f4bdd559722bb5883196b0b85)
+++ arch/sparc64/src/mm/tlb.c	(revision 0e4dd7b95bffe673fac48922bc9a9259c32b00ad)
@@ -63,6 +63,5 @@
 	
 	/*
-	 * For simplicity, we do identity mapping of first 4M of memory.
-	 * The very next change should be leaving the first 4M unmapped.
+	 * We do identity mapping of 4M-page at 4M.
 	 */
 	tag.value = 0;
Index: arch/sparc64/src/start.S
===================================================================
--- arch/sparc64/src/start.S	(revision 37c8975a5116482f4bdd559722bb5883196b0b85)
+++ arch/sparc64/src/start.S	(revision 0e4dd7b95bffe673fac48922bc9a9259c32b00ad)
@@ -27,4 +27,6 @@
 #
 
+#include <arch/boot/boot.h>
+
 .register %g2, #scratch
 .register %g3, #scratch
@@ -51,4 +53,39 @@
 
 1:
+	flushw				! flush all but the active register window
+
+	/*
+	 * Prepare to copy the kernel image to 4M.
+	 */
+
+	set LMA, %g1			! source address
+	set VMA, %g2			! destination address (VMA)
+	set hardcoded_ktext_size, %g3	! link address of hardcoded_ktext_size
+	set hardcoded_kdata_size, %g4	! link address of hardcoded_kdata_size
+
+	sub %g3, %g2, %g3		! offset of hardcoded_ktext_size from the beginning of the load address
+	sub %g4, %g2, %g4		! offset of hardcoded_kdata_size from the beginning of the load address
+	
+	ldx [%g3 + %g1], %g3		! hardcoded_ktext_size -> %g3
+	ldx [%g4 + %g1], %g4		! hardcoded_kdata_size -> %g4
+
+	add %g3, %g4, %g3		! size of kernel text and data
+
+	/*
+	 * Start copying the kernel from higher addresses towards lower addresses.
+	 */
+
+2:	dec %g3
+	ldub [%g1 + %g3], %g4
+	stb %g4, [%g2 + %g3]
+	cmp %g3, 0
+	bnz 2b
+	nop
+
+	set relocated, %g1
+	jmp %g1
+	nop
+
+relocated:
 	set ofw, %l0
 
