Index: kernel/generic/include/console/console.h
===================================================================
--- kernel/generic/include/console/console.h	(revision be069144135afaab9e7c8cee79ffd3504762612c)
+++ kernel/generic/include/console/console.h	(revision b3b7e14a1e27b36c3c59ce41e9bc3060bdc881fd)
@@ -37,5 +37,19 @@
 
 #include <typedefs.h>
+#include <print.h>
 #include <console/chardev.h>
+
+#define PAGING(counter, increment, before, after) \
+	do { \
+		(counter) += (increment); \
+		if ((counter) > 23) { \
+			before; \
+			printf(" -- Press any key to continue -- "); \
+			indev_pop_character(stdin); \
+			after; \
+			printf("\n"); \
+			(counter) = 0; \
+		} \
+	} while (0)
 
 extern indev_t *stdin;
Index: kernel/generic/include/interrupt.h
===================================================================
--- kernel/generic/include/interrupt.h	(revision be069144135afaab9e7c8cee79ffd3504762612c)
+++ kernel/generic/include/interrupt.h	(revision b3b7e14a1e27b36c3c59ce41e9bc3060bdc881fd)
@@ -44,9 +44,10 @@
 #include <stacktrace.h>
 
-typedef void (* iroutine)(int, istate_t *);
+typedef void (* iroutine_t)(int, istate_t *);
 
 typedef struct {
 	const char *name;
-	iroutine f;
+	bool hot;
+	iroutine_t handler;
 	uint64_t cycles;
 	uint64_t count;
@@ -57,6 +58,6 @@
 
 extern void fault_if_from_uspace(istate_t *, const char *, ...);
-extern iroutine exc_register(int, const char *, iroutine);
-extern void exc_dispatch(int, istate_t *);
+extern iroutine_t exc_register(unsigned int, const char *, bool, iroutine_t);
+extern void exc_dispatch(unsigned int, istate_t *);
 extern void exc_init(void);
 
Index: kernel/generic/include/sysinfo/abi.h
===================================================================
--- kernel/generic/include/sysinfo/abi.h	(revision be069144135afaab9e7c8cee79ffd3504762612c)
+++ kernel/generic/include/sysinfo/abi.h	(revision b3b7e14a1e27b36c3c59ce41e9bc3060bdc881fd)
@@ -130,4 +130,5 @@
 	unsigned int id;             /**< Exception ID */
 	char desc[EXC_NAME_BUFLEN];  /**< Description */
+	bool hot;                    /**< Active or inactive exception */
 	uint64_t cycles;             /**< Number of CPU cycles in the handler */
 	uint64_t count;              /**< Number of handled exceptions */
Index: kernel/generic/src/interrupt/interrupt.c
===================================================================
--- kernel/generic/src/interrupt/interrupt.c	(revision be069144135afaab9e7c8cee79ffd3504762612c)
+++ kernel/generic/src/interrupt/interrupt.c	(revision b3b7e14a1e27b36c3c59ce41e9bc3060bdc881fd)
@@ -61,18 +61,26 @@
 /** Register exception handler
  *
- * @param n       Exception number
- * @param name    Description
- * @param handler Exception handler
- *
- */
-iroutine exc_register(int n, const char *name, iroutine handler)
-{
+ * @param n       Exception number.
+ * @param name    Description.
+ * @param hot     Whether the exception is actually handled
+ *                in any meaningful way.
+ * @param handler New exception handler.
+ *
+ * @return Previously registered exception handler.
+ *
+ */
+iroutine_t exc_register(unsigned int n, const char *name, bool hot,
+    iroutine_t handler)
+{
+#if (IVT_ITEMS > 0)
 	ASSERT(n < IVT_ITEMS);
+#endif
 	
 	irq_spinlock_lock(&exctbl_lock, true);
 	
-	iroutine old = exc_table[n].f;
-	exc_table[n].f = handler;
+	iroutine_t old = exc_table[n].handler;
+	exc_table[n].handler = handler;
 	exc_table[n].name = name;
+	exc_table[n].hot = hot;
 	exc_table[n].cycles = 0;
 	exc_table[n].count = 0;
@@ -89,7 +97,9 @@
  *
  */
-void exc_dispatch(int n, istate_t *istate)
-{
+void exc_dispatch(unsigned int n, istate_t *istate)
+{
+#if (IVT_ITEMS > 0)
 	ASSERT(n < IVT_ITEMS);
+#endif
 	
 	uint64_t begin_cycle = get_cycle();
@@ -107,5 +117,5 @@
 #endif
 	
-	exc_table[n].f(n + IVT_FIRST, istate);
+	exc_table[n].handler(n + IVT_FIRST, istate);
 	
 #ifdef CONFIG_UDEBUG
@@ -185,4 +195,6 @@
 #ifdef CONFIG_KCONSOLE
 
+static char flag_buf[MAX_CMDLINE + 1];
+
 /** Print all exceptions
  *
@@ -190,20 +202,38 @@
 static int cmd_exc_print(cmd_arg_t *argv)
 {
+	bool excs_all;
+	
+	if (str_cmp(flag_buf, "-a") == 0)
+		excs_all = true;
+	else if (str_cmp(flag_buf, "") == 0)
+		excs_all = false;
+	else {
+		printf("Unknown argument \"%s\".\n", flag_buf);
+		return 1;
+	}
+	
 #if (IVT_ITEMS > 0)
 	unsigned int i;
+	unsigned int rows;
 	
 	irq_spinlock_lock(&exctbl_lock, true);
 	
 #ifdef __32_BITS__
-	printf("Exc Description          Count      Cycles     Handler    Symbol\n");
-	printf("--- -------------------- ---------- ---------- ---------- --------\n");
+	printf("[exc   ] [description       ] [count   ] [cycles  ]"
+	    " [handler ] [symbol\n");
+	rows = 1;
 #endif
 	
 #ifdef __64_BITS__
-	printf("Exc Description          Count      Cycles     Handler            Symbol\n");
-	printf("--- -------------------- ---------- ---------- ------------------ --------\n");
+	printf("[exc   ] [description       ] [count   ] [cycles  ]"
+	    " [handler         ]\n");
+	printf("         [symbol\n");
+	rows = 2;
 #endif
 	
 	for (i = 0; i < IVT_ITEMS; i++) {
+		if ((!excs_all) && (!exc_table[i].hot))
+			continue;
+		
 		uint64_t count;
 		char count_suffix;
@@ -217,40 +247,49 @@
 		
 		const char *symbol =
-		    symtab_fmt_name_lookup((unative_t) exc_table[i].f);
+		    symtab_fmt_name_lookup((unative_t) exc_table[i].handler);
 		
 #ifdef __32_BITS__
-		printf("%-3u %-20s %9" PRIu64 "%c %9" PRIu64 "%c %10p %s\n",
+		printf("%-8u %-20s %9" PRIu64 "%c %9" PRIu64 "%c %10p %s\n",
 		    i + IVT_FIRST, exc_table[i].name, count, count_suffix,
-		    cycles, cycles_suffix, exc_table[i].f, symbol);
+		    cycles, cycles_suffix, exc_table[i].handler, symbol);
+		
+		PAGING(rows, 1, irq_spinlock_unlock(&exctbl_lock, true),
+		    irq_spinlock_lock(&exctbl_lock, true));
 #endif
 		
 #ifdef __64_BITS__
-		printf("%-3u %-20s %9" PRIu64 "%c %9" PRIu64 "%c %18p %s\n",
+		printf("%-8u %-20s %9" PRIu64 "%c %9" PRIu64 "%c %18p\n",
 		    i + IVT_FIRST, exc_table[i].name, count, count_suffix,
-		    cycles, cycles_suffix, exc_table[i].f, symbol);
-#endif
-		
-		if (((i + 1) % 20) == 0) {
-			printf(" -- Press any key to continue -- ");
-			irq_spinlock_unlock(&exctbl_lock, true);
-			indev_pop_character(stdin);
-			irq_spinlock_lock(&exctbl_lock, true);
-			printf("\n");
-		}
+		    cycles, cycles_suffix, exc_table[i].handler);
+		printf("         %s\n", symbol);
+		
+		PAGING(rows, 2, irq_spinlock_unlock(&exctbl_lock, true),
+		    irq_spinlock_lock(&exctbl_lock, true));
+#endif
 	}
 	
 	irq_spinlock_unlock(&exctbl_lock, true);
-#endif
+#else /* (IVT_ITEMS > 0) */
+	
+	printf("No exception table%s.\n", excs_all ? " (showing all exceptions)" : "");
+	
+#endif /* (IVT_ITEMS > 0) */
 	
 	return 1;
 }
+
+static cmd_arg_t exc_argv = {
+	.type = ARG_TYPE_STRING_OPTIONAL,
+	.buffer = flag_buf,
+	.len = sizeof(flag_buf)
+};
 
 static cmd_info_t exc_info = {
 	.name = "exc",
-	.description = "Print exception table.",
+	.description = "Print exception table (use -a for all exceptions).",
 	.func = cmd_exc_print,
 	.help = NULL,
-	.argc = 0,
-	.argv = NULL
+	.argc = 1,
+	.argv = &exc_argv
 };
 
@@ -268,5 +307,5 @@
 	
 	for (i = 0; i < IVT_ITEMS; i++)
-		exc_register(i, "undef", (iroutine) exc_undef);
+		exc_register(i, "undef", false, (iroutine_t) exc_undef);
 #endif
 	
Index: kernel/generic/src/sysinfo/stats.c
===================================================================
--- kernel/generic/src/sysinfo/stats.c	(revision be069144135afaab9e7c8cee79ffd3504762612c)
+++ kernel/generic/src/sysinfo/stats.c	(revision b3b7e14a1e27b36c3c59ce41e9bc3060bdc881fd)
@@ -562,4 +562,5 @@
 	}
 	
+#if (IVT_ITEMS > 0)
 	/* Messing with exception table, avoid deadlock */
 	irq_spinlock_lock(&exctbl_lock, true);
@@ -569,4 +570,5 @@
 		stats_exceptions[i].id = i + IVT_FIRST;
 		str_cpy(stats_exceptions[i].desc, EXC_NAME_BUFLEN, exc_table[i].name);
+		stats_exceptions[i].hot = exc_table[i].hot;
 		stats_exceptions[i].cycles = exc_table[i].cycles;
 		stats_exceptions[i].count = exc_table[i].count;
@@ -574,4 +576,5 @@
 	
 	irq_spinlock_unlock(&exctbl_lock, true);
+#endif
 	
 	return ((void *) stats_exceptions);
@@ -606,11 +609,15 @@
 		return ret;
 	
-#if IVT_FIRST > 0
+#if (IVT_FIRST > 0)
 	if (excn < IVT_FIRST)
 		return ret;
 #endif
 	
+#if (IVT_ITEMS + IVT_FIRST == 0)
+	return ret;
+#else
 	if (excn >= IVT_ITEMS + IVT_FIRST)
 		return ret;
+#endif
 	
 	if (dry_run) {
@@ -638,4 +645,5 @@
 		stats_exception->id = excn;
 		str_cpy(stats_exception->desc, EXC_NAME_BUFLEN, exc_table[excn].name);
+		stats_exception->hot = exc_table[excn].hot;
 		stats_exception->cycles = exc_table[excn].cycles;
 		stats_exception->count = exc_table[excn].count;
