Index: arch/sparc64/Makefile.inc
===================================================================
--- arch/sparc64/Makefile.inc	(revision c0bc1898445c3789b9e325736e7e2d2f9361f8d9)
+++ arch/sparc64/Makefile.inc	(revision 7633b109e17e4f8643784b2812f8275a844acef1)
@@ -62,7 +62,9 @@
 
 ## Compile with support for framebuffer.
+## Mapping of the framebuffer is implemented by a sparc64-specific function.
 #
 
 CONFIG_FB = y
+CONFIG_FB_MAP_ARCH = y
 
 ## Compile with support for i8042 controller.
Index: arch/sparc64/src/console.c
===================================================================
--- arch/sparc64/src/console.c	(revision c0bc1898445c3789b9e325736e7e2d2f9361f8d9)
+++ arch/sparc64/src/console.c	(revision 7633b109e17e4f8643784b2812f8275a844acef1)
@@ -72,4 +72,10 @@
 }
 
+void fb_map_arch(__address virtaddr, __address physaddr, size_t size)
+{
+	dtlb_insert_mapping(virtaddr, physaddr, PAGESIZE_512K, true, false);
+	dtlb_insert_mapping(virtaddr + 512*1024, physaddr + 512*1024, PAGESIZE_512K, true, false);
+}
+
 /** Initialize kernel console to use framebuffer and keyboard directly. */
 void standalone_sparc64_console_init(void)
@@ -78,8 +84,7 @@
 	stdin = NULL;
 
-	dtlb_insert_mapping(FB_VIRT_ADDRESS, FB_PHYS_ADDRESS, PAGESIZE_4M, true, false);
 	dtlb_insert_mapping(KBD_VIRT_ADDRESS, KBD_PHYS_ADDRESS, PAGESIZE_8K, true, false);
 
-	fb_init(FB_VIRT_ADDRESS, FB_X_RES, FB_Y_RES, FB_COLOR_DEPTH, FB_X_RES * FB_COLOR_DEPTH / 8);
+	fb_init(FB_PHYS_ADDRESS, FB_X_RES, FB_Y_RES, FB_COLOR_DEPTH, FB_X_RES * FB_COLOR_DEPTH / 8);
 	i8042_init();
 }
Index: genarch/Makefile.inc
===================================================================
--- genarch/Makefile.inc	(revision c0bc1898445c3789b9e325736e7e2d2f9361f8d9)
+++ genarch/Makefile.inc	(revision 7633b109e17e4f8643784b2812f8275a844acef1)
@@ -68,4 +68,8 @@
 		genarch/src/fb/fb.c
 	DEFS += -DCONFIG_FB
+	ifneq ($(CONFIG_FB_MAP_ARCH),y)
+		GENARCH_SOURCES += \
+			genarch/src/fb/fb_map.c
+	endif
 endif
 
Index: genarch/include/fb/fb.h
===================================================================
--- genarch/include/fb/fb.h	(revision c0bc1898445c3789b9e325736e7e2d2f9361f8d9)
+++ genarch/include/fb/fb.h	(revision 7633b109e17e4f8643784b2812f8275a844acef1)
@@ -36,3 +36,6 @@
 void fb_init(__address addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan);
 
+/* To be implemented by architecture. */
+void fb_map_arch(__address virtaddr, __address physaddr, size_t size);
+
 #endif
Index: genarch/src/fb/fb.c
===================================================================
--- genarch/src/fb/fb.c	(revision c0bc1898445c3789b9e325736e7e2d2f9361f8d9)
+++ genarch/src/fb/fb.c	(revision 7633b109e17e4f8643784b2812f8275a844acef1)
@@ -33,5 +33,4 @@
 #include <sysinfo/sysinfo.h>
 #include <mm/slab.h>
-#include <mm/as.h>
 #include <bitops.h>
 #include <align.h>
@@ -361,7 +360,5 @@
 	fbaddress = (__u8 *) PA2KA(PFN2ADDR(frame_alloc(fborder, FRAME_KA)));
 	
-	pfn_t i;
-	for (i = 0; i < ADDR2PFN(ALIGN_UP(fbsize, PAGE_SIZE)); i++)
-		page_mapping_insert(AS_KERNEL, (__address) fbaddress + PFN2ADDR(i), addr + PFN2ADDR(i),	PAGE_NOT_CACHEABLE);
+	fb_map_arch((__address) fbaddress, (__address) addr, fbsize);
 	
 	xres = x;
Index: genarch/src/fb/fb_map.c
===================================================================
--- genarch/src/fb/fb_map.c	(revision 7633b109e17e4f8643784b2812f8275a844acef1)
+++ genarch/src/fb/fb_map.c	(revision 7633b109e17e4f8643784b2812f8275a844acef1)
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Martin Decky
+ * 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.
+ */
+
+#include <genarch/fb/fb.h>
+#include <mm/as.h>
+#include <mm/page.h>
+#include <mm/frame.h>
+#include <align.h>
+
+void fb_map_arch(__address virtaddr, __address physaddr, size_t size)
+{
+	pfn_t i;
+	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
+		page_mapping_insert(AS_KERNEL, (__address) virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i),
+			PAGE_NOT_CACHEABLE);
+}
