Index: kernel/genarch/src/mm/page_ht.c
===================================================================
--- kernel/genarch/src/mm/page_ht.c	(revision 7aaed09d88be49fac8360d3017e3328ed9b0635c)
+++ kernel/genarch/src/mm/page_ht.c	(revision efb48ebf4be82c1df6d4bef51b7a15c85de1af3f)
@@ -59,4 +59,5 @@
 static void ht_mapping_remove(as_t *, uintptr_t);
 static pte_t *ht_mapping_find(as_t *, uintptr_t, bool);
+static void ht_mapping_make_global(uintptr_t, size_t);
 
 slab_cache_t *pte_cache = NULL;
@@ -88,5 +89,6 @@
 	.mapping_insert = ht_mapping_insert,
 	.mapping_remove = ht_mapping_remove,
-	.mapping_find = ht_mapping_find
+	.mapping_find = ht_mapping_find,
+	.mapping_make_global = ht_mapping_make_global
 };
 
@@ -262,4 +264,9 @@
 }
 
+void ht_mapping_make_global(uintptr_t base, size_t size)
+{
+	/* nothing to do */
+}
+
 /** @}
  */
Index: kernel/genarch/src/mm/page_pt.c
===================================================================
--- kernel/genarch/src/mm/page_pt.c	(revision 7aaed09d88be49fac8360d3017e3328ed9b0635c)
+++ kernel/genarch/src/mm/page_pt.c	(revision efb48ebf4be82c1df6d4bef51b7a15c85de1af3f)
@@ -46,13 +46,17 @@
 #include <arch/asm.h>
 #include <memstr.h>
+#include <align.h>
+#include <macros.h>
 
 static void pt_mapping_insert(as_t *, uintptr_t, uintptr_t, unsigned int);
 static void pt_mapping_remove(as_t *, uintptr_t);
 static pte_t *pt_mapping_find(as_t *, uintptr_t, bool);
+static void pt_mapping_make_global(uintptr_t, size_t);
 
 page_mapping_operations_t pt_mapping_operations = {
 	.mapping_insert = pt_mapping_insert,
 	.mapping_remove = pt_mapping_remove,
-	.mapping_find = pt_mapping_find
+	.mapping_find = pt_mapping_find,
+	.mapping_make_global = pt_mapping_make_global
 };
 
@@ -133,5 +137,4 @@
 	/*
 	 * First, remove the mapping, if it exists.
-	 *
 	 */
 	
@@ -150,5 +153,8 @@
 	pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
 	
-	/* Destroy the mapping. Setting to PAGE_NOT_PRESENT is not sufficient. */
+	/*
+	 * Destroy the mapping.
+	 * Setting to PAGE_NOT_PRESENT is not sufficient.
+	 */
 	memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0);
 	
@@ -286,4 +292,48 @@
 }
 
+/** Make the mappings in the given range global accross all address spaces.
+ *
+ * All PTL0 entries in the given range will be mapped to a next level page
+ * table. The next level page table will be allocated and cleared.
+ *
+ * pt_mapping_remove() will never deallocate these page tables even when there
+ * are no PTEs in them.
+ *
+ * @param as   Address space.
+ * @param base Base address corresponding to the first PTL0 entry that will be
+ *             altered by this function.
+ * @param size Size in bytes defining the range of PTL0 entries that will be
+ *             altered by this function.
+ */
+void pt_mapping_make_global(uintptr_t base, size_t size)
+{
+	uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
+	uintptr_t ptl0step = (((uintptr_t) -1) / PTL0_ENTRIES) + 1;
+	size_t order;
+	uintptr_t addr;
+
+#if (PTL1_ENTRIES != 0)
+	order = PTL1_SIZE;
+#elif (PTL2_ENTRIES != 0)
+	order = PTL2_SIZE;
+#else
+	order = PTL3_SIZE;
+#endif
+
+	ASSERT(ispwr2(ptl0step));
+
+	for (addr = ALIGN_DOWN(base, ptl0step); addr < base + size;
+	    addr += ptl0step) {
+		uintptr_t l1;
+
+		l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM);
+		memsetb((void *) l1, FRAME_SIZE << order, 0);
+		SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
+		SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
+		    PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |
+		    PAGE_WRITE);
+	}
+}
+
 /** @}
  */
