Index: boot/arch/ia64/loader/gefi/HelenOS/hello.c
===================================================================
--- boot/arch/ia64/loader/gefi/HelenOS/hello.c	(revision 48eb7a14a8533358b5a3d4be1e99bb2a217817c7)
+++ boot/arch/ia64/loader/gefi/HelenOS/hello.c	(revision 2eb893b0af836486e4d6cd3d0b897be36ab58e77)
@@ -6,6 +6,12 @@
 #define KERNEL_LOAD_ADDRESS 0x4400000
 
+#define MEM_MAP_DESCRIPTOR_OFFSET_TYPE 0	    
+#define MEM_MAP_DESCRIPTOR_OFFSET_BASE 8    
+#define MEM_MAP_DESCRIPTOR_OFFSET_PAGES	24    
+
+
+
 //Link image as a data array into hello - usefull with network boot
-//#define IMAGE_LINKED
+#define IMAGE_LINKED
 
 bootinfo_t *bootinfo=(bootinfo_t *)BOOTINFO_ADDRESS;
@@ -178,14 +184,12 @@
 
 
-        int wakeup_intno;
-        wakeup_intno=0xf0;
+        UINT64 wakeup_intno;
+		LibGetSalWakeupVector(&wakeup_intno);
         Print (L"WAKEUP INTNO:%X\n", wakeup_intno);
-	//bootinfo->wakeup_intno=wakeup_intno;
-
-
-
-
-
-	{
+
+
+
+
+
 	    UINTN cookie;
 	    void *p=(void *)KERNEL_LOAD_ADDRESS;
@@ -193,8 +197,6 @@
 	    UINT32 desver;
 	    EFI_STATUS status;
-	    EFI_MEMORY_DESCRIPTOR emd[1024];
 	    
 	        	    
-	    mapsize=1024*sizeof(emd);
 	    
 	    status=BS->AllocatePages(AllocateAnyPages,EfiLoaderData,/*(HOSSize>>12)+1*/ 1,p);
@@ -207,8 +209,16 @@
 	    }
 	    
-	    status=BS->GetMemoryMap(&mapsize,emd,&cookie,&descsize,&desver);
-	    if(EFI_ERROR(status)){
-		Print(L"Error 1\n");
-		return EFI_SUCCESS;
+	    UINTN no_entryes;
+	    void * mds;
+	    mds=LibMemoryMap(&no_entryes,&cookie,&descsize,&desver);
+	    
+	    for(i=0;i<no_entryes;i++)
+	    {
+	    
+	    	unsigned int type=*((unsigned int *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_TYPE));
+	    	unsigned long long base=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_BASE));
+	    	unsigned long long pages=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_PAGES));
+	    	Print(L"T:%02d %016llX %016llX\n",type,base,pages*EFI_PAGE_SIZE);
+		
 	    }
 	    status=BS->ExitBootServices(image,cookie);	
@@ -218,5 +228,5 @@
 	    }
 	    
-	}
+	
 	int a;
 	
@@ -228,4 +238,49 @@
 	bootinfo->sys_freq=sys_freq;
 	bootinfo->freq_scale=freq_scale;
+
+
+	    bootinfo->memmap_items=0;
+	    
+	    for(i=0;i<no_entryes;i++)
+	    {
+	    
+	    	unsigned int type=*((unsigned int *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_TYPE));
+	    	unsigned long long base=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_BASE));
+	    	unsigned long long pages=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_PAGES));
+	    	
+	    	
+	    	
+	    	switch (type)
+	    	{
+	    		case EfiConventionalMemory:
+				bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_FREE_MEM;   	
+				bootinfo->memmap[bootinfo->memmap_items].base=base;   	
+				bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;   	
+	    			bootinfo->memmap_items++;
+	    			break;
+	    		case EfiMemoryMappedIO:
+				bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_IO;   	
+				bootinfo->memmap[bootinfo->memmap_items].base=base;   	
+				bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;   	
+	    			bootinfo->memmap_items++;
+	    			break;
+	    		case EfiMemoryMappedIOPortSpace:
+				bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_IO_PORTS;   	
+				bootinfo->memmap[bootinfo->memmap_items].base=base;   	
+				bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;   	
+	    			bootinfo->memmap_items++;
+	    			break;
+	    			
+	    		default :
+	    			break;
+	    	}
+	    	
+	    	
+	    	
+	    	
+
+	    }
+
+
 	
 	//Run Kernel
Index: kernel/arch/ia64/include/bootinfo.h
===================================================================
--- kernel/arch/ia64/include/bootinfo.h	(revision 48eb7a14a8533358b5a3d4be1e99bb2a217817c7)
+++ kernel/arch/ia64/include/bootinfo.h	(revision 2eb893b0af836486e4d6cd3d0b897be36ab58e77)
@@ -34,4 +34,11 @@
 #define CONFIG_INIT_TASKS	32
 
+#define MEMMAP_ITEMS 128
+
+#define EFI_MEMMAP_FREE_MEM 0
+#define EFI_MEMMAP_IO 1
+#define EFI_MEMMAP_IO_PORTS 2
+
+
 typedef struct {
 	void *addr; 
@@ -44,7 +51,16 @@
 } binit_t;
 
+typedef struct {
+	unsigned int type;
+	unsigned long base;
+	unsigned long size;
+}efi_memmap_item_t;
+
 
 typedef struct {
 	binit_t taskmap;
+
+	efi_memmap_item_t memmap[MEMMAP_ITEMS];
+	unsigned int memmap_items;
 
 	unsigned long * sapic;
Index: kernel/arch/ia64/src/mm/frame.c
===================================================================
--- kernel/arch/ia64/src/mm/frame.c	(revision 48eb7a14a8533358b5a3d4be1e99bb2a217817c7)
+++ 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));
 	}	
 }
