Index: arch/ia32/src/proc/scheduler.c
===================================================================
--- arch/ia32/src/proc/scheduler.c	(revision 69a5600600477ae968b08bfe68aa8032066bb55f)
+++ arch/ia32/src/proc/scheduler.c	(revision 5626277b8459d4e7f87105bacfa7b3ef4aa4e53b)
@@ -36,6 +36,5 @@
 #include <arch/pm.h>
 #include <arch/asm.h>
-#include <adt/bitmap.h>
-#include <print.h>
+#include <arch/ddi/ddi.h>
 
 /** Perform ia32 specific tasks needed before the new task is run.
@@ -45,40 +44,5 @@
 void before_task_runs_arch(void)
 {
-	count_t bits;
-	ptr_16_32_t cpugdtr;
-	descriptor_t *gdt_p;
-
-	/*
-	 * Switch the I/O Permission Bitmap, if necessary.
-	 */
-
-	/* First, copy the I/O Permission Bitmap. */
-	spinlock_lock(&TASK->lock);
-	if ((bits = TASK->arch.iomap.bits)) {
-		bitmap_t iomap;
-	
-		ASSERT(TASK->arch.iomap.map);
-		bitmap_initialize(&iomap, CPU->arch.tss->iomap, TSS_IOMAP_SIZE * 8);
-		bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits);
-		/*
-		 * It is safe to set the trailing eight bits because of the extra
-		 * convenience byte in TSS_IOMAP_SIZE.
-		 */
-		bitmap_set_range(&iomap, TASK->arch.iomap.bits, 8);
-	}
-	spinlock_unlock(&TASK->lock);
-
-	/* Second, adjust TSS segment limit. */
-	gdtr_store(&cpugdtr);
-	gdt_p = (descriptor_t *) cpugdtr.base;
-	gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits) - 1);
-	gdtr_load(&cpugdtr);
-
-	/*
-	 * Before we load new TSS limit, the current TSS descriptor
-	 * type must be changed to describe inactive TSS.
-	 */
-	gdt_p[TSS_DES].access = AR_PRESENT | AR_TSS | DPL_KERNEL;
-	tr_load(selector(TSS_DES));
+	io_perm_bitmap_install();
 }
 
