Index: kernel/arch/ia64/src/mm/frame.c
===================================================================
--- kernel/arch/ia64/src/mm/frame.c	(revision 59e4864a51a79cbe1c491a3c86539b884e9005e6)
+++ kernel/arch/ia64/src/mm/frame.c	(revision 2eb893b0af836486e4d6cd3d0b897be36ab58e77)
@@ -37,4 +37,7 @@
 #include <config.h>
 #include <panic.h>
+#include <arch/bootinfo.h>
+#include <align.h>
+#include <macros.h>
 
 /*
@@ -42,6 +45,9 @@
  * for real ia64 systems that provide memory map.
  */
-#define MEMORY_SIZE	(64 * 1024 * 1024)
+#define MEMORY_SIZE	(256 * 1024 * 1024)
 #define MEMORY_BASE	(0 * 64 * 1024 * 1024)
+
+#define KERNEL_RESERVED_AREA_BASE (0x4400000)
+#define KERNEL_RESERVED_AREA_SIZE (16*1024*1024)
 
 #define ONE_TO_ONE_MAPPING_SIZE (256*1048576) // Mapped at start
@@ -51,20 +57,39 @@
 void poke_char(int x,int y,char ch, char c);
 
+#define MIN_ZONE_SIZE (64*1024)
+
 uintptr_t last_frame;
+#define MINCONF 1
 
 void frame_arch_init(void)
 {
 
-	if(config.cpu_active==1)
-	{
-		zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0);
+	if(config.cpu_active==1){
+		
+		
+		
+		unsigned int i;
+		for(i=0;i<bootinfo->memmap_items;i++){
+			if (bootinfo->memmap[i].type==EFI_MEMMAP_FREE_MEM){
+				uint64_t base=bootinfo->memmap[i].base;
+				uint64_t size=bootinfo->memmap[i].size;
+				uint64_t abase=ALIGN_UP(base,FRAME_SIZE);
+				if(size>FRAME_SIZE) size -=abase-base;
+				
+
+				if(size>MIN_ZONE_SIZE) 	{
+					zone_create(abase >> FRAME_WIDTH, (size) >> FRAME_WIDTH, max(MINCONF,((abase) >> FRAME_WIDTH)), 0);
+				}	
+			}
+		}
+		
+		//zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0);
 	
 		/*
 		* Blacklist ROM regions.
 		*/
-		//frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE));
+		frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE));
 
-		frame_mark_unavailable(ADDR2PFN(0), SIZE2FRAMES(1048576));
-		last_frame=SIZE2FRAMES((VRN_KERNEL<<VRN_SHIFT)+ONE_TO_ONE_MAPPING_SIZE);	
+		frame_mark_unavailable(ADDR2PFN(KERNEL_RESERVED_AREA_BASE), SIZE2FRAMES(KERNEL_RESERVED_AREA_SIZE));
 	}	
 }
