Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision 201abde2f6d30f23f1aab2b46d1a55da556278f1)
+++ kernel/generic/src/proc/task.c	(revision f74bbaf20e8d8be55495c56affc5b17ef6ea2bf0)
@@ -94,4 +94,47 @@
 }
 
+/** Kill all tasks except the current task.
+ *
+ */
+void task_done(void)
+{
+	task_t *t;
+	do { /* Repeat until there are any tasks except TASK */
+		
+		/* Messing with task structures, avoid deadlock */
+		ipl_t ipl = interrupts_disable();
+		spinlock_lock(&tasks_lock);
+		
+		t = NULL;
+		link_t *cur;
+		for (cur = tasks_btree.leaf_head.next; cur != &tasks_btree.leaf_head; cur = cur->next) {
+			btree_node_t *node = list_get_instance(cur, btree_node_t, leaf_link);
+			
+			unsigned int i;
+			for (i = 0; i < node->keys; i++) {
+				if ((task_t *) node->value[i] != TASK) {
+					t = (task_t *) node->value[i];
+					break;
+				}
+			}
+		}
+		
+		if (t != NULL) {
+			task_id_t id = t->taskid;
+			
+			spinlock_unlock(&tasks_lock);
+			interrupts_restore(ipl);
+			
+#ifdef CONFIG_DEBUG
+			printf("Killing task %llu\n", id);
+#endif			
+			task_kill(id);
+		} else {
+			spinlock_unlock(&tasks_lock);
+			interrupts_restore(ipl);
+		}
+		
+	} while (t != NULL);
+}
 
 /** Create new task
@@ -374,5 +417,5 @@
 	ipl_t ipl;
 	
-	/* Messing with thread structures, avoid deadlock */
+	/* Messing with task structures, avoid deadlock */
 	ipl = interrupts_disable();
 	spinlock_lock(&tasks_lock);
