Index: kernel/arch/amd64/include/mm/frame.h
===================================================================
--- kernel/arch/amd64/include/mm/frame.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/amd64/include/mm/frame.h	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -45,4 +45,5 @@
 #ifndef __ASM__
 extern uintptr_t last_frame;
+extern uintptr_t end_frame;
 extern void frame_arch_init(void);
 extern void physmem_print(void);
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/amd64/src/mm/page.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -215,4 +215,10 @@
 }
 
+void hw_area(uintptr_t *physaddr, pfn_t *frames)
+{
+	*physaddr = end_frame;
+	*frames = ADDR2PFN(0xfffffffffffff - end_frame);
+}
+
 /** @}
  */
Index: kernel/arch/arm32/include/mm/frame.h
===================================================================
--- kernel/arch/arm32/include/mm/frame.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/arm32/include/mm/frame.h	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -52,4 +52,5 @@
 
 extern uintptr_t last_frame;
+extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/arm32/src/mm/frame.c
===================================================================
--- kernel/arch/arm32/src/mm/frame.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/arm32/src/mm/frame.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -42,4 +42,5 @@
 /** Address of the last frame in the memory. */
 uintptr_t last_frame = 0;
+uintptr_t end_frame = 0;
 
 /** Creates memory zones. */
@@ -50,5 +51,6 @@
 	    BOOT_PAGE_TABLE_START_FRAME + BOOT_PAGE_TABLE_SIZE_IN_FRAMES, 0);
 	last_frame = machine_get_memory_size();
-
+	end_frame = last_frame;
+	
 	/* blacklist boot page table */
 	frame_mark_unavailable(BOOT_PAGE_TABLE_START_FRAME,
Index: kernel/arch/arm32/src/mm/page.c
===================================================================
--- kernel/arch/arm32/src/mm/page.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/arm32/src/mm/page.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -107,4 +107,10 @@
 }
 
+void hw_area(uintptr_t *physaddr, pfn_t *frames)
+{
+	*physaddr = end_frame;
+	*frames = ADDR2PFN(0xffffffff - end_frame);
+}
+
 /** @}
  */
Index: kernel/arch/ia32/include/mm/frame.h
===================================================================
--- kernel/arch/ia32/include/mm/frame.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ia32/include/mm/frame.h	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -45,4 +45,5 @@
 
 extern uintptr_t last_frame;
+extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/ia32/src/mm/frame.c
===================================================================
--- kernel/arch/ia32/src/mm/frame.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ia32/src/mm/frame.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -51,4 +51,5 @@
 
 uintptr_t last_frame = 0;
+uintptr_t end_frame = 0;
 
 static void init_e820_memory(pfn_t minconf)
@@ -74,6 +75,8 @@
 				last_frame =
 				    ALIGN_UP(e820table[i].base_address + e820table[i].size, FRAME_SIZE);
-		}			
+		}
 	}
+	
+	end_frame = last_frame;
 }
 
@@ -114,4 +117,5 @@
 	if (config.cpu_active == 1) {
 		minconf = 1;
+		
 #ifdef CONFIG_SMP
 		minconf = max(minconf,
@@ -120,5 +124,5 @@
 #endif
 		init_e820_memory(minconf);
-
+		
 		/* Reserve frame 0 (BIOS data) */
 		frame_mark_unavailable(0, 1);
Index: kernel/arch/ia32/src/mm/page.c
===================================================================
--- kernel/arch/ia32/src/mm/page.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ia32/src/mm/page.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -94,4 +94,10 @@
 }
 
+void hw_area(uintptr_t *physaddr, pfn_t *frames)
+{
+	*physaddr = end_frame;
+	*frames = ADDR2PFN(0xffffffff - end_frame);
+}
+
 void page_fault(int n __attribute__((unused)), istate_t *istate)
 {
@@ -103,5 +109,5 @@
 	if (istate->error_word & PFERR_CODE_RSVD)
 		panic("Reserved bit set in page directory.");
-
+	
 	if (istate->error_word & PFERR_CODE_RW)
 		access = PF_ACCESS_WRITE;
Index: kernel/arch/ia64/include/mm/frame.h
===================================================================
--- kernel/arch/ia64/include/mm/frame.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ia64/include/mm/frame.h	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -45,4 +45,5 @@
 
 extern uintptr_t last_frame;
+extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/ia64/src/mm/frame.c
===================================================================
--- kernel/arch/ia64/src/mm/frame.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ia64/src/mm/frame.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -52,4 +52,5 @@
 
 uintptr_t last_frame = 0;
+uintptr_t end_frame = 0;
 
 void frame_arch_init(void)
Index: kernel/arch/ia64/src/mm/page.c
===================================================================
--- kernel/arch/ia64/src/mm/page.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ia64/src/mm/page.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -275,4 +275,10 @@
 }
 
+void hw_area(uintptr_t *physaddr, pfn_t *frames)
+{
+	*physaddr = end_frame;
+	*frames = ADDR2PFN(0x7fffffffffffffffUL - end_frame);
+}
+
 /** @}
  */
Index: kernel/arch/mips32/include/mm/frame.h
===================================================================
--- kernel/arch/mips32/include/mm/frame.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/mips32/include/mm/frame.h	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -36,12 +36,16 @@
 #define KERN_mips32_FRAME_H_
 
-#define FRAME_WIDTH		14	/* 16K */
-#define FRAME_SIZE		(1 << FRAME_WIDTH)
+#define FRAME_WIDTH  14  /* 16K */
+#define FRAME_SIZE   (1 << FRAME_WIDTH)
 
 #ifdef KERNEL
 #ifndef __ASM__
 
+#include <typedefs.h>
+
 extern void frame_arch_init(void);
 extern void physmem_print(void);
+
+extern uintptr_t end_frame;
 
 #endif /* __ASM__ */
Index: kernel/arch/mips32/src/drivers/msim.c
===================================================================
--- kernel/arch/mips32/src/drivers/msim.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/mips32/src/drivers/msim.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -42,5 +42,4 @@
 #include <ddi/ddi.h>
 
-static parea_t msim_parea;
 static chardev_t console;
 static irq_t msim_irq;
@@ -157,10 +156,4 @@
 	sysinfo_set_item_val("kbd.address.virtual", NULL, MSIM_KBD_ADDRESS);
 	
-	msim_parea.pbase = KA2PA(MSIM_VIDEORAM);
-	msim_parea.vbase = MSIM_VIDEORAM;
-	msim_parea.frames = 1;
-	msim_parea.cacheable = false;
-	ddi_parea_register(&msim_parea);
-	
 	sysinfo_set_item_val("fb", NULL, true);
 	sysinfo_set_item_val("fb.kind", NULL, 3);
Index: kernel/arch/mips32/src/mm/frame.c
===================================================================
--- kernel/arch/mips32/src/mm/frame.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/mips32/src/mm/frame.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -65,4 +65,6 @@
 static count_t phys_regions_count = 0;
 static phys_region_t phys_regions[MAX_REGIONS];
+
+uintptr_t end_frame = 0;
 
 
@@ -237,5 +239,7 @@
 	}
 	
-	frame_add_region(start_frame, frame);
+	end_frame = frame;
+	
+	frame_add_region(start_frame, end_frame);
 	
 	/* Blacklist interrupt vector frame */
Index: kernel/arch/mips32/src/mm/page.c
===================================================================
--- kernel/arch/mips32/src/mm/page.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/mips32/src/mm/page.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32mm	
+/** @addtogroup mips32mm
  * @{
  */
@@ -36,4 +36,5 @@
 #include <genarch/mm/page_pt.h>
 #include <mm/page.h>
+#include <mm/frame.h>
 
 void page_arch_init(void)
@@ -51,4 +52,10 @@
 }
 
+void hw_area(uintptr_t *physaddr, pfn_t *frames)
+{
+	*physaddr = end_frame;
+	*frames = ADDR2PFN(0xffffffff - end_frame);
+}
+
 /** @}
  */
Index: kernel/arch/ppc32/include/mm/frame.h
===================================================================
--- kernel/arch/ppc32/include/mm/frame.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ppc32/include/mm/frame.h	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -42,7 +42,8 @@
 #ifndef __ASM__
 
-#include <arch/types.h> 
+#include <arch/types.h>
 
 extern uintptr_t last_frame;
+extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/ppc32/src/mm/frame.c
===================================================================
--- kernel/arch/ppc32/src/mm/frame.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ppc32/src/mm/frame.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -41,4 +41,5 @@
 
 uintptr_t last_frame = 0;
+uintptr_t end_frame = 0;
 
 void physmem_print(void)
@@ -75,5 +76,7 @@
 			last_frame = ALIGN_UP(bootinfo.memmap.zones[i].start + bootinfo.memmap.zones[i].size, FRAME_SIZE);
 	}
-
+	
+	end_frame = last_frame;
+	
 	/* First is exception vector, second is 'implementation specific',
 	   third and fourth is reserved, other contain real mode code */
Index: kernel/arch/ppc32/src/mm/page.c
===================================================================
--- kernel/arch/ppc32/src/mm/page.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/ppc32/src/mm/page.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -64,4 +64,10 @@
 }
 
+void hw_area(uintptr_t *physaddr, pfn_t *frames)
+{
+	*physaddr = end_frame;
+	*frames = ADDR2PFN(0xffffffff - end_frame);
+}
+
 /** @}
  */
Index: kernel/arch/sparc64/include/mm/frame.h
===================================================================
--- kernel/arch/sparc64/include/mm/frame.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/sparc64/include/mm/frame.h	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -74,4 +74,5 @@
 
 extern uintptr_t last_frame;
+extern uintptr_t end_frame;
 extern void frame_arch_init(void);
 #define physmem_print()
Index: kernel/arch/sparc64/src/drivers/sgcn.c
===================================================================
--- kernel/arch/sparc64/src/drivers/sgcn.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/sparc64/src/drivers/sgcn.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -162,17 +162,8 @@
 
 /**
- * Registers the physical area of the SRAM so that the userspace SGCN
- * driver can map it. Moreover, it sets some sysinfo values (SRAM address
- * and SRAM size).
- */
-static void register_sram_parea(uintptr_t sram_begin_physical)
-{
-	static parea_t sram_parea;
-	sram_parea.pbase = sram_begin_physical;
-	sram_parea.vbase = (uintptr_t) sram_begin;
-	sram_parea.frames = MAPPED_AREA_SIZE / FRAME_SIZE;
-	sram_parea.cacheable = false;
-	ddi_parea_register(&sram_parea);
-	
+ * Set some sysinfo values (SRAM address and SRAM size).
+ */
+static void register_sram(uintptr_t sram_begin_physical)
+{
 	sysinfo_set_item_val("sram.area.size", NULL, MAPPED_AREA_SIZE);
 	sysinfo_set_item_val("sram.address.physical", NULL,
@@ -212,5 +203,5 @@
 	sram_begin = hw_map(sram_begin_physical, MAPPED_AREA_SIZE);
 	
-	register_sram_parea(sram_begin_physical);
+	register_sram(sram_begin_physical);
 }
 
Index: kernel/arch/sparc64/src/mm/frame.c
===================================================================
--- kernel/arch/sparc64/src/mm/frame.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/sparc64/src/mm/frame.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -42,4 +42,5 @@
 
 uintptr_t last_frame = NULL;
+uintptr_t end_frame = NULL;
 
 /** Create memory zones according to information stored in bootinfo.
@@ -81,4 +82,5 @@
 	}
 	
+	end_frame = last_frame;
 }
 
Index: kernel/arch/sparc64/src/mm/page.c
===================================================================
--- kernel/arch/sparc64/src/mm/page.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
+++ kernel/arch/sparc64/src/mm/page.c	(revision ae318d3535cba06a6996f270db31a961fae402ad)
@@ -148,5 +148,5 @@
 		    sizemap[order].pagesize_code, true, false);
 	
-#ifdef CONFIG_SMP	
+#ifdef CONFIG_SMP
 		/*
 		 * Second, save the information about the mapping for APs.
@@ -165,5 +165,10 @@
 }
 
+void hw_area(uintptr_t *physaddr, pfn_t *frames)
+{
+	*physaddr = end_frame;
+	*frames = ADDR2PFN(0x7ffffffffff - end_frame);
+}
+
 /** @}
  */
-
