Index: arch/amd64/src/proc/scheduler.c
===================================================================
--- arch/amd64/src/proc/scheduler.c	(revision 9c1ecf97b370f5342999a51032e078c14f33f5d9)
+++ arch/amd64/src/proc/scheduler.c	(revision 613bc54e40bd66aec3da7e1b368afbcd6e8c6453)
@@ -37,4 +37,5 @@
 #include <print.h>
 #include <arch/pm.h>
+#include <adt/bitmap.h>
 
 /** Perform amd64 specific tasks needed before the new task is run.
@@ -44,5 +45,5 @@
 void before_task_runs_arch(void)
 {
-	size_t iomap_size;
+	count_t bits;
 	ptr_16_64_t cpugdtr;
 	descriptor_t *gdt_p;
@@ -54,9 +55,15 @@
 	/* First, copy the I/O Permission Bitmap. */
 	spinlock_lock(&TASK->lock);
-	iomap_size = TASK->arch.iomap_size;
-	if (iomap_size) {
-		ASSERT(TASK->arch.iomap);
-		memcpy(CPU->arch.tss->iomap, TASK->arch.iomap, iomap_size);
-		CPU->arch.tss->iomap[iomap_size] = 0xff;        /* terminating byte */
+	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 four bits because of the extra
+		 * convenience byte in TSS_IOMAP_SIZE.
+		 */
+		bitmap_set_range(&iomap, TASK->arch.iomap.bits, 4);
 	}
 	spinlock_unlock(&TASK->lock);
@@ -65,5 +72,5 @@
 	gdtr_store(&cpugdtr);
 	gdt_p = (descriptor_t *) cpugdtr.base;
-	gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + iomap_size - 1);
+	gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits) - 1);
 	gdtr_load(&cpugdtr);
 }
Index: arch/amd64/src/proc/task.c
===================================================================
--- arch/amd64/src/proc/task.c	(revision 9c1ecf97b370f5342999a51032e078c14f33f5d9)
+++ arch/amd64/src/proc/task.c	(revision 613bc54e40bd66aec3da7e1b368afbcd6e8c6453)
@@ -36,5 +36,4 @@
 void task_create_arch(task_t *t)
 {
-	t->arch.iomap = NULL;
-	t->arch.iomap_size = 0;
+	bitmap_initialize(&t->arch.iomap, NULL, 0);
 }
