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;
