Index: kernel/arch/ia64/include/cpu.h
===================================================================
--- kernel/arch/ia64/include/cpu.h	(revision f714576b33a5b9db46bd31376a156454ab629bd7)
+++ kernel/arch/ia64/include/cpu.h	(revision 0fdd6bbb06ebd929c2d9e4c5f604650f5f06ef82)
@@ -88,4 +88,6 @@
 {
 	(bootinfo->sapic)[2*(id*256+eid)]=intno;
+	srlz_d();
+
 }
 
Index: kernel/arch/ia64/include/interrupt.h
===================================================================
--- kernel/arch/ia64/include/interrupt.h	(revision f714576b33a5b9db46bd31376a156454ab629bd7)
+++ kernel/arch/ia64/include/interrupt.h	(revision 0fdd6bbb06ebd929c2d9e4c5f604650f5f06ef82)
@@ -51,4 +51,6 @@
 
 /** External Interrupt vectors. */
+
+#define VECTOR_TLB_SHOOTDOWN_IPI 0xf0
 #define INTERRUPT_TIMER		255
 #define IRQ_KBD			241
Index: kernel/arch/ia64/src/interrupt.c
===================================================================
--- kernel/arch/ia64/src/interrupt.c	(revision f714576b33a5b9db46bd31376a156454ab629bd7)
+++ kernel/arch/ia64/src/interrupt.c	(revision 0fdd6bbb06ebd929c2d9e4c5f604650f5f06ef82)
@@ -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 f714576b33a5b9db46bd31376a156454ab629bd7)
+++ kernel/arch/ia64/src/smp/smp.c	(revision 0fdd6bbb06ebd929c2d9e4c5f604650f5f06ef82)
@@ -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);
+
 }
 
Index: kernel/generic/src/mm/tlb.c
===================================================================
--- kernel/generic/src/mm/tlb.c	(revision f714576b33a5b9db46bd31376a156454ab629bd7)
+++ kernel/generic/src/mm/tlb.c	(revision 0fdd6bbb06ebd929c2d9e4c5f604650f5f06ef82)
@@ -135,7 +135,5 @@
 void tlb_shootdown_ipi_send(void)
 {
-#ifndef ia64
 	ipi_broadcast(VECTOR_TLB_SHOOTDOWN_IPI);
-#endif	
 }
 
