Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 5d2ab231a2e6c513f459e864da1c59750cce6db7)
+++ generic/src/mm/as.c	(revision 6ed5352295adcd745ba17129d6c6a4abd72de065)
@@ -34,4 +34,5 @@
 
 #include <mm/as.h>
+#include <mm/asid.h>
 #include <mm/page.h>
 #include <mm/frame.h>
@@ -40,4 +41,5 @@
 #include <arch/mm/page.h>
 #include <genarch/mm/page_pt.h>
+#include <mm/asid.h>
 #include <arch/mm/asid.h>
 #include <arch/mm/as.h>
@@ -71,5 +73,5 @@
  * 	  (Virtual Address Translation) mechanisms.
  */
-as_t *as_create(pte_t *ptl0)
+as_t *as_create(pte_t *ptl0, int flags)
 {
 	as_t *as;
@@ -77,8 +79,12 @@
 	as = (as_t *) malloc(sizeof(as_t));
 	if (as) {
+		list_initialize(&as->as_with_asid_link);
 		spinlock_initialize(&as->lock, "as_lock");
 		list_initialize(&as->as_area_head);
 
-		as->asid = asid_get();
+		if (flags & AS_KERNEL)
+			as->asid = ASID_KERNEL;
+		else
+			as->asid = ASID_INVALID;
 
 		as->ptl0 = ptl0;
@@ -290,4 +296,6 @@
 	ipl_t ipl;
 	
+	asid_install(as);
+	
 	ipl = interrupts_disable();
 	spinlock_lock(&as->lock);
@@ -299,5 +307,5 @@
 	/*
 	 * Perform architecture-specific steps.
-	 * (e.g. invalidate TLB, install ASID etc.)
+	 * (e.g. write ASID to hardware register etc.)
 	 */
 	as_install_arch(as);
Index: generic/src/mm/tlb.c
===================================================================
--- generic/src/mm/tlb.c	(revision 5d2ab231a2e6c513f459e864da1c59750cce6db7)
+++ generic/src/mm/tlb.c	(revision 6ed5352295adcd745ba17129d6c6a4abd72de065)
@@ -47,5 +47,5 @@
 #ifdef CONFIG_SMP
 /* must be called with interrupts disabled */
-void tlb_shootdown_start(void)
+void tlb_shootdown_start(tlb_invalidate_type_t type, asid_t asid, __address page, count_t cnt)
 {
 	int i;
@@ -53,6 +53,24 @@
 	CPU->tlb_active = 0;
 	spinlock_lock(&tlblock);
+	
+	/*
+	 * TODO: assemble shootdown message.
+	 */
 	tlb_shootdown_ipi_send();
-	tlb_invalidate(0); /* TODO: use valid ASID */
+
+	switch (type) {
+	    case TLB_INVL_ALL:
+		tlb_invalidate_all();
+		break;
+	    case TLB_INVL_ASID:
+		tlb_invalidate_asid(asid);
+		break;
+	    case TLB_INVL_PAGES:
+		tlb_invalidate_pages(asid, page, cnt);
+		break;
+	    default:
+		panic("unknown tlb_invalidate_type_t value: %d\n", type);
+		break;
+	}
 	
 busy_wait:	
@@ -78,5 +96,5 @@
 	spinlock_lock(&tlblock);
 	spinlock_unlock(&tlblock);
-	tlb_invalidate(0);	/* TODO: use valid ASID */
+	tlb_invalidate_all();	/* TODO: use valid ASID */
 	CPU->tlb_active = 1;
 }
