Index: kernel/arch/amd64/Makefile.inc
===================================================================
--- kernel/arch/amd64/Makefile.inc	(revision 49e6c6b48a1667db53d7a8cfba97659b95c83ea8)
+++ kernel/arch/amd64/Makefile.inc	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -104,4 +104,5 @@
 		arch/$(KARCH)/src/smp/ipi.c \
 		arch/$(KARCH)/src/smp/mps.c \
+		arch/$(KARCH)/src/smp/smp_call.c \
 		arch/$(KARCH)/src/smp/smp.c
 endif
Index: kernel/arch/amd64/include/interrupt.h
===================================================================
--- kernel/arch/amd64/include/interrupt.h	(revision 49e6c6b48a1667db53d7a8cfba97659b95c83ea8)
+++ kernel/arch/amd64/include/interrupt.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -69,4 +69,5 @@
 #define VECTOR_TLB_SHOOTDOWN_IPI  (IVT_FREEBASE + 1)
 #define VECTOR_DEBUG_IPI          (IVT_FREEBASE + 2)
+#define VECTOR_SMP_CALL_IPI       (IVT_FREEBASE + 3)
 
 extern void (* disable_irqs_function)(uint16_t);
Index: kernel/arch/amd64/src/interrupt.c
===================================================================
--- kernel/arch/amd64/src/interrupt.c	(revision 49e6c6b48a1667db53d7a8cfba97659b95c83ea8)
+++ kernel/arch/amd64/src/interrupt.c	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -54,4 +54,5 @@
 #include <symtab.h>
 #include <stacktrace.h>
+#include <smp/smp_call.h>
 
 /*
@@ -161,4 +162,10 @@
 	tlb_shootdown_ipi_recv();
 }
+
+static void arch_smp_call_ipi_recv(unsigned int n, istate_t *istate)
+{
+	trap_virtual_eoi();
+	smp_call_ipi_recv();
+}
 #endif
 
@@ -222,4 +229,6 @@
 	exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", true,
 	    (iroutine_t) tlb_shootdown_ipi);
+	exc_register(VECTOR_SMP_CALL_IPI, "smp_call", true, 
+		(iroutine_t) arch_smp_call_ipi_recv);
 #endif
 }
Index: kernel/arch/amd64/src/smp/smp_call.c
===================================================================
--- kernel/arch/amd64/src/smp/smp_call.c	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
+++ kernel/arch/amd64/src/smp/smp_call.c	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -0,0 +1,11 @@
+#include <arch/smp/smp_call.h>
+#include <arch/smp/apic.h>
+#include <arch/interrupt.h>
+#include <cpu.h>
+
+
+void arch_smp_call_ipi(unsigned int cpu_id)
+{
+	(void) l_apic_send_custom_ipi(cpus[cpu_id].arch.id, VECTOR_SMP_CALL_IPI);
+}
+
Index: kernel/arch/ia32/Makefile.inc
===================================================================
--- kernel/arch/ia32/Makefile.inc	(revision 49e6c6b48a1667db53d7a8cfba97659b95c83ea8)
+++ kernel/arch/ia32/Makefile.inc	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -86,4 +86,5 @@
 	arch/$(KARCH)/src/smp/mps.c \
 	arch/$(KARCH)/src/smp/smp.c \
+	arch/$(KARCH)/src/smp/smp_call.c \
 	arch/$(KARCH)/src/atomic.S \
 	arch/$(KARCH)/src/smp/ipi.c \
Index: kernel/arch/ia32/include/interrupt.h
===================================================================
--- kernel/arch/ia32/include/interrupt.h	(revision 49e6c6b48a1667db53d7a8cfba97659b95c83ea8)
+++ kernel/arch/ia32/include/interrupt.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -69,4 +69,5 @@
 #define VECTOR_TLB_SHOOTDOWN_IPI  (IVT_FREEBASE + 1)
 #define VECTOR_DEBUG_IPI          (IVT_FREEBASE + 2)
+#define VECTOR_SMP_CALL_IPI       (IVT_FREEBASE + 3)
 
 extern void (* disable_irqs_function)(uint16_t);
Index: kernel/arch/ia32/include/smp/smp_call.h
===================================================================
--- kernel/arch/ia32/include/smp/smp_call.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
+++ kernel/arch/ia32/include/smp/smp_call.h	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -0,0 +1,8 @@
+
+#ifndef KERN_ia32_SMP_CALL_H_
+#define KERN_ia32_SMP_CALL_H_
+
+
+extern void arch_smp_call_ipi(unsigned int);
+
+#endif /*  KERN_amd64_SMP_CALL_H_ */
Index: kernel/arch/ia32/src/interrupt.c
===================================================================
--- kernel/arch/ia32/src/interrupt.c	(revision 49e6c6b48a1667db53d7a8cfba97659b95c83ea8)
+++ kernel/arch/ia32/src/interrupt.c	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -54,4 +54,5 @@
 #include <symtab.h>
 #include <stacktrace.h>
+#include <smp/smp_call.h>
 
 /*
@@ -170,4 +171,10 @@
 	tlb_shootdown_ipi_recv();
 }
+
+static void arch_smp_call_ipi_recv(unsigned int n, istate_t *istate)
+{
+	trap_virtual_eoi();
+	smp_call_ipi_recv();
+}
 #endif
 
@@ -230,4 +237,6 @@
 	exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", true,
 	    (iroutine_t) tlb_shootdown_ipi);
+	exc_register(VECTOR_SMP_CALL_IPI, "smp_call", true,
+	    (iroutine_t) arch_smp_call_ipi_recv);
 #endif
 }
Index: kernel/arch/ia32/src/smp/smp_call.c
===================================================================
--- kernel/arch/ia32/src/smp/smp_call.c	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
+++ kernel/arch/ia32/src/smp/smp_call.c	(revision 2ee1ccc69bcd25005be784804853ee2cdc2231a2)
@@ -0,0 +1,11 @@
+#include <arch/smp/smp_call.h>
+#include <arch/smp/apic.h>
+#include <arch/interrupt.h>
+#include <cpu.h>
+
+
+void arch_smp_call_ipi(unsigned int cpu_id)
+{
+	(void) l_apic_send_custom_ipi(cpus[cpu_id].arch.id, VECTOR_SMP_CALL_IPI);
+}
+
