Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision f651e80e2ba6968d9e184dd8ca7fa6e5b779caaf)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision 108a60f93deb7351872cdb1a408aedfbc137fd23)
@@ -63,51 +63,5 @@
 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.");
-	
-	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;
-}
 
 /*
@@ -128,11 +82,27 @@
 }
 
-void ega_putchar(chardev_t *d __attribute__((unused)), const char ch)
+static 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));	
+}
+
+static void ega_display_char(char ch, bool silent)
+{
+	backbuf[ega_cursor * 2] = ch;
+	
+	if (!silent)
+		videoram[ega_cursor * 2] = ch;
+}
+
+static void ega_putchar(chardev_t *d __attribute__((unused)), const char ch, bool silent)
 {
 	ipl_t ipl;
-
+	
 	ipl = interrupts_disable();
 	spinlock_lock(&egalock);
-
+	
 	switch (ch) {
 	case '\n':
@@ -147,21 +117,52 @@
 		break;
 	default:
-		ega_display_char(ch);
+		ega_display_char(ch, silent);
 		ega_cursor++;
 		break;
 	}
 	ega_check_cursor();
-	ega_move_cursor();
-
+	
+	if (!silent)
+		ega_move_cursor();
+	
 	spinlock_unlock(&egalock);
 	interrupts_restore(ipl);
 }
 
-void ega_move_cursor(void)
+static chardev_operations_t ega_ops = {
+	.write = ega_putchar
+};
+
+void ega_init(ioport_t base, uintptr_t videoram_phys)
 {
-	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));	
+	/* Initialize the software structure. */	
+	ega_base = base;
+	
+	backbuf = (uint8_t *) malloc(SCREEN * 2, 0);
+	if (!backbuf)
+		panic("Unable to allocate backbuffer.");
+	
+	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);
 }
 
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision f651e80e2ba6968d9e184dd8ca7fa6e5b779caaf)
+++ kernel/genarch/src/fb/fb.c	(revision 108a60f93deb7351872cdb1a408aedfbc137fd23)
@@ -185,10 +185,11 @@
  *
  */
-static void logo_hide(void)
+static void logo_hide(bool silent)
 {
 	ylogo = 0;
 	ytrim = yres;
 	rowtrim = rows;
-	fb_redraw();
+	if (!silent)
+		fb_redraw();
 }
 
@@ -197,5 +198,5 @@
  *
  */
-static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row)
+static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row, bool silent)
 {
 	unsigned int x = COL2X(col);
@@ -204,11 +205,13 @@
 	
 	if (y >= ytrim)
-		logo_hide();
+		logo_hide(silent);
 	
 	backbuf[BB_POS(col, row)] = glyph;
 	
-	for (yd = 0; yd < FONT_SCANLINES; yd++)
-		memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
-		    &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
+	if (!silent) {
+		for (yd = 0; yd < FONT_SCANLINES; yd++)
+			memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
+			    &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
+	}
 }
 
@@ -218,37 +221,39 @@
  *
  */
-static void screen_scroll(void)
+static void screen_scroll(bool silent)
 {
 	if (ylogo > 0) {
-		logo_hide();
+		logo_hide(silent);
 		return;
 	}
 	
-	unsigned int row;
-	
-	for (row = 0; row < rows; row++) {
-		unsigned int y = ROW2Y(row);
-		unsigned int yd;
+	if (!silent) {
+		unsigned int row;
 		
-		for (yd = 0; yd < FONT_SCANLINES; yd++) {
-			unsigned int x;
-			unsigned int col;
+		for (row = 0; row < rows; row++) {
+			unsigned int y = ROW2Y(row);
+			unsigned int yd;
 			
-			for (col = 0, x = 0; col < cols; col++,
-			    x += FONT_WIDTH) {
-				uint8_t glyph;
+			for (yd = 0; yd < FONT_SCANLINES; yd++) {
+				unsigned int x;
+				unsigned int col;
 				
-				if (row < rows - 1) {
-					if (backbuf[BB_POS(col, row)] ==
-					    backbuf[BB_POS(col, row + 1)])
-						continue;
+				for (col = 0, x = 0; col < cols; col++,
+				    x += FONT_WIDTH) {
+					uint8_t glyph;
 					
-					glyph = backbuf[BB_POS(col, row + 1)];
-				} else
-					glyph = 0;
-				
-				memcpy(&fb_addr[FB_POS(x, y + yd)],
-				    &glyphs[GLYPH_POS(glyph, yd)],
-				    glyphscanline);
+					if (row < rows - 1) {
+						if (backbuf[BB_POS(col, row)] ==
+						    backbuf[BB_POS(col, row + 1)])
+							continue;
+						
+						glyph = backbuf[BB_POS(col, row + 1)];
+					} else
+						glyph = 0;
+					
+					memcpy(&fb_addr[FB_POS(x, y + yd)],
+					    &glyphs[GLYPH_POS(glyph, yd)],
+					    glyphscanline);
+				}
 			}
 		}
@@ -260,13 +265,13 @@
 
 
-static void cursor_put(void)
-{
-	glyph_draw(CURSOR, position % cols, position / cols);
-}
-
-
-static void cursor_remove(void)
-{
-	glyph_draw(0, position % cols, position / cols);
+static void cursor_put(bool silent)
+{
+	glyph_draw(CURSOR, position % cols, position / cols, silent);
+}
+
+
+static void cursor_remove(bool silent)
+{
+	glyph_draw(0, position % cols, position / cols, silent);
 }
 
@@ -277,5 +282,5 @@
  *
  */
-static void fb_putchar(chardev_t *dev, char ch)
+static void fb_putchar(chardev_t *dev, char ch, bool silent)
 {
 	spinlock_lock(&fb_lock);
@@ -283,27 +288,28 @@
 	switch (ch) {
 	case '\n':
-		cursor_remove();
+		cursor_remove(silent);
 		position += cols;
 		position -= position % cols;
 		break;
 	case '\r':
-		cursor_remove();
+		cursor_remove(silent);
 		position -= position % cols;
 		break;
 	case '\b':
-		cursor_remove();
+		cursor_remove(silent);
 		if (position % cols)
 			position--;
 		break;
 	case '\t':
-		cursor_remove();
+		cursor_remove(silent);
 		do {
 			glyph_draw((uint8_t) ' ', position % cols,
-			    position / cols);
+			    position / cols, silent);
 			position++;
 		} while ((position % 8) && (position < cols * rows));
 		break;
 	default:
-		glyph_draw((uint8_t) ch, position % cols, position / cols);
+		glyph_draw((uint8_t) ch, position % cols,
+		    position / cols, silent);
 		position++;
 	}
@@ -311,8 +317,8 @@
 	if (position >= cols * rows) {
 		position -= cols;
-		screen_scroll();
-	}
-	
-	cursor_put();
+		screen_scroll(silent);
+	}
+	
+	cursor_put(silent);
 	
 	spinlock_unlock(&fb_lock);
