Index: arch/amd64/src/mm/page.c
===================================================================
--- arch/amd64/src/mm/page.c	(revision 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ arch/amd64/src/mm/page.c	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -72,4 +72,6 @@
         SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \
     }
+
+
 void page_arch_init(void)
 {
@@ -108,4 +110,5 @@
 	}
 }
+
 
 /** Identity page mapper
@@ -162,4 +165,5 @@
 }
 
+
 void page_fault(int n, istate_t *istate)
 {
@@ -173,2 +177,18 @@
 	}
 }
+
+
+__address hw_map(__address physaddr, size_t size)
+{
+	if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
+		panic("Unable to map physical memory %p (%d bytes)", physaddr, size)
+	
+	__address virtaddr = PA2KA(last_frame);
+	pfn_t i;
+	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
+		page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE);
+	
+	last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
+	
+	return virtaddr;
+}
Index: arch/ia32/src/mm/page.c
===================================================================
--- arch/ia32/src/mm/page.c	(revision 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ arch/ia32/src/mm/page.c	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -34,4 +34,5 @@
 #include <mm/as.h>
 #include <arch/types.h>
+#include <align.h>
 #include <config.h>
 #include <func.h>
@@ -42,4 +43,5 @@
 #include <print.h>
 #include <interrupt.h>
+
 
 void page_arch_init(void)
@@ -70,2 +72,18 @@
 	paging_on();
 }
+
+
+__address hw_map(__address physaddr, size_t size)
+{
+	if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
+		panic("Unable to map physical memory %p (%d bytes)", physaddr, size)
+	
+	__address virtaddr = PA2KA(last_frame);
+	pfn_t i;
+	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
+		page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE);
+	
+	last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
+	
+	return virtaddr;
+}
Index: arch/sparc64/Makefile.inc
===================================================================
--- arch/sparc64/Makefile.inc	(revision 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ arch/sparc64/Makefile.inc	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -66,5 +66,4 @@
 
 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 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ arch/sparc64/src/console.c	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -70,10 +70,4 @@
 	mutex_initialize(&canwork);
 	ofw_console_active = 1;
-}
-
-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);
 }
 
Index: arch/sparc64/src/mm/page.c
===================================================================
--- arch/sparc64/src/mm/page.c	(revision 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ arch/sparc64/src/mm/page.c	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -28,5 +28,8 @@
 
 #include <arch/mm/page.h>
+#include <arch/mm/tlb.h>
 #include <genarch/mm/page_ht.h>
+#include <mm/frame.h>
+#include <bitops.h>
 
 void page_arch_init(void)
@@ -34,2 +37,19 @@
 	page_mapping_operations = &ht_mapping_operations;
 }
+
+__address hw_map(__address physaddr, size_t size)
+{
+	unsigned int order;
+	
+	if (size <= FRAME_SIZE)
+		order = 0;
+	else
+		order = (fnzb32(size - 1) + 1) - FRAME_WIDTH;
+	
+	__address virtaddr = PA2KA(PFN2ADDR(frame_alloc(order, FRAME_KA)));
+	
+	dtlb_insert_mapping(virtaddr, physaddr, PAGESIZE_512K, true, false);
+	dtlb_insert_mapping(virtaddr + 512 * 1024, physaddr + 512 * 1024, PAGESIZE_512K, true, false);
+	
+	return virtaddr;
+}
Index: genarch/Makefile.inc
===================================================================
--- genarch/Makefile.inc	(revision 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ genarch/Makefile.inc	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -68,8 +68,4 @@
 		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 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ genarch/include/fb/fb.h	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -36,6 +36,3 @@
 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 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ genarch/src/fb/fb.c	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -33,5 +33,4 @@
 #include <sysinfo/sysinfo.h>
 #include <mm/slab.h>
-#include <bitops.h>
 #include <align.h>
 #include <panic.h>
@@ -350,15 +349,7 @@
 	
 	unsigned int fbsize = scan * y;
-	unsigned int fborder;
-	
-	if (fbsize <= FRAME_SIZE)
-		fborder = 0;
-	else
-		fborder = (fnzb32(fbsize - 1) + 1) - FRAME_WIDTH;
 	
 	/* Map the framebuffer */
-	fbaddress = (__u8 *) PA2KA(PFN2ADDR(frame_alloc(fborder, FRAME_KA)));
-	
-	fb_map_arch((__address) fbaddress, (__address) addr, fbsize);
+	fbaddress = (__u8 *) hw_map((__address) addr, fbsize);
 	
 	xres = x;
Index: narch/src/fb/fb_map.c
===================================================================
--- genarch/src/fb/fb_map.c	(revision 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ 	(revision )
@@ -1,41 +1,0 @@
-/*
- * 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);
-}
Index: generic/include/mm/page.h
===================================================================
--- generic/include/mm/page.h	(revision 1068f6a33444f5917a7f47f13b57ebe76e675eb3)
+++ generic/include/mm/page.h	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
@@ -79,4 +79,5 @@
 extern pte_t *page_table_create(int flags);
 extern void map_structure(__address s, size_t size);
+extern __address hw_map(__address physaddr, size_t size);
 
 #endif
