Index: arch/ia32/src/mm/frame.c
===================================================================
--- arch/ia32/src/mm/frame.c	(revision f6297e0db360cfc4702b1de07398872a26b9229b)
+++ arch/ia32/src/mm/frame.c	(revision 74b2f5bf70b629eb78cf316e112a0ded34c54ecb)
@@ -33,4 +33,5 @@
 #include <arch/boot/boot.h>
 #include <arch/boot/memmap.h>
+#include <panic.h>
 
 size_t hardcoded_unmapped_ktext_size = 0;
@@ -39,22 +40,22 @@
 void frame_arch_init(void)
 {
+	zone_t *z;
 	__u8 i;
 	
 	if (config.cpu_active == 1) {
-		/* Reserve the NULL frame */
-		frame_not_free(0x0);
+		for (i=e820counter;i>0;i--) {
+			if (e820table[i-1].type==MEMMAP_MEMORY_AVAILABLE) {
+				z = zone_create(e820table[i-1].base_address, e820table[i-1].size & ~(FRAME_SIZE-1), 0);
+				if (!z) {
+					panic("Cannot allocate zone (%dB).\n", e820table[i-1].size & ~(FRAME_SIZE-1));
+				}
+				zone_attach(z);
+			}
+		}
 		
-		/* Reserve well-known memory regions */
-		frame_region_not_free(0xa0000,0xff000);
-		frame_region_not_free(0xfec00000,0xffffffff);
-		
+		frame_not_free(0);
+
 		/* Reserve real mode bootstrap memory */
-		frame_region_not_free(BOOTSTRAP_OFFSET, BOOTSTRAP_OFFSET + hardcoded_unmapped_ktext_size + hardcoded_unmapped_kdata_size);
-		
-		for (i=e820counter;i>0;i--) {
-			if (e820table[i-1].type!=MEMMAP_MEMORY_AVAILABLE) {
-					frame_region_not_free(e820table[i-1].base_address, e820table[i-1].base_address+e820table[i-1].size);
-				}
-			}
+                frame_region_not_free(BOOTSTRAP_OFFSET, BOOTSTRAP_OFFSET + hardcoded_unmapped_ktext_size + hardcoded_unmapped_kdata_size);
 	}
 }
