Index: uspace/lib/c/generic/fibril_synch.c
===================================================================
--- uspace/lib/c/generic/fibril_synch.c	(revision 525df288cfe2c99c79f9e1d14ea53aec237940b0)
+++ uspace/lib/c/generic/fibril_synch.c	(revision 1fa010cf522cf2c3d4f24c98f452e974d5698128)
@@ -42,4 +42,6 @@
 #include <errno.h>
 #include <assert.h>
+#include <stacktrace.h>
+#include <stdlib.h>
 
 static void optimize_execution_power(void)
@@ -56,4 +58,40 @@
 }
 
+static bool check_for_deadlock(fibril_owner_info_t *oi)
+{
+	while (oi && oi->owned_by) {
+		if (oi->owned_by == (fibril_t *) fibril_get_id())
+			return true;
+		oi = oi->owned_by->waits_for;
+	}
+
+	return false;
+}
+
+static void print_deadlock(fibril_owner_info_t *oi)
+{
+	fibril_t *f = (fibril_t *) fibril_get_id();
+
+	printf("Deadlock detected: ");
+
+	printf("Fibril %p waits for primitive %p.\n", f, oi);
+	stacktrace_print();
+
+	while (oi && oi->owned_by) {
+		printf(". ");
+		printf("Primitive %p is owned by fibril %p.\n",
+		    oi, oi->owned_by);
+		stacktrace_print_fp_pc(oi->owned_by->ctx.ebp,
+		    oi->owned_by->ctx.pc);
+		if (oi->owned_by == f)
+			break;
+		printf("Fibril %p waits for primitive %p.\n",
+		     oi->owned_by, oi->owned_by->waits_for);
+		oi = oi->owned_by->waits_for;
+	}
+
+	abort();
+}
+
 void fibril_mutex_initialize(fibril_mutex_t *fm)
 {
@@ -77,4 +115,6 @@
 		list_append(&wdata.wu_event.link, &fm->waiters);
 
+		if (check_for_deadlock(&fm->oi))
+			print_deadlock(&fm->oi);
 		f->waits_for = &fm->oi;
 
