Index: src/mm/tlb.c
===================================================================
--- src/mm/tlb.c	(revision f761f1eb635bfe9a5deaf70a0f0a51aa8d2f5f22)
+++ src/mm/tlb.c	(revision 169587adb76206b75ea15c7f171f7fdb5dca2b82)
@@ -28,7 +28,42 @@
 
 #include <mm/tlb.h>
+#include <synch/spinlock.h>
+#include <typedefs.h>
+#include <arch/atomic.h>
+#include <config.h>
 
-void tlb_shutdown(void)
+#ifdef __SMP__
+static spinlock_t tlblock;
+static volatile int tlb_shutdown_cnt;
+
+void tlb_init(void)
 {
-	/* TODO: implement tlb_shutdown */
+	spinlock_initialize(&tlblock);
+	tlb_shutdown_cnt = 0;
 }
+
+/* must be called with interrupts disabled */
+void tlb_shutdown_start(void)
+{
+	spinlock_lock(&tlblock);
+	tlb_shutdown_ipi_send();
+	
+	while (tlb_shutdown_cnt < config.cpu_active - 1)
+		;
+		
+	tlb_shutdown_cnt = 0;
+}
+
+void tlb_shutdown_finalize(void)
+{
+	spinlock_unlock(&tlblock);
+}
+
+void tlb_shutdown_ipi_recv(void)
+{
+	atomic_inc((int *) &tlb_shutdown_cnt);
+	spinlock_lock(&tlblock);
+	spinlock_unlock(&tlblock);
+	tlb_invalidate(0);	/* TODO: use valid ASID */
+}
+#endif /* __SMP__ */
Index: src/mm/vm.c
===================================================================
--- src/mm/vm.c	(revision f761f1eb635bfe9a5deaf70a0f0a51aa8d2f5f22)
+++ src/mm/vm.c	(revision 169587adb76206b75ea15c7f171f7fdb5dca2b82)
@@ -30,4 +30,5 @@
 #include <mm/page.h>
 #include <mm/frame.h>
+#include <mm/tlb.h>
 #include <arch/mm/page.h>
 #include <arch/types.h>
@@ -143,5 +144,5 @@
 	for (i=0; i<a->size; i++)		
 		map_page_to_frame(a->address + i*PAGE_SIZE, 0, PAGE_NOT_PRESENT, 0);
-		
+	
 	spinlock_unlock(&a->lock);
 	cpu_priority_restore(pri);
@@ -169,4 +170,7 @@
 	
 	pri = cpu_priority_high();
+
+	tlb_shutdown_start();
+
 	spinlock_lock(&m->lock);
 
@@ -175,4 +179,8 @@
 
 	spinlock_unlock(&m->lock);
+
+	tlb_invalidate(0);
+	tlb_shutdown_finalize();
+
 	cpu_priority_restore(pri);
 }
