Index: kernel/arch/ia64/include/mm/page.h
===================================================================
--- kernel/arch/ia64/include/mm/page.h	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/arch/ia64/include/mm/page.h	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -49,5 +49,12 @@
 #define FW_PAGE_WIDTH			28	/* 256M */
 
-/** Staticly mapped IO spaces */
+#define USPACE_IO_PAGE_WIDTH		12	/* 4K */
+
+
+
+/** Staticly mapped IO spaces - offsets to 0xe...00 of virtual adresses 
+becauce of "minimal virtual bits implemented is 51"
+it is possible to have here values up to 0x0007000000000000
+*/
 
 /* Firmware area (bellow 4GB in phys mem) */
Index: kernel/arch/ia64/include/mm/tlb.h
===================================================================
--- kernel/arch/ia64/include/mm/tlb.h	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/arch/ia64/include/mm/tlb.h	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -47,6 +47,6 @@
 #define DTR_KERNEL	0
 #define ITR_KERNEL	0
-#define DTR_KSTACK1	1
-#define DTR_KSTACK2	2
+#define DTR_KSTACK1	4
+#define DTR_KSTACK2	5
 
 /** Portion of TLB insertion format data structure. */
Index: kernel/arch/ia64/include/proc/task.h
===================================================================
--- kernel/arch/ia64/include/proc/task.h	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/arch/ia64/include/proc/task.h	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -32,12 +32,17 @@
 /** @file
  */
+#include <proc/task.h>
 
 #ifndef KERN_ia64_TASK_H_
 #define KERN_ia64_TASK_H_
 
+#include <adt/bitmap.h>
+
 typedef struct {
+	bitmap_t *iomap;
 } task_arch_t;
 
-#define task_create_arch(t)
+
+#define task_create_arch(t) {(t)->arch.iomap=NULL;}
 #define task_destroy_arch(t)
 
Index: kernel/arch/ia64/src/ddi/ddi.c
===================================================================
--- kernel/arch/ia64/src/ddi/ddi.c	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/arch/ia64/src/ddi/ddi.c	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2006 Jakub Jermar
+ * Copyright (c) 2006 Jakub Jermar, Jakub vana
  * All rights reserved.
  *
@@ -36,4 +36,9 @@
 #include <proc/task.h>
 #include <arch/types.h>
+#include <mm/slab.h>
+#include <errno.h>
+
+#define IO_MEMMAP_PAGES 16384
+#define PORTS_PER_PAGE 4
 
 /** Enable I/O space range for task.
@@ -49,4 +54,21 @@
 int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size)
 {
+
+	if(!task->arch.iomap)
+	{
+		uint8_t *map;
+		task->arch.iomap=malloc(sizeof(bitmap_t),0);
+		map=malloc(BITS2BYTES(IO_MEMMAP_PAGES),0);
+		if(!map)
+			return ENOMEM;
+		bitmap_initialize(task->arch.iomap,map,IO_MEMMAP_PAGES);	
+		bitmap_clear_range(task->arch.iomap,0,IO_MEMMAP_PAGES);
+	}
+	
+	uintptr_t iopage = ioaddr / PORTS_PER_PAGE;
+	size = ALIGN_UP (size+ioaddr-4*iopage,PORTS_PER_PAGE);
+	bitmap_set_range(task->arch.iomap,iopage,size/4);
+
+
 	return 0;
 }
Index: kernel/arch/ia64/src/drivers/ega.c
===================================================================
--- kernel/arch/ia64/src/drivers/ega.c	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/arch/ia64/src/drivers/ega.c	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -47,4 +47,6 @@
 #include <sysinfo/sysinfo.h>
 #include <arch/drivers/ega.h>
+#include <ddi/ddi.h>
+
 
 /*
@@ -52,4 +54,8 @@
  * Simple and short. Function for displaying characters and "scrolling".
  */
+
+
+static parea_t ega_parea;	/**< Physical memory area for EGA video RAM. */
+
 
 SPINLOCK_INITIALIZE(egalock);
@@ -76,4 +82,12 @@
 	chardev_initialize("ega_out", &ega_console, &ega_ops);
 	stdout = &ega_console;
+
+
+	ega_parea.pbase = VIDEORAM & 0xffffffff;
+	ega_parea.vbase = (uintptr_t) videoram;
+	ega_parea.frames = 1;
+	ega_parea.cacheable = false;
+	ddi_parea_register(&ega_parea);
+
 	
 	sysinfo_set_item_val("fb", NULL, true);
@@ -81,5 +95,5 @@
 	sysinfo_set_item_val("fb.width", NULL, ROW);
 	sysinfo_set_item_val("fb.height", NULL, ROWS);
-	sysinfo_set_item_val("fb.address.physical", NULL, VIDEORAM);
+	sysinfo_set_item_val("fb.address.physical", NULL, VIDEORAM & 0xffffffff);
 	
 #ifndef CONFIG_FB
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/arch/ia64/src/ia64.c	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -61,4 +61,5 @@
 #include <panic.h>
 #include <print.h>
+#include <sysinfo/sysinfo.h>
 
 /*NS16550 as a COM 1*/
@@ -183,4 +184,9 @@
 
 	}
+	
+	sysinfo_set_item_val("ia64_iospace", NULL, true);
+	sysinfo_set_item_val("ia64_iospace.address", NULL, true);
+	sysinfo_set_item_val("ia64_iospace.address.virtual", NULL, IO_OFFSET);
+
 }
 
Index: kernel/arch/ia64/src/mm/tlb.c
===================================================================
--- kernel/arch/ia64/src/mm/tlb.c	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/arch/ia64/src/mm/tlb.c	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -476,4 +476,71 @@
 }
 
+
+
+static int is_io_page_accessible(int page)
+{
+	if(TASK->arch.iomap) return bitmap_get(TASK->arch.iomap,page);
+	else return 0;
+}
+
+#define IO_FRAME_BASE 0xFFFFC000000
+
+/** There is special handling of memmaped lagacy io, because
+ * of 4KB sized access
+ * only for userspace
+ *
+ * @param va virtual address of page fault
+ * @param istate Structure with saved interruption state.
+ *
+ *
+ * @return 1 on success, 0 on fail
+ */
+static int try_memmap_io_insertion(uintptr_t va, istate_t *istate)
+{
+	if((va >= IO_OFFSET ) && (va < IO_OFFSET + (1<<IO_PAGE_WIDTH)))
+		if(TASK){
+			
+			uint64_t io_page=(va &  ((1<<IO_PAGE_WIDTH)-1)) >> (USPACE_IO_PAGE_WIDTH);
+			if(is_io_page_accessible(io_page)){
+				//printf("Insert %llX\n",va);
+
+				uint64_t page,frame;
+
+				page = IO_OFFSET + (1 << USPACE_IO_PAGE_WIDTH) * io_page;
+				frame = IO_FRAME_BASE + (1 << USPACE_IO_PAGE_WIDTH) * io_page;
+
+
+				tlb_entry_t entry;
+	
+				entry.word[0] = 0;
+				entry.word[1] = 0;
+	
+				entry.p = true;			/* present */
+				entry.ma = MA_UNCACHEABLE;		
+				entry.a = true;			/* already accessed */
+				entry.d = true;			/* already dirty */
+				entry.pl = PL_USER;
+				entry.ar = AR_READ | AR_WRITE;
+				entry.ppn = frame >> PPN_SHIFT;    //MUSIM spocitat frame
+				entry.ps = USPACE_IO_PAGE_WIDTH;
+	
+				dtc_mapping_insert(page, TASK->as->asid, entry); //Musim zjistit ASID
+				return 1;
+			}else {
+				fault_if_from_uspace(istate,"IO access fault at %p",va);
+				return 0;
+			}		
+		} else 
+			return 0;
+	else 
+		return 0;
+		
+	return 0;
+
+}
+
+
+
+
 /** Data TLB fault handler for faults with VHPT turned off.
  *
@@ -512,8 +579,9 @@
 		page_table_unlock(AS, true);
 	} else {
+		page_table_unlock(AS, true);
+		if (try_memmap_io_insertion(va,istate)) return;
 		/*
 		 * Forward the page fault to the address space page fault handler.
 		 */
-		page_table_unlock(AS, true);
 		if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) {
 			fault_if_from_uspace(istate,"Page fault at %p",va);
Index: kernel/generic/include/adt/bitmap.h
===================================================================
--- kernel/generic/include/adt/bitmap.h	(revision 08b68364e802ce47b2b0f3b67d6b72b2dbdd9623)
+++ kernel/generic/include/adt/bitmap.h	(revision 3b10e07b5a24e144e18c1c16fb9c3387c8a559a0)
@@ -50,4 +50,12 @@
 extern void bitmap_copy(bitmap_t *dst, bitmap_t *src, count_t bits);
 
+static inline int bitmap_get(bitmap_t *bitmap,index_t bit)
+{
+	if(bit >= bitmap->bits)
+		return 0;
+	return !! ((bitmap->map)[bit/8] & (1 << (bit & 7)));
+}
+
+
 #endif
 
