Index: kernel/generic/include/udebug/udebug.h
===================================================================
--- kernel/generic/include/udebug/udebug.h	(revision bc310a05ba9e9da83dfe5f2096a36e10f288e414)
+++ kernel/generic/include/udebug/udebug.h	(revision 0d21b534cf29b9b695f324a08426ec17d8c12aa5)
@@ -218,4 +218,5 @@
 
 int udebug_task_cleanup(struct task *ta);
+void udebug_thread_fault(void);
 
 #endif
Index: kernel/generic/src/interrupt/interrupt.c
===================================================================
--- kernel/generic/src/interrupt/interrupt.c	(revision bc310a05ba9e9da83dfe5f2096a36e10f288e414)
+++ kernel/generic/src/interrupt/interrupt.c	(revision 0d21b534cf29b9b695f324a08426ec17d8c12aa5)
@@ -134,25 +134,20 @@
 	printf("\n");
 
+	/*
+	 * Userspace can subscribe for FAULT events to take action
+	 * whenever a thread faults. (E.g. take a dump, run a debugger).
+	 * The notification is always available, but unless Udebug is enabled,
+	 * that's all you get.
+	 */
 	if (event_is_subscribed(EVENT_FAULT)) {
+		/* Notify the subscriber that a fault occurred. */
 		event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid),
 		    UPPER32(TASK->taskid), (unative_t) THREAD);
+
+#ifdef CONFIG_UDEBUG
+		/* Wait for a debugging session. */
+		udebug_thread_fault();
+#endif
 	}
-
-#ifdef CONFIG_UDEBUG
-	/* Wait until a debugger attends to us. */
-	mutex_lock(&THREAD->udebug.lock);
-	while (!THREAD->udebug.active)
-		condvar_wait(&THREAD->udebug.active_cv, &THREAD->udebug.lock);
-	mutex_unlock(&THREAD->udebug.lock);
-
-	udebug_stoppable_begin();
-	udebug_stoppable_end();
-
-	/* Make sure the debugging session is over before proceeding. */
-	mutex_lock(&THREAD->udebug.lock);
-	while (THREAD->udebug.active)
-		condvar_wait(&THREAD->udebug.active_cv, &THREAD->udebug.lock);
-	mutex_unlock(&THREAD->udebug.lock);
-#endif
 
 	task_kill(task->taskid);
Index: kernel/generic/src/udebug/udebug.c
===================================================================
--- kernel/generic/src/udebug/udebug.c	(revision bc310a05ba9e9da83dfe5f2096a36e10f288e414)
+++ kernel/generic/src/udebug/udebug.c	(revision 0d21b534cf29b9b695f324a08426ec17d8c12aa5)
@@ -460,4 +460,29 @@
 }
 
+/** Wait for debugger to handle a fault in this thread.
+ *
+ * When a thread faults and someone is subscribed to the FAULT kernel event,
+ * this function is called to wait for a debugging session to give userspace
+ * a chance to examine the faulting thead/task. When the debugging session
+ * is over, this function returns (so that thread/task cleanup can continue).
+ */
+void udebug_thread_fault(void)
+{
+	udebug_stoppable_begin();
+
+	/* Wait until a debugger attends to us. */
+	mutex_lock(&THREAD->udebug.lock);
+	while (!THREAD->udebug.active)
+		condvar_wait(&THREAD->udebug.active_cv, &THREAD->udebug.lock);
+	mutex_unlock(&THREAD->udebug.lock);
+
+	/* Make sure the debugging session is over before proceeding. */
+	mutex_lock(&THREAD->udebug.lock);
+	while (THREAD->udebug.active)
+		condvar_wait(&THREAD->udebug.active_cv, &THREAD->udebug.lock);
+	mutex_unlock(&THREAD->udebug.lock);
+
+	udebug_stoppable_end();
+}
 
 /** @}
