Index: kernel/arch/amd64/Makefile.inc
===================================================================
--- kernel/arch/amd64/Makefile.inc	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/amd64/Makefile.inc	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -76,4 +76,10 @@
 DEFS += -DCONFIG_I8042
 
+## Compile with EGA support
+#
+
+CONFIG_EGA = y
+DEFS += -DCONFIG_EGA
+
 ## Accepted configuration directives
 #
@@ -97,5 +103,4 @@
 	arch/$(ARCH)/src/context.S \
 	arch/$(ARCH)/src/ddi/ddi.c \
-	arch/$(ARCH)/src/drivers/ega.c \
 	arch/$(ARCH)/src/drivers/vesa.c \
 	arch/$(ARCH)/src/drivers/i8254.c \
Index: kernel/arch/amd64/include/types.h
===================================================================
--- kernel/arch/amd64/include/types.h	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/amd64/include/types.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -58,4 +58,6 @@
 typedef int64_t native_t;
 
+typedef uintptr_t ioport_t;
+
 /**< Formats for uintptr_t, size_t, count_t and index_t */
 #define PRIp "llx"
Index: kernel/arch/amd64/src/amd64.c
===================================================================
--- kernel/arch/amd64/src/amd64.c	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/amd64/src/amd64.c	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -41,4 +41,5 @@
 #include <proc/thread.h>
 #include <arch/drivers/ega.h>
+#include <genarch/drivers/ega/ega.h>
 #include <arch/drivers/vesa.h>
 #include <genarch/kbd/i8042.h>
@@ -140,5 +141,5 @@
 		else
 #endif
-			ega_init();	/* video */
+			ega_init(EGA_BASE, EGA_VIDEORAM);	/* video */
 		
 		/* Enable debugger */
Index: kernel/arch/ia32/Makefile.inc
===================================================================
--- kernel/arch/ia32/Makefile.inc	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia32/Makefile.inc	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -111,4 +111,10 @@
 DEFS += -DCONFIG_I8042
 
+## Compile with EGA support
+#
+
+CONFIG_EGA = y
+DEFS += -DCONFIG_EGA
+
 ## Accepted configuration directives
 #
@@ -156,5 +162,4 @@
 	arch/$(ARCH)/src/drivers/i8254.c \
 	arch/$(ARCH)/src/drivers/i8259.c \
-	arch/$(ARCH)/src/drivers/ega.c \
 	arch/$(ARCH)/src/drivers/vesa.c \
 	arch/$(ARCH)/src/boot/boot.S \
Index: kernel/arch/ia32/include/drivers/ega.h
===================================================================
--- kernel/arch/ia32/include/drivers/ega.h	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia32/include/drivers/ega.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2001-2004 Jakub Jermar
+ * Copyright (c) 2008 Jakub Jermar 
  * All rights reserved.
  *
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ia32	
+/** @addtogroup ia32
  * @{
  */
@@ -33,14 +33,9 @@
  */
 
-#ifndef KERN_ia32_EGA_H_
-#define KERN_ia32_EGA_H_
+#ifndef KERN_ia32_EGA_H
+#define KERN_ia32_EGA_H
 
-#define VIDEORAM	0xb8000
-#define ROW		80
-#define ROWS		25
-#define SCREEN		(ROW * ROWS)
-
-extern void ega_redraw(void);
-extern void ega_init(void);
+#define EGA_VIDEORAM 	0xb8000
+#define EGA_BASE	0x3d4
 
 #endif
Index: kernel/arch/ia32/include/types.h
===================================================================
--- kernel/arch/ia32/include/types.h	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia32/include/types.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -58,4 +58,6 @@
 typedef int32_t native_t;
 
+typedef uintptr_t ioport_t;
+
 #define PRIp "x"	/**< Format for uintptr_t. */
 #define PRIs "u"	/**< Format for size_t. */
Index: rnel/arch/ia32/src/drivers/ega.c
===================================================================
--- kernel/arch/ia32/src/drivers/ega.c	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ 	(revision )
@@ -1,170 +1,0 @@
-/*
- * Copyright (c) 2001-2004 Jakub Jermar
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup ia32	
- * @{
- */
-/**
- * @file
- * @brief EGA driver.
- */
-
-#include <arch/drivers/ega.h>
-#include <putchar.h>
-#include <mm/page.h>
-#include <mm/as.h>
-#include <mm/slab.h>
-#include <arch/mm/page.h>
-#include <synch/spinlock.h>
-#include <arch/types.h>
-#include <arch/asm.h>
-#include <memstr.h>
-#include <console/chardev.h>
-#include <console/console.h>
-#include <sysinfo/sysinfo.h>
-#include <ddi/ddi.h>
-
-/*
- * The EGA driver.
- * Simple and short. Function for displaying characters and "scrolling".
- */
-
-static parea_t ega_parea;	/**< Physical memory area for EGA video RAM. */
-
-SPINLOCK_INITIALIZE(egalock);
-static uint32_t ega_cursor;
-static uint8_t *videoram;
-static uint8_t *backbuf;
-
-static void ega_putchar(chardev_t *d, const char ch);
-
-chardev_t ega_console;
-static chardev_operations_t ega_ops = {
-	.write = ega_putchar
-};
-
-static void ega_move_cursor(void);
-
-void ega_init(void)
-{
-	uint8_t hi, lo;
-
-	backbuf = (uint8_t *) malloc(SCREEN * 2, 0);
-	if (!backbuf)
-		panic("Unable to allocate backbuffer.\n");
-	
-	videoram = (uint8_t *) hw_map(VIDEORAM, SCREEN * 2);
-	outb(0x3d4, 0xe);
-	hi = inb(0x3d5);
-	outb(0x3d4, 0xf);
-	lo = inb(0x3d5);
-	ega_cursor = (hi << 8) | lo;
-
-	chardev_initialize("ega_out", &ega_console, &ega_ops);
-	stdout = &ega_console;
-	
-	ega_parea.pbase = VIDEORAM;
-	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);
-	sysinfo_set_item_val("fb.kind", NULL, 2);
-	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);
-}
-
-static void ega_display_char(char ch)
-{
-	videoram[ega_cursor * 2] = ch;
-	backbuf[ega_cursor * 2] = ch;
-}
-
-/*
- * This function takes care of scrolling.
- */
-static void ega_check_cursor(void)
-{
-	if (ega_cursor < SCREEN)
-		return;
-
-	memmove((void *) videoram, (void *) (videoram + ROW * 2), (SCREEN - ROW) * 2);
-	memmove((void *) backbuf, (void *) (backbuf + ROW * 2), (SCREEN - ROW) * 2);
-	memsetw(videoram + (SCREEN - ROW) * 2, ROW, 0x0720);
-	memsetw(backbuf + (SCREEN - ROW) * 2, ROW, 0x0720);
-	ega_cursor = ega_cursor - ROW;
-}
-
-void ega_putchar(chardev_t *d __attribute__((unused)), const char ch)
-{
-	ipl_t ipl;
-
-	ipl = interrupts_disable();
-	spinlock_lock(&egalock);
-
-	switch (ch) {
-	case '\n':
-		ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW;
-		break;
-	case '\t':
-		ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
-		break; 
-	case '\b':
-		if (ega_cursor % ROW)
-			ega_cursor--;
-		break;
-	default:
-		ega_display_char(ch);
-		ega_cursor++;
-		break;
-	}
-	ega_check_cursor();
-	ega_move_cursor();
-
-	spinlock_unlock(&egalock);
-	interrupts_restore(ipl);
-}
-
-void ega_move_cursor(void)
-{
-	outb(0x3d4, 0xe);
-	outb(0x3d5, (uint8_t) ((ega_cursor >> 8) & 0xff));
-	outb(0x3d4, 0xf);
-	outb(0x3d5, (uint8_t) (ega_cursor & 0xff));	
-}
-
-void ega_redraw(void)
-{
-	memcpy(videoram, backbuf, SCREEN * 2);
-	ega_move_cursor();
-}
-
-/** @}
- */
Index: kernel/arch/ia32/src/ia32.c
===================================================================
--- kernel/arch/ia32/src/ia32.c	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia32/src/ia32.c	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -40,4 +40,5 @@
 
 #include <arch/drivers/ega.h>
+#include <genarch/drivers/ega/ega.h>
 #include <arch/drivers/vesa.h>
 #include <genarch/kbd/i8042.h>
@@ -94,5 +95,5 @@
 		else
 #endif
-			ega_init(); /* video */
+			ega_init(EGA_BASE, EGA_VIDEORAM);	/* video */
 		
 		/* Enable debugger */
Index: kernel/arch/ia64/Makefile.inc
===================================================================
--- kernel/arch/ia64/Makefile.inc	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia64/Makefile.inc	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -60,5 +60,4 @@
 CONFIG_ASID_FIFO = y
 
-
 ## Compile with support for software integer division.
 #
@@ -93,7 +92,7 @@
 
 ifeq ($(MACHINE),i460GX)
-	ARCH_SOURCES += arch/$(ARCH)/src/drivers/ega.c
 	CONFIG_I8042 = y
-	DEFS += -DI460GX -DCONFIG_I8042
+	CONFIG_EGA = y
+	DEFS += -DI460GX -DCONFIG_I8042 -DCONFIG_EGA
 	BFD = binary
 endif
Index: kernel/arch/ia64/include/asm.h
===================================================================
--- kernel/arch/ia64/include/asm.h	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia64/include/asm.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -40,6 +40,4 @@
 #include <arch/register.h>
 
-typedef uint64_t ioport_t;
-
 #define IA64_IOSPACE_ADDRESS 0xE001000000000000ULL
 
Index: kernel/arch/ia64/include/drivers/ega.h
===================================================================
--- kernel/arch/ia64/include/drivers/ega.h	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia64/include/drivers/ega.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -1,5 +1,4 @@
 /*
- * Copyright (c) 2001-2004 Jakub Jermar
- * 2007 Jakub Vana 
+ * Copyright (c) 2008 Jakub Jermar 
  * All rights reserved.
  *
@@ -28,5 +27,5 @@
  */
 
-/** @addtogroup ia32	
+/** @addtogroup ia64
  * @{
  */
@@ -37,11 +36,6 @@
 #define KERN_ia64_EGA_H
 
-#define VIDEORAM (0xe0020000000B8000LL)
-
-#define ROW		80
-#define ROWS		25
-#define SCREEN		(ROW * ROWS)
-
-extern void ega_init(void);
+#define EGA_VIDEORAM 	0xb8000
+#define EGA_BASE	0x3d4
 
 #endif
Index: kernel/arch/ia64/include/types.h
===================================================================
--- kernel/arch/ia64/include/types.h	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia64/include/types.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -66,4 +66,6 @@
 typedef int64_t native_t;
 
+typedef uintptr_t ioport_t;
+
 #define PRIp "lx"	/**< Format for uintptr_t. */
 #define PRIs "lu"	/**< Format for size_t. */
Index: kernel/arch/ia64/src/asm.S
===================================================================
--- kernel/arch/ia64/src/asm.S	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia64/src/asm.S	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -129,4 +129,8 @@
 	br _memsetb
 
+.global memsetw
+memsetw:
+	br _memsetw
+
 .global cpu_halt
 cpu_halt:
Index: rnel/arch/ia64/src/drivers/ega.c
===================================================================
--- kernel/arch/ia64/src/drivers/ega.c	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ 	(revision )
@@ -1,154 +1,0 @@
-/*
- * Copyright (c) 2001-2004 Jakub Jermar
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup ia32	
- * @{
- */
-/**
- * @file
- * @brief EGA driver.
- */
-
-#include <putchar.h>
-#include <mm/page.h>
-#include <mm/as.h>
-#include <arch/mm/page.h>
-#include <synch/spinlock.h>
-#include <arch/types.h>
-#include <arch/asm.h>
-#include <memstr.h>
-#include <console/chardev.h>
-#include <console/console.h>
-#include <sysinfo/sysinfo.h>
-#include <arch/drivers/ega.h>
-#include <ddi/ddi.h>
-
-
-/*
- * The EGA driver.
- * Simple and short. Function for displaying characters and "scrolling".
- */
-
-
-static parea_t ega_parea;	/**< Physical memory area for EGA video RAM. */
-
-
-SPINLOCK_INITIALIZE(egalock);
-static uint32_t ega_cursor;
-static uint8_t *videoram;
-
-static void ega_putchar(chardev_t *d, const char ch);
-
-chardev_t ega_console;
-static chardev_operations_t ega_ops = {
-	.write = ega_putchar
-};
-
-
-void ega_init(void)
-{
-	videoram = (uint8_t *) (VIDEORAM);
-
-	/*
-	 * Clear the screen.
-	 */
-	_memsetw(videoram, SCREEN, 0x0720);	
-
-	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);
-	sysinfo_set_item_val("fb.kind", NULL, 2);
-	sysinfo_set_item_val("fb.width", NULL, ROW);
-	sysinfo_set_item_val("fb.height", NULL, ROWS);
-	sysinfo_set_item_val("fb.blinking", NULL, true);
-	sysinfo_set_item_val("fb.address.physical", NULL,
-	    VIDEORAM & 0xffffffff);
-	
-#ifndef CONFIG_FB
-	putchar('\n');
-#endif	
-}
-
-static void ega_display_char(char ch)
-{
-	videoram[ega_cursor * 2] = ch;
-	videoram[ega_cursor * 2 + 1] = 7;
-}
-
-/*
- * This function takes care of scrolling.
- */
-static void ega_check_cursor(void)
-{
-	if (ega_cursor < SCREEN)
-		return;
-
-	memmove((void *) videoram, (void *) (videoram + ROW * 2),
-	    (SCREEN - ROW) * 2);
-	_memsetw(videoram + (SCREEN - ROW) * 2, ROW, 0x0720);
-	ega_cursor = ega_cursor - ROW;
-}
-
-void ega_putchar(chardev_t *d, const char ch)
-{
-	ipl_t ipl;
-
-	ipl = interrupts_disable();
-	spinlock_lock(&egalock);
-
-	switch (ch) {
-	case '\n':
-		ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW;
-		break;
-	case '\t':
-		ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
-		break; 
-	case '\b':
-		if (ega_cursor % ROW)
-			ega_cursor--;
-		break;
-	default:
-		ega_display_char(ch);
-		ega_cursor++;
-		break;
-	}
-	ega_check_cursor();
-
-	spinlock_unlock(&egalock);
-	interrupts_restore(ipl);
-}
-
-/** @}
- */
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/ia64/src/ia64.c	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -52,6 +52,7 @@
 #include <ddi/irq.h>
 #include <ddi/device.h>
+#include <arch/bootinfo.h>
 #include <arch/drivers/ega.h>
-#include <arch/bootinfo.h>
+#include <genarch/drivers/ega/ega.h>
 #include <genarch/kbd/i8042.h>
 #include <genarch/kbd/ns16550.h>
@@ -133,5 +134,5 @@
 		ski_init_console();
 #else	
-		ega_init();
+		ega_init(EGA_BASE, EGA_VIDEORAM);
 #endif	
 	}
Index: kernel/arch/sparc64/include/types.h
===================================================================
--- kernel/arch/sparc64/include/types.h	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/arch/sparc64/include/types.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -55,8 +55,8 @@
 typedef uint64_t ipl_t;
 
-typedef uint64_t ioport_t;
-
 typedef uint64_t unative_t;
 typedef int64_t native_t;
+
+typedef uintptr_t ioport_t;
 
 /**< Formats for uintptr_t, size_t, count_t and index_t */
Index: kernel/genarch/Makefile.inc
===================================================================
--- kernel/genarch/Makefile.inc	(revision 44ff4fb9fbf32f58d6fa97cffdcb4226917d5a68)
+++ kernel/genarch/Makefile.inc	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -104,2 +104,8 @@
 		genarch/src/ofw/upa.c 
 endif
+
+## EGA
+ifeq ($(CONFIG_EGA), y)
+	GENARCH_SOURCES += \
+		genarch/src/drivers/ega/ega.c
+endif
Index: kernel/genarch/include/drivers/ega/ega.h
===================================================================
--- kernel/genarch/include/drivers/ega/ega.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
+++ kernel/genarch/include/drivers/ega/ega.h	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2001-2004 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup genarch_drivers	
+ * @{
+ */
+/** @file
+ */
+
+#ifndef KERN_EGA_H_
+#define KERN_EGA_H_
+
+#include <arch/types.h>
+
+#define ROW		80
+#define ROWS		25
+#define SCREEN		(ROW * ROWS)
+
+/* EGA device registers. */
+#define EGA_INDEX_REG	0
+#define EGA_DATA_REG	1
+
+extern void ega_redraw(void);
+extern void ega_init(ioport_t, uintptr_t);
+
+#endif
+
+/** @}
+ */
Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision f2451459eff17f8a5c730a385925d2af36865089)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision f2451459eff17f8a5c730a385925d2af36865089)
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2001-2004 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup genarch_drivers	
+ * @{
+ */
+/**
+ * @file
+ * @brief EGA driver.
+ */
+
+#include <genarch/drivers/ega/ega.h>
+#include <putchar.h>
+#include <mm/page.h>
+#include <mm/as.h>
+#include <mm/slab.h>
+#include <arch/mm/page.h>
+#include <synch/spinlock.h>
+#include <arch/types.h>
+#include <arch/asm.h>
+#include <memstr.h>
+#include <console/chardev.h>
+#include <console/console.h>
+#include <sysinfo/sysinfo.h>
+#include <ddi/ddi.h>
+
+/*
+ * The EGA driver.
+ * Simple and short. Function for displaying characters and "scrolling".
+ */
+
+static parea_t ega_parea;	/**< Physical memory area for EGA video RAM. */
+
+SPINLOCK_INITIALIZE(egalock);
+static uint32_t ega_cursor;
+static uint8_t *videoram;
+static uint8_t *backbuf;
+static ioport_t ega_base;
+
+static void ega_putchar(chardev_t *d, const char ch);
+
+chardev_t ega_console;
+static chardev_operations_t ega_ops = {
+	.write = ega_putchar
+};
+
+static void ega_move_cursor(void);
+
+void ega_init(ioport_t base, uintptr_t videoram_phys)
+{
+	/* Initialize the software structure. */	
+	ega_base = base;
+
+	backbuf = (uint8_t *) malloc(SCREEN * 2, 0);
+	if (!backbuf)
+		panic("Unable to allocate backbuffer.\n");
+	
+	videoram = (uint8_t *) hw_map(videoram_phys, SCREEN * 2);
+	
+	/* Clear the screen and set the cursor position. */
+	memsetw(videoram, SCREEN, 0x0720);
+	memsetw(backbuf, SCREEN, 0x0720);
+	ega_move_cursor();
+
+	chardev_initialize("ega_out", &ega_console, &ega_ops);
+	stdout = &ega_console;
+	
+	ega_parea.pbase = videoram_phys;
+	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);
+	sysinfo_set_item_val("fb.kind", NULL, 2);
+	sysinfo_set_item_val("fb.width", NULL, ROW);
+	sysinfo_set_item_val("fb.height", NULL, ROWS);
+	sysinfo_set_item_val("fb.blinking", NULL, true);
+	sysinfo_set_item_val("fb.address.physical", NULL, videoram_phys);
+}
+
+static void ega_display_char(char ch)
+{
+	videoram[ega_cursor * 2] = ch;
+	backbuf[ega_cursor * 2] = ch;
+}
+
+/*
+ * This function takes care of scrolling.
+ */
+static void ega_check_cursor(void)
+{
+	if (ega_cursor < SCREEN)
+		return;
+
+	memmove((void *) videoram, (void *) (videoram + ROW * 2),
+	    (SCREEN - ROW) * 2);
+	memmove((void *) backbuf, (void *) (backbuf + ROW * 2),
+	    (SCREEN - ROW) * 2);
+	memsetw(videoram + (SCREEN - ROW) * 2, ROW, 0x0720);
+	memsetw(backbuf + (SCREEN - ROW) * 2, ROW, 0x0720);
+	ega_cursor = ega_cursor - ROW;
+}
+
+void ega_putchar(chardev_t *d __attribute__((unused)), const char ch)
+{
+	ipl_t ipl;
+
+	ipl = interrupts_disable();
+	spinlock_lock(&egalock);
+
+	switch (ch) {
+	case '\n':
+		ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW;
+		break;
+	case '\t':
+		ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
+		break; 
+	case '\b':
+		if (ega_cursor % ROW)
+			ega_cursor--;
+		break;
+	default:
+		ega_display_char(ch);
+		ega_cursor++;
+		break;
+	}
+	ega_check_cursor();
+	ega_move_cursor();
+
+	spinlock_unlock(&egalock);
+	interrupts_restore(ipl);
+}
+
+void ega_move_cursor(void)
+{
+	outb(ega_base + EGA_INDEX_REG, 0xe);
+	outb(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff));
+	outb(ega_base + EGA_INDEX_REG, 0xf);
+	outb(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff));	
+}
+
+void ega_redraw(void)
+{
+	memcpy(videoram, backbuf, SCREEN * 2);
+	ega_move_cursor();
+}
+
+/** @}
+ */
