Index: kernel/arch/ia64/src/interrupt.c
===================================================================
--- kernel/arch/ia64/src/interrupt.c	(revision 0aa1665b932e64c1786b7cc2ee1964f9694cfd8b)
+++ kernel/arch/ia64/src/interrupt.c	(revision 49df572e82b89ba6586591f90fb55a38b5cb8b51)
@@ -54,4 +54,5 @@
 #include <ipc/ipc.h>
 #include <synch/spinlock.h>
+#include <mm/tlb.h>
 
 #define VECTORS_64_BUNDLE	20
@@ -235,4 +236,10 @@
 }
 
+static void end_of_local_irq()
+{
+	asm volatile ("mov cr.eoi=r0;;");
+}
+
+
 void external_interrupt(uint64_t vector, istate_t *istate)
 {
@@ -255,4 +262,12 @@
 			break;
 
+#ifdef CONFIG_SMP
+		case VECTOR_TLB_SHOOTDOWN_IPI:
+			tlb_shootdown_ipi_recv();
+			end_of_local_irq();
+			break;
+#endif
+
+
 		default:
 			panic("\nUnhandled External Interrupt Vector %d\n",
Index: kernel/arch/ia64/src/smp/smp.c
===================================================================
--- kernel/arch/ia64/src/smp/smp.c	(revision 0aa1665b932e64c1786b7cc2ee1964f9694cfd8b)
+++ kernel/arch/ia64/src/smp/smp.c	(revision 49df572e82b89ba6586591f90fb55a38b5cb8b51)
@@ -97,5 +97,17 @@
 void ipi_broadcast_arch(int ipi )
 {
-	ipi_broadcast_arch_all(ipi);
+	int id,eid;
+	int myid,myeid;
+	
+	myid=ia64_get_cpu_id();
+	myeid=ia64_get_cpu_eid();
+
+	//printf("Sending ipi %d on %d\n",ipi,CPU->id);
+	for(id=0;id<256;id++)
+		for(eid=0;eid<256;eid++)
+			if((id!=myid) || (eid!=myeid))
+				if(cpu_by_id_eid_list[id][eid])
+					ipi_send_ipi(id,eid,ipi);
+
 }
 
