diff --git a/sys/conf/options b/sys/conf/options
index b27e782..8aa1bea 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -552,6 +552,7 @@ KTR				opt_global.h
 KTR_ENTRIES			opt_global.h
 KTR_ALL				opt_ktr.h
 KTR_ACPI_EC			opt_ktr.h
+KTR_CONSOLE			opt_ktr.h
 KTR_CTXSW			opt_ktr.h
 KTR_DMCRYPT			opt_ktr.h
 KTR_DSCHED_BFQ			opt_ktr.h
diff --git a/sys/dev/misc/syscons/sckmsrndr.c b/sys/dev/misc/syscons/sckmsrndr.c
index 5152588..651a9b4 100644
--- a/sys/dev/misc/syscons/sckmsrndr.c
+++ b/sys/dev/misc/syscons/sckmsrndr.c
@@ -31,6 +31,7 @@
 #include <sys/kernel.h>
 #include <sys/thread.h>
 #include <sys/thread2.h>
+#include <sys/ktr.h>
 
 #include <machine/console.h>
 
@@ -40,13 +41,21 @@
 
 #include <bus/isa/isareg.h>
 
-static vr_draw_border_t		kms_border;
+#if !defined(KTR_CONSOLE)
+#define KTR_CONSOLE	KTR_ALL
+#endif
+KTR_INFO_MASTER(console);
+KTR_INFO(KTR_CONSOLE, console, kms_draw_enter, 0, "kms_draw: %d %d %d",
+    int from, int count, int flip);
+KTR_INFO(KTR_CONSOLE, console, kms_draw_char, 1, "drawing at vaddr+%p",
+    void *offset);
+
+static vr_draw_border_t		kms_border __unused;
 static vr_draw_t		kms_draw;
-static vr_set_cursor_t		kms_cursor_shape;
-static vr_draw_cursor_t		kms_cursor;
-static vr_blink_cursor_t	kms_blink;
+static vr_draw_cursor_t		kms_cursor __unused;
+static vr_blink_cursor_t	kms_blink __unused;
 #ifndef SC_NO_CUTPASTE
-static vr_draw_mouse_t		kms_mouse;
+static vr_draw_mouse_t		kms_mouse __unused;
 #else
 #define	kms_mouse		(vr_draw_mouse_t *)kms_nop
 #endif
@@ -58,12 +67,12 @@ static vr_draw_border_t		kms_grborder;
 static void			kms_nop(scr_stat *scp, ...);
 
 static sc_rndr_sw_t kmsrndrsw = {
-	kms_border,
+	(vr_draw_border_t *)kms_nop,
 	kms_draw,
-	kms_cursor_shape,
-	kms_cursor,
-	kms_blink,
-	kms_mouse,
+	(vr_set_cursor_t *)kms_nop,
+	(vr_draw_cursor_t *)kms_nop,
+	(vr_blink_cursor_t *)kms_nop,
+	(vr_draw_mouse_t *)kms_nop,
 };
 RENDERER(kms, V_INFO_MM_TEXT, kmsrndrsw, kms_set);
 
@@ -181,24 +190,29 @@ kms_draw(scr_stat *scp, int from, int count, int flip)
 	int a, i, j, k;
 	uint32_t bg;
 	uint32_t fg;
-	vm_offset_t draw_pos, p;
+	vm_offset_t draw_pos, idraw_pos, p;
 	int pos, line_width, pixel_size;
 
+	KTR_LOG(console_kms_draw_enter, from, count, flip);
+
 	line_width = sc->fbi->stride;
 	pixel_size = 4;
 
-	draw_pos = sc->fbi->vaddr +
-	    8 * pixel_size * scp->xoff +
-	    scp->yoff * scp->font_size * line_width +
-	    8 * pixel_size * (from % scp->xsize) +
-	    scp->font_size * line_width * (from / scp->xsize);
+	draw_pos = idraw_pos = sc->fbi->vaddr +
+	    8 * scp->font_mag * pixel_size * scp->xoff +
+	    scp->yoff * scp->font_size * scp->font_mag * line_width +
+	    8 * scp->font_mag * pixel_size * (from % scp->xsize) +
+	    scp->font_mag * scp->font_size * line_width * (from / scp->xsize);
 
 	if (from + count > scp->xsize * scp->ysize)
 		count = scp->xsize * scp->ysize - from;
 
 	for (i = from; count-- > 0; i++) {
-		a = sc_vtb_geta(&scp->vtb, i);
+		p = draw_pos;
+		char_data = &(scp->font[sc_vtb_getc(&scp->vtb, i) *
+		    scp->font_size]);
 
+		a = sc_vtb_geta(&scp->vtb, i);
 		if (flip) {
 			fg = colormap[((a & 0xf000) >> 4) >> 8];
 			bg = colormap[(a & 0x0f00) >> 8];
@@ -207,35 +221,28 @@ kms_draw(scr_stat *scp, int from, int count, int flip)
 			bg = colormap[((a & 0xf000) >> 4) >> 8];
 		}
 
-		p = draw_pos;
-		char_data = &(scp->font[sc_vtb_getc(&scp->vtb, i) *
-		    scp->font_size]);
-
+		KTR_LOG(console_kms_draw_char, (void *)(draw_pos - idraw_pos));
 		for (j = 0; j < scp->font_size; j++, char_data++) {
 			pos = 7;
 
 			for (k = 0; k < 2 * pixel_size; k++) {
 				writel(p, *char_data & (1 << pos--) ? fg : bg);
-				p += 4;
+				p += 4 * scp->font_mag;
 			}
 
-			p += line_width - 8 * pixel_size;
+			p += scp->font_mag * line_width -
+			    8 * scp->font_mag * pixel_size;
+		}
+		draw_pos += 8 * scp->font_mag * pixel_size;
+		if ((i % scp->xsize) == scp->xsize - 1) {
+			draw_pos +=
+			    scp->xoff * 16 * scp->font_mag * pixel_size +
+			    (scp->font_size * scp->font_mag - 1) * line_width;
 		}
-
-		draw_pos += 8 * pixel_size;
-
-		if ((i % scp->xsize) == scp->xsize - 1)
-			draw_pos += scp->xoff * 16 * pixel_size +
-			     (scp->font_size - 1) * line_width;
 	}
 }
 
 static void
-kms_cursor_shape(scr_stat *scp, int base, int height, int blink)
-{
-}
-
-static void
 draw_kmscursor(scr_stat *scp, int at, int on, int flip)
 {
 	sc_softc_t *sc = scp->sc;
diff --git a/sys/dev/misc/syscons/scvidctl.c b/sys/dev/misc/syscons/scvidctl.c
index fc2b5d9..d9b6795 100644
--- a/sys/dev/misc/syscons/scvidctl.c
+++ b/sys/dev/misc/syscons/scvidctl.c
@@ -796,6 +796,11 @@ sc_update_render(scr_stat *scp)
 		scp->model = V_INFO_MM_TEXT;
 		scp->xsize = scp->fbi->width / 8;
 		scp->ysize = scp->fbi->height / scp->font_size;
+		while (scp->xsize / 2 >= 80 && scp->ysize / 2 >= 25) {
+			scp->xsize /= 2;
+			scp->ysize /= 2;
+			scp->font_mag++;
+		}
 
 		/* allocate buffers */
 		sc_alloc_scr_buffer(scp, TRUE, TRUE);
@@ -811,9 +816,9 @@ sc_update_render(scr_stat *scp)
 		tp = VIRTUAL_TTY(scp->sc, scp->index);
 		if (tp == NULL)
 			return;
-		kprintf("syscons terminal resized from %dx%d to %dx%d\n",
+		kprintf("syscons terminal resized from %dx%d to %dx%d, font magnification %d\n",
 		    tp->t_winsize.ws_col, tp->t_winsize.ws_row,
-		    scp->xsize, scp->ysize);
+		    scp->xsize, scp->ysize, scp->font_mag);
 		if (tp->t_winsize.ws_col != scp->xsize ||
 		    tp->t_winsize.ws_row != scp->ysize) {
 			tp->t_winsize.ws_col = scp->xsize;
diff --git a/sys/dev/misc/syscons/syscons.c b/sys/dev/misc/syscons/syscons.c
index b1650b5..c0d4810 100644
--- a/sys/dev/misc/syscons/syscons.c
+++ b/sys/dev/misc/syscons/syscons.c
@@ -3187,10 +3187,16 @@ init_scp(sc_softc_t *sc, int vty, scr_stat *scp)
 #endif
 	}
     }
+    scp->font_mag = 1;
     scp->fbi = sc->fbi;
     if (scp->fbi != NULL) {
 	scp->xsize = scp->fbi->width / 8;
 	scp->ysize = scp->fbi->height / scp->font_size;
+	while (scp->xsize / 2 >= 80 && scp->ysize / 2 >= 25) {
+	    scp->xsize /= 2;
+	    scp->ysize /= 2;
+	    scp->font_mag++;
+	}
     }
     sc_vtb_init(&scp->vtb, VTB_MEMORY, 0, 0, NULL, FALSE);
     sc_vtb_init(&scp->scr, VTB_FRAMEBUFFER, 0, 0, NULL, FALSE);
diff --git a/sys/dev/misc/syscons/syscons.h b/sys/dev/misc/syscons/syscons.h
index 6b24fa7..c1a400f 100644
--- a/sys/dev/misc/syscons/syscons.h
+++ b/sys/dev/misc/syscons/syscons.h
@@ -267,6 +267,7 @@ typedef struct scr_stat {
 
 	u_char		*font;			/* current font */
 	int		font_size;		/* fontsize in Y direction */
+	int		font_mag;		/* font magnification */
 
 	int		start;			/* modified area start */
 	int		end;			/* modified area end */
