Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision b6f3e7e89f35903bd2012ad022ef70b966d8b246)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision c263c77c4712f982349c184bbee4df2163f68baa)
@@ -40,5 +40,4 @@
 #include <mm/as.h>
 #include <mm/slab.h>
-#include <synch/mutex.h>
 #include <arch/mm/page.h>
 #include <typedefs.h>
@@ -63,5 +62,5 @@
 
 typedef struct {
-	mutex_t mtx;
+	IRQ_SPINLOCK_DECLARE(lock);
 	
 	uint32_t cursor;
@@ -540,5 +539,5 @@
 	ega_instance_t *instance = (ega_instance_t *) dev->data;
 	
-	mutex_lock(&instance->mtx);
+	irq_spinlock_lock(&instance->lock, true);
 	
 	switch (ch) {
@@ -563,5 +562,5 @@
 	ega_move_cursor(instance, silent);
 	
-	mutex_unlock(&instance->mtx);
+	irq_spinlock_unlock(&instance->lock, true);
 }
 
@@ -570,5 +569,5 @@
 	ega_instance_t *instance = (ega_instance_t *) dev->data;
 	
-	mutex_lock(&instance->mtx);
+	irq_spinlock_lock(&instance->lock, true);
 	
 	memcpy(instance->addr, instance->backbuf, EGA_VRAM_SIZE);
@@ -576,5 +575,5 @@
 	ega_show_cursor(instance, silent);
 	
-	mutex_unlock(&instance->mtx);
+	irq_spinlock_unlock(&instance->lock, true);
 }
 
@@ -594,5 +593,5 @@
 	egadev->data = instance;
 	
-	mutex_initialize(&instance->mtx, MUTEX_PASSIVE);
+	irq_spinlock_initialize(&instance->lock, "*ega.instance.lock");
 	
 	instance->base = base;
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision b6f3e7e89f35903bd2012ad022ef70b966d8b246)
+++ kernel/genarch/src/fb/fb.c	(revision c263c77c4712f982349c184bbee4df2163f68baa)
@@ -80,5 +80,5 @@
 
 typedef struct {
-	mutex_t mtx;
+	SPINLOCK_DECLARE(lock);
 	
 	uint8_t *addr;
@@ -365,5 +365,5 @@
 {
 	fb_instance_t *instance = (fb_instance_t *) dev->data;
-	mutex_lock(&instance->mtx);
+	spinlock_lock(&instance->lock);
 	
 	switch (ch) {
@@ -406,5 +406,5 @@
 	cursor_put(instance, silent);
 	
-	mutex_unlock(&instance->mtx);
+	spinlock_unlock(&instance->lock);
 }
 
@@ -473,7 +473,7 @@
 	fb_instance_t *instance = (fb_instance_t *) dev->data;
 	
-	mutex_lock(&instance->mtx);
+	spinlock_lock(&instance->lock);
 	fb_redraw_internal(instance);
-	mutex_unlock(&instance->mtx);
+	spinlock_unlock(&instance->lock);
 }
 
@@ -554,5 +554,5 @@
 	fbdev->data = instance;
 	
-	mutex_initialize(&instance->mtx, MUTEX_PASSIVE);
+	spinlock_initialize(&instance->lock, "*fb.instance.lock");
 	instance->rgb_conv = rgb_conv;
 	instance->pixelbytes = pixelbytes;
Index: kernel/generic/src/synch/spinlock.c
===================================================================
--- kernel/generic/src/synch/spinlock.c	(revision b6f3e7e89f35903bd2012ad022ef70b966d8b246)
+++ kernel/generic/src/synch/spinlock.c	(revision c263c77c4712f982349c184bbee4df2163f68baa)
@@ -84,5 +84,20 @@
 		 * This conserns especially printf_lock and the
 		 * framebuffer lock.
+		 *
+		 * Any lock whose name is prefixed by "*" will be
+		 * ignored by this deadlock detection routine
+		 * as this might cause an infinite recursion.
+		 * We trust our code that there is no possible deadlock
+		 * caused by these locks (except when an exception
+		 * is triggered for instance by printf()).
+		 *
+		 * We encountered false positives caused by very
+		 * slow framebuffer interaction (especially when
+		 * run in a simulator) that caused problems with both
+		 * printf_lock and the framebuffer lock.
 		 */
+		if (lock->name[0] == '*')
+			continue;
+		
 		if (i++ > DEADLOCK_THRESHOLD) {
 			printf("cpu%u: looping on spinlock %p:%s, "
