Index: generic/include/proc/thread.h
===================================================================
--- generic/include/proc/thread.h	(revision 428aabf28c24869816fc053ab91991e8942c8cfc)
+++ generic/include/proc/thread.h	(revision 55ab0f1b4eb5fe0181079aea11a8851e2a23d7e5)
@@ -134,4 +134,5 @@
 
 extern void thread_register_call_me(void (* call_me)(void *), void *call_me_with);
+extern void thread_print_list(void);
 
 #endif
Index: generic/src/console/cmd.c
===================================================================
--- generic/src/console/cmd.c	(revision 428aabf28c24869816fc053ab91991e8942c8cfc)
+++ generic/src/console/cmd.c	(revision 55ab0f1b4eb5fe0181079aea11a8851e2a23d7e5)
@@ -53,4 +53,5 @@
 #include <mm/slab.h>
 #include <proc/scheduler.h>
+#include <proc/thread.h>
 
 /** Data and methods for 'help' command. */
@@ -245,4 +246,12 @@
 };
 
+static int cmd_threads(cmd_arg_t *argv);
+static cmd_info_t threads_info = {
+	.name = "threads",
+	.description = "List all threads",
+	.func = cmd_threads,
+	.argc = 0
+};
+
 
 static int cmd_sched(cmd_arg_t *argv);
@@ -321,4 +330,5 @@
 	&symaddr_info,
 	&sched_info,
+	&threads_info,
 	&tlb_info,
 	&version_info,
@@ -598,4 +608,16 @@
 }
 
+
+/** Command for listings Thread information
+ *
+ * @param argv Ignores
+ *
+ * @return Always 1
+ */
+int cmd_threads(cmd_arg_t * argv) {
+	thread_print_list();
+	return 1;
+}
+
 /** Command for listings Thread information
  *
Index: generic/src/proc/thread.c
===================================================================
--- generic/src/proc/thread.c	(revision 428aabf28c24869816fc053ab91991e8942c8cfc)
+++ generic/src/proc/thread.c	(revision 55ab0f1b4eb5fe0181079aea11a8851e2a23d7e5)
@@ -52,4 +52,5 @@
 #include <arch/atomic.h>
 #include <memstr.h>
+#include <print.h>
 
 char *thread_states[] = {"Invalid", "Running", "Sleeping", "Ready", "Entering", "Exiting"}; /**< Thread states */
@@ -319,2 +320,26 @@
 	interrupts_restore(ipl);
 }
+
+/** Print list of threads debug info */
+void thread_print_list(void)
+{
+	link_t *cur;
+	thread_t *t;
+	ipl_t ipl;
+	
+	/* Messing with thread structures, avoid deadlock */
+	ipl = interrupts_disable();
+	spinlock_lock(&threads_lock);
+
+	for (cur=threads_head.next; cur!=&threads_head; cur=cur->next) {
+		t = list_get_instance(cur, thread_t, threads_link);
+		printf("Thr: %d(%s) ", t->tid, thread_states[t->state]);
+		if (t->cpu)
+			printf("cpu%d ", t->cpu->id);
+		
+		printf("\n");
+	}
+
+	spinlock_unlock(&threads_lock);
+	interrupts_enable();
+}
