Index: kernel/generic/include/adt/list.h
===================================================================
--- kernel/generic/include/adt/list.h	(revision 1f092d9ee54c991d7f2820ce325e6374d85b3a26)
+++ kernel/generic/include/adt/list.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -258,4 +258,35 @@
 }
 
+/** Moves items of one list into another after the specified item.
+ * 
+ * Inserts all items of @a list after item at @a pos in another list. 
+ * Both lists may be empty. 
+ * 
+ * In order to insert the list at the beginning of another list, use:
+ * @code 
+ * list_splice(&list_dest.head, &list_src);
+ * @endcode
+ * 
+ * @param list Source list to move after pos.
+ * @param pos Source items will be placed after this item.
+ */
+NO_TRACE static inline void list_splice(list_t *list, link_t *pos)
+{
+	link_t *pos_next = pos->next;
+	
+	if (!list_empty(list)) {
+		link_t *first = list->head.next;
+		link_t *last = list->head.prev;
+
+		pos->next = first;
+		first->prev = pos;
+
+		last->next = pos_next;
+		pos_next->prev = last;
+		
+		list_initialize(list);
+	}
+}
+
 /** Get n-th item in a list.
  *
Index: kernel/generic/include/cpu.h
===================================================================
--- kernel/generic/include/cpu.h	(revision 1f092d9ee54c991d7f2820ce325e6374d85b3a26)
+++ kernel/generic/include/cpu.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -94,4 +94,10 @@
 	
 	/**
+	 * SMP calls to invoke on this CPU.
+	 */
+	SPINLOCK_DECLARE(smp_calls_lock);
+	list_t smp_pending_calls;
+	
+	/**
 	 * Stack used by scheduler when there is no running thread.
 	 */
Index: kernel/generic/include/smp/smp_call.h
===================================================================
--- kernel/generic/include/smp/smp_call.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
+++ kernel/generic/include/smp/smp_call.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -0,0 +1,33 @@
+/* 
+ */
+
+#ifndef KERN_SMP_CALL_H_
+#define	KERN_SMP_CALL_H_
+
+#include <adt/list.h>
+#include <synch/spinlock.h>
+#include <atomic.h>
+
+typedef void (*smp_call_func_t)(void *);
+
+typedef struct smp_call {
+	smp_call_func_t func;
+	void *arg;
+	link_t calls_link;
+	atomic_t pending;
+} smp_call_t;
+
+
+
+extern void smp_call(unsigned int, smp_call_func_t, void *);
+extern void smp_call_async(unsigned int, smp_call_func_t, void *, smp_call_t *);
+extern void smp_call_wait(smp_call_t *);
+//extern void smp_broadcast_call(smp_call_func_t, void *);
+
+extern void smp_call_init(void);
+extern void smp_call_ipi_recv(void);
+
+
+
+#endif	/* KERN_SMP_CALL_H_ */
+
